resolve() public method

public resolve ( $value = null )
 /**
  * Make a directory as described in the task description
  * @param Deferred $deferred
  * @param TaskInterface $task
  * @return bool
  */
 protected function processDeferred(Deferred $deferred, TaskInterface $task)
 {
     yield;
     /** @var Description $description */
     $description = $task->getDescription();
     $deferred->notify(new Notification("Creating directory '{$description->getName()}'", Notification::PRIORITY_NORMAL));
     if ($this->getFileSystem()->isDirectory($description->getName())) {
         $deferred->resolve("Directory '{$description->getName()}' already exists");
         return;
     }
     if ($this->getFileSystem()->makeDirectory($description->getName())) {
         $deferred->resolve("Created directory '{$description->getName()}'");
         return;
     }
     $deferred->reject("Directory '{$description->getName()}' could not be created");
 }
 /**
  * Make a directory as described in the task description
  * @param Deferred $deferred
  * @param TaskInterface $task
  * @return bool
  */
 protected function processDeferred(Deferred $deferred, TaskInterface $task)
 {
     yield;
     /** @var Description $description */
     $description = $task->getDescription();
     $deferred->notify(new Notification("Deleting file or directory '{$description->getName()}'", Notification::PRIORITY_NORMAL));
     if (!$this->getFileSystem()->isFile($description->getName()) && !$this->getFileSystem()->isDirectory($description->getName())) {
         $deferred->resolve("File or directory '{$description->getName()}' does not exist");
         return;
     }
     if ($this->getFileSystem()->delete($description->getName())) {
         $deferred->resolve("Deleted file or directory '{$description->getName()}'");
         return;
     }
     $deferred->reject("File or directory '{$description->getName()}' could not be deleted");
 }
Esempio n. 3
0
 public function doQuery($nameserver, $transport, $queryData, $name)
 {
     $parser = $this->parser;
     $loop = $this->loop;
     $response = new Message();
     $deferred = new Deferred();
     $retryWithTcp = function () use($nameserver, $queryData, $name) {
         return $this->doQuery($nameserver, 'tcp', $queryData, $name);
     };
     $timer = $this->loop->addTimer($this->timeout, function () use(&$conn, $name, $deferred) {
         $conn->close();
         $deferred->reject(new TimeoutException(sprintf("DNS query for %s timed out", $name)));
     });
     $conn = $this->createConnection($nameserver, $transport);
     $conn->on('data', function ($data) use($retryWithTcp, $conn, $parser, $response, $transport, $deferred, $timer) {
         $responseReady = $parser->parseChunk($data, $response);
         if (!$responseReady) {
             return;
         }
         $timer->cancel();
         if ($response->header->isTruncated()) {
             if ('tcp' === $transport) {
                 $deferred->reject(new BadServerException('The server set the truncated bit although we issued a TCP request'));
             } else {
                 $conn->end();
                 $deferred->resolve($retryWithTcp());
             }
             return;
         }
         $conn->end();
         $deferred->resolve($response);
     });
     $conn->write($queryData);
     return $deferred->promise();
 }
Esempio n. 4
0
 /**
  * {@inheritdoc}
  */
 public function tick()
 {
     if ($this->firstTick) {
         $this->firstTick = false;
         $this->deferred->notify(new MessageEvent($this, $this->generator->current()));
     } else {
         $this->deferred->notify(new MessageEvent($this, $this->generator->send(null)));
     }
     if (!$this->generator->valid()) {
         $this->deferred->resolve(new Event($this));
     }
 }
Esempio n. 5
0
 /**
  * Return file name through a promise.
  *
  * @param integer $xAxis X coordinate.
  * @param integer $yAxis Y coordinate.
  *
  * @return \React\Promise\Promise
  */
 public function getTile($xAxis, $yAxis)
 {
     $fileName = str_replace(['{x}', '{y}'], [$xAxis, $yAxis], $this->location);
     $deferred = new Deferred();
     $this->loader->imageExists($fileName)->then(function () use($deferred, $fileName) {
         $deferred->resolve($fileName);
     }, function () use($deferred, $fileName) {
         if (empty($this->fallbackImage)) {
             return $deferred->resolve($fileName);
         }
         $deferred->resolve($this->fallbackImage);
     });
     return $deferred->promise();
 }
