From 9dc2c36d5a9e5d3cc7dcb490180b50d0eef5a2f6 Mon Sep 17 00:00:00 2001 From: Sergei Karii Date: Tue, 10 May 2022 12:27:27 +0300 Subject: [PATCH 1/4] feature(server): integrate tcp server and listenerManager --- bootstrap.php | 31 +++++++++++++++ composer.json | 5 ++- src/ListenerManager.php | 27 +++++++++++++ src/Listeners/DemoListener.php | 11 ++++++ src/Listeners/ListenerContract.php | 8 ++++ .../Manager/ListenerEventManagerInterface.php | 20 ++++++++++ .../Manager/TcpListenerEventManager.php | 31 +++++++++++++++ src/Server/ServerInterface.php | 30 +++++++++++++++ src/Server/TcpServer.php | 38 +++++++++++++++++++ src/ServerProvider.php | 35 +++++++++++++++++ 10 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 bootstrap.php create mode 100644 src/ListenerManager.php create mode 100644 src/Listeners/DemoListener.php create mode 100644 src/Listeners/ListenerContract.php create mode 100644 src/Listeners/Manager/ListenerEventManagerInterface.php create mode 100644 src/Listeners/Manager/TcpListenerEventManager.php create mode 100644 src/Server/ServerInterface.php create mode 100644 src/Server/TcpServer.php create mode 100644 src/ServerProvider.php diff --git a/bootstrap.php b/bootstrap.php new file mode 100644 index 0000000..72d4d1b --- /dev/null +++ b/bootstrap.php @@ -0,0 +1,31 @@ +setType('tcp'); +$tcpServer->setConfig([ + 'host' => '0.0.0.0', + 'port' => '1236' +]); + +// set listener manager +$tcpListenerEventManager = new TcpListenerEventManager(); +$tcpListenerEventManager->setListeners([ + new DemoListener() +]); + +// run +$serverProvider = new ServerProvider( + $tcpServer, + $tcpListenerEventManager +); + +$serverProvider->boot(); + diff --git a/composer.json b/composer.json index 40890d7..8a99959 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,10 @@ "require": { "predis/predis": "^1.1", "react/event-loop": "^1.1.1", - "dto/dto": "^3.2" + "dto/dto": "^3.2", + "react/stream": "^1.2", + "clue/redis-react": "^2.6", + "ext-sockets": "*" }, "require-dev": { "phpunit/phpunit": "^8.5", diff --git a/src/ListenerManager.php b/src/ListenerManager.php new file mode 100644 index 0000000..6877abe --- /dev/null +++ b/src/ListenerManager.php @@ -0,0 +1,27 @@ +listeners as $listener) { + $listener->handle($payload); + } + } + + /** + * @param ListenerContract[] $listeners + */ + public function setListeners(array $listeners): void { + $this->listeners = $listeners; + } +} \ No newline at end of file diff --git a/src/Listeners/DemoListener.php b/src/Listeners/DemoListener.php new file mode 100644 index 0000000..ca95e99 --- /dev/null +++ b/src/Listeners/DemoListener.php @@ -0,0 +1,11 @@ +listeners = $listeners; + } + + /** + * @param mixed $payload + * @return void + */ + public function handle($payload): void { + foreach ($this->listeners as $listener) { + $listener->handle($payload); + } + } +} \ No newline at end of file diff --git a/src/Server/ServerInterface.php b/src/Server/ServerInterface.php new file mode 100644 index 0000000..2445443 --- /dev/null +++ b/src/Server/ServerInterface.php @@ -0,0 +1,30 @@ +server = $server; + $this->listenerEventManager = $listenerEventManager; + } + + public function boot(): void + { + $this->server->start(); + + } + + +} \ No newline at end of file From e7ae0ba588222ed7bd1d50f86a370a638c624881 Mon Sep 17 00:00:00 2001 From: Sergei Karii Date: Tue, 10 May 2022 22:45:11 +0300 Subject: [PATCH 2/4] feature(server): add tcp server and demo listener --- bootstrap.php | 1 - src/ListenerManager.php | 6 +-- src/Listeners/DemoListener.php | 2 +- ...enerContract.php => ListenerInterface.php} | 2 +- .../Manager/ListenerEventManagerInterface.php | 10 +++- .../Manager/TcpListenerEventManager.php | 13 +++-- src/Server/ServerInterface.php | 7 +-- src/Server/TcpServer.php | 54 +++++++++++++++---- src/ServerProvider.php | 10 ++-- 9 files changed, 75 insertions(+), 30 deletions(-) rename src/Listeners/{ListenerContract.php => ListenerInterface.php} (77%) diff --git a/bootstrap.php b/bootstrap.php index 72d4d1b..a07ebff 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -9,7 +9,6 @@ // set server $tcpServer = new TcpServer(); -$tcpServer->setType('tcp'); $tcpServer->setConfig([ 'host' => '0.0.0.0', 'port' => '1236' diff --git a/src/ListenerManager.php b/src/ListenerManager.php index 6877abe..aefdc59 100644 --- a/src/ListenerManager.php +++ b/src/ListenerManager.php @@ -2,12 +2,12 @@ namespace Asiries335\redisSteamPhp; -use Asiries335\redisSteamPhp\Listeners\ListenerContract; +use Asiries335\redisSteamPhp\Listeners\ListenerInterface; class ListenerManager { /** - * @var ListenerContract[] + * @var ListenerInterface[] */ private array $listeners; @@ -19,7 +19,7 @@ public function runAll($payload) { } /** - * @param ListenerContract[] $listeners + * @param ListenerInterface[] $listeners */ public function setListeners(array $listeners): void { $this->listeners = $listeners; diff --git a/src/Listeners/DemoListener.php b/src/Listeners/DemoListener.php index ca95e99..fe0398b 100644 --- a/src/Listeners/DemoListener.php +++ b/src/Listeners/DemoListener.php @@ -2,7 +2,7 @@ namespace Asiries335\redisSteamPhp\Listeners; -class DemoListener implements ListenerContract +class DemoListener implements ListenerInterface { public function handle($payload) { diff --git a/src/Listeners/ListenerContract.php b/src/Listeners/ListenerInterface.php similarity index 77% rename from src/Listeners/ListenerContract.php rename to src/Listeners/ListenerInterface.php index da00ff9..8737fbd 100644 --- a/src/Listeners/ListenerContract.php +++ b/src/Listeners/ListenerInterface.php @@ -2,7 +2,7 @@ namespace Asiries335\redisSteamPhp\Listeners; -interface ListenerContract +interface ListenerInterface { public function handle($payload); } \ No newline at end of file diff --git a/src/Listeners/Manager/ListenerEventManagerInterface.php b/src/Listeners/Manager/ListenerEventManagerInterface.php index 8424eb0..9356924 100644 --- a/src/Listeners/Manager/ListenerEventManagerInterface.php +++ b/src/Listeners/Manager/ListenerEventManagerInterface.php @@ -2,12 +2,12 @@ namespace Asiries335\redisSteamPhp\Listeners\Manager; -use Asiries335\redisSteamPhp\Listeners\ListenerContract; +use Asiries335\redisSteamPhp\Listeners\ListenerInterface; interface ListenerEventManagerInterface { /** - * @param ListenerContract[] $listeners + * @param ListenerInterface[] $listeners * @return void */ public function setListeners(array $listeners): void; @@ -17,4 +17,10 @@ public function setListeners(array $listeners): void; * @return void */ public function handle($payload): void; + + + /** + * @return ListenerInterface[] + */ + public function list(): array; } \ No newline at end of file diff --git a/src/Listeners/Manager/TcpListenerEventManager.php b/src/Listeners/Manager/TcpListenerEventManager.php index 61ff301..b12767b 100644 --- a/src/Listeners/Manager/TcpListenerEventManager.php +++ b/src/Listeners/Manager/TcpListenerEventManager.php @@ -2,17 +2,17 @@ namespace Asiries335\redisSteamPhp\Listeners\Manager; -use Asiries335\redisSteamPhp\Listeners\ListenerContract; +use Asiries335\redisSteamPhp\Listeners\ListenerInterface; class TcpListenerEventManager implements ListenerEventManagerInterface { /** - * @var ListenerContract[] + * @var ListenerInterface[] */ private array $listeners; /** - * @param ListenerContract[] $listeners + * @param ListenerInterface[] $listeners * @return void */ public function setListeners(array $listeners): void { @@ -28,4 +28,11 @@ public function handle($payload): void { $listener->handle($payload); } } + + /** + * @return ListenerInterface[] + */ + public function list(): array { + return $this->listeners; + } } \ No newline at end of file diff --git a/src/Server/ServerInterface.php b/src/Server/ServerInterface.php index 2445443..0246043 100644 --- a/src/Server/ServerInterface.php +++ b/src/Server/ServerInterface.php @@ -2,15 +2,16 @@ namespace Asiries335\redisSteamPhp\Server; -use Asiries335\redisSteamPhp\Listeners\ListenerContract; +use Asiries335\redisSteamPhp\Listeners\ListenerInterface; interface ServerInterface { + /** - * @param string $type (tcp, udp or etc) + * @param ListenerInterface[] $listeners * @return void */ - public function setType(string $type): void; + public function setListeners(array $listeners): void; /** * @param array $config diff --git a/src/Server/TcpServer.php b/src/Server/TcpServer.php index 3ef40c2..8386b95 100644 --- a/src/Server/TcpServer.php +++ b/src/Server/TcpServer.php @@ -2,37 +2,73 @@ namespace Asiries335\redisSteamPhp\Server; -use Asiries335\redisSteamPhp\Listeners\ListenerContract; +use Asiries335\redisSteamPhp\Listeners\ListenerInterface; +use React\Socket\ConnectionInterface; +/** + * + */ class TcpServer implements ServerInterface { + + private array $config; + /** - * @param string $type - * @return void + * @var \React\Socket\ServerInterface */ - public function setType(string $type): void { - // TODO: Implement setType() method. - } + private $tcpServer = null; + + + /** + * @var ListenerInterface[] + */ + private array $listeners; /** * @param array $config * @return void */ public function setConfig(array $config): void { - // TODO: Implement setConfig() method. + $this->config = $config; } /** * @return void */ public function start(): void { - // TODO: Implement start() method. + if ($this->tcpServer !== null) { + return; + } + + $ip = $this->config['ip'] ?? '0.0.0.0'; + $port = $this->config['port'] ?? '2341'; + + $this->tcpServer = new \React\Socket\TcpServer($ip . ':' . $port); + + $this->tcpServer->on('connection', function (ConnectionInterface $connection) { + + $connection->pipe($connection); + + $connection->on('data', function ($payload) { + foreach ($this->listeners as $listener) { + $listener->handle($payload); + } + }); + }); } /** * @return void */ public function down(): void { - // TODO: Implement down() method. + $this->tcpServer->close(); + } + + /** + * @param array $listeners + * @return void + */ + public function setListeners(array $listeners): void { + $this->listeners = $listeners; } } \ No newline at end of file diff --git a/src/ServerProvider.php b/src/ServerProvider.php index 5d5f5e6..703da99 100644 --- a/src/ServerProvider.php +++ b/src/ServerProvider.php @@ -7,13 +7,10 @@ class ServerProvider { - /** - * @var ServerInterface - */ + private ServerInterface $server; private ListenerEventManagerInterface $listenerEventManager; - /** * @param ServerInterface $server * @param ListenerEventManagerInterface $listenerEventManager @@ -25,10 +22,9 @@ public function __construct(ServerInterface $server, ListenerEventManagerInterfa $this->listenerEventManager = $listenerEventManager; } - public function boot(): void - { + public function boot(): void { + $this->server->setListeners($this->listenerEventManager->list()); $this->server->start(); - } From 22f7e93d0d7f722d362ebacb9f69b339a2010d40 Mon Sep 17 00:00:00 2001 From: Sergei Karii Date: Tue, 10 May 2022 22:58:41 +0300 Subject: [PATCH 3/4] feature(server): refactoring --- bootstrap.php | 12 +++--- src/Consumer/ConsumerInterface.php | 8 ++++ src/Consumer/DemoConsumer.php | 11 ++++++ .../Manager/ConsumerManagerInterface.php | 26 +++++++++++++ src/Consumer/Manager/TcpConsumerManager.php | 38 +++++++++++++++++++ src/ListenerManager.php | 27 ------------- src/Listeners/DemoListener.php | 11 ------ src/Listeners/ListenerInterface.php | 8 ---- .../Manager/ListenerEventManagerInterface.php | 26 ------------- .../Manager/TcpListenerEventManager.php | 38 ------------------- src/Server/ServerInterface.php | 4 +- src/Server/TcpServer.php | 4 +- src/ServerProvider.php | 8 ++-- 13 files changed, 97 insertions(+), 124 deletions(-) create mode 100644 src/Consumer/ConsumerInterface.php create mode 100644 src/Consumer/DemoConsumer.php create mode 100644 src/Consumer/Manager/ConsumerManagerInterface.php create mode 100644 src/Consumer/Manager/TcpConsumerManager.php delete mode 100644 src/ListenerManager.php delete mode 100644 src/Listeners/DemoListener.php delete mode 100644 src/Listeners/ListenerInterface.php delete mode 100644 src/Listeners/Manager/ListenerEventManagerInterface.php delete mode 100644 src/Listeners/Manager/TcpListenerEventManager.php diff --git a/bootstrap.php b/bootstrap.php index a07ebff..799a06b 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -1,7 +1,7 @@ setListeners([ - new DemoListener() +$tcpConsumerManager = new TcpConsumerManager(); +$tcpConsumerManager->setConsumers([ + new DemoConsumer() ]); // run $serverProvider = new ServerProvider( $tcpServer, - $tcpListenerEventManager + $tcpConsumerManager ); $serverProvider->boot(); diff --git a/src/Consumer/ConsumerInterface.php b/src/Consumer/ConsumerInterface.php new file mode 100644 index 0000000..feed9c9 --- /dev/null +++ b/src/Consumer/ConsumerInterface.php @@ -0,0 +1,8 @@ +consumers = $consumers; + } + + /** + * @param mixed $payload + * @return void + */ + public function handle($payload): void { + foreach ($this->consumers as $consumer) { + $consumer->handle($payload); + } + } + + /** + * @return ConsumerInterface[] + */ + public function list(): array { + return $this->consumers; + } +} \ No newline at end of file diff --git a/src/ListenerManager.php b/src/ListenerManager.php deleted file mode 100644 index aefdc59..0000000 --- a/src/ListenerManager.php +++ /dev/null @@ -1,27 +0,0 @@ -listeners as $listener) { - $listener->handle($payload); - } - } - - /** - * @param ListenerInterface[] $listeners - */ - public function setListeners(array $listeners): void { - $this->listeners = $listeners; - } -} \ No newline at end of file diff --git a/src/Listeners/DemoListener.php b/src/Listeners/DemoListener.php deleted file mode 100644 index fe0398b..0000000 --- a/src/Listeners/DemoListener.php +++ /dev/null @@ -1,11 +0,0 @@ -listeners = $listeners; - } - - /** - * @param mixed $payload - * @return void - */ - public function handle($payload): void { - foreach ($this->listeners as $listener) { - $listener->handle($payload); - } - } - - /** - * @return ListenerInterface[] - */ - public function list(): array { - return $this->listeners; - } -} \ No newline at end of file diff --git a/src/Server/ServerInterface.php b/src/Server/ServerInterface.php index 0246043..6dc45fa 100644 --- a/src/Server/ServerInterface.php +++ b/src/Server/ServerInterface.php @@ -2,13 +2,13 @@ namespace Asiries335\redisSteamPhp\Server; -use Asiries335\redisSteamPhp\Listeners\ListenerInterface; +use Asiries335\redisSteamPhp\Consumer\ConsumerInterface; interface ServerInterface { /** - * @param ListenerInterface[] $listeners + * @param ConsumerInterface[] $listeners * @return void */ public function setListeners(array $listeners): void; diff --git a/src/Server/TcpServer.php b/src/Server/TcpServer.php index 8386b95..e1b732a 100644 --- a/src/Server/TcpServer.php +++ b/src/Server/TcpServer.php @@ -2,7 +2,7 @@ namespace Asiries335\redisSteamPhp\Server; -use Asiries335\redisSteamPhp\Listeners\ListenerInterface; +use Asiries335\redisSteamPhp\Consumer\ConsumerInterface; use React\Socket\ConnectionInterface; /** @@ -20,7 +20,7 @@ class TcpServer implements ServerInterface /** - * @var ListenerInterface[] + * @var ConsumerInterface[] */ private array $listeners; diff --git a/src/ServerProvider.php b/src/ServerProvider.php index 703da99..e5f18fd 100644 --- a/src/ServerProvider.php +++ b/src/ServerProvider.php @@ -2,22 +2,22 @@ namespace Asiries335\redisSteamPhp; -use Asiries335\redisSteamPhp\Listeners\Manager\ListenerEventManagerInterface; +use Asiries335\redisSteamPhp\Consumer\Manager\ConsumerManagerInterface; use Asiries335\redisSteamPhp\Server\ServerInterface; class ServerProvider { private ServerInterface $server; - private ListenerEventManagerInterface $listenerEventManager; + private ConsumerManagerInterface $listenerEventManager; /** * @param ServerInterface $server - * @param ListenerEventManagerInterface $listenerEventManager + * @param ConsumerManagerInterface $listenerEventManager * * @return void */ - public function __construct(ServerInterface $server, ListenerEventManagerInterface $listenerEventManager) { + public function __construct(ServerInterface $server, ConsumerManagerInterface $listenerEventManager) { $this->server = $server; $this->listenerEventManager = $listenerEventManager; } From 9e3e50691b0adbf97d4ab6fce6947c254684aa39 Mon Sep 17 00:00:00 2001 From: Sergei Karii Date: Tue, 10 May 2022 23:03:36 +0300 Subject: [PATCH 4/4] feature(server): refactoring #1 --- src/Server/ServerInterface.php | 4 ++-- src/Server/TcpServer.php | 12 ++++++------ src/ServerProvider.php | 11 +++++------ 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/Server/ServerInterface.php b/src/Server/ServerInterface.php index 6dc45fa..e65ea0c 100644 --- a/src/Server/ServerInterface.php +++ b/src/Server/ServerInterface.php @@ -8,10 +8,10 @@ interface ServerInterface { /** - * @param ConsumerInterface[] $listeners + * @param ConsumerInterface[] $consumers * @return void */ - public function setListeners(array $listeners): void; + public function setConsumers(array $consumers): void; /** * @param array $config diff --git a/src/Server/TcpServer.php b/src/Server/TcpServer.php index e1b732a..09f1713 100644 --- a/src/Server/TcpServer.php +++ b/src/Server/TcpServer.php @@ -22,7 +22,7 @@ class TcpServer implements ServerInterface /** * @var ConsumerInterface[] */ - private array $listeners; + private array $consumers; /** * @param array $config @@ -50,8 +50,8 @@ public function start(): void { $connection->pipe($connection); $connection->on('data', function ($payload) { - foreach ($this->listeners as $listener) { - $listener->handle($payload); + foreach ($this->consumers as $consumer) { + $consumer->handle($payload); } }); }); @@ -65,10 +65,10 @@ public function down(): void { } /** - * @param array $listeners + * @param ConnectionInterface[] $consumers * @return void */ - public function setListeners(array $listeners): void { - $this->listeners = $listeners; + public function setConsumers(array $consumers): void { + $this->consumers = $consumers; } } \ No newline at end of file diff --git a/src/ServerProvider.php b/src/ServerProvider.php index e5f18fd..b935d32 100644 --- a/src/ServerProvider.php +++ b/src/ServerProvider.php @@ -7,23 +7,22 @@ class ServerProvider { - private ServerInterface $server; - private ConsumerManagerInterface $listenerEventManager; + private ConsumerManagerInterface $consumerManager; /** * @param ServerInterface $server - * @param ConsumerManagerInterface $listenerEventManager + * @param ConsumerManagerInterface $consumerManager * * @return void */ - public function __construct(ServerInterface $server, ConsumerManagerInterface $listenerEventManager) { + public function __construct(ServerInterface $server, ConsumerManagerInterface $consumerManager) { $this->server = $server; - $this->listenerEventManager = $listenerEventManager; + $this->consumerManager = $consumerManager; } public function boot(): void { - $this->server->setListeners($this->listenerEventManager->list()); + $this->server->setConsumers($this->consumerManager->list()); $this->server->start(); }