diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..e03d597 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,22 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.yml] +indent_size = 2 + +[*.yaml] +indent_size = 2 + +[*.json] +indent_style = space +indent_size = 4 diff --git a/.gitattributes b/.gitattributes index bc4b7e4..e8daa2c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,10 +1,10 @@ * text=auto -/.github export-ignore -/tests export-ignore -/.* export-ignore -/phpunit.xml* export-ignore -/phpstan.* export-ignore -/psalm.* export-ignore -/infection.* export-ignore -/codecov.* export-ignore +/.* export-ignore +/config/ export-ignore +/resources/scripts/ export-ignore +/runtime/ export-ignore +/tests/ export-ignore + +/*.xml export-ignore +/*.xml.dist export-ignore diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 7d0c40e..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,10 +0,0 @@ -| Q | A | -|--------------|-------------------------------------------------------------------------------------------------------------------------| -| Bugfix? | ✔️/❌ | -| Breaks BC? | ✔️/❌ | -| New feature? | ✔️/❌ | -| Issues | #... | -| Docs PR | spiral/docs#... | - - diff --git a/.github/workflows/cs-fix.yml b/.github/workflows/cs-fix.yml new file mode 100644 index 0000000..0395b27 --- /dev/null +++ b/.github/workflows/cs-fix.yml @@ -0,0 +1,12 @@ +on: + push: + branches: + - '*' + +name: Fix Code Style + +jobs: + cs-fix: + permissions: + contents: write + uses: spiral/gh-actions/.github/workflows/cs-fix.yml@master diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php new file mode 100644 index 0000000..7bad12e --- /dev/null +++ b/.php-cs-fixer.dist.php @@ -0,0 +1,11 @@ +include(__DIR__ . '/src') + ->include(__FILE__) + ->allowRisky(true) + ->build(); diff --git a/composer.json b/composer.json index d9559a8..8f6fea9 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,6 @@ "support": { "docs": "https://docs.roadrunner.dev", "issues": "https://github.com/roadrunner-server/roadrunner/issues", - "forum": "https://forum.roadrunner.dev/", "chat": "https://discord.gg/V6EK4he" }, "require": { @@ -42,17 +41,21 @@ "ext-sockets": "*", "psr/log": "^2.0 || ^3.0", "spiral/goridge": "^4.1.0", - "spiral/roadrunner": "^2023.1 || ^2024.1", + "spiral/roadrunner": "^2023.1 || ^2024.1 || ^2025.1", "composer-runtime-api": "^2.0" }, "require-dev": { + "buggregator/trap": "^1.13", "jetbrains/phpstorm-attributes": "^1.0", - "phpunit/phpunit": "^10.0", - "vimeo/psalm": "^5.9", - "symfony/var-dumper": "^6.3 || ^7.0" + "phpunit/phpunit": "^10.5.45", + "spiral/code-style": "^2.2", + "vimeo/psalm": "^6.0" }, "scripts": { - "analyze": "psalm" + "cs:diff": "php-cs-fixer fix --dry-run -v --diff --show-progress dots", + "cs:fix": "php-cs-fixer fix -v", + "test": "phpunit", + "psalm": "psalm" }, "autoload": { "psr-4": { diff --git a/phpunit.xml b/phpunit.xml index afe153a..e1a9df2 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,6 +1,7 @@ - - tests + + tests/Unit - + + + + + + + + + + src - + diff --git a/psalm.xml b/psalm.xml index ce4a97e..71c6520 100644 --- a/psalm.xml +++ b/psalm.xml @@ -14,4 +14,19 @@ + + + + + + + + + + + + + + + diff --git a/src/Environment.php b/src/Environment.php index 1af6963..9c6c907 100644 --- a/src/Environment.php +++ b/src/Environment.php @@ -23,7 +23,14 @@ class Environment implements EnvironmentInterface */ public function __construct( private array $env = [], - ) { + ) {} + + public static function fromGlobals(): self + { + /** @var array $env */ + $env = [...$_ENV, ...$_SERVER]; + + return new self($env); } public function getMode(): string @@ -57,17 +64,9 @@ private function get(string $name, string $default = ''): string { if (isset($this->env[$name]) || \array_key_exists($name, $this->env)) { /** @psalm-suppress RedundantCastGivenDocblockType */ - return (string)$this->env[$name]; + return (string) $this->env[$name]; } return $default; } - - public static function fromGlobals(): self - { - /** @var array $env */ - $env = [...$_ENV, ...$_SERVER]; - - return new self($env); - } } diff --git a/src/Exception/RoadRunnerException.php b/src/Exception/RoadRunnerException.php index a07d2e5..cdfecf5 100644 --- a/src/Exception/RoadRunnerException.php +++ b/src/Exception/RoadRunnerException.php @@ -4,6 +4,4 @@ namespace Spiral\RoadRunner\Exception; -final class RoadRunnerException extends \RuntimeException -{ -} +final class RoadRunnerException extends \RuntimeException {} diff --git a/src/Informer/Worker.php b/src/Informer/Worker.php index 2503ee4..7b7a115 100644 --- a/src/Informer/Worker.php +++ b/src/Informer/Worker.php @@ -24,6 +24,5 @@ public function __construct( public float $cpuUsage, public string $command, public string $status, - ) { - } + ) {} } diff --git a/src/Informer/Workers.php b/src/Informer/Workers.php index 433bf77..96e24e5 100644 --- a/src/Informer/Workers.php +++ b/src/Informer/Workers.php @@ -11,8 +11,7 @@ final class Workers implements \Countable */ public function __construct( private readonly array $workers = [], - ) { - } + ) {} /** * @return array diff --git a/src/Internal/StdoutHandler.php b/src/Internal/StdoutHandler.php index f9fcebf..bb782c3 100644 --- a/src/Internal/StdoutHandler.php +++ b/src/Internal/StdoutHandler.php @@ -36,7 +36,7 @@ final class StdoutHandler */ public static function register(int $chunkSize = self::OB_CHUNK_SIZE): void { - assert($chunkSize >= 0, 'Invalid chunk size argument value'); + \assert($chunkSize >= 0, 'Invalid chunk size argument value'); self::restreamOutputBuffer($chunkSize); self::restreamHeaders(); @@ -50,7 +50,7 @@ public static function register(int $chunkSize = self::OB_CHUNK_SIZE): void */ private static function restreamHeaders(): void { - \header_register_callback(static function(): void { + \header_register_callback(static function (): void { $headers = \headers_list(); if ($headers !== []) { diff --git a/src/Logger.php b/src/Logger.php index 7163e1b..dd477f1 100644 --- a/src/Logger.php +++ b/src/Logger.php @@ -16,10 +16,10 @@ class Logger implements LoggerInterface */ public function log(mixed $level, string|\Stringable $message, array $context = []): void { - assert(\is_scalar($level), 'Invalid log level type'); - assert(\is_string($message), 'Invalid log message type'); + \assert(\is_scalar($level), 'Invalid log level type'); + \assert(\is_string($message), 'Invalid log message type'); - $this->write($this->format((string)$level, $message, $context)); + $this->write($this->format((string) $level, $message, $context)); } protected function write(string $message): void diff --git a/src/Message/Command/GetProcessId.php b/src/Message/Command/GetProcessId.php index 67c4d8d..3c21d01 100644 --- a/src/Message/Command/GetProcessId.php +++ b/src/Message/Command/GetProcessId.php @@ -10,6 +10,4 @@ /** * @psalm-immutable */ -final class GetProcessId extends Payload implements ControlMessage -{ -} +final class GetProcessId extends Payload implements ControlMessage {} diff --git a/src/Message/Command/Pong.php b/src/Message/Command/Pong.php index 1731a08..fbc3708 100644 --- a/src/Message/Command/Pong.php +++ b/src/Message/Command/Pong.php @@ -10,6 +10,4 @@ /** * @psalm-immutable */ -final class Pong extends Payload implements SkipMessage -{ -} +final class Pong extends Payload implements SkipMessage {} diff --git a/src/Message/Command/StreamStop.php b/src/Message/Command/StreamStop.php index b526bd4..ccc0754 100644 --- a/src/Message/Command/StreamStop.php +++ b/src/Message/Command/StreamStop.php @@ -10,6 +10,4 @@ /** * @psalm-immutable */ -final class StreamStop extends Payload implements SkipMessage -{ -} +final class StreamStop extends Payload implements SkipMessage {} diff --git a/src/Message/Command/WorkerStop.php b/src/Message/Command/WorkerStop.php index 200c33c..7614f31 100644 --- a/src/Message/Command/WorkerStop.php +++ b/src/Message/Command/WorkerStop.php @@ -10,6 +10,4 @@ /** * @psalm-immutable */ -final class WorkerStop extends Payload implements ControlMessage -{ -} +final class WorkerStop extends Payload implements ControlMessage {} diff --git a/src/Message/ControlMessage.php b/src/Message/ControlMessage.php index 166a482..8b177aa 100644 --- a/src/Message/ControlMessage.php +++ b/src/Message/ControlMessage.php @@ -7,6 +7,4 @@ /** * @internal */ -interface ControlMessage -{ -} +interface ControlMessage {} diff --git a/src/Message/SkipMessage.php b/src/Message/SkipMessage.php index d0462fe..9a93ee7 100644 --- a/src/Message/SkipMessage.php +++ b/src/Message/SkipMessage.php @@ -10,6 +10,4 @@ * after stream end because async and should be skipped in main worker loop. * @internal */ -interface SkipMessage -{ -} +interface SkipMessage {} diff --git a/src/PayloadFactory.php b/src/PayloadFactory.php index 5046200..c496ba4 100644 --- a/src/PayloadFactory.php +++ b/src/PayloadFactory.php @@ -70,4 +70,4 @@ private static function decode(string $json): array return $result; } -} \ No newline at end of file +} diff --git a/src/Version.php b/src/Version.php index 9637c8c..95be987 100644 --- a/src/Version.php +++ b/src/Version.php @@ -12,14 +12,13 @@ final class Version 'spiral/roadrunner', 'spiral/roadrunner-worker', ]; - public const VERSION_FALLBACK = 'dev-master'; public static function current(): string { foreach (self::PACKAGE_NAMES as $name) { if (InstalledVersions::isInstalled($name)) { - return \ltrim((string)InstalledVersions::getPrettyVersion($name), 'v'); + return \ltrim((string) InstalledVersions::getPrettyVersion($name), 'v'); } } diff --git a/src/Worker.php b/src/Worker.php index 1fdf43d..099cffb 100644 --- a/src/Worker.php +++ b/src/Worker.php @@ -36,9 +36,10 @@ class Worker implements StreamWorkerInterface /** @var array */ private array $payloads = []; - private bool $streamMode = false; /** @var int<0, max> Count of frames sent in stream mode */ private int $framesSent = 0; + + private bool $streamMode = false; private bool $shouldPing = false; private bool $waitingPong = false; @@ -52,6 +53,38 @@ public function __construct( } } + /** + * Create a new RoadRunner {@see Worker} using global + * environment ({@see Environment}) configuration. + */ + public static function create(bool $interceptSideEffects = true, LoggerInterface $logger = new Logger()): self + { + return static::createFromEnvironment( + env: Environment::fromGlobals(), + interceptSideEffects: $interceptSideEffects, + logger: $logger, + ); + } + + /** + * Create a new RoadRunner {@see Worker} using passed environment + * configuration. + */ + public static function createFromEnvironment( + EnvironmentInterface $env, + bool $interceptSideEffects = true, + LoggerInterface $logger = new Logger(), + ): self { + $address = $env->getRelayAddress(); + \assert($address !== '', 'Relay address must be specified in environment'); + + return new self( + relay: Relay::create($address), + interceptSideEffects: $interceptSideEffects, + logger: $logger, + ); + } + public function getLogger(): LoggerInterface { return $this->logger; @@ -235,7 +268,7 @@ private function sendFrame(Frame $frame): void } catch (GoridgeException $e) { throw new TransportException($e->getMessage(), $e->getCode(), $e); } catch (\Throwable $e) { - throw new RoadRunnerException($e->getMessage(), (int)$e->getCode(), $e); + throw new RoadRunnerException($e->getMessage(), (int) $e->getCode(), $e); } } @@ -244,38 +277,6 @@ private function encode(array $payload): string return \json_encode($payload, self::JSON_ENCODE_FLAGS); } - /** - * Create a new RoadRunner {@see Worker} using global - * environment ({@see Environment}) configuration. - */ - public static function create(bool $interceptSideEffects = true, LoggerInterface $logger = new Logger()): self - { - return static::createFromEnvironment( - env: Environment::fromGlobals(), - interceptSideEffects: $interceptSideEffects, - logger: $logger, - ); - } - - /** - * Create a new RoadRunner {@see Worker} using passed environment - * configuration. - */ - public static function createFromEnvironment( - EnvironmentInterface $env, - bool $interceptSideEffects = true, - LoggerInterface $logger = new Logger(), - ): self { - $address = $env->getRelayAddress(); - \assert($address !== '', 'Relay address must be specified in environment'); - - return new self( - relay: Relay::create($address), - interceptSideEffects: $interceptSideEffects, - logger: $logger - ); - } - private function sendProcessId(): void { $frame = new Frame($this->encode(['pid' => \getmypid()]), [], Frame::CONTROL);