Esempio n. 6
0
 /**
  * {@inheritdoc}
  */
 public function tick()
 {
     $this->startPendingTasks();
     if ($this->runningTasks->isEmpty()) {
         $this->deferred->resolve();
         return;
     }
     /** @var TaskInterface $task */
     $task = $this->runningTasks->dequeue();
     if (false !== ($pos = array_search($task, $this->finishedTasks, true))) {
         unset($this->finishedTasks[array_search($task, $this->finishedTasks, true)]);
         return $this->tick();
     }
     $task->tick();
     $this->runningTasks->enqueue($task);
 }
Esempio n. 7
0
 private function collectEvents($command, $expectedEndEvent)
 {
     $req = $this->client->createAction($command);
     $ret = $this->client->request($req);
     $id = $req->getActionId();
     $deferred = new Deferred();
     // collect all intermediary channel events with this action ID
     $collected = array();
     $collector = function (Event $event) use($id, &$collected, $deferred, $expectedEndEvent) {
         if ($event->getActionId() === $id) {
             $collected[] = $event;
             if ($event->getName() === $expectedEndEvent) {
                 $deferred->resolve($collected);
             }
         }
     };
     $this->client->on('event', $collector);
     // unregister collector if client fails
     $client = $this->client;
     $unregister = function () use($client, $collector) {
         $client->removeListener('event', $collector);
     };
     $ret->then(null, $unregister);
     // stop waiting for events
     $deferred->promise()->then($unregister);
     return $ret->then(function (Response $response) use($deferred) {
         // final result has been received => merge all intermediary channel events
         return $deferred->promise()->then(function ($collected) use($response) {
             $last = array_pop($collected);
             return new Collection($response, $collected, $last);
         });
     });
 }
Esempio n. 8
0
 public function connect($timeout = 5)
 {
     if ($this->connectDeferred) {
         return $this->connectDeferred->promise();
     }
     $this->connectionStatus = 'connecting';
     $promise = new Deferred();
     $client = $this;
     $loop = $this->loop;
     $this->connectDeferred = $promise;
     $this->connectDeferred->then(function () use($client) {
         $client->setConnectionStatus('connected');
     });
     $timer = $this->loop->addTimer($timeout, function () use($client, $promise) {
         $promise->reject(new ConnectionException('Connection timeout'));
         $client->resetConnectDeferred();
         $client->setConnectionStatus('not-connected');
     });
     $this->on('connect', function ($client) use($timer, $promise) {
         $timer->cancel();
         $promise->resolve($client);
     });
     $frame = $this->packageCreator->connect($this->options['vhost'], $this->options['login'], $this->options['passcode']);
     $this->output->sendFrame($frame);
     return $this->connectDeferred->promise();
 }
Esempio n. 9
0
 public function wait()
 {
     if ($this->isRealized) {
         return false;
     }
     // Seed the pool with N number of requests.
     $this->addNextRequests();
     // Stop if the pool was cancelled while transferring requests.
     if ($this->isRealized) {
         return false;
     }
     // Wait on any outstanding FutureResponse objects.
     while ($response = array_pop($this->waitQueue)) {
         try {
             $response->wait();
         } catch (\Exception $e) {
             // Eat exceptions because they should be handled asynchronously
         }
         $this->addNextRequests();
     }
     // Clean up no longer needed state.
     $this->isRealized = true;
     $this->waitQueue = $this->eventListeners = [];
     $this->client = $this->iter = null;
     $this->deferred->resolve(true);
     return true;
 }
Esempio n. 10
0
 /**
  * @param $channel
  * @param string $message
  * @return DeferredPromise
  */
 public function call($channel, $message)
 {
     $loop = LoopFactory::create();
     $factory = new StompFactory($loop);
     $client = $factory->createClient();
     $deferred = new Deferred();
     $timer = $loop->addTimer(2, function () use($deferred, $client) {
         $client->disconnect();
         $deferred->reject(new RpcTimeIsOutException());
     });
     $client->connect()->then(function (StompClient $client) use($message, $channel, $loop, $deferred, $timer) {
         $rpcReceiver = function (Frame $frame) use($deferred, $timer, $client) {
             $timer->cancel();
             $client->disconnect();
             try {
                 $deferred->resolve($frame);
             } catch (\Exception $e) {
                 $deferred->reject($e);
             }
         };
         $client->sendToTemp($channel, $message, [], $rpcReceiver);
     }, function () use($deferred, $client) {
         $client->disconnect();
         $deferred->reject(new \RuntimeException('Error start rpc connection'));
     });
     $loop->run();
     return $deferred->promise();
 }
