From 47731286f20bee34b0667c50c19da2a667608647 Mon Sep 17 00:00:00 2001 From: roxblnfk Date: Mon, 12 Oct 2026 15:53:35 +0400 Subject: [PATCH] fix!: generate a configuration that RoadRunner 3 accepts feat: add nsq, kafka, google_pub_sub, centrifuge and protoreg sections Every section was checked against the RoadRunner 3 docs and the 3.0 config schema; the full render now passes the schema, where it had 12 errors. The `http.middleware` list stays `[gzip, static]`: RoadRunner 3 applies it left to right, so static files are now compressed, as the docs recommend. Broker sections pull in `jobs`, since their blocks only configure job pipelines, and `jobs` gets a memory pipeline so the starter runs without a broker. Values copied from RoadRunner's test fixtures are replaced with documented starters. BREAKING CHANGE: the `tcp`, `websockets`, `broadcast` and `reload` plugins are removed: RoadRunner 3 does not ship them. Assisted-By: Claude Opus 5.5 --- README.md | 5 +- src/Internal/Configuration/Generator.php | 2 +- src/Internal/Configuration/Plugins.php | 18 +++--- src/Internal/Configuration/Section/Amqp.php | 8 +++ .../Configuration/Section/Beanstalk.php | 9 ++- src/Internal/Configuration/Section/Boltdb.php | 2 +- .../Configuration/Section/Broadcast.php | 60 ------------------- .../Configuration/Section/Centrifuge.php | 38 ++++++++++++ .../Configuration/Section/Fileserver.php | 26 ++------ .../Configuration/Section/GooglePubSub.php | 38 ++++++++++++ src/Internal/Configuration/Section/Grpc.php | 23 +------ src/Internal/Configuration/Section/Jobs.php | 15 ++++- src/Internal/Configuration/Section/Kafka.php | 39 ++++++++++++ src/Internal/Configuration/Section/Kv.php | 12 +--- src/Internal/Configuration/Section/Logs.php | 34 ----------- src/Internal/Configuration/Section/Nats.php | 10 +++- .../Section/{Websockets.php => Nsq.php} | 16 +++-- src/Internal/Configuration/Section/Otel.php | 12 ++-- .../Configuration/Section/Protoreg.php | 42 +++++++++++++ src/Internal/Configuration/Section/Reload.php | 48 --------------- .../Configuration/Section/Service.php | 20 +------ src/Internal/Configuration/Section/Sqs.php | 12 +++- src/Internal/Configuration/Section/Status.php | 4 +- src/Internal/Configuration/Section/Tcp.php | 59 ------------------ .../Configuration/Section/Temporal.php | 32 +++------- .../Internal/Configuration/GeneratorTest.php | 31 +++++++++- 26 files changed, 285 insertions(+), 330 deletions(-) delete mode 100644 src/Internal/Configuration/Section/Broadcast.php create mode 100644 src/Internal/Configuration/Section/Centrifuge.php create mode 100644 src/Internal/Configuration/Section/GooglePubSub.php create mode 100644 src/Internal/Configuration/Section/Kafka.php rename src/Internal/Configuration/Section/{Websockets.php => Nsq.php} (60%) create mode 100644 src/Internal/Configuration/Section/Protoreg.php delete mode 100644 src/Internal/Configuration/Section/Reload.php delete mode 100644 src/Internal/Configuration/Section/Tcp.php diff --git a/README.md b/README.md index da4b6b1..1e0ac57 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,9 @@ See the [RoadRunner documentation](https://docs.roadrunner.dev) for the configur `plugin` and `preset` options, a configuration with the default plugins (`rpc`, `server`, `http`, `jobs`, `kv`, `metrics`) is created. Using the `plugin` option (shortcut `p`) can create an example configuration file with only plugins needed. For example, with http plugin only: `get-binary -p http`, http and jobs: `get-binary -p http -p jobs`. - Available plugins: `amqp`, `beanstalk`, `boltdb`, `broadcast`, `endure`, `fileserver`, `grpc`, `http`, `jobs`, `kv`, - `logs`, `metrics`, `nats`, `otel`, `redis`, `reload`, `rpc`, `server`, `service`, `sqs`, `status`, `tcp`, `temporal`, `websockets`. + Available plugins: `amqp`, `beanstalk`, `boltdb`, `centrifuge`, `endure`, `fileserver`, `google_pub_sub`, `grpc`, + `http`, `jobs`, `kafka`, `kv`, `logs`, `metrics`, `nats`, `nsq`, `otel`, `protoreg`, `redis`, `rpc`, `server`, + `service`, `sqs`, `status`, `temporal`. Using the `preset` option can create an example configuration file with popular plugins for different typical tasks. For example, with web preset: `get-binary --preset web`. Available presets: `web` (contains plugins `http`, `jobs`). diff --git a/src/Internal/Configuration/Generator.php b/src/Internal/Configuration/Generator.php index f2447d7..8ee5648 100644 --- a/src/Internal/Configuration/Generator.php +++ b/src/Internal/Configuration/Generator.php @@ -27,7 +27,7 @@ public function generate(Plugins $plugins): string { $this->collectSections($plugins->getPlugins()); - return Yaml::dump($this->getContent(), 10); + return Yaml::dump($this->getContent(), 10, 4, Yaml::DUMP_OBJECT_AS_MAP); } private function getContent(): array diff --git a/src/Internal/Configuration/Plugins.php b/src/Internal/Configuration/Plugins.php index 7898a3d..7bd1d0e 100644 --- a/src/Internal/Configuration/Plugins.php +++ b/src/Internal/Configuration/Plugins.php @@ -7,29 +7,30 @@ use Spiral\RoadRunner\Console\Internal\Configuration\Section\Amqp; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Beanstalk; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Boltdb; -use Spiral\RoadRunner\Console\Internal\Configuration\Section\Broadcast; +use Spiral\RoadRunner\Console\Internal\Configuration\Section\Centrifuge; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Endure; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Fileserver; +use Spiral\RoadRunner\Console\Internal\Configuration\Section\GooglePubSub; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Grpc; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Http; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Jobs; +use Spiral\RoadRunner\Console\Internal\Configuration\Section\Kafka; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Kv; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Logs; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Metrics; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Nats; +use Spiral\RoadRunner\Console\Internal\Configuration\Section\Nsq; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Otel; +use Spiral\RoadRunner\Console\Internal\Configuration\Section\Protoreg; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Redis; -use Spiral\RoadRunner\Console\Internal\Configuration\Section\Reload; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Rpc; use Spiral\RoadRunner\Console\Internal\Configuration\Section\SectionInterface; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Server; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Service; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Sqs; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Status; -use Spiral\RoadRunner\Console\Internal\Configuration\Section\Tcp; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Temporal; use Spiral\RoadRunner\Console\Internal\Configuration\Section\Version; -use Spiral\RoadRunner\Console\Internal\Configuration\Section\Websockets; /** * @internal @@ -45,28 +46,29 @@ final class Plugins Amqp::class, Beanstalk::class, Boltdb::class, - Broadcast::class, + Centrifuge::class, Endure::class, Fileserver::class, + GooglePubSub::class, Grpc::class, Http::class, Jobs::class, + Kafka::class, Kv::class, Logs::class, Metrics::class, Nats::class, + Nsq::class, Otel::class, + Protoreg::class, Redis::class, - Reload::class, Rpc::class, Server::class, Service::class, Sqs::class, Status::class, - Tcp::class, Temporal::class, Version::class, - Websockets::class, ]; /** diff --git a/src/Internal/Configuration/Section/Amqp.php b/src/Internal/Configuration/Section/Amqp.php index c994fb0..1ce6250 100644 --- a/src/Internal/Configuration/Section/Amqp.php +++ b/src/Internal/Configuration/Section/Amqp.php @@ -29,4 +29,12 @@ public function render(): array ], ]; } + + #[\Override] + public function getRequired(): array + { + return [ + Jobs::class, + ]; + } } diff --git a/src/Internal/Configuration/Section/Beanstalk.php b/src/Internal/Configuration/Section/Beanstalk.php index f74b093..c710f66 100644 --- a/src/Internal/Configuration/Section/Beanstalk.php +++ b/src/Internal/Configuration/Section/Beanstalk.php @@ -23,8 +23,15 @@ public function render(): array return [ self::NAME => [ 'addr' => 'tcp://127.0.0.1:11300', - 'timeout' => '10s', ], ]; } + + #[\Override] + public function getRequired(): array + { + return [ + Jobs::class, + ]; + } } diff --git a/src/Internal/Configuration/Section/Boltdb.php b/src/Internal/Configuration/Section/Boltdb.php index c401cf0..26d3a4c 100644 --- a/src/Internal/Configuration/Section/Boltdb.php +++ b/src/Internal/Configuration/Section/Boltdb.php @@ -22,7 +22,7 @@ public function render(): array { return [ self::NAME => [ - 'permissions' => 0777, + 'file' => 'rr.db', ], ]; } diff --git a/src/Internal/Configuration/Section/Broadcast.php b/src/Internal/Configuration/Section/Broadcast.php deleted file mode 100644 index 30c0635..0000000 --- a/src/Internal/Configuration/Section/Broadcast.php +++ /dev/null @@ -1,60 +0,0 @@ - [ - 'default' => [ - 'driver' => 'memory', - 'config' => [], - ], - // 'default-redis' => [ - // 'driver' => 'redis', - // 'config' => [ - // 'addrs' => [ - // 'localhost:6379' - // ], - // 'master_name' => '', - // 'username' => '', - // 'password' => '', - // 'db' => 0, - // 'sentinel_password' => '', - // 'route_by_latency' => false, - // 'route_randomly' => false, - // 'dial_timeout' => 0, - // 'max_retries' => 1, - // 'min_retry_backoff' => 0, - // 'max_retry_backoff' => 0, - // 'pool_size' => 0, - // 'min_idle_conns' => 0, - // 'max_conn_age' => 0, - // 'read_timeout' => 0, - // 'write_timeout' => 0, - // 'pool_timeout' => 0, - // 'idle_timeout' => 0, - // 'idle_check_freq' => 0, - // 'read_only' => false - // ] - // ] - ], - ]; - } -} diff --git a/src/Internal/Configuration/Section/Centrifuge.php b/src/Internal/Configuration/Section/Centrifuge.php new file mode 100644 index 0000000..a020064 --- /dev/null +++ b/src/Internal/Configuration/Section/Centrifuge.php @@ -0,0 +1,38 @@ + [ + 'proxy_address' => 'tcp://127.0.0.1:30000', + 'grpc_api_address' => '127.0.0.1:10000', + ], + ]; + } + + #[\Override] + public function getRequired(): array + { + return [ + Server::class, + ]; + } +} diff --git a/src/Internal/Configuration/Section/Fileserver.php b/src/Internal/Configuration/Section/Fileserver.php index b262b2a..57d7c31 100644 --- a/src/Internal/Configuration/Section/Fileserver.php +++ b/src/Internal/Configuration/Section/Fileserver.php @@ -24,26 +24,12 @@ public function render(): array self::NAME => [ 'address' => '127.0.0.1:10101', 'calculate_etag' => true, - 'weak' => false, - 'stream_request_body' => true, - // 'serve' => [ - // [ - // 'prefix' => '/foo', - // 'root' => '../../../tests', - // 'compress' => false, - // 'cache_duration' => 10, - // 'max_age' => 10, - // 'bytes_range' => true - // ], - // [ - // 'prefix' => '/foo/bar', - // 'root' => '../../../tests', - // 'compress' => false, - // 'cache_duration' => 10, - // 'max_age' => 10, - // 'bytes_range' => true - // ] - // ] + 'serve' => [ + [ + 'prefix' => '/', + 'root' => 'public', + ], + ], ], ]; } diff --git a/src/Internal/Configuration/Section/GooglePubSub.php b/src/Internal/Configuration/Section/GooglePubSub.php new file mode 100644 index 0000000..5dc5126 --- /dev/null +++ b/src/Internal/Configuration/Section/GooglePubSub.php @@ -0,0 +1,38 @@ + [ + 'insecure' => true, + 'endpoint' => '127.0.0.1:8085', + ], + ]; + } + + #[\Override] + public function getRequired(): array + { + return [ + Jobs::class, + ]; + } +} diff --git a/src/Internal/Configuration/Section/Grpc.php b/src/Internal/Configuration/Section/Grpc.php index d503b0f..7a51316 100644 --- a/src/Internal/Configuration/Section/Grpc.php +++ b/src/Internal/Configuration/Section/Grpc.php @@ -24,29 +24,8 @@ public function render(): array self::NAME => [ 'listen' => 'tcp://127.0.0.1:9001', 'proto' => [ - 'first.proto', - 'second.proto', + 'proto/helloworld.proto', ], - // 'tls' => [ - // 'key' => '', - // 'cert' => '', - // 'root_ca' => '', - // 'client_auth_type' => 'no_client_certs' - // ], - // 'max_send_msg_size' => 50, - // 'max_recv_msg_size' => 50, - // 'max_connection_idle' => '0s', - // 'max_connection_age' => '0s', - // 'max_connection_age_grace' => '0s8h', - // 'max_concurrent_streams' => 10, - // 'ping_time' => '1s', - // 'timeout' => '200s', - // 'pool' => [ - // 'num_workers' => 2, - // 'max_jobs' => 0, - // 'allocate_timeout' => '60s', - // 'destroy_timeout' => 60 - // ] ], ]; } diff --git a/src/Internal/Configuration/Section/Jobs.php b/src/Internal/Configuration/Section/Jobs.php index febd5b7..f6e390d 100644 --- a/src/Internal/Configuration/Section/Jobs.php +++ b/src/Internal/Configuration/Section/Jobs.php @@ -24,9 +24,20 @@ public function render(): array self::NAME => [ 'pool' => [ 'num_workers' => 2, - 'max_worker_memory' => 100, + 'supervisor' => [ + 'max_worker_memory' => 100, + ], + ], + 'consume' => ['local'], + 'pipelines' => [ + 'local' => [ + 'driver' => 'memory', + 'config' => [ + 'priority' => 10, + 'prefetch' => 10, + ], + ], ], - 'consume' => [], ], ]; } diff --git a/src/Internal/Configuration/Section/Kafka.php b/src/Internal/Configuration/Section/Kafka.php new file mode 100644 index 0000000..75a0279 --- /dev/null +++ b/src/Internal/Configuration/Section/Kafka.php @@ -0,0 +1,39 @@ + [ + 'brokers' => [ + '127.0.0.1:9092', + ], + ], + ]; + } + + #[\Override] + public function getRequired(): array + { + return [ + Jobs::class, + ]; + } +} diff --git a/src/Internal/Configuration/Section/Kv.php b/src/Internal/Configuration/Section/Kv.php index 0d4407e..294935d 100644 --- a/src/Internal/Configuration/Section/Kv.php +++ b/src/Internal/Configuration/Section/Kv.php @@ -24,18 +24,8 @@ public function render(): array self::NAME => [ 'local' => [ 'driver' => 'memory', - 'config' => [ - 'interval' => 60, - ], + 'config' => new \stdClass(), ], - // 'redis' => [ - // 'driver' => 'redis', - // 'config' => [ - // 'addrs' => [ - // 'localhost:6379' - // ] - // ] - // ] ], ]; } diff --git a/src/Internal/Configuration/Section/Logs.php b/src/Internal/Configuration/Section/Logs.php index c210bf6..1e0ed88 100644 --- a/src/Internal/Configuration/Section/Logs.php +++ b/src/Internal/Configuration/Section/Logs.php @@ -24,40 +24,6 @@ public function render(): array self::NAME => [ 'mode' => 'development', 'level' => 'debug', - // 'encoding' => 'console', - // 'line_ending' => '\n', - // 'output' => 'stderr', - // 'err_output' => 'stderr', - // 'file_logger_options' => [ - // 'log_output' => '/tmp/my.log', - // 'max_size' => 100, - // 'max_age' => 1, - // 'max_backups' => 5, - // 'compress' => false - // ], - // 'channels' => [ - // 'http' => [ - // 'mode' => 'development', - // 'level' => 'panic', - // 'encoding' => 'console', - // 'output' => 'stdout', - // 'err_output' => 'stderr' - // ], - // 'server' => [ - // 'mode' => 'production', - // 'level' => 'info', - // 'encoding' => 'json', - // 'output' => 'stdout', - // 'err_output' => 'stdout' - // ], - // 'rpc' => [ - // 'mode' => 'raw', - // 'level' => 'debug', - // 'encoding' => 'console', - // 'output' => 'stderr', - // 'err_output' => 'stdout' - // ] - // ] ], ]; } diff --git a/src/Internal/Configuration/Section/Nats.php b/src/Internal/Configuration/Section/Nats.php index 02a7e6f..ef5ff82 100644 --- a/src/Internal/Configuration/Section/Nats.php +++ b/src/Internal/Configuration/Section/Nats.php @@ -22,8 +22,16 @@ public function render(): array { return [ self::NAME => [ - 'addr' => 'demo.nats.io', + 'addr' => 'nats://127.0.0.1:4222', ], ]; } + + #[\Override] + public function getRequired(): array + { + return [ + Jobs::class, + ]; + } } diff --git a/src/Internal/Configuration/Section/Websockets.php b/src/Internal/Configuration/Section/Nsq.php similarity index 60% rename from src/Internal/Configuration/Section/Websockets.php rename to src/Internal/Configuration/Section/Nsq.php index 630b593..30c2600 100644 --- a/src/Internal/Configuration/Section/Websockets.php +++ b/src/Internal/Configuration/Section/Nsq.php @@ -7,9 +7,9 @@ /** * @internal */ -final class Websockets extends AbstractSection +final class Nsq extends AbstractSection { - private const NAME = 'websockets'; + private const NAME = 'nsq'; #[\Override] public static function getShortName(): string @@ -22,10 +22,16 @@ public function render(): array { return [ self::NAME => [ - 'broker' => 'default-redis', - 'allowed_origin' => '*', - 'path' => '/ws', + 'addr' => 'tcp://127.0.0.1:4150', ], ]; } + + #[\Override] + public function getRequired(): array + { + return [ + Jobs::class, + ]; + } } diff --git a/src/Internal/Configuration/Section/Otel.php b/src/Internal/Configuration/Section/Otel.php index ffd71bf..845b946 100644 --- a/src/Internal/Configuration/Section/Otel.php +++ b/src/Internal/Configuration/Section/Otel.php @@ -22,13 +22,13 @@ public function render(): array { return [ self::NAME => [ - 'insecure' => false, - 'compress' => false, - 'client' => 'http', + 'resource' => [ + 'service_name' => 'RoadRunner', + 'service_version' => '1.0.0', + ], + 'insecure' => true, 'exporter' => 'otlp', - 'custom_url' => '', - 'service_name' => 'RoadRunner', - 'service_version' => '1.0.0', + 'client' => 'http', 'endpoint' => '127.0.0.1:4318', ], ]; diff --git a/src/Internal/Configuration/Section/Protoreg.php b/src/Internal/Configuration/Section/Protoreg.php new file mode 100644 index 0000000..4ce175e --- /dev/null +++ b/src/Internal/Configuration/Section/Protoreg.php @@ -0,0 +1,42 @@ + [ + 'proto_path' => [ + 'proto', + ], + 'files' => [ + 'helloworld.proto', + ], + ], + ]; + } + + #[\Override] + public function getRequired(): array + { + return [ + Grpc::class, + ]; + } +} diff --git a/src/Internal/Configuration/Section/Reload.php b/src/Internal/Configuration/Section/Reload.php deleted file mode 100644 index bbf1e66..0000000 --- a/src/Internal/Configuration/Section/Reload.php +++ /dev/null @@ -1,48 +0,0 @@ - [ - 'interval' => '1s', - 'patterns' => [ - '.php', - ], - 'services' => [ - 'http' => [ - 'dirs' => [ - '.', - ], - 'recursive' => true, - 'ignore' => [ - 'vendor', - ], - 'patterns' => [ - '.php', - '.go', - '.md', - ], - ], - ], - ], - ]; - } -} diff --git a/src/Internal/Configuration/Section/Service.php b/src/Internal/Configuration/Section/Service.php index 0d4b7ef..e86dd31 100644 --- a/src/Internal/Configuration/Section/Service.php +++ b/src/Internal/Configuration/Section/Service.php @@ -22,25 +22,9 @@ public function render(): array { return [ self::NAME => [ - 'some_service_1' => [ - 'command' => 'php tests/plugins/service/test_files/loop.php', - 'env' => [ - 'foo' => 'BAR', - 'foo2' => 'BAR2', - ], + 'some_service' => [ + 'command' => 'php service.php', 'process_num' => 1, - 'exec_timeout' => 0, - 'remain_after_exit' => true, - 'restart_sec' => 1, - ], - 'some_service_2' => [ - 'command' => 'binary', - 'env' => [ - 'foo' => 'BAR', - 'foo2' => 'BAR2', - ], - 'process_num' => 1, - 'exec_timeout' => 0, 'remain_after_exit' => true, 'restart_sec' => 1, ], diff --git a/src/Internal/Configuration/Section/Sqs.php b/src/Internal/Configuration/Section/Sqs.php index e9986c5..2052928 100644 --- a/src/Internal/Configuration/Section/Sqs.php +++ b/src/Internal/Configuration/Section/Sqs.php @@ -22,12 +22,18 @@ public function render(): array { return [ self::NAME => [ - 'key' => 'api-key', + 'key' => 'access-key', 'secret' => 'api-secret', 'region' => 'us-west-1', - 'session_token' => 'test', - 'endpoint' => 'http://127.0.0.1:9324', ], ]; } + + #[\Override] + public function getRequired(): array + { + return [ + Jobs::class, + ]; + } } diff --git a/src/Internal/Configuration/Section/Status.php b/src/Internal/Configuration/Section/Status.php index 80efa25..91a3cf8 100644 --- a/src/Internal/Configuration/Section/Status.php +++ b/src/Internal/Configuration/Section/Status.php @@ -22,9 +22,7 @@ public function render(): array { return [ self::NAME => [ - 'address' => '127.0.0.1:2114', - 'unavailable_status_code' => 503, - ], + 'address' => '127.0.0.1:2114', ], ]; } } diff --git a/src/Internal/Configuration/Section/Tcp.php b/src/Internal/Configuration/Section/Tcp.php deleted file mode 100644 index 26a76be..0000000 --- a/src/Internal/Configuration/Section/Tcp.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'servers' => [ - 'server1' => [ - 'addr' => '127.0.0.1:7778', - // 'delimiter' => '\r\n', - // 'read_buf_size' => 1 - ], - // 'server2' => [ - // 'addr' => '127.0.0.1:8811', - // 'read_buf_size' => 10 - // ], - // 'server3' => [ - // 'addr' => '127.0.0.1:8812', - // 'delimiter' => '\r\n', - // 'read_buf_size' => 1 - // ] - ], - 'pool' => [ - 'command' => '', - 'num_workers' => 5, - 'max_jobs' => 0, - 'allocate_timeout' => '60s', - 'destroy_timeout' => '60s', - ], - ], - ]; - } - - #[\Override] - public function getRequired(): array - { - return [ - Server::class, - ]; - } -} diff --git a/src/Internal/Configuration/Section/Temporal.php b/src/Internal/Configuration/Section/Temporal.php index f94129f..012c52d 100644 --- a/src/Internal/Configuration/Section/Temporal.php +++ b/src/Internal/Configuration/Section/Temporal.php @@ -23,31 +23,15 @@ public function render(): array return [ self::NAME => [ 'address' => '127.0.0.1:7233', - // 'cache_size' => 10000, - // 'namespace' => 'default', - // 'codec' => 'proto', - // 'debug_level' => 2, - // 'metrics' => [ - // 'address' => '127.0.0.1:9091', - // 'type' => 'summary', - // 'prefix' => 'foobar' - // ], - // 'activities' => [ - // 'debug' => false, - // 'command' => 'php my-super-app.php', - // 'num_workers' => 0, - // 'max_jobs' => 64, - // 'allocate_timeout' => '60s', - // 'destroy_timeout' => '60s', - // 'supervisor' => [ - // 'watch_tick' => '1s', - // 'ttl' => '0s', - // 'idle_ttl' => '10s', - // 'max_worker_memory' => 128, - // 'exec_ttl' => '60s' - // ] - // ] ], ]; } + + #[\Override] + public function getRequired(): array + { + return [ + Server::class, + ]; + } } diff --git a/tests/Unit/Internal/Configuration/GeneratorTest.php b/tests/Unit/Internal/Configuration/GeneratorTest.php index 60d61f8..f846aac 100644 --- a/tests/Unit/Internal/Configuration/GeneratorTest.php +++ b/tests/Unit/Internal/Configuration/GeneratorTest.php @@ -25,7 +25,8 @@ public function generatesDefaultConfiguration(): void #[DataSet(['http'])] #[DataSet(['jobs'])] #[DataSet(['grpc'])] - #[DataSet(['tcp'])] + #[DataSet(['temporal'])] + #[DataSet(['centrifuge'])] public function addsServerForWorkerPlugins(string $plugin): void { $config = Yaml::parse((new Generator())->generate(Plugins::fromPlugins([$plugin]))); @@ -33,6 +34,34 @@ public function addsServerForWorkerPlugins(string $plugin): void Assert::same(\array_keys($config), ['version', 'rpc', $plugin, 'server']); } + #[DataSet(['amqp'])] + #[DataSet(['beanstalk'])] + #[DataSet(['google_pub_sub'])] + #[DataSet(['kafka'])] + #[DataSet(['nats'])] + #[DataSet(['nsq'])] + #[DataSet(['sqs'])] + public function addsJobsForBrokerPlugins(string $plugin): void + { + $config = Yaml::parse((new Generator())->generate(Plugins::fromPlugins([$plugin]))); + + Assert::same(\array_keys($config), ['version', 'rpc', $plugin, 'jobs', 'server']); + } + + public function addsGrpcForProtoreg(): void + { + $config = Yaml::parse((new Generator())->generate(Plugins::fromPlugins(['protoreg']))); + + Assert::same(\array_keys($config), ['version', 'rpc', 'protoreg', 'grpc', 'server']); + } + + public function rendersKvMemoryConfigAsMap(): void + { + $yaml = (new Generator())->generate(Plugins::fromPlugins(['kv'])); + + Assert::string($yaml)->matchesRegex('/^\s+config: \{\s*\}$/m'); + } + public function rendersEachSectionOnce(): void { $config = Yaml::parse((new Generator())->generate(Plugins::fromPlugins(['http', 'jobs', 'server'])));