Inheritance: implements React\Promise\ExtendedPromiseInterface, implements React\Promise\CancellablePromiseInterface
Example #1
0
 /**
  * Handle on session start
  * 
  * @param \Thruway\AbstractSession $session
  * @param \Thruway\Transport\TransportInterface $transport
  */
 public function onSessionStart($session, $transport)
 {
     $this->thePromise->then(function () use($session) {
         $this->getCaller()->call($session, 'com.example.thefunction0', [])->then(function ($res) {
             var_dump($res);
         });
     });
 }
Example #2
0
 public function fromPromise(Promise $promise)
 {
     $json = null;
     $promise->done(function ($data) use(&$json) {
         $json = $data;
     });
     return new \Zend\Diactoros\Response\JsonResponse($json);
 }
Example #3
0
 /**
  * Handle on session start
  *
  * @param \Thruway\ClientSession $session
  * @param \Thruway\Transport\TransportInterface $transport
  */
 public function onSessionStart($session, $transport)
 {
     $this->thePromise->then(function () use($session) {
         $session->call('com.example.thefunction0', [])->then(function ($res) {
             echo "Done.\n";
             exit;
         });
     });
 }
Example #4
0
 /** @test */
 public function shouldRejectIfResolverThrowsException()
 {
     $exception = new \Exception('foo');
     $promise = new Promise(function () use($exception) {
         throw $exception;
     });
     $mock = $this->createCallableMock();
     $mock->expects($this->once())->method('__invoke')->with($this->identicalTo($exception));
     $promise->then($this->expectCallableNever(), $mock);
 }
 /**
  *
  * @param EventEmitterInterface $emitter
  * @param string[] $fulfillEvents
  * @param string[] $rejectEvents
  * @param string[] $notifyEvents
  * @return ExtendedPromiseInterface
  */
 public static function listen(EventEmitterInterface $emitter, array $fulfillEvents = [], array $rejectEvents = [], array $notifyEvents = [])
 {
     $listeners = [];
     $removeListeners = function () use($emitter, &$listeners) {
         foreach ($listeners as $event => $callback) {
             $emitter->removeListener($event, $callback);
         }
         $listeners = [];
     };
     $promise = new Promise(function ($resolve, $reject, $notify) use($emitter, &$listeners, $fulfillEvents, $rejectEvents, $notifyEvents) {
         $listeners = array_merge(static::registerCallbacks($emitter, $fulfillEvents, $resolve), static::registerCallbacks($emitter, $rejectEvents, $reject), static::registerCallbacks($emitter, $notifyEvents, $notify));
     }, $removeListeners);
     return $promise->always($removeListeners);
 }
Example #6
0
 /**
  *  Process a result as a promise
  *
  * @param \React\Promise\Promise $promise
  * @param \Thruway\Message\InvocationMessage $msg
  * @param \Thruway\ClientSession $session
  * @param array $registration
  */
 private function processResultAsPromise(Promise $promise, InvocationMessage $msg, ClientSession $session, $registration)
 {
     $promise->then(function ($promiseResults) use($msg, $session) {
         $options = new \stdClass();
         if ($promiseResults instanceof Result) {
             $yieldMsg = new YieldMessage($msg->getRequestId(), $options, $promiseResults->getArguments(), $promiseResults->getArgumentsKw());
         } else {
             $promiseResults = is_array($promiseResults) ? $promiseResults : [$promiseResults];
             $promiseResults = !$this::is_list($promiseResults) ? [$promiseResults] : $promiseResults;
             $yieldMsg = new YieldMessage($msg->getRequestId(), $options, $promiseResults);
         }
         $session->sendMessage($yieldMsg);
     }, function () use($msg, $session, $registration) {
         $errorMsg = ErrorMessage::createErrorMessageFromMessage($msg);
         $errorMsg->setErrorURI($registration['procedure_name'] . '.error');
         $session->sendMessage($errorMsg);
     }, function ($results) use($msg, $session, $registration) {
         $options = ["progress" => true];
         if ($results instanceof Result) {
             $yieldMsg = new YieldMessage($msg->getRequestId(), $options, $results->getArguments(), $results->getArgumentsKw());
         } else {
             $results = is_array($results) ? $results : [$results];
             $results = !$this::is_list($results) ? [$results] : $results;
             $yieldMsg = new YieldMessage($msg->getRequestId(), $options, $results);
         }
         $session->sendMessage($yieldMsg);
     });
 }
Example #7
0
 /**
  * Add a tile to the base image.
  *
  * @param Promise $promise Promise from the get tile.
  * @param Point   $point   Point where to place the tile.
  *
  * @return void
  */
 protected function addTile(Promise $promise, Point $point)
 {
     $promise->then(function ($fileName) use($point) {
         return $this->loader->addImage($fileName);
     })->then(function ($image) use($point) {
         $this->drawImage($image, $point);
     });
 }
Example #8
0
 private function assertRejected($expected, Promise $promise)
 {
     $rejected = null;
     $promise->then(null, function ($data) use(&$rejected) {
         $rejected = $data;
     });
     $this->assertEquals($expected, $rejected);
 }
Example #9
0
/**
 * Creates a `Promise` which resolves with an array of all the event data
 *
 * @param ReadableStreamInterface|WritableStreamInterface $stream
 * @param string                                          $event
 * @return CancellablePromiseInterface Promise<string, Exception>
 */
function all(EventEmitterInterface $stream, $event = 'data')
{
    // stream already ended => resolve with empty buffer
    if ($stream instanceof ReadableStreamInterface) {
        // readable or duplex stream not readable => already closed
        // a half-open duplex stream is considered closed if its readable side is closed
        if (!$stream->isReadable()) {
            return Promise\resolve(array());
        }
    } elseif ($stream instanceof WritableStreamInterface) {
        // writable-only stream (not duplex) not writable => already closed
        if (!$stream->isWritable()) {
            return Promise\resolve(array());
        }
    }
    $buffer = array();
    $bufferer = function ($data) use(&$buffer) {
        $buffer[] = $data;
    };
    $stream->on($event, $bufferer);
    $promise = new Promise\Promise(function ($resolve, $reject) use($stream, &$buffer) {
        $stream->on('error', function ($error) use($reject) {
            $reject(new \RuntimeException('An error occured on the underlying stream while buffering', 0, $error));
        });
        $stream->on('close', function () use($resolve, &$buffer) {
            $resolve($buffer);
        });
    }, function ($_, $reject) {
        $reject(new \RuntimeException('Cancelled buffering'));
    });
    return $promise->then(null, function ($error) use(&$buffer, $bufferer, $stream, $event) {
        // promise rejected => clear buffer and buffering
        $buffer = array();
        $stream->removeListener($event, $bufferer);
        throw $error;
    });
}