Esempio n. 11
0
 public function loadEtcResolvConf($filename)
 {
     if (!file_exists($filename)) {
         return When::reject(new \InvalidArgumentException("The filename for /etc/resolv.conf given does not exist: {$filename}"));
     }
     try {
         $deferred = new Deferred();
         $fd = fopen($filename, 'r');
         stream_set_blocking($fd, 0);
         $contents = '';
         $stream = new Stream($fd, $this->loop);
         $stream->on('data', function ($data) use(&$contents) {
             $contents .= $data;
         });
         $stream->on('end', function () use(&$contents, $deferred) {
             $deferred->resolve($contents);
         });
         $stream->on('error', function ($error) use($deferred) {
             $deferred->reject($error);
         });
         return $deferred->promise();
     } catch (\Exception $e) {
         return When::reject($e);
     }
 }
 private function executeRequest($method, $uri, $body = null)
 {
     $deferred = new Deferred();
     $request = $this->client->request($method, $this->buildUrl($uri), array('Content-Length' => strlen($body), 'Authorization' => 'Basic ' . base64_encode($this->options['user'] . ':' . $this->options['password']), 'Content-Type' => 'application/json'));
     $request->writeHead();
     $request->on('error', function ($error) use($uri, $deferred) {
         $deferred->reject(sprintf('Error while doing the request on %s : %s', $uri, $error->getMessage()));
     });
     $request->on('response', function (Response $response) use($deferred) {
         if ($response->getCode() < 200 || $response->getCode() >= 400) {
             $deferred->reject(sprintf('The response is not as expected (status code %s, message is %s)', $response->getCode(), $response->getReasonPhrase()));
         }
         $response->on('error', function ($error) use($deferred) {
             $deferred->reject($error->getMessage());
         });
         $data = (object) array('data' => '');
         $response->on('data', function ($chunk) use($data) {
             $data->data .= $chunk;
         });
         $response->on('end', function () use($deferred, $data) {
             $deferred->resolve($data->data);
         });
     });
     $request->end($body);
     return $deferred->promise();
 }
Esempio n. 13
0
 /**
  * Connect to $numSeeds DNS seeds
  *
  * @param int $numSeeds
  * @return \React\Promise\Promise|\React\Promise\PromiseInterface
  */
 public function queryDnsSeeds($numSeeds = 1)
 {
     $peerList = new Deferred();
     // Take $numSeeds
     $seedHosts = self::dnsSeedHosts();
     $seeds = array_slice($seedHosts, 0, min($numSeeds, count($seedHosts)));
     // Connect to $numSeeds peers
     /** @var Peer[] $vNetAddr */
     $vNetAddr = [];
     foreach ($seeds as $seed) {
         echo " [ query DNS seed: " . $seed . " ] \n";
         $this->dns->resolve($seed)->then(function ($ipList) use(&$vNetAddr, $peerList, &$numSeeds) {
             $vNetAddr[] = $ipList;
             if (count($vNetAddr) == $numSeeds) {
                 $peerList->resolve($vNetAddr);
             }
         });
     }
     // Compile the list of lists of peers into $this->knownAddresses
     return $peerList->promise()->then(function (array $vPeerVAddrs) {
         shuffle($vPeerVAddrs);
         /** @var NetworkAddressInterface[] $addresses */
         $addresses = [];
         array_map(function (array $value) use(&$addresses) {
             foreach ($value as $ip) {
                 $addresses[] = new NetworkAddress(Buffer::hex('01', 8), $ip, 8333);
             }
         }, $vPeerVAddrs);
         $this->knownAddresses = array_merge($this->knownAddresses, $addresses);
         return $this;
     });
 }
