예제 #1
0
파일: Command.php 프로젝트: khelle/surume
 /**
  * @param mixed[] $params
  * @return PromiseInterface
  */
 public function execute($params = [])
 {
     $promise = Promise::doResolve($params);
     return $promise->then(function ($params) {
         return $this->command($params);
     });
 }
예제 #2
0
 /**
  * @param Error|Exception $ex
  * @param mixed[] $params
  * @return PromiseInterface
  */
 public function handle($ex, $params = [])
 {
     foreach ($this->requires as $require) {
         if (!isset($params[$require])) {
             return Promise::doReject(new IllegalCallException('Missing parameter [' . $require . '] for [' . get_class($this) . '].'));
         }
     }
     return Promise::doResolve([$ex, $params])->spread(function ($ex, $params) {
         return $this->handler($ex, $params);
     });
 }
예제 #3
0
 /**
  * @param Error|Exception $ex
  * @param mixed[] $params
  * @return mixed
  * @throws RejectionException
  */
 protected function handler($ex, $params = [])
 {
     $promise = Promise::doResolve();
     foreach ($this->handlers as $handler) {
         $current = $handler;
         $promise = $promise->then(function ($value) use($ex, $params, $current) {
             return Promise::doResolve($current->handle($ex, $params));
         });
     }
     return $promise;
 }
예제 #4
0
 /**
  * @param mixed[] $params
  * @return mixed
  */
 protected function command($params = [])
 {
     $runtime = $this->runtime;
     $channel = $this->channel;
     $promise = Promise::doResolve();
     return $promise->then(function () use($runtime) {
         return $runtime->manager()->getRuntimes();
     })->then(function ($children) use($channel) {
         $promises = [];
         foreach ($children as $childAlias) {
             $req = new Request($channel, $childAlias, new RuntimeCommand('arch:status'));
             $promises[] = $req->call();
         }
         return Promise::all($promises);
     })->then(function ($childrenData) use($runtime) {
         return ['parent' => $runtime->parent(), 'alias' => $runtime->alias(), 'name' => $runtime->name(), 'state' => $runtime->state(), 'children' => $childrenData];
     });
 }
예제 #5
0
 /**
  * @param Error|Exception $ex
  * @param mixed[] $params
  * @param int $try
  * @return PromiseInterface
  */
 public function handle($ex, $params = [], &$try = 0)
 {
     $classBaseEx = get_class($ex);
     $classes = array_merge([$classBaseEx], class_parents($ex));
     $indexMin = -1;
     $chosen = null;
     foreach ($classes as $class) {
         $indexCurrent = array_search($class, array_keys($this->rules), true);
         if ($indexCurrent !== false && ($indexMin === -1 || $indexCurrent < $indexMin)) {
             $indexMin = $indexCurrent;
             $chosen = $class;
         }
     }
     if ($chosen === null) {
         return Promise::doReject(new ExecutionException("SolverInterface [{$classBaseEx}] is not registered."));
     }
     $try++;
     $params = array_merge($this->params, $params);
     $valueOrPromise = $this->getHandler($chosen)->handle($ex, $params);
     return Promise::doResolve($valueOrPromise);
 }
예제 #6
0
 /**
  * @param Error|Exception $ex
  * @param mixed[] $params
  * @return mixed
  */
 protected function handler($ex, $params = [])
 {
     $this->runtime->fail($ex, $params);
     return Promise::doResolve('Runtime has handled failure.');
 }
예제 #7
0
 /**
  * @return PromiseInterface
  */
 public function stop()
 {
     $state = $this->getState();
     if ($state === Runtime::STATE_CREATED || $state === Runtime::STATE_DESTROYED) {
         return Promise::doReject(new RejectionException("It is not possible to stop runtime from state [{$state}]."));
     }
     if ($state !== Runtime::STATE_STOPPED) {
         $this->setState(Runtime::STATE_STOPPED);
         $emitter = $this->eventEmitter();
         $emitter->emit('beforeStop');
         $emitter->emit('stop');
         $emitter->emit('afterStop');
     }
     return Promise::doResolve('Runtime has been stopped.');
 }
예제 #8
0
 /**
  * @param int $flags
  * @return PromiseInterface
  */
 public function flushThreads($flags = Runtime::DESTROY_KEEP)
 {
     return Promise::doResolve("Threads have been flushed.");
 }
예제 #9
0
 /**
  * @param int $flags
  * @return PromiseInterface
  */
 public function flushProcesses($flags = Runtime::DESTROY_KEEP)
 {
     return Promise::doResolve("Processes have been flushed.");
 }
예제 #10
0
 /**
  * @return PromiseInterface
  */
 public function getProcesses()
 {
     $list = [];
     foreach ($this->processes as $alias => $process) {
         $list[] = $alias;
     }
     return Promise::doResolve($list);
 }
예제 #11
0
 /**
  * @return PromiseInterface
  */
 public function getThreads()
 {
     $list = [];
     foreach ($this->threads as $alias => $wrapper) {
         $list[] = $alias;
     }
     return Promise::doResolve($list);
 }