diff --git a/Rpc/Producer.php b/Rpc/Producer.php index e08be376..42f9b03b 100644 --- a/Rpc/Producer.php +++ b/Rpc/Producer.php @@ -16,84 +16,121 @@ use Snowflake\Snowflake; class Producer extends Component { - private array $producers = []; + private array $producers = []; - private array $classAlias = []; + private array $classAlias = []; - private array $consumers = []; + private array $consumers = []; - /** - * @param string $name - * @param array $handler - * @param array $node - */ - public function addProducer(string $name, array $handler, array $node) - { - $this->classAlias[get_class($handler[0])] = $name; - - $this->consumers[$name] = $handler[0]; - - $this->producers[$name] = $node; - } + private array $cmds = []; - /** - * @param $name - * @return mixed - * @throws Exception - */ - public function get($name): mixed - { - if (!isset($this->consumers[$name])) { - throw new Exception('Unknown rpc client.'); - } - return $this->consumers[$name]; - } + /** + * @param string $name + * @param array $handler + * @param array $node + */ + public function addProducer(string $name, array $handler, array $node) + { + $this->classAlias[get_class($handler[0])] = $name; + + $this->consumers[$name] = $handler[0]; + + $this->producers[$name] = $node; + } - /** - * @param string $name - * @return mixed - * @throws Exception - */ - public function getClient(string $name): Client - { - if (!is_array($producer = $this->producers[$name] ?? null)) { - throw new Exception('Unknown rpc client config.'); - } - $producerName = $this->getName($name, $producer); + /** + * @param string $name + * @param array $handler + * @param array $node + */ + public function addConsumer(string $cmd, array $handler) + { + $class = get_class($handler[0]); - $snowflake = Snowflake::app(); - if (!$snowflake->has($producerName)) { - return $snowflake->set($producerName, ['class' => Client::class, 'config' => $producer]); - } else { - return $snowflake->get($producerName); - } - } + if (!isset($this->classAlias[$class])) { + return; + } + + $name = $this->classAlias[$class]; + + $this->cmds[$name . '.' . $cmd] = $handler; + } - /** - * @param $name - * @return Client|bool - * @throws Exception - */ - public function __get($name): Client|bool - { - return $this->get($name); // TODO: Change the autogenerated stub - } + /** + * @param $cmd + * @param mixed ...$params + * @return false|mixed + */ + public function dispatch($cmd, mixed ...$params) + { + $handler = $this->cmds[$cmd] ?? null; + if (empty($handler)) { + return false; + } + return call_user_func($handler, ...$params); + } - /** - * @param $name - * @param $rand - * @return string - */ - private function getName($name, $rand): string - { - return 'rpc.client.' . $name . '.' . $rand['host']; - } + /** + * @param $name + * @return mixed + * @throws Exception + */ + public function get($name): mixed + { + if (!isset($this->consumers[$name])) { + throw new Exception('Unknown rpc client.'); + } + return $this->consumers[$name]; + } + + + /** + * @param string $name + * @return mixed + * @throws Exception + */ + public function getClient(string $name): Client + { + if (!is_array($producer = $this->producers[$name] ?? null)) { + throw new Exception('Unknown rpc client config.'); + } + $producerName = $this->getName($name, $producer); + + $snowflake = Snowflake::app(); + if (!$snowflake->has($producerName)) { + return $snowflake->set($producerName, ['class' => Client::class, 'config' => $producer]); + } else { + return $snowflake->get($producerName); + } + } + + + /** + * @param $name + * @return Client|bool + * @throws Exception + */ + public function __get($name): Client|bool + { + return $this->get($name); // TODO: Change the autogenerated stub + } + + + /** + * @param $name + * @param $rand + * @return string + */ + private function getName($name, $rand): string + { + return 'rpc.client.' . $name . '.' . $rand['host']; + } }