Esempio n. 14
0
 /** @internal */
 public function go(Process $process)
 {
     $this->deferred = $deferred = new Deferred();
     $this->process = $process;
     $buffered = null;
     $process->stdout->on('data', function ($data) use(&$buffered) {
         if ($data !== '') {
             $buffered .= $data;
         }
     });
     $process->on('exit', function ($code) use($deferred) {
         if ($code !== 0) {
             $deferred->reject($code);
         } else {
             $deferred->resolve();
         }
     });
     $that = $this;
     $this->promise = $deferred->promise()->then(function () use(&$buffered, $that) {
         if ($buffered === null) {
             $buffered = true;
         } else {
             $buffered = $that->parseValue(trim($buffered));
         }
         return $buffered;
     });
 }
 protected function createInternalAsync($host, $docroot, $router)
 {
     $deferred = new Deferred();
     $process = new BuiltinServer($host, $docroot, $router, $this->php);
     $process->start($this->loop);
     $process->on('exit', function ($code) use($deferred) {
         $this->stderr->write("Process exit with code {$code}\n");
         $deferred->reject();
     });
     $process->stdin->close();
     $process->stdout->close();
     $process->stderr->on('data', function ($output) use($deferred) {
         $this->stderr->write($output);
         $deferred->reject();
     });
     $timer = new Deferred();
     $this->loop->addTimer(0.05, function () use($timer, $process) {
         if (DIRECTORY_SEPARATOR === '\\') {
             // Pipes opened by proc_open() can break stream_select() loop in Windows.
             // This fix might do the trick...
             $process->stderr->close();
         }
         $timer->resolve($process);
     });
     return \React\Promise\race([$deferred->promise(), $timer->promise()])->then(null, function () use($process) {
         $process->terminate();
         return new RejectedPromise();
     });
 }
Esempio n. 16
0
 public static function createFuture(callable $wait, callable $cancel = null)
 {
     $deferred = new Deferred();
     return new FutureResponse($deferred->promise(), function () use($deferred, $wait) {
         $deferred->resolve($wait());
     }, $cancel);
 }
 public function __invoke(GetTodosByAssigneeId $query, Deferred $deferred = null)
 {
     $todos = $this->todoFinder->findByAssigneeId($query->userId());
     if (null === $deferred) {
         return $todos;
     }
     $deferred->resolve($todos);
 }
 public function __invoke(GetUserById $query, Deferred $deferred = null)
 {
     $user = $this->userFinder->findById($query->userId());
     if (null === $deferred) {
         return $user;
     }
     $deferred->resolve($user);
 }
Esempio n. 19
0
 public function start()
 {
     $deferred = new Deferred();
     $this->loop->addTimer($this->interval, function () use($deferred) {
         $deferred->resolve();
     });
     return $deferred->promise();
 }
 public function __invoke(GetAllUsers $query, Deferred $deferred = null)
 {
     $user = $this->userFinder->findAll();
     if (null === $deferred) {
         return $user;
     }
     $deferred->resolve($user);
 }
Esempio n. 21
0
 /**
  * {@inheritdoc}
  */
 public function tick()
 {
     if (!$this->process->isRunning() && $this->outputBuffer->isEmpty()) {
         usleep(1000);
         if ($this->outputBuffer->isEmpty()) {
             if ($this->process->isSuccessful()) {
                 $this->deferred->resolve(new MessageEvent($this, $this->process->getOutput()));
             } else {
                 $this->deferred->reject(new MessageEvent($this, $this->process->getOutput()));
             }
             return;
         }
     }
     if (!$this->outputBuffer->isEmpty()) {
         $this->deferred->notify(new MessageEvent($this, $this->outputBuffer->dequeue()[1]));
     }
 }
Esempio n. 22
0
 protected function createPromiseResolved($value = null, $delay = 0.01)
 {
     $deferred = new Deferred();
     $this->loop->addTimer($delay, function () use($deferred, $value) {
         $deferred->resolve($value);
     });
     return $deferred->promise();
 }
 public function __invoke(GetTodoById $query, Deferred $deferred = null)
 {
     $todo = $this->todoFinder->findById($query->todoId());
     if (null === $deferred) {
         return $todo;
     }
     $deferred->resolve($todo);
 }
Esempio n. 24
0
 protected function createConnectionManagerMock($ret)
 {
     $mock = $this->getMockBuilder('React\\SocketClient\\Connector')->disableOriginalConstructor()->getMock();
     $deferred = new Deferred();
     $deferred->resolve($ret);
     $mock->expects($this->any())->method('create')->will($this->returnValue($deferred->promise()));
     return $mock;
 }
 public function promiseAction(Request $request)
 {
     $secs = intval($request->attributes->get("secs"));
     $deferred = new Deferred();
     $this->loop->addTimer($secs, function () use($secs, $deferred) {
         $deferred->resolve(Response::create("{$secs} seconds later...\n"));
     });
     return $deferred->promise();
 }
Esempio n. 26
0
 /**
  * create stream client socket connected to given address
  *
  * @param string $address
  * @return PromiseInterface to return a \Sockets\Stream
  * @uses RawFactory::createFromString()
  * @uses RawSocket::setBlocking() to turn on non-blocking mode
  * @uses RawSocket::connect() to initiate async connection
  * @uses LoopInterface::addWriteStream() to wait for connection result once
  * @uses RawSocket::assertAlive() to check connection result
  */
 public function createClient($address)
 {
     $that = $this;
     $factory = $this->rawFactory;
     return $this->resolve($address)->then(function ($address) use($factory, $that) {
         $deferred = new Deferred();
         $socket = $factory->createFromString($address, $scheme);
         if ($socket->getType() !== SOCK_STREAM) {
             $socket->close();
             throw new Exception('Not a stream address scheme');
         }
         $socket->setBlocking(false);
         try {
             // socket is nonblocking, so connect should emit EINPROGRESS
             $socket->connect($address);
             // socket is already connected immediately?
             $deferred->resolve(new Connection($socket, $that->getSocketLoop()));
         } catch (Exception $exception) {
             if ($exception->getCode() === SOCKET_EINPROGRESS) {
                 // connection in progress => wait for the socket to become writable
                 $that->getSocketLoop()->addWriteStream($socket->getResource(), function ($resource, $loop) use($deferred, $socket) {
                     // only poll for writable event once
                     $loop->removeWriteStream($resource);
                     try {
                         // assert that socket error is 0 (no TCP RST received)
                         $socket->assertAlive();
                     } catch (Exception $e) {
                         // error returned => connected failed
                         $socket->close();
                         $deferred->reject(new Exception('Error while establishing connection', $e->getCode(), $e));
                         return;
                     }
                     // no error => connection established
                     $deferred->resolve(new Connection($socket, $loop));
                 });
             } else {
                 // re-throw any other socket error
                 $socket->close();
                 $deferred->reject($exception);
             }
         }
         return $deferred->promise();
     });
 }
Esempio n. 27
0
 public function testJsonResolvingPromiseWithWrongValueWillEmitErrorAndCloseEvent()
 {
     $deferred = new Deferred();
     $stream = $this->parser->parseJsonStream($deferred->promise());
     $this->assertTrue($stream->isReadable());
     $stream->on('error', $this->expectCallableOnce());
     $stream->on('close', $this->expectCallableOnce());
     $deferred->resolve('not a stream');
     $this->assertFalse($stream->isReadable());
 }
 public function start()
 {
     $command = $this->getCommand($this->keys);
     $deferred = new Deferred();
     $command->start($this->loop, 0.001);
     $command->on('exit', function () use($deferred) {
         $deferred->resolve();
     });
     return $deferred->promise();
 }
 /**
  * Message producers need to be invokable.
  *
  * A producer MUST be able to handle a message async without returning a response.
  * A producer MAY also support future response by resolving the passed $deferred.
  *
  * Note: A $deferred is only passed by a QueryBus but in this case the $deferred
  *       MUST either be resolved/rejected OR the message producer
  *       MUST throw a Prooph\ServiceBus\Exception\RuntimeException if it cannot
  *       handle the $deferred
  *
  * @param Message $message
  * @param null|Deferred $deferred
  * @throws RuntimeException If a $deferred is passed but producer can not handle it
  */
 public function __invoke(Message $message, Deferred $deferred = null)
 {
     $this->assertDeferred(null !== $deferred);
     $data = $this->arrayFromMessage($message);
     $this->zmqClient->send(json_encode($data), ZMQ::MODE_DONTWAIT);
     if ($deferred) {
         $response = $this->zmqClient->receive();
         $deferred->resolve($response);
     }
 }
Esempio n. 30
0
 protected function waitForStreamOnce($stream)
 {
     $deferred = new Deferred();
     $loop = $this->loop;
     $this->loop->addWriteStream($stream, function ($stream) use($loop, $deferred) {
         $loop->removeWriteStream($stream);
         $deferred->resolve($stream);
     });
     return $deferred->promise();
 }