diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0f09d0b --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.cache +.idea +.vscode +vendor/ diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php new file mode 100644 index 0000000..1b4f0b7 --- /dev/null +++ b/.php-cs-fixer.php @@ -0,0 +1,99 @@ +setRiskyAllowed(true) + ->setRules([ + '@PSR2' => true, + '@Symfony' => true, + '@DoctrineAnnotation' => true, + '@PhpCsFixer' => true, + 'header_comment' => [ + 'comment_type' => 'PHPDoc', + 'header' => $header, + 'separate' => 'none', + 'location' => 'after_declare_strict', + ], + 'array_syntax' => [ + 'syntax' => 'short' + ], + 'list_syntax' => [ + 'syntax' => 'short' + ], + 'concat_space' => [ + 'spacing' => 'one' + ], + 'blank_line_before_statement' => [ + 'statements' => [ + 'declare', + ], + ], + 'general_phpdoc_annotation_remove' => [ + 'annotations' => [ + 'author' + ], + ], + 'ordered_imports' => [ + 'imports_order' => [ + 'class', 'function', 'const', + ], + 'sort_algorithm' => 'alpha', + ], + 'single_line_comment_style' => [ + 'comment_types' => [ + ], + ], + 'yoda_style' => [ + 'always_move_variable' => false, + 'equal' => false, + 'identical' => false, + ], + 'phpdoc_align' => [ + 'align' => 'left', + ], + 'multiline_whitespace_before_semicolons' => [ + 'strategy' => 'no_multi_line', + ], + 'constant_case' => [ + 'case' => 'lower', + ], + 'global_namespace_import' => [ + 'import_classes' => true, + 'import_constants' => true, + 'import_functions' => true, + ], + 'class_attributes_separation' => true, + 'combine_consecutive_unsets' => true, + 'declare_strict_types' => true, + 'linebreak_after_opening_tag' => true, + 'lowercase_static_reference' => true, + 'no_useless_else' => true, + 'no_unused_imports' => true, + 'not_operator_with_successor_space' => true, + 'not_operator_with_space' => false, + 'ordered_class_elements' => true, + 'php_unit_strict' => false, + 'phpdoc_separation' => false, + 'single_quote' => true, + 'standardize_not_equals' => true, + 'multiline_comment_opening_closing' => true, + 'global_namespace_import' => [ + 'import_classes' => true, + 'import_constants' => true, + 'import_functions' => true, + ], + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->exclude('vendor') + ->in(__DIR__) + ) + ->setUsingCache(true); diff --git a/LICENSE b/LICENSE index c35d3f5..36eac04 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) Hyperf +Copyright (c) Hyperf & OpenCodeCo Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md new file mode 100644 index 0000000..7193034 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# Hyperf Tracer + +🔭 Drop-in replacement for the `hyperf/tracer` component. + +Suited for special needs, especially for OpenTelemetry, New Relic and Dynatrace platforms. + +## Getting started + +### Install + +#### Add OpenCodeCo's Composer repository: +```shell +composer config repositories.opencodeco composer https://composer.opencodeco.dev +``` + +#### Update your `hyperf/tracer`: +```shell +composer update hyperf/tracer +``` diff --git a/class_map/Map.php b/class_map/Map.php index be7bde9..e5e9035 100644 --- a/class_map/Map.php +++ b/class_map/Map.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Zipkin\Propagation; diff --git a/class_map/SpanContext.php b/class_map/SpanContext.php new file mode 100644 index 0000000..425889c --- /dev/null +++ b/class_map/SpanContext.php @@ -0,0 +1,98 @@ +baggage = $baggage ?? []; + } + + #[ReturnTypeWillChange] + public function getIterator(): ArrayIterator|iterable + { + return new ArrayIterator($this->baggage); + } + + public function getBaggageItem(string $key): ?string + { + return $this->baggage[$key] ?? null; + } + + /** + * @return SpanContext + */ + public function withBaggageItem(string $key, string $value): OTSpanContext + { + return new self( + $this->traceId, + $this->spanId, + $this->parentId, + $this->flags, + [$key => $value] + $this->baggage + ); + } + + public function getTraceId(): string + { + return $this->traceId; + } + + public function setTraceId(string $traceId): self + { + $this->traceId = $traceId; + return $this; + } + + public function getParentId(): ?string + { + return $this->parentId; + } + + public function getSpanId(): string + { + return $this->spanId; + } + + public function getFlags(): ?int + { + return $this->flags; + } + + public function getBaggage(): array + { + return $this->baggage; + } + + public function getDebugId(): ?int + { + return $this->debugId; + } + + public function isDebugIdContainerOnly(): bool + { + return ($this->traceId === null) && ($this->debugId !== null); + } +} diff --git a/class_map/TextCodec.php b/class_map/TextCodec.php new file mode 100644 index 0000000..9c35b46 --- /dev/null +++ b/class_map/TextCodec.php @@ -0,0 +1,207 @@ +urlEncoding = $urlEncoding; + $this->traceIdHeader = str_replace('_', '-', strtolower($traceIdHeader)); + $this->baggagePrefix = str_replace('_', '-', strtolower($baggageHeaderPrefix)); + $this->debugIdHeader = str_replace('_', '-', strtolower($debugIdHeader)); + $this->prefixLength = strlen($baggageHeaderPrefix); + $this->openTelemetryCodec = new TextCodecOtel(); + } + + /** + * {@inheritdoc} + * + * @param SpanContext $spanContext + * @param mixed $carrier + * + * @return void + * @see \Jaeger\Tracer::inject + * + */ + public function inject(SpanContext $spanContext, &$carrier) + { + $this->openTelemetryCodec->inject($spanContext, $carrier); + + $carrier[$this->traceIdHeader] = $this->spanContextToString( + $spanContext->getTraceId(), + $spanContext->getSpanId(), + $spanContext->getParentId(), + $spanContext->getFlags() + ); + + $baggage = $spanContext->getBaggage(); + if (empty($baggage)) { + return; + } + + foreach ($baggage as $key => $value) { + $encodedValue = $value; + + if ($this->urlEncoding) { + $encodedValue = urlencode($value); + } + $headerName = $this->baggagePrefix . $key; + + if (!GuzzleHeaderValidate::isValidHeader($headerName, $encodedValue)) { + continue; + } + $carrier[$headerName] = $encodedValue; + } + } + + /** + * {@inheritdoc} + * + * @param mixed $carrier + * @return SpanContext|null + * + * @throws Exception + * @see \Jaeger\Tracer::extract + * + */ + public function extract($carrier) + { + $spanContext = $this->openTelemetryCodec->extract($carrier); + if ($spanContext !== null) { + return $spanContext; + } + + $traceId = null; + $spanId = null; + $parentId = null; + $flags = null; + $baggage = null; + $debugId = null; + + foreach ((array)$carrier as $key => $value) { + $ucKey = strtolower($key); + + if ($ucKey === $this->traceIdHeader) { + if ($this->urlEncoding) { + $value = urldecode($value); + } + [$traceId, $spanId, $parentId, $flags] = + $this->spanContextFromString($value); + } elseif ($this->startsWith($ucKey, $this->baggagePrefix)) { + if ($this->urlEncoding) { + $value = urldecode($value); + } + $attrKey = substr($key, $this->prefixLength); + if ($baggage === null) { + $baggage = [strtolower($attrKey) => $value]; + } else { + $baggage[strtolower($attrKey)] = $value; + } + } elseif ($ucKey === $this->debugIdHeader) { + if ($this->urlEncoding) { + $value = urldecode($value); + } + $debugId = $value; + } + } + + if ($traceId === null && $baggage !== null) { + throw new Exception('baggage without trace ctx'); + } + + if ($traceId === null) { + if ($debugId !== null) { + return new SpanContext(null, null, null, null, [], $debugId); + } + return null; + } + + return new SpanContext($traceId, $spanId, $parentId, $flags, $baggage); + } + + /** + * Store a span context to a string. + * + * @param int $traceId + * @param int $spanId + * @param int $parentId + * @param int $flags + * @return string + */ + private function spanContextToString($traceId, $spanId, $parentId, $flags) + { + $parentId = $parentId ?? 0; + if (is_int($traceId)) { + $traceId = sprintf('%016x', $traceId); + } + return sprintf('%s:%x:%x:%x', $traceId, $spanId, $parentId, $flags); + } + + /** + * Create a span context from a string. + * + * @param string $value + * @return array + * + * @throws Exception + */ + private function spanContextFromString($value): array + { + $parts = explode(':', $value); + + if (count($parts) != 4) { + throw new Exception('Malformed tracer state string.'); + } + + return [ + $parts[0], + CodecUtility::hexToInt64($parts[1]), + CodecUtility::hexToInt64($parts[2]), + $parts[3], + ]; + } + + /** + * Checks that a string ($haystack) starts with a given prefix ($needle). + * + * @param string $haystack + * @param string $needle + * @return bool + */ + private function startsWith(string $haystack, string $needle): bool + { + return substr($haystack, 0, strlen($needle)) == $needle; + } +} diff --git a/class_map/ThriftUdpTransport.php b/class_map/ThriftUdpTransport.php index b22f3ee..90ab61c 100644 --- a/class_map/ThriftUdpTransport.php +++ b/class_map/ThriftUdpTransport.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Jaeger; @@ -25,39 +25,19 @@ use Thrift\Transport\TTransport; use Throwable; +use function Hyperf\Support\env; + class ThriftUdpTransport extends TTransport { - /** - * @var string - */ - private $host; - - /** - * @var int - */ - private $port; - - /** - * @var LoggerInterface - */ - private $logger; - - /** - * @var null|resource|Socket - */ - private $socket; + private null|Socket $socket = null; - /** - * @var ?Channel - */ - private $chan; + private ?Channel $chan = null; - public function __construct(string $host, int $port, ?LoggerInterface $logger = null) - { - $this->host = $host; - $this->port = $port; - $this->logger = $logger ?? new NullLogger(); - } + public function __construct( + private string $host, + private int $port, + private LoggerInterface $logger + ) {} /** * Whether this transport is open. @@ -141,9 +121,17 @@ public function write($buf) $this->loop(); } - $this->chan->push(function () use ($buf) { + $pushed = $this->chan->push(function () use ($buf) { $this->doWrite($buf); - }); + }, (float) env('TRACE_THRIFT_UDP_TIMEOUT', 0.1)); + + if (! $pushed) { + $this->logger->error('ThriftUdpTransport error:' . match (true) { + $this->chan->isTimeout() => 'Channel Timeout', + $this->chan->isClosing() => 'Channel Close', + default => 'Channel Error' + }); + } } private function doOpen(): void @@ -172,7 +160,14 @@ private function loop(): void $this->chan = new Channel(1); Coroutine::create(function () { while (true) { - $this->doOpen(); + try { + $this->doOpen(); + } catch (Throwable $e) { + $this->chan->close(); + $this->chan = null; + throw $e; + } + while (true) { try { $closure = $this->chan->pop(); @@ -181,13 +176,7 @@ private function loop(): void } $closure->call($this); } catch (Throwable $e) { - if (ApplicationContext::hasContainer()) { - if (ApplicationContext::getContainer()->has(StdoutLoggerInterface::class)) { - ApplicationContext::getContainer() - ->get(StdoutLoggerInterface::class) - ->error('ThriftUdpTransport error:' . $e->getMessage()); - } - } + $this->logger->error('ThriftUdpTransport error:' . $e->getMessage()); @socket_close($this->socket); $this->socket = null; break; diff --git a/composer.json b/composer.json index e3f3dbf..2130750 100644 --- a/composer.json +++ b/composer.json @@ -1,12 +1,13 @@ { "name": "hyperf/tracer", - "description": "A open tracing system implemented for Hyperf or other coroutine framework", + "description": "Drop-in replacement for the Hyperf Tracer component.", "license": "MIT", "keywords": [ "php", "hyperf", "open-tracing", - "zipkin" + "zipkin", + "jaeger" ], "homepage": "https://hyperf.io", "support": { @@ -23,8 +24,19 @@ "hyperf/support": "~3.1.0", "hyperf/utils": "~3.1.0", "jcchavezs/zipkin-opentracing": "^2.0", + "jonahgeorge/jaeger-client-php": "^1.4", "opentracing/opentracing": "^1.0", - "psr/http-message": "^1.0 || ^2.0" + "psr/http-message": "^1.0|^2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.21", + "hyperf/config": "^3.0", + "hyperf/testing": "^3.0", + "mockery/mockery": "^1.6", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-mockery": "^1.1", + "rector/rector": "^0.17.5" }, "suggest": { "hyperf/event": "Required to use DbQueryExecutedListener.", @@ -41,8 +53,18 @@ "HyperfTest\\Tracer\\": "tests/" } }, + "scripts": { + "test": "co-phpunit", + "test-coverage": "co-phpunit --coverage-clover clover.xml", + "cs-fix": "php-cs-fixer fix $1", + "analyse": "phpstan analyse --memory-limit=-1 -l 5 -c phpstan.neon", + "rector": "rector process --clear-cache" + }, "config": { - "sort-packages": true + "sort-packages": true, + "allow-plugins": { + "phpstan/extension-installer": true + } }, "extra": { "branch-alias": { diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..1daff2e --- /dev/null +++ b/composer.lock @@ -0,0 +1,7372 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "f42f85bc37ab21c5cb3edf2d38e78db3", + "packages": [ + { + "name": "doctrine/inflector", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.8" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2023-06-16T13:40:37+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.30 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:15:36+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:16:48+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:35:24+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:19:20+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.6.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:05:35+00:00" + }, + { + "name": "hyperf/code-parser", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/code-parser.git", + "reference": "b2b42ea957463fbdf6fbb762fcff0ff578c36a4c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/code-parser/zipball/b2b42ea957463fbdf6fbb762fcff0ff578c36a4c", + "reference": "b2b42ea957463fbdf6fbb762fcff0ff578c36a4c", + "shasum": "" + }, + "require": { + "hyperf/collection": "~3.1.0", + "hyperf/stringable": "~3.1.0", + "hyperf/support": "~3.1.0", + "php": ">=8.1" + }, + "suggest": { + "jean85/pretty-package-versions": "Required to use PrettyVersions. (^1.2|^2.0)", + "nikic/php-parser": "Required to use PhpParser. (^4.0)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\CodeParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A code parser component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "code-parser", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/codec", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/codec.git", + "reference": "18db58e92688b7992e3d939b6c5b7790a45f2d2b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/codec/zipball/18db58e92688b7992e3d939b6c5b7790a45f2d2b", + "reference": "18db58e92688b7992e3d939b6c5b7790a45f2d2b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-xml": "*", + "hyperf/contract": "~3.1.0", + "php": ">=8.1" + }, + "suggest": { + "ext-igbinary": "Required to use IgbinarySerializerPacker." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Codec\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A codec component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "codec", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/collection", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/collection.git", + "reference": "a71303f5d21786253f6814aa9e1663c5e53ec575" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/collection/zipball/a71303f5d21786253f6814aa9e1663c5e53ec575", + "reference": "a71303f5d21786253f6814aa9e1663c5e53ec575", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Collection package which come from illuminate/collections", + "homepage": "https://hyperf.io", + "keywords": [ + "collection", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/conditionable", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/conditionable.git", + "reference": "18da1405ae39a775bd3fae8cec98841eaa22f013" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/conditionable/zipball/18da1405ae39a775bd3fae8cec98841eaa22f013", + "reference": "18da1405ae39a775bd3fae8cec98841eaa22f013", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Conditionable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Macroable package which come from illuminate/conditionable", + "homepage": "https://hyperf.io", + "keywords": [ + "conditionable", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/context", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/context.git", + "reference": "8307d6c924ed67c7abd47874ec14f0e2e3e4b732" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/context/zipball/8307d6c924ed67c7abd47874ec14f0e2e3e4b732", + "reference": "8307d6c924ed67c7abd47874ec14f0e2e3e4b732", + "shasum": "" + }, + "require": { + "hyperf/engine": "^2.0", + "php": ">=8.1" + }, + "suggest": { + "swow/psr7-plus": "Required to use RequestContext and ResponseContext" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Context\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A coroutine/application context library.", + "homepage": "https://hyperf.io", + "keywords": [ + "Context", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/contract", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/contract.git", + "reference": "2b2f3610fce6c080c6b61764cad2745f7c9a312b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/contract/zipball/2b2f3610fce6c080c6b61764cad2745f7c9a312b", + "reference": "2b2f3610fce6c080c6b61764cad2745f7c9a312b", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Contract\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The contracts of Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/coordinator", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/coordinator.git", + "reference": "9f589319ba689ece5e4399b7ee218a223b089cba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/coordinator/zipball/9f589319ba689ece5e4399b7ee218a223b089cba", + "reference": "9f589319ba689ece5e4399b7ee218a223b089cba", + "shasum": "" + }, + "require": { + "hyperf/engine": "^2.0", + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Coordinator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Coordinator", + "homepage": "https://hyperf.io", + "keywords": [ + "Coordinator", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/coroutine", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/coroutine.git", + "reference": "60ed5835ec00a07da9fb34fb605fd7a99c9f8a5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/coroutine/zipball/60ed5835ec00a07da9fb34fb605fd7a99c9f8a5e", + "reference": "60ed5835ec00a07da9fb34fb605fd7a99c9f8a5e", + "shasum": "" + }, + "require": { + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/engine": "^2.0", + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Coroutine\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Coroutine", + "homepage": "https://hyperf.io", + "keywords": [ + "coroutine", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/di", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/di.git", + "reference": "08efa8748caf3af777707b82c270b60313bfd878" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/di/zipball/08efa8748caf3af777707b82c270b60313bfd878", + "reference": "08efa8748caf3af777707b82c270b60313bfd878", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0", + "hyperf/code-parser": "~3.1.0", + "hyperf/pipeline": "~3.1.0", + "hyperf/stdlib": "~3.1.0", + "hyperf/support": "~3.1.0", + "nikic/php-parser": "^4.1", + "php": ">=8.1", + "php-di/phpdoc-reader": "^2.2", + "psr/container": "^1.0|^2.0", + "symfony/finder": "^5.0|^6.0", + "vlucas/phpdotenv": "^5.0" + }, + "suggest": { + "ext-pcntl": "Required to scan annotations.", + "hyperf/config": "Require this component for annotation scan progress to retrieve the scan path." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Di\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Di\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A DI for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "annotation", + "di", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/engine", + "version": "v2.10.3", + "source": { + "type": "git", + "url": "https://github.com/hyperf/engine.git", + "reference": "7e7238708f29f39df643aba25485ba1c075943c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/engine/zipball/7e7238708f29f39df643aba25485ba1c075943c1", + "reference": "7e7238708f29f39df643aba25485ba1c075943c1", + "shasum": "" + }, + "require": { + "hyperf/engine-contract": "~1.9.0", + "php": ">=8.0" + }, + "conflict": { + "ext-swoole": "<5.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "hyperf/guzzle": "^3.0", + "hyperf/http-message": " 3.0.*", + "mockery/mockery": "^1.5", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^9.4", + "swoole/ide-helper": "dev-master" + }, + "suggest": { + "ext-sockets": "*", + "ext-swoole": ">=5.0", + "hyperf/http-message": "Required to use ResponseEmitter.", + "psr/http-message": "Required to use WebSocket Frame." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.10-dev" + }, + "hyperf": { + "config": "Hyperf\\Engine\\ConfigProvider" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Engine\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Coroutine engine provided by swoole.", + "keywords": [ + "engine", + "hyperf", + "php", + "swoole" + ], + "support": { + "issues": "https://github.com/hyperf/engine/issues", + "source": "https://github.com/hyperf/engine/tree/v2.10.3" + }, + "time": "2023-09-30T14:57:09+00:00" + }, + { + "name": "hyperf/engine-contract", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/engine-contract.git", + "reference": "45c9c49766d8b0e539975fe4c5ed6807221c4b38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/engine-contract/zipball/45c9c49766d8b0e539975fe4c5ed6807221c4b38", + "reference": "45c9c49766d8b0e539975fe4c5ed6807221c4b38", + "shasum": "" + }, + "require": { + "php": ">=8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "mockery/mockery": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": ">=7.0", + "psr/http-message": "^1.0", + "swoole/ide-helper": "^4.5" + }, + "suggest": { + "psr/http-message": "Required to use WebSocket Frame." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Engine\\Contract\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Contract for Coroutine Engine", + "keywords": [ + "contract", + "coroutine", + "engine", + "hyperf", + "php" + ], + "support": { + "issues": "https://github.com/hyperf/engine-contract/issues", + "source": "https://github.com/hyperf/engine-contract/tree/v1.9.0" + }, + "time": "2023-07-14T02:21:02+00:00" + }, + { + "name": "hyperf/guzzle", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/guzzle.git", + "reference": "df01c9b6ba645347a05113c6bcac2314145e611c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/guzzle/zipball/df01c9b6ba645347a05113c6bcac2314145e611c", + "reference": "df01c9b6ba645347a05113c6bcac2314145e611c", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.3|^7.0", + "php": ">=8.1", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.0|^2.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "hyperf/pool": "Required to use pool handler." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Guzzle\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Swoole coroutine handler for guzzle", + "keywords": [ + "Guzzle", + "handler", + "php", + "swoole" + ], + "support": { + "issues": "https://github.com/hyperf/guzzle/issues", + "source": "https://github.com/hyperf/guzzle/tree/v3.1.0" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/macroable", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/macroable.git", + "reference": "de5b07be74d666f04ecef4ce5ee6ceb97d846cfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/macroable/zipball/de5b07be74d666f04ecef4ce5ee6ceb97d846cfa", + "reference": "de5b07be74d666f04ecef4ce5ee6ceb97d846cfa", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Macroable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Macroable package which come from illuminate/macroable", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "macroable", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/pipeline", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/pipeline.git", + "reference": "44352f9b20c61c372dae655894f7a8f2bb86d0de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/pipeline/zipball/44352f9b20c61c372dae655894f7a8f2bb86d0de", + "reference": "44352f9b20c61c372dae655894f7a8f2bb86d0de", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.0|^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Pipeline\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Macroable package which come from illuminate/pipeline", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "pipeline", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/serializer", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/serializer.git", + "reference": "8fae2fa4342cbefead70b54e42e11c228d8be94b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/serializer/zipball/8fae2fa4342cbefead70b54e42e11c228d8be94b", + "reference": "8fae2fa4342cbefead70b54e42e11c228d8be94b", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "php": ">=8.1" + }, + "suggest": { + "hyperf/di": "Required to use ExceptionNormalizer", + "symfony/property-access": "Required to use SymfonyNormalizer (^5.0|^6.0)", + "symfony/serializer": "Required to use SymfonyNormalizer (^5.0|^6.0)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Serializer\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Serializer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A serializer component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "swoole", + "tappable" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/stdlib", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/stdlib.git", + "reference": "25b73da235551d0d71d9157324709abaea36c455" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/stdlib/zipball/25b73da235551d0d71d9157324709abaea36c455", + "reference": "25b73da235551d0d71d9157324709abaea36c455", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A stdlib component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "stdlib", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/stringable", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/stringable.git", + "reference": "10465337a7bbf528ab28bd84330d795a5b3e06bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/stringable/zipball/10465337a7bbf528ab28bd84330d795a5b3e06bd", + "reference": "10465337a7bbf528ab28bd84330d795a5b3e06bd", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "hyperf/collection": "~3.1.0", + "hyperf/conditionable": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "hyperf/tappable": "~3.1.0", + "php": ">=8.1" + }, + "suggest": { + "doctrine/inflector": "Required to use plural and singular methods.(^2.0|^3.0)", + "ramsey/uuid": "Required to use uuid and orderedUuid methods.(^4.7|^5.0)", + "symfony/uid": "Required to use ulid method.(^5.0|^6.0)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Stringable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Stringable package which come from illuminate/support", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "stringable", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/support", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/support.git", + "reference": "7752db2c4d292e4a44dadbc49e39bdfba4c8947e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/support/zipball/7752db2c4d292e4a44dadbc49e39bdfba4c8947e", + "reference": "7752db2c4d292e4a44dadbc49e39bdfba4c8947e", + "shasum": "" + }, + "require": { + "hyperf/collection": "~3.1.0", + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "hyperf/stringable": "~3.1.0", + "php": ">=8.1" + }, + "suggest": { + "nesbot/carbon": "Use Carbon as DateTime object.(^2.0)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Support\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A support component for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "support", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/tappable", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/tappable.git", + "reference": "f640e37006dad09ca6f2b9a4cf047907aaebf002" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/tappable/zipball/f640e37006dad09ca6f2b9a4cf047907aaebf002", + "reference": "f640e37006dad09ca6f2b9a4cf047907aaebf002", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Hyperf\\Tappable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Hyperf Macroable package which come from illuminate/tappable", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "swoole", + "tappable" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/utils", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/utils.git", + "reference": "10522904195eb5af9090bbd072589fb387c91041" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/utils/zipball/10522904195eb5af9090bbd072589fb387c91041", + "reference": "10522904195eb5af9090bbd072589fb387c91041", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "hyperf/code-parser": "~3.1.0", + "hyperf/codec": "~3.1.0", + "hyperf/collection": "~3.1.0", + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/coordinator": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "hyperf/engine": "^2.0", + "hyperf/macroable": "~3.1.0", + "hyperf/serializer": "~3.1.0", + "hyperf/stringable": "~3.1.0", + "hyperf/support": "~3.1.0", + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A tools package that could help developer solved the problem quickly.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "swoole", + "utils" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "jcchavezs/zipkin-opentracing", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/jcchavezs/zipkin-php-opentracing.git", + "reference": "bb8f1c5c3643594c0328c7df98e49fef86c85710" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jcchavezs/zipkin-php-opentracing/zipball/bb8f1c5c3643594c0328c7df98e49fef86c85710", + "reference": "bb8f1c5c3643594c0328c7df98e49fef86c85710", + "shasum": "" + }, + "require": { + "opentracing/opentracing": "^1.0.1", + "openzipkin/zipkin": "^3.0.0", + "php": ">=7.4 || ^8.0" + }, + "provide": { + "opentracing/opentracing": "1.0.0" + }, + "require-dev": { + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/phpstan": "^0.12.26", + "phpunit/phpunit": "^9.0", + "squizlabs/php_codesniffer": "3.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipkinOpenTracing\\": "./src/ZipkinOpenTracing/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "José Carlos Chávez", + "email": "jcchavezs@gmail.com" + } + ], + "description": "A Zipkin bridge with OpenTracing", + "support": { + "issues": "https://github.com/jcchavezs/zipkin-php-opentracing/issues", + "source": "https://github.com/jcchavezs/zipkin-php-opentracing/tree/2.0.3" + }, + "funding": [ + { + "url": "https://www.paypal.me/jcchavezs", + "type": "paypal" + } + ], + "time": "2023-06-08T11:40:46+00:00" + }, + { + "name": "jonahgeorge/jaeger-client-php", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/jonahgeorge/jaeger-client-php.git", + "reference": "39e35bc3168da12cf596038cd1332e700b5131e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jonahgeorge/jaeger-client-php/zipball/39e35bc3168da12cf596038cd1332e700b5131e9", + "reference": "39e35bc3168da12cf596038cd1332e700b5131e9", + "shasum": "" + }, + "require": { + "ext-sockets": "*", + "opentracing/opentracing": "^1.0", + "packaged/thrift": "^0.13", + "php": "^7.1 || ^8.0 || ^8.1", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "psr/log": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "cache/array-adapter": "^1.0", + "phpunit/phpunit": "^7 || ^8 || ^9", + "squizlabs/php_codesniffer": "3.*", + "symfony/polyfill-php73": "^1.10" + }, + "type": "library", + "autoload": { + "files": [ + "./src/Jaeger/Constants.php" + ], + "psr-4": { + "Jaeger\\": "src/Jaeger/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonah George", + "homepage": "http://twitter.com/jonahgeorge" + }, + { + "name": "José Carlos Chávez", + "email": "jcchavezs@gmail.com" + }, + { + "name": "Contributors", + "homepage": "https://github.com/jonahgeorge/jaeger-client-php/graphs/contributors" + } + ], + "description": "Jaeger Bindings for PHP OpenTracing API", + "keywords": [ + "jaeger", + "opentracing", + "trace", + "tracing" + ], + "support": { + "issues": "https://github.com/jonahgeorge/jaeger-client-php/issues", + "source": "https://github.com/jonahgeorge/jaeger-client-php/tree/v1.5.0" + }, + "time": "2023-08-26T09:30:03+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.17.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + }, + "time": "2023-08-13T19:53:39+00:00" + }, + { + "name": "opentracing/opentracing", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/opentracing/opentracing-php.git", + "reference": "cd60bd1fb2a25280600bc74c7f9e0c13881a9116" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opentracing/opentracing-php/zipball/cd60bd1fb2a25280600bc74c7f9e0c13881a9116", + "reference": "cd60bd1fb2a25280600bc74c7f9e0c13881a9116", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "~0.12", + "phpunit/phpunit": "^7.0 || ^9.0", + "squizlabs/php_codesniffer": "3.*" + }, + "type": "library", + "autoload": { + "files": [ + "src/OpenTracing/Tags.php", + "src/OpenTracing/Formats.php" + ], + "psr-4": { + "OpenTracing\\": "src/OpenTracing/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "José Carlos Chávez", + "email": "jcchavezs@gmail.com" + } + ], + "description": "OpenTracing API for PHP", + "support": { + "issues": "https://github.com/opentracing/opentracing-php/issues", + "source": "https://github.com/opentracing/opentracing-php/tree/1.0.2" + }, + "time": "2022-01-27T19:59:21+00:00" + }, + { + "name": "openzipkin/zipkin", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/openzipkin/zipkin-php.git", + "reference": "e2809f8b6775796d2116b3ca73576a1734296ff6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/openzipkin/zipkin-php/zipball/e2809f8b6775796d2116b3ca73576a1734296ff6", + "reference": "e2809f8b6775796d2116b3ca73576a1734296ff6", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": "^7.4 || ^8.0", + "psr/http-message": "~1.0 || ~2.0", + "psr/log": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "ext-mysqli": "*", + "jcchavezs/httptest": "~0.2", + "middlewares/fast-route": "^2.0", + "middlewares/request-handler": "^2.0", + "nyholm/psr7": "^1.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/phpstan": "^0.12.26", + "phpunit/phpunit": "~9", + "psr/http-client": "^1.0", + "psr/http-server-middleware": "^1.0", + "squizlabs/php_codesniffer": "3.*" + }, + "suggest": { + "ext-mysqli": "Allows to use mysqli instrumentation.", + "psr/http-client": "Allows to instrument HTTP clients following PSR18.", + "psr/http-server-middleware": "Allows to instrument HTTP servers via middlewares following PSR15." + }, + "type": "library", + "autoload": { + "files": [ + "./src/Zipkin/Propagation/Id.php", + "./src/Zipkin/Timestamp.php", + "./src/Zipkin/Kind.php", + "./src/Zipkin/Tags.php", + "./src/Zipkin/Annotations.php", + "./src/Zipkin/SpanName.php" + ], + "psr-4": { + "Zipkin\\": "./src/Zipkin/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "José Carlos Chávez", + "email": "jcchavezs@gmail.com" + } + ], + "description": "A Zipkin instrumentation for PHP", + "homepage": "https://github.com/openzipkin/zipkin-php", + "keywords": [ + "distributed-tracing", + "openzipkin", + "tracing", + "zipkin" + ], + "support": { + "issues": "https://github.com/openzipkin/zipkin-php/issues", + "source": "https://github.com/openzipkin/zipkin-php/tree/3.2.0" + }, + "time": "2023-09-28T20:54:04+00:00" + }, + { + "name": "packaged/thrift", + "version": "0.13.01", + "source": { + "type": "git", + "url": "https://github.com/packaged/thrift.git", + "reference": "e3dbcfb79e319971d64264ffe9c340590cc8a228" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/packaged/thrift/zipball/e3dbcfb79e319971d64264ffe9c340590cc8a228", + "reference": "e3dbcfb79e319971d64264ffe9c340590cc8a228", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Thrift\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Apache Thrift", + "homepage": "http://thrift.apache.org/", + "keywords": [ + "apache", + "thrift" + ], + "support": { + "issues": "https://github.com/packaged/thrift/issues", + "source": "https://github.com/packaged/thrift/tree/0.13.01" + }, + "time": "2021-01-25T13:32:28+00:00" + }, + { + "name": "php-di/phpdoc-reader", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/PhpDocReader.git", + "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/66daff34cbd2627740ffec9469ffbac9f8c8185c", + "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpDocReader\\": "src/PhpDocReader" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)", + "keywords": [ + "phpdoc", + "reflection" + ], + "support": { + "issues": "https://github.com/PHP-DI/PhpDocReader/issues", + "source": "https://github.com/PHP-DI/PhpDocReader/tree/2.2.1" + }, + "time": "2020-10-12T12:39:22+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2023-11-12T21:59:55+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-10-31T17:30:12+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "42292d99c55abe617799667f454222c54c60e229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-28T09:04:16+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.2", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:43:29+00:00" + } + ], + "packages-dev": [ + { + "name": "composer/pcre", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.1.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-10-11T07:11:09+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-08-31T09:50:34+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-02-25T21:32:43+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.40.2", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "4344562a516b76afe8f2d64b2e52214c30d64ed8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/4344562a516b76afe8f2d64b2e52214c30d64ed8", + "reference": "4344562a516b76afe8f2d64b2e52214c30d64ed8", + "shasum": "" + }, + "require": { + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.3", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0", + "sebastian/diff": "^4.0 || ^5.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-mbstring": "^1.28", + "symfony/polyfill-php80": "^1.28", + "symfony/polyfill-php81": "^1.28", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3 || ^2.0", + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.11", + "php-coveralls/php-coveralls": "^2.7", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", + "phpspec/prophecy": "^1.17", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/phpunit-bridge": "^6.3.8 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.40.2" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2023-12-03T09:21:33+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "hyperf/config", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/config.git", + "reference": "f619a0e6118704707932de56fa8e86ffeec042f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/config/zipball/f619a0e6118704707932de56fa8e86ffeec042f1", + "reference": "f619a0e6118704707932de56fa8e86ffeec042f1", + "shasum": "" + }, + "require": { + "hyperf/collection": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/support": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0|^2.0", + "symfony/finder": "^5.0|^6.0" + }, + "suggest": { + "hyperf/context": "Required to use config()", + "hyperf/di": "Allows using @Value annotation", + "hyperf/event": "Allows using @Value annotation", + "hyperf/framework": "Allows using @Value annotation", + "vlucas/phpdotenv": "Allows using enviroment value to override the config" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Config\\ConfigProvider" + } + }, + "autoload": { + "files": [ + "./src/Functions.php" + ], + "psr-4": { + "Hyperf\\Config\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "An independent component that provides configuration container.", + "homepage": "https://hyperf.io", + "keywords": [ + "config", + "configuration", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/dispatcher", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/dispatcher.git", + "reference": "582dc948da50db771294130bba465d8163f11ab1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/dispatcher/zipball/582dc948da50db771294130bba465d8163f11ab1", + "reference": "582dc948da50db771294130bba465d8163f11ab1", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.0|^2.0", + "psr/http-server-middleware": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Dispatcher\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Dispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A HTTP Server for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "dispatcher", + "filter", + "hyperf", + "middleware", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/event", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/event.git", + "reference": "6eada5f74ce80786c567d5aed0361d51175217bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/event/zipball/6eada5f74ce80786c567d5aed0361d51175217bb", + "reference": "6eada5f74ce80786c567d5aed0361d51175217bb", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "hyperf/stdlib": "~3.1.0", + "php": ">=8.1", + "psr/event-dispatcher": "^1.0" + }, + "suggest": { + "hyperf/di": "Required to use annotatioins." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Event\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "an event manager that implements PSR-14.", + "homepage": "https://hyperf.io", + "keywords": [ + "event", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/exception-handler", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/exception-handler.git", + "reference": "941a7b426d7ecc6f34fa56d19749e8ab57a737f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/exception-handler/zipball/941a7b426d7ecc6f34fa56d19749e8ab57a737f8", + "reference": "941a7b426d7ecc6f34fa56d19749e8ab57a737f8", + "shasum": "" + }, + "require": { + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/dispatcher": "~3.1.0", + "hyperf/http-message": "~3.1.0", + "hyperf/stdlib": "~3.1.0", + "hyperf/support": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0|^2.0", + "psr/http-message": "^1.0|^2.0", + "swow/psr7-plus": "^1.0" + }, + "suggest": { + "hyperf/di": "Required to use #[ExceptionHandler]", + "hyperf/event": "Required to use listeners", + "hyperf/framework": "Required to use listeners", + "hyperf/stringable": "Required to use WhoopsExceptionHandler" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\ExceptionHandler\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\ExceptionHandler\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Exception handler for hyperf", + "homepage": "https://hyperf.io", + "keywords": [ + "exception-handler", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/http-message", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/http-message.git", + "reference": "1aa6b862003262d1186f5978f251970f687c16d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/http-message/zipball/1aa6b862003262d1186f5978f251970f687c16d5", + "reference": "1aa6b862003262d1186f5978f251970f687c16d5", + "shasum": "" + }, + "require": { + "hyperf/codec": "~3.1.0", + "hyperf/engine": "^2.7", + "hyperf/support": "~3.1.0", + "laminas/laminas-mime": "^2.7", + "php": ">=8.1", + "psr/http-message": "^1.0|^2.0", + "swow/psr7-plus": "^1.0" + }, + "suggest": { + "psr/container": "Required to replace RequestParserInterface." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\HttpMessage\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\HttpMessage\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "microservice framework base on swoole", + "keywords": [ + "http-message", + "hyperf", + "php", + "swoole" + ], + "support": { + "issues": "https://github.com/hyperf/http-message/issues", + "source": "https://github.com/hyperf/http-message/tree/v3.1.0" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/http-server", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/http-server.git", + "reference": "022da795a5b2712380b657b2c736d85f70b33395" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/http-server/zipball/022da795a5b2712380b657b2c736d85f70b33395", + "reference": "022da795a5b2712380b657b2c736d85f70b33395", + "shasum": "" + }, + "require": { + "hyperf/codec": "~3.1.0", + "hyperf/collection": "~3.1.0", + "hyperf/context": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "hyperf/dispatcher": "~3.1.0", + "hyperf/event": "~3.1.0", + "hyperf/exception-handler": "~3.1.0", + "hyperf/http-message": "~3.1.0", + "hyperf/macroable": "~3.1.0", + "hyperf/serializer": "~3.1.0", + "hyperf/server": "~3.1.0", + "hyperf/stdlib": "~3.1.0", + "hyperf/support": "~3.1.0", + "nikic/fast-route": "^1.3", + "php": ">=8.1", + "psr/container": "^1.0|^2.0", + "swow/psr7-plus": "^1.0" + }, + "suggest": { + "hyperf/di": "Required to use annotations." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\HttpServer\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\HttpServer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A HTTP Server for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "http", + "http-server", + "hyperf", + "php", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/server", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/server.git", + "reference": "2c667e0977945d26a56bec53b1c946286cffc3a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/server/zipball/2c667e0977945d26a56bec53b1c946286cffc3a2", + "reference": "2c667e0977945d26a56bec53b1c946286cffc3a2", + "shasum": "" + }, + "require": { + "hyperf/contract": "~3.1.0", + "hyperf/coordinator": "~3.1.0", + "hyperf/engine": "^2.8", + "hyperf/support": "~3.1.0", + "hyperf/tappable": "~3.1.0", + "php": ">=8.1", + "psr/container": "^1.0|^2.0", + "psr/event-dispatcher": "^1.0", + "psr/log": "^1.0|^2.0|^3.0", + "symfony/console": "^5.0|^6.0" + }, + "suggest": { + "hyperf/event": "Dump the info after server start.", + "hyperf/framework": "Dump the info after server start." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + }, + "hyperf": { + "config": "Hyperf\\Server\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A base server library for Hyperf.", + "homepage": "https://hyperf.io", + "keywords": [ + "hyperf", + "php", + "server", + "swoole" + ], + "support": { + "docs": "https://hyperf.wiki", + "issues": "https://github.com/hyperf/hyperf/issues", + "pull-request": "https://github.com/hyperf/hyperf/pulls", + "source": "https://github.com/hyperf/hyperf" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-24T03:10:53+00:00" + }, + { + "name": "hyperf/testing", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/hyperf/testing.git", + "reference": "a0b4f5472953ccadb4b54a39dfd6695dff5d3dcd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hyperf/testing/zipball/a0b4f5472953ccadb4b54a39dfd6695dff5d3dcd", + "reference": "a0b4f5472953ccadb4b54a39dfd6695dff5d3dcd", + "shasum": "" + }, + "require": { + "hyperf/codec": "~3.1.0", + "hyperf/collection": "~3.1.0", + "hyperf/contract": "~3.1.0", + "hyperf/coroutine": "~3.1.0", + "hyperf/http-message": "~3.1.0", + "hyperf/http-server": "~3.1.0", + "hyperf/support": "~3.1.0", + "hyperf/utils": "~3.1.0", + "php": ">=8.1", + "phpunit/phpunit": "^10.0", + "psr/container": "^1.0|^2.0", + "symfony/http-foundation": "^5.4|^6.0" + }, + "suggest": { + "fakerphp/faker": "Required to use Faker feature.(^1.23)" + }, + "bin": [ + "co-phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Hyperf\\Testing\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Testing for hyperf", + "keywords": [ + "dev", + "php", + "swoole", + "testing" + ], + "support": { + "source": "https://github.com/hyperf/testing/tree/v3.1.0" + }, + "funding": [ + { + "url": "https://hyperf.wiki/#/zh-cn/donate", + "type": "custom" + }, + { + "url": "https://opencollective.com/hyperf", + "type": "open_collective" + } + ], + "time": "2023-11-29T03:44:48+00:00" + }, + { + "name": "laminas/laminas-mime", + "version": "2.12.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-mime.git", + "reference": "08cc544778829b7d68d27a097885bd6e7130135e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-mime/zipball/08cc544778829b7d68d27a097885bd6e7130135e", + "reference": "08cc544778829b7d68d27a097885bd6e7130135e", + "shasum": "" + }, + "require": { + "laminas/laminas-stdlib": "^2.7 || ^3.0", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "conflict": { + "zendframework/zend-mime": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.4.0", + "laminas/laminas-mail": "^2.19.0", + "phpunit/phpunit": "~9.5.25" + }, + "suggest": { + "laminas/laminas-mail": "Laminas\\Mail component" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Mime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Create and parse MIME messages and parts", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "mime" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-mime/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-mime/issues", + "rss": "https://github.com/laminas/laminas-mime/releases.atom", + "source": "https://github.com/laminas/laminas-mime" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2023-11-02T16:47:19+00:00" + }, + { + "name": "laminas/laminas-stdlib", + "version": "3.18.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-stdlib.git", + "reference": "e85b29076c6216e7fc98e72b42dbe1bbc3b95ecf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/e85b29076c6216e7fc98e72b42dbe1bbc3b95ecf", + "reference": "e85b29076c6216e7fc98e72b42dbe1bbc3b95ecf", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "conflict": { + "zendframework/zend-stdlib": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^2.5", + "phpbench/phpbench": "^1.2.14", + "phpunit/phpunit": "^10.3.3", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.15.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "SPL extensions, array utilities, error handlers, and more", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "stdlib" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-stdlib/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-stdlib/issues", + "rss": "https://github.com/laminas/laminas-stdlib/releases.atom", + "source": "https://github.com/laminas/laminas-stdlib" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2023-09-19T10:15:21+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.6", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/b8e0bb7d8c604046539c1115994632c74dcb361e", + "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.10", + "psalm/plugin-phpunit": "^0.18.4", + "symplify/easy-coding-standard": "^11.5.0", + "vimeo/psalm": "^4.30" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2023-08-09T00:03:52+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "FastRoute\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "support": { + "issues": "https://github.com/nikic/FastRoute/issues", + "source": "https://github.com/nikic/FastRoute/tree/master" + }, + "time": "2018-02-13T20:26:39+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpstan/extension-installer", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "f45734bfb9984c6c56c4486b71230355f066a58a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/f45734bfb9984c6c56c4486b71230355f066a58a", + "reference": "f45734bfb9984c6c56c4486b71230355f066a58a", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.9.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.3.1" + }, + "time": "2023-05-24T08:59:17+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.10.47", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/84dbb33b520ea28b6cf5676a3941f4bae1c1ff39", + "reference": "84dbb33b520ea28b6cf5676a3941f4bae1c1ff39", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2023-12-01T15:19:17+00:00" + }, + { + "name": "phpstan/phpstan-mockery", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-mockery.git", + "reference": "6aa86bd8e9c9a1be97baf0558d4a2ed1374736a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-mockery/zipball/6aa86bd8e9c9a1be97baf0558d4a2ed1374736a6", + "reference": "6aa86bd8e9c9a1be97baf0558d4a2ed1374736a6", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.10" + }, + "require-dev": { + "mockery/mockery": "^1.2.4", + "nikic/php-parser": "^4.13.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan Mockery extension", + "support": { + "issues": "https://github.com/phpstan/phpstan-mockery/issues", + "source": "https://github.com/phpstan/phpstan-mockery/tree/1.1.1" + }, + "time": "2023-02-18T13:54:03+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/a56a9ab2f680246adcf3db43f38ddf1765774735", + "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.15", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.9" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-11-23T12:23:20+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.5.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "5aedff46afba98dddecaa12349ec044d9103d4fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5aedff46afba98dddecaa12349ec044d9103d4fe", + "reference": "5aedff46afba98dddecaa12349ec044d9103d4fe", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.5", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.1", + "sebastian/global-state": "^6.0.1", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.2" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2023-12-05T14:54:33+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, + { + "name": "rector/rector", + "version": "0.17.13", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "e2003ba7c5bda06d7bb419cf4be8dae5f8672132" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/e2003ba7c5bda06d7bb419cf4be8dae5f8672132", + "reference": "e2003ba7c5bda06d7bb419cf4be8dae5f8672132", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.10.26" + }, + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "keywords": [ + "automation", + "dev", + "migration", + "refactoring" + ], + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/0.17.13" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2023-08-14T16:33:29+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:15+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-14T13:18:12+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", + "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.10", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-09-28T11:50:59+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-05-01T07:48:21+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-04-11T05:39:26+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-09-24T13:22:09+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-07-19T07:19:23+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.10", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T09:25:50+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "swow/psr7-plus", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/swow/psr7-plus.git", + "reference": "7acc4924be907d2ff64edee5a2bd116620e56364" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swow/psr7-plus/zipball/7acc4924be907d2ff64edee5a2bd116620e56364", + "reference": "7acc4924be907d2ff64edee5a2bd116620e56364", + "shasum": "" + }, + "require": { + "php": ">=8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Swow\\Psr7\\Message\\": "src/Message/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "twose", + "email": "twosee@php.net" + } + ], + "description": "Modern strong-typed interfaces for Psr7, not only HTTP but also WebSocket", + "keywords": [ + "http", + "psr17", + "psr7", + "swow", + "websocket" + ], + "support": { + "issues": "https://github.com/swow/swow", + "source": "https://github.com/swow/psr7-plus/tree/v1.1.2" + }, + "time": "2023-06-15T09:18:11+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/a550a7c99daeedef3f9d23fb82e3531525ff11fd", + "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.4.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-11-30T10:54:28+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "c459b40ffe67c49af6fd392aac374c9edf8a027e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/c459b40ffe67c49af6fd392aac374c9edf8a027e", + "reference": "c459b40ffe67c49af6fd392aac374c9edf8a027e", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-27T16:29:09+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v7.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "7da8ea2362a283771478c5f7729cfcb43a76b8b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7da8ea2362a283771478c5f7729cfcb43a76b8b7", + "reference": "7da8ea2362a283771478c5f7729cfcb43a76b8b7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v7.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-27T06:33:22+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "44a6d39a9cc11e154547d882d5aac1e014440771" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/44a6d39a9cc11e154547d882d5aac1e014440771", + "reference": "44a6d39a9cc11e154547d882d5aac1e014440771", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.3" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-11-20T16:41:16+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v7.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "700ff4096e346f54cb628ea650767c8130f1001f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/700ff4096e346f54cb628ea650767c8130f1001f", + "reference": "700ff4096e346f54cb628ea650767c8130f1001f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v7.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-08-08T10:20:21+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "875e90aeea2777b6f135677f618529449334a612" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-26T09:26:14+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.28.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-08-16T06:22:46+00:00" + }, + { + "name": "symfony/process", + "version": "v7.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "13bdb1670c7f510494e04fcb2bfa29af63db9c0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/13bdb1670c7f510494e04fcb2bfa29af63db9c0d", + "reference": "13bdb1670c7f510494e04fcb2bfa29af63db9c0d", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-11-20T16:43:42+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838", + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-30T20:28:31+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v7.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "7bbfa3dd564a0ce12eb4acaaa46823c740f9cb7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/7bbfa3dd564a0ce12eb4acaaa46823c740f9cb7a", + "reference": "7bbfa3dd564a0ce12eb4acaaa46823c740f9cb7a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v7.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-05T13:06:06+00:00" + }, + { + "name": "symfony/string", + "version": "v7.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "92bd2bfbba476d4a1838e5e12168bef2fd1e6620" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/92bd2bfbba476d4a1838e5e12168bef2fd1e6620", + "reference": "92bd2bfbba476d4a1838e5e12168bef2fd1e6620", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-11-29T08:40:23+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2023-11-20T00:12:19+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=8.0" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000..f25d7d9 --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,11 @@ +parameters: + bootstrapFiles: + - tests/bootstrap.php + paths: + - src + - tests + inferPrivatePropertyTypeFromConstructor: true + treatPhpDocTypesAsCertain: true + reportUnmatchedIgnoredErrors: false + ignoreErrors: + - '#Variable .* in PHPDoc tag @var does not exist#' diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..bb72997 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,21 @@ + + + + + src + + + + + tests + + + diff --git a/publish/opentracing.php b/publish/opentracing.php index 9839059..67589be 100644 --- a/publish/opentracing.php +++ b/publish/opentracing.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ use Hyperf\Tracer\Adapter\JaegerTracerFactory; use Hyperf\Tracer\Adapter\NoOpTracerFactory; diff --git a/rector.php b/rector.php new file mode 100644 index 0000000..6d8c034 --- /dev/null +++ b/rector.php @@ -0,0 +1,31 @@ +paths([ + __DIR__ . '/class_map', + __DIR__ . '/publish', + __DIR__ . '/src', + __DIR__ . '/tests', + ]); + + // register a single rule + $rectorConfig->rule(InlineConstructorDefaultToPropertyRector::class); + + // define sets of rules + $rectorConfig->sets([ + LevelSetList::UP_TO_PHP_80, + ]); +}; diff --git a/src/Adapter/HttpClientFactory.php b/src/Adapter/HttpClientFactory.php index 30d92b5..fcb1716 100644 --- a/src/Adapter/HttpClientFactory.php +++ b/src/Adapter/HttpClientFactory.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer\Adapter; diff --git a/src/Adapter/JaegerTracerFactory.php b/src/Adapter/JaegerTracerFactory.php index 3383413..e3a063a 100644 --- a/src/Adapter/JaegerTracerFactory.php +++ b/src/Adapter/JaegerTracerFactory.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer\Adapter; @@ -27,9 +27,7 @@ class JaegerTracerFactory implements NamedFactoryInterface private string $name = ''; - public function __construct(private ConfigInterface $config, private ?LoggerInterface $logger = null, private ?CacheItemPoolInterface $cache = null) - { - } + public function __construct(private ConfigInterface $config, private LoggerInterface $logger, private ?CacheItemPoolInterface $cache = null) {} public function make(string $name): Tracer { diff --git a/src/Adapter/NoopTracerFactory.php b/src/Adapter/NoopTracerFactory.php new file mode 100644 index 0000000..d97829d --- /dev/null +++ b/src/Adapter/NoopTracerFactory.php @@ -0,0 +1,25 @@ +switchManager->isEnable('db') === false) { + if ($this->switchManager->isEnabled('db') === false) { return $proceedingJoinPoint->process(); } $arguments = $proceedingJoinPoint->arguments['keys']; $span = $this->startSpan('Db::' . $arguments['name']); - $span->setTag($this->spanTagManager->get('db', 'db.query'), json_encode($arguments['arguments'])); + $span->setTag($this->spanTagManager->get('db', 'db.query'), json_encode($arguments['arguments'], JSON_THROW_ON_ERROR)); try { $result = $proceedingJoinPoint->process(); } catch (Throwable $e) { diff --git a/src/Aspect/ElasticserachAspect.php b/src/Aspect/ElasticserachAspect.php index 419cc55..587fc89 100644 --- a/src/Aspect/ElasticserachAspect.php +++ b/src/Aspect/ElasticserachAspect.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer\Aspect; diff --git a/src/Aspect/HttpClientAspect.php b/src/Aspect/HttpClientAspect.php index dfc5370..9e1ab08 100644 --- a/src/Aspect/HttpClientAspect.php +++ b/src/Aspect/HttpClientAspect.php @@ -2,23 +2,32 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer\Aspect; use GuzzleHttp\Client; +use GuzzleHttp\Exception\RequestException; +use GuzzleHttp\Promise\Create; +use GuzzleHttp\Promise\PromiseInterface; +use GuzzleHttp\Psr7\Uri; use Hyperf\Di\Aop\AbstractAspect; use Hyperf\Di\Aop\ProceedingJoinPoint; +use Hyperf\Di\Exception\Exception; +use Hyperf\Tracer\ExceptionAppender; use Hyperf\Tracer\SpanStarter; use Hyperf\Tracer\SpanTagManager; +use Hyperf\Tracer\Support\Uri as SupportUri; use Hyperf\Tracer\SwitchManager; use Hyperf\Tracer\TracerContext; +use OpenTracing\Span; +use OpenTracing\Tracer; use Psr\Http\Message\ResponseInterface; use Throwable; @@ -27,6 +36,7 @@ class HttpClientAspect extends AbstractAspect { use SpanStarter; + use ExceptionAppender; public array $classes = [ Client::class . '::request', @@ -42,26 +52,40 @@ public function __construct(private SwitchManager $switchManager, private SpanTa */ public function process(ProceedingJoinPoint $proceedingJoinPoint) { - if ($this->switchManager->isEnable('guzzle') === false) { + if ($this->switchManager->isEnabled('guzzle') === false) { return $proceedingJoinPoint->process(); } $options = $proceedingJoinPoint->arguments['keys']['options']; if (isset($options['no_aspect']) && $options['no_aspect'] === true) { return $proceedingJoinPoint->process(); } - // Disable the aspect for the requestAsync method. - if ($proceedingJoinPoint->methodName == 'request') { - $options['no_aspect'] = true; - } + /** @var Client $instance */ + $instance = $proceedingJoinPoint->getInstance(); + /** @var Uri $base_uri */ + $base_uri = $instance->getConfig('base_uri'); $arguments = $proceedingJoinPoint->arguments; - $method = $arguments['keys']['method'] ?? 'Null'; - $uri = $arguments['keys']['uri'] ?? 'Null'; - $key = "HTTP Request [{$method}] {$uri}"; - $span = $this->startSpan($key); + $method = strtoupper($arguments['keys']['method'] ?? ''); + $uri = $arguments['keys']['uri'] ?? ''; + $host = $base_uri === null ? (parse_url($uri, PHP_URL_HOST) ?? '') : $base_uri->getHost(); + $span = $this->startSpan( + sprintf( + '%s %s/%s', + $method, + rtrim((string) ($base_uri ?? ''), '/'), + ltrim(parse_url(SupportUri::sanitize($uri), PHP_URL_PATH) ?? '', '/') + ) + ); + + $span->setTag('category', 'http'); + $span->setTag('component', 'GuzzleHttp'); + $span->setTag('kind', 'client'); $span->setTag('source', $proceedingJoinPoint->className . '::' . $proceedingJoinPoint->methodName); if ($this->spanTagManager->has('http_client', 'http.url')) { $span->setTag($this->spanTagManager->get('http_client', 'http.url'), $uri); } + if ($this->spanTagManager->has('http_client', 'http.host')) { + $span->setTag($this->spanTagManager->get('http_client', 'http.host'), $host); + } if ($this->spanTagManager->has('http_client', 'http.method')) { $span->setTag($this->spanTagManager->get('http_client', 'http.method'), $method); } @@ -75,20 +99,57 @@ public function process(ProceedingJoinPoint $proceedingJoinPoint) $options['headers'] = array_replace($options['headers'] ?? [], $appendHeaders); $proceedingJoinPoint->arguments['keys']['options'] = $options; - try { - $result = $proceedingJoinPoint->process(); - if ($result instanceof ResponseInterface) { - $span->setTag($this->spanTagManager->get('http_client', 'http.status_code'), (string) $result->getStatusCode()); - } - } catch (Throwable $e) { - if ($this->switchManager->isEnable('exception') && ! $this->switchManager->isIgnoreException($e)) { - $span->setTag('error', true); - $span->log(['message', $e->getMessage(), 'code' => $e->getCode(), 'stacktrace' => $e->getTraceAsString()]); - } - throw $e; - } finally { - $span->finish(); - } + $this->appendCustomSpan($span, $options); + + /** @var PromiseInterface $result */ + $result = $proceedingJoinPoint->process(); + $result->then( + $this->onFullFilled($span, $options), + $this->onRejected($span, $options) + ); + $span->finish(); + return $result; } + + protected function appendCustomSpan(Span $span, array $options): void + { + // just for override + } + + protected function appendCustomResponseSpan(Span $span, array $options, ?ResponseInterface $response): void + { + // just for override + } + + private function onFullFilled(Span $span, array $options): callable + { + return function (ResponseInterface $response) use ($span, $options) { + $span->setTag( + $this->spanTagManager->get('http_client', 'http.status_code'), + $response->getStatusCode() + ); + $span->setTag('otel.status_code', 'OK'); + + $this->appendCustomResponseSpan($span, $options, $response); + }; + } + + private function onRejected(Span $span, array $options): callable + { + return function (RequestException $exception) use ($span, $options) { + if ($this->switchManager->isEnabled('exception')) { + $this->appendExceptionToSpan($span, $exception); + } + + $span->setTag( + $this->spanTagManager->get('http_client', 'http.status_code'), + $exception->getResponse()->getStatusCode() + ); + + $this->appendCustomResponseSpan($span, $options, $exception->getResponse()); + + return Create::rejectionFor($exception); + }; + } } diff --git a/src/Aspect/JsonRpcAspect.php b/src/Aspect/JsonRpcAspect.php index a65a5c6..9412225 100644 --- a/src/Aspect/JsonRpcAspect.php +++ b/src/Aspect/JsonRpcAspect.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer\Aspect; diff --git a/src/Aspect/MethodAspect.php b/src/Aspect/MethodAspect.php index 099c6b9..789bb2e 100644 --- a/src/Aspect/MethodAspect.php +++ b/src/Aspect/MethodAspect.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer\Aspect; @@ -35,7 +35,7 @@ public function __construct(private SwitchManager $switchManager) */ public function process(ProceedingJoinPoint $proceedingJoinPoint) { - if ($this->switchManager->isEnable('method') === false) { + if ($this->switchManager->isEnabled('method') === false) { return $proceedingJoinPoint->process(); } diff --git a/src/Aspect/MongoCollectionAspect.php b/src/Aspect/MongoCollectionAspect.php new file mode 100644 index 0000000..20013a5 --- /dev/null +++ b/src/Aspect/MongoCollectionAspect.php @@ -0,0 +1,121 @@ +tracer = $tracer; + $this->spanTagManager = $spanTagManager; + } + + public function process(ProceedingJoinPoint $proceedingJoinPoint) + { + if ($this->switchManager->isEnabled('mongo') === false) { + return $proceedingJoinPoint->process(); + } + + if (in_array($proceedingJoinPoint->methodName, $this->ignoredMethods)) { + return $proceedingJoinPoint->process(); + } + + $collectionName = $this->getCollectionName($proceedingJoinPoint); + $method = $proceedingJoinPoint->methodName; + $span = $this->startSpan( + sprintf( + 'Mongo::%s on %s', + $method, + $collectionName + ) + ); + + $span->setTag('category', 'datastore'); + $span->setTag('kind', 'client'); + $span->setTag('component', 'MongoDB'); + $span->setTag('db.system', 'mongodb'); + $span->setTag('source', $proceedingJoinPoint->className . '::' . $proceedingJoinPoint->methodName); + + if ($this->spanTagManager->has('mongo', 'collection')) { + $span->setTag($this->spanTagManager->get('mongo', 'collection'), $collectionName); + } + + if ($this->spanTagManager->has('mongo', 'method')) { + $span->setTag($this->spanTagManager->get('mongo', 'method'), $method); + } + + $appendHeaders = []; + $this->tracer->inject( + $span->getContext(), + TEXT_MAP, + $appendHeaders + ); + + try { + $result = $proceedingJoinPoint->process(); + $span->setTag('otel.status_code', 'OK'); + } catch (Throwable $exception) { + if ($this->switchManager->isEnabled('exception')) { + $this->appendExceptionToSpan($span, $exception); + } + throw $exception; + } finally { + $span->finish(); + } + + return $result; + } + + private function getCollectionName(ProceedingJoinPoint $proceedingJoinPoint): string + { + /** @var Collection $collection */ + $collection = $proceedingJoinPoint->getInstance(); + + $property = new ReflectionProperty(Collection::class, 'collection'); + $property->setAccessible(true); + + return $property->getValue($collection); + } +} diff --git a/src/Aspect/RedisAspect.php b/src/Aspect/RedisAspect.php index 641a07d..bd5306e 100644 --- a/src/Aspect/RedisAspect.php +++ b/src/Aspect/RedisAspect.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer\Aspect; @@ -37,16 +37,16 @@ public function __construct(private SwitchManager $switchManager, private SpanTa */ public function process(ProceedingJoinPoint $proceedingJoinPoint) { - if ($this->switchManager->isEnable('redis') === false) { + if ($this->switchManager->isEnabled('redis') === false) { return $proceedingJoinPoint->process(); } $arguments = $proceedingJoinPoint->arguments['keys']; $span = $this->startSpan('Redis::' . $arguments['name']); - $span->setTag($this->spanTagManager->get('redis', 'arguments'), json_encode($arguments['arguments'])); + $span->setTag($this->spanTagManager->get('redis', 'arguments'), json_encode($arguments['arguments'], JSON_THROW_ON_ERROR)); try { $result = $proceedingJoinPoint->process(); - $span->setTag($this->spanTagManager->get('redis', 'result'), json_encode($result)); + $span->setTag($this->spanTagManager->get('redis', 'result'), json_encode($result, JSON_THROW_ON_ERROR)); } catch (Throwable $e) { if ($this->switchManager->isEnable('exception') && ! $this->switchManager->isIgnoreException($e)) { $span->setTag('error', true); diff --git a/src/Aspect/TraceAnnotationAspect.php b/src/Aspect/TraceAnnotationAspect.php index 3e14c45..410f9af 100644 --- a/src/Aspect/TraceAnnotationAspect.php +++ b/src/Aspect/TraceAnnotationAspect.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer\Aspect; diff --git a/src/ConfigProvider.php b/src/ConfigProvider.php index e98107c..1de8562 100644 --- a/src/ConfigProvider.php +++ b/src/ConfigProvider.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer; @@ -18,14 +18,18 @@ use Hyperf\Tracer\Aspect\ElasticserachAspect; use Hyperf\Tracer\Aspect\GrpcAspect; use Hyperf\Tracer\Aspect\HttpClientAspect; +use Hyperf\Tracer\Aspect\MongoCollectionAspect; use Hyperf\Tracer\Aspect\RedisAspect; use Hyperf\Tracer\Aspect\RpcAspect; use Hyperf\Tracer\Aspect\TraceAnnotationAspect; use Hyperf\Tracer\Listener\DbQueryExecutedListener; +use Hyperf\Tracer\Middleware\TraceMiddleware; +use Jaeger\SpanContext; use Jaeger\ThriftUdpTransport; use OpenTracing\GlobalTracer; use OpenTracing\Tracer; use Zipkin\Propagation\Map; +use Jaeger\Codec\TextCodec; class ConfigProvider { @@ -41,12 +45,17 @@ public function __invoke(): array 'listeners' => [ DbQueryExecutedListener::class, ], + 'middlewares' => [ + TraceMiddleware::class, + ], 'annotations' => [ 'scan' => [ 'class_map' => [ GlobalTracer::class => __DIR__ . '/../class_map/GlobalTracer.php', Map::class => __DIR__ . '/../class_map/Map.php', ThriftUdpTransport::class => __DIR__ . '/../class_map/ThriftUdpTransport.php', + SpanContext::class => __DIR__ . '/../class_map/SpanContext.php', + TextCodec::class => __DIR__ . '/../class_map/TextCodec.php', ], ], ], @@ -59,6 +68,7 @@ public function __invoke(): array RedisAspect::class, RpcAspect::class, TraceAnnotationAspect::class, + MongoCollectionAspect::class, ], 'publish' => [ [ diff --git a/src/Contract/NamedFactoryInterface.php b/src/Contract/NamedFactoryInterface.php index ec81b3e..9bd6222 100644 --- a/src/Contract/NamedFactoryInterface.php +++ b/src/Contract/NamedFactoryInterface.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer\Contract; diff --git a/src/Exception/InvalidArgumentException.php b/src/Exception/InvalidArgumentException.php index abcb97c..af0d4fd 100644 --- a/src/Exception/InvalidArgumentException.php +++ b/src/Exception/InvalidArgumentException.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer\Exception; diff --git a/src/ExceptionAppender.php b/src/ExceptionAppender.php new file mode 100644 index 0000000..b73fe37 --- /dev/null +++ b/src/ExceptionAppender.php @@ -0,0 +1,31 @@ +setTag('error', true); + + $span->setTag('otel.status_code', 'ERROR'); + $span->setTag('otel.status_description', $exception->getMessage()); + + $span->setTag($this->spanTagManager->get('exception', 'class'), $exception::class); + $span->setTag($this->spanTagManager->get('exception', 'code'), $exception->getCode()); + $span->setTag($this->spanTagManager->get('exception', 'message'), $exception->getMessage()); + $span->setTag($this->spanTagManager->get('exception', 'stack_trace'), (string) $exception); + } +} diff --git a/src/Listener/DbQueryExecutedListener.php b/src/Listener/DbQueryExecutedListener.php index 23b35b7..cd0a453 100644 --- a/src/Listener/DbQueryExecutedListener.php +++ b/src/Listener/DbQueryExecutedListener.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer\Listener; @@ -40,7 +40,7 @@ public function listen(): array */ public function process(object $event): void { - if ($this->switchManager->isEnable('db') === false) { + if ($this->switchManager->isEnabled('db') === false) { return; } $sql = $event->sql; @@ -51,9 +51,17 @@ public function process(object $event): void } $endTime = microtime(true); - $span = $this->startSpan($this->spanTagManager->get('db', 'db.query'), [ + $span = $this->startSpan($sql, [ 'start_time' => (int) (($endTime - $event->time / 1000) * 1000 * 1000), ]); + + $span->setTag('category', 'datastore'); + $span->setTag('component', 'MySQL'); + $span->setTag('kind', 'client'); + $span->setTag('otel.status_code', 'OK'); + $span->setTag('db.system', 'mysql'); + $span->setTag('db.name', $event->connectionName); + $span->setTag($this->spanTagManager->get('db', 'db.statement'), $sql); $span->setTag($this->spanTagManager->get('db', 'db.query_time'), $event->time . ' ms'); $span->finish((int) ($endTime * 1000 * 1000)); diff --git a/src/Middleware/TraceMiddleware.php b/src/Middleware/TraceMiddleware.php index 65828a6..7727cd8 100644 --- a/src/Middleware/TraceMiddleware.php +++ b/src/Middleware/TraceMiddleware.php @@ -2,37 +2,57 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer\Middleware; use Hyperf\Coroutine\Coroutine; use Hyperf\HttpMessage\Exception\HttpException; +use Hyperf\Tracer\ExceptionAppender; use Hyperf\Tracer\SpanStarter; use Hyperf\Tracer\SpanTagManager; +use Hyperf\Tracer\Support\Uri; use Hyperf\Tracer\SwitchManager; use Hyperf\Tracer\TracerContext; use OpenTracing\Span; +use OpenTracing\Tracer; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Message\UriInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; use Throwable; use function Hyperf\Coroutine\defer; +use const OpenTracing\Tags\SPAN_KIND_RPC_SERVER; + class TraceMiddleware implements MiddlewareInterface { use SpanStarter; + use ExceptionAppender; - public function __construct(private SwitchManager $switchManager, private SpanTagManager $spanTagManager) - { + protected SpanTagManager $spanTagManager; + + protected Tracer $tracer; + + protected array $config; + + protected string $sensitive_headers_regex = '/pass|auth|token|secret/i'; + + public function __construct( + protected SwitchManager $switchManager, + SpanTagManager $spanTagManager, + ConfigInterface $config, + ) { + $this->spanTagManager = $spanTagManager; + $this->config = $config->get('opentracing'); } /** @@ -40,34 +60,38 @@ public function __construct(private SwitchManager $switchManager, private SpanTa * Processes an incoming server request in order to produce a response. * If unable to produce the response itself, it may delegate to the provided * request handler to do so. + * @throws Throwable */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { + if (! empty($this->config['ignore_path']) && preg_match($this->config['ignore_path'], $request->getUri()->getPath())) { + return $handler->handle($request); + } $tracer = TracerContext::getTracer(); $span = $this->buildSpan($request); - defer(function () use ($tracer) { + defer(function () { try { - $tracer->flush(); - } catch (Throwable) { + $this->tracer->flush(); + } catch (Throwable $exception) { + if (ApplicationContext::hasContainer() && ApplicationContext::getContainer()->has(StdoutLoggerInterface::class)) { + ApplicationContext::getContainer() + ->get(StdoutLoggerInterface::class) + ->error($exception->getMessage()); + } } }); try { $response = $handler->handle($request); - if ($traceId = TracerContext::getTraceId()) { - $response = $response->withHeader('Trace-Id', $traceId); - } - $span->setTag($this->spanTagManager->get('response', 'status_code'), (string) $response->getStatusCode()); - if ($this->spanTagManager->has('response', 'body')) { - $span->setTag($this->spanTagManager->get('response', 'body'), (string) $response->getBody()); - } + $span->setTag($this->spanTagManager->get('response', 'status_code'), $response->getStatusCode()); + $span->setTag('otel.status_code', 'OK'); + $this->appendCustomResponseSpan($span, $request, $response); } catch (Throwable $exception) { - if ($this->switchManager->isEnable('exception') && ! $this->switchManager->isIgnoreException($exception)) { - $this->appendExceptionToSpan($span, $exception); - } + $this->switchManager->isEnabled('exception') && $this->appendExceptionToSpan($span, $exception); if ($exception instanceof HttpException) { $span->setTag($this->spanTagManager->get('response', 'status_code'), (string) $exception->getStatusCode()); } + $this->appendCustomExceptionSpan($span, $exception); throw $exception; } finally { $span->finish(); @@ -76,29 +100,57 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface return $response; } - protected function appendExceptionToSpan(Span $span, Throwable $exception): void + protected function appendCustomExceptionSpan(Span $span, Throwable $exception): void + { + // just for override + } + + protected function appendCustomSpan(Span $span, ServerRequestInterface $request): void + { + // just for override + } + + protected function appendCustomResponseSpan(Span $span, ServerRequestInterface $request, ResponseInterface $response): void { - $span->setTag('error', true); - $span->setTag($this->spanTagManager->get('exception', 'class'), get_class($exception)); - $span->setTag($this->spanTagManager->get('exception', 'code'), (string) $exception->getCode()); - $span->setTag($this->spanTagManager->get('exception', 'message'), $exception->getMessage()); - $span->setTag($this->spanTagManager->get('exception', 'stack_trace'), (string) $exception); + // just for override } protected function buildSpan(ServerRequestInterface $request): Span { - $uri = $request->getUri(); - $span = $this->startSpan(sprintf('request: %s %s', $request->getMethod(), $uri->getPath())); + $path = $this->getPath($request->getUri()); + $spanName = sprintf('%s %s', $request->getMethod(), $path); + + $span = $this->startSpan($spanName, [], SPAN_KIND_RPC_SERVER); + + $span->setTag('kind', 'server'); + $span->setTag($this->spanTagManager->get('coroutine', 'id'), (string) Coroutine::id()); - $span->setTag($this->spanTagManager->get('request', 'path'), (string) $uri->getPath()); + $span->setTag($this->spanTagManager->get('request', 'path'), $path); $span->setTag($this->spanTagManager->get('request', 'method'), $request->getMethod()); - $span->setTag($this->spanTagManager->get('request', 'uri'), (string) $uri); - if ($this->spanTagManager->has('request', 'body')) { - $span->setTag($this->spanTagManager->get('request', 'body'), (string) $request->getBody()); - } + foreach ($request->getHeaders() as $key => $value) { + if (preg_match($this->sensitive_headers_regex, $key)) { + continue; + } + $span->setTag($this->spanTagManager->get('request', 'header') . '.' . $key, implode(', ', $value)); } + + foreach ($request->getAttributes() as $key => $value) { + if (! is_string($value) || empty($value)) { + continue; + } + + $span->setTag("attribute.{$key}", $value); + } + + $this->appendCustomSpan($span, $request); + return $span; } + + protected function getPath(UriInterface $uri): string + { + return Uri::sanitize($uri->getPath()); + } } diff --git a/src/SpanStarter.php b/src/SpanStarter.php index e6ccf8e..e8f74c6 100644 --- a/src/SpanStarter.php +++ b/src/SpanStarter.php @@ -2,18 +2,16 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer; -use Hyperf\Context\ApplicationContext; -use Hyperf\Context\Context; use Hyperf\Context\RequestContext; use Hyperf\Rpc; use OpenTracing\Span; @@ -21,7 +19,7 @@ use const OpenTracing\Formats\TEXT_MAP; use const OpenTracing\Tags\SPAN_KIND; -use const OpenTracing\Tags\SPAN_KIND_RPC_SERVER; +use const OpenTracing\Tags\SPAN_KIND_RPC_CLIENT; trait SpanStarter { @@ -31,12 +29,11 @@ trait SpanStarter protected function startSpan( string $name, array $option = [], - string $kind = SPAN_KIND_RPC_SERVER + string $kind = SPAN_KIND_RPC_CLIENT ): Span { $root = TracerContext::getRoot(); $tracer = TracerContext::getTracer(); if (! $root instanceof Span) { - $container = ApplicationContext::getContainer(); $request = RequestContext::getOrNull(); if (! $request instanceof ServerRequestInterface) { // If the request object is absent, we are probably in a commandLine context. @@ -46,13 +43,8 @@ protected function startSpan( TracerContext::setRoot($root); return $root; } - $carrier = array_map(fn ($header) => $header[0], $request->getHeaders()); - if ($container->has(Rpc\Context::class) && $rpcContext = $container->get(Rpc\Context::class)) { - $rpcCarrier = $rpcContext->get('tracer.carrier'); - if (! empty($rpcCarrier)) { - $carrier = $rpcCarrier; - } - } + $carrier = array_map(static fn ($header) => $header[0], $request->getHeaders()); + // Extracts the context from the HTTP headers. $spanContext = $tracer->extract(TEXT_MAP, $carrier); if ($spanContext) { diff --git a/src/SpanTagManager.php b/src/SpanTagManager.php index 8d523ce..be740e7 100644 --- a/src/SpanTagManager.php +++ b/src/SpanTagManager.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer; @@ -25,8 +25,8 @@ class SpanTagManager 'response.header' => 'grpc.response.header', ], 'redis' => [ - 'arguments' => 'redis.arguments', - 'result' => 'redis.result', + 'arguments' => 'db.arguments', + 'result' => 'db.result', ], 'db' => [ 'db.query' => 'db.query', diff --git a/src/SpanTagManagerFactory.php b/src/SpanTagManagerFactory.php index 94e722d..e863bf5 100644 --- a/src/SpanTagManagerFactory.php +++ b/src/SpanTagManagerFactory.php @@ -2,12 +2,12 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer; diff --git a/src/Support/GuzzleHeaderValidate.php b/src/Support/GuzzleHeaderValidate.php new file mode 100644 index 0000000..a392d73 --- /dev/null +++ b/src/Support/GuzzleHeaderValidate.php @@ -0,0 +1,37 @@ +traceIdHeader] = $this->spanContextToString( + $spanContext->getTraceId(), + $spanContext->getSpanId(), + $spanContext->getFlags() + ); + + $baggage = $spanContext->getBaggage(); + if (empty($baggage)) { + return; + } + + $baggageHeader = []; + + foreach ($baggage as $key => $value) { + $value = $key . '=' . $value; + if (!GuzzleHeaderValidate::isValidHeaderValue($value)) { + continue; + } + $baggageHeader[] = $value; + } + $carrier[$this->traceStateHeader] = implode(',', $baggageHeader); + } + + /** + * {@inheritdoc} + * + * @param mixed $carrier + * @return SpanContext|null + * + * @throws Exception + * @see \Jaeger\Tracer::extract + * + */ + public function extract($carrier) + { + $baggage = []; + $carrier = (array)$carrier; + + if (!isset($carrier[$this->traceIdHeader])) { + return null; + } + + [$version, $traceId, $spanId, $flags] = $this->spanContextFromString($carrier[$this->traceIdHeader]); + if (!empty($carrier[$this->traceStateHeader])) { + $traceStateHeaders = $carrier[$this->traceStateHeader]; + $state = explode(',', $traceStateHeaders); + foreach ($state as $stateItem) { + $stateItem = trim($stateItem); + $stateItem = explode('=', $stateItem); + if (count($stateItem) !== 2) { + continue; + } + $stateKey = $stateItem[0]; + $stateValue = $stateItem[1]; + $baggage[$stateKey] = $stateValue; + } + } + + if ($traceId === null && $baggage !== []) { + throw new Exception('baggage without trace ctx'); + } + + if ($traceId === null) { + return null; + } + + return new SpanContext($traceId, $spanId, null, $flags, $baggage); + } + + /** + * Store a span context to a string. + * + * @param string $traceId + * @param string $spanId + * @param string $flags + * @return string + */ + private function spanContextToString($traceId, $spanId, $flags) + { + $flags = str_pad($flags, 2, "0", STR_PAD_LEFT); + return sprintf('%s-%s-%s-%s', + self::VERSION, + JaegerDecoder::traceIdDecoder($traceId), + JaegerDecoder::spanIdDecoder($spanId), + $flags + ); + } + + /** + * Create a span context from a string. + * + * @param string $value + * @return array + * + * @throws Exception + */ + private function spanContextFromString($value): array + { + $parts = explode('-', $value); + + if (count($parts) != 4) { + throw new Exception('Malformed tracer state string.'); + } + /** + * TraceId em Otel ja é um hexadecimal de 32 caracteres e precisa permanecer assim. + * Span id sofre conversões no caminho porém é reportado em hexa, por isso é necessária a conversão + */ + + return [ + $parts[0], + $parts[1],// + CodecUtility::hexToInt64($parts[2]),// + $parts[3], + ]; + } +} diff --git a/src/Support/Uri.php b/src/Support/Uri.php new file mode 100644 index 0000000..f29ce45 --- /dev/null +++ b/src/Support/Uri.php @@ -0,0 +1,34 @@ +', + '/', + '/', + '/', + ], + $uri + ); + } +} diff --git a/src/Support/Uuid.php b/src/Support/Uuid.php new file mode 100644 index 0000000..60b505c --- /dev/null +++ b/src/Support/Uuid.php @@ -0,0 +1,30 @@ +has(StdoutLoggerInterface::class)) { + ApplicationContext::getContainer() + ->get(StdoutLoggerInterface::class) + ->warning($exception->getMessage()); + } + return null; + } + + return self::getTracerRoot($parent_id); + } } diff --git a/src/TracerFactory.php b/src/TracerFactory.php index d3cc77f..e9562c7 100644 --- a/src/TracerFactory.php +++ b/src/TracerFactory.php @@ -2,32 +2,37 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace Hyperf\Tracer; +use Exception; use Hyperf\Contract\ConfigInterface; -use Hyperf\Tracer\Adapter\ZipkinTracerFactory; +use Hyperf\Tracer\Adapter\JaegerTracerFactory; use Hyperf\Tracer\Contract\NamedFactoryInterface; -use Hyperf\Tracer\Exception\InvalidArgumentException; +use InvalidArgumentException; +use OpenTracing\Tracer; use Psr\Container\ContainerInterface; class TracerFactory { - public function __invoke(ContainerInterface $container) + /** + * @throws Exception + */ + public function __invoke(ContainerInterface $container): Tracer { $config = $container->get(ConfigInterface::class); $name = $config->get('opentracing.default'); // v1.0 has no 'default' config. Fallback to v1.0 mode for backward compatibility. if (empty($name)) { - $factory = $container->get(ZipkinTracerFactory::class); + $factory = $container->get(JaegerTracerFactory::class); return $factory->make(''); } diff --git a/tests/GuzzleHeaderValidateTest.php b/tests/GuzzleHeaderValidateTest.php new file mode 100644 index 0000000..5cc3cef --- /dev/null +++ b/tests/GuzzleHeaderValidateTest.php @@ -0,0 +1,35 @@ +tracer = Mockery::mock(Tracer::class); + $this->switchManager = Mockery::spy(SwitchManager::class); + $this->spanTagManager = Mockery::spy(SpanTagManager::class); + $this->config = Mockery::mock(ConfigInterface::class); + + $this->config + ->expects('get') + ->with('opentracing') + ->andReturn(['ignore_path' => '/^\/health$/']); + + $this->traceMiddleware = new TraceMiddleware( + $this->tracer, + $this->switchManager, + $this->spanTagManager, + $this->config, + ); + + parent::setUp(); + } + + public function testProcessIgnorePathIgnores(): void + { + $uri = Mockery::mock(UriInterface::class); + $uri->expects('getPath')->andReturn('/health'); + + $request = Mockery::mock(ServerRequestInterface::class); + $request->expects('getUri')->andReturn($uri); + + $handler = Mockery::mock(RequestHandlerInterface::class); + $handler->expects('handle')->with($request); + + $this->tracer->expects('startSpan')->never(); + $this->traceMiddleware->process($request, $handler); + } +} diff --git a/tests/TracerFactoryTest.php b/tests/TracerFactoryTest.php index 636e930..221c4ca 100644 --- a/tests/TracerFactoryTest.php +++ b/tests/TracerFactoryTest.php @@ -2,114 +2,40 @@ declare(strict_types=1); /** - * This file is part of Hyperf. + * This file is part of Hyperf + OpenCodeCo * - * @link https://www.hyperf.io + * @link https://opencodeco.dev * @document https://hyperf.wiki - * @contact group@hyperf.io - * @license https://github.com/hyperf/hyperf/blob/master/LICENSE + * @contact leo@opencodeco.dev + * @license https://github.com/opencodeco/hyperf-metric/blob/main/LICENSE */ namespace HyperfTest\Tracer; +use Exception; use Hyperf\Config\Config; use Hyperf\Context\ApplicationContext; use Hyperf\Contract\ConfigInterface; use Hyperf\Di\Container; use Hyperf\Tracer\Adapter\JaegerTracerFactory; -use Hyperf\Tracer\Adapter\NoOpTracerFactory; -use Hyperf\Tracer\Adapter\Reporter\HttpClientFactory; -use Hyperf\Tracer\Adapter\Reporter\ReporterFactory; -use Hyperf\Tracer\Adapter\ZipkinTracerFactory; use Hyperf\Tracer\TracerFactory; +use Jaeger\Tracer; use Mockery; -use OpenTracing\NoopTracer; -use PHPUnit\Framework\Attributes\CoversNothing; +use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration; use PHPUnit\Framework\TestCase; -use Zipkin\Reporters\Http; -use Zipkin\Samplers\BinarySampler; -use ZipkinOpenTracing\Tracer; - -use function Hyperf\Support\env; /** * @internal * @coversNothing */ -#[CoversNothing] class TracerFactoryTest extends TestCase { - protected function tearDown(): void - { - Mockery::close(); - } + use MockeryPHPUnitIntegration; - public function testOldSetting() - { - $config = new Config([ - 'opentracing' => [ - 'zipkin' => [ - 'app' => [ - 'name' => env('APP_NAME', 'skeleton'), - // Hyperf will detect the system info automatically as the value if ipv4, ipv6, port is null - 'ipv4' => '127.0.0.1', - 'ipv6' => null, - 'port' => 9501, - ], - 'options' => [ - 'endpoint_url' => env('ZIPKIN_ENDPOINT_URL', 'http://localhost:9411/api/v2/spans'), - 'timeout' => env('ZIPKIN_TIMEOUT', 1), - ], - 'sampler' => BinarySampler::createAsAlwaysSample(), - ], - ], - ]); - $container = $this->getContainer($config); - $factory = new TracerFactory(); - - $this->assertInstanceOf(Tracer::class, $factory($container)); - } - - public function testZipkinFactory() - { - $config = new Config([ - 'opentracing' => [ - 'default' => 'zipkin', - 'enable' => [ - ], - 'tracer' => [ - 'zipkin' => [ - 'driver' => ZipkinTracerFactory::class, - 'app' => [ - 'name' => 'skeleton', - // Hyperf will detect the system info automatically as the value if ipv4, ipv6, port is null - 'ipv4' => '127.0.0.1', - 'ipv6' => null, - 'port' => 9501, - ], - 'options' => [ - ], - 'sampler' => BinarySampler::createAsAlwaysSample(), - ], - 'jaeger' => [ - 'driver' => JaegerTracerFactory::class, - 'name' => 'skeleton', - 'options' => [ - ], - ], - 'noop' => [ - 'driver' => NoOpTracerFactory::class, - ], - ], - ], - ]); - $container = $this->getContainer($config); - $factory = new TracerFactory(); - - $this->assertInstanceOf(Tracer::class, $factory($container)); - } - - public function testJaegerFactory() + /** + * @throws Exception + */ + public function testJaegerFactory(): void { $config = new Config([ 'opentracing' => [ @@ -117,96 +43,32 @@ public function testJaegerFactory() 'enable' => [ ], 'tracer' => [ - 'zipkin' => [ - 'driver' => ZipkinTracerFactory::class, - 'app' => [ - 'name' => 'skeleton', - // Hyperf will detect the system info automatically as the value if ipv4, ipv6, port is null - 'ipv4' => '127.0.0.1', - 'ipv6' => null, - 'port' => 9501, - ], - 'options' => [ - ], - 'sampler' => BinarySampler::createAsAlwaysSample(), - ], 'jaeger' => [ 'driver' => JaegerTracerFactory::class, 'name' => 'skeleton', 'options' => [ ], ], - 'noop' => [ - 'driver' => NoOpTracerFactory::class, - ], ], ], ]); $container = $this->getContainer($config); $factory = new TracerFactory(); - $this->assertInstanceOf(\Jaeger\Tracer::class, $factory($container)); - } - - public function testNoOpFactory() - { - $config = new Config([ - 'opentracing' => [ - 'default' => 'noop', - 'enable' => [ - ], - 'tracer' => [ - 'zipkin' => [ - 'driver' => ZipkinTracerFactory::class, - 'app' => [ - 'name' => 'skeleton', - // Hyperf will detect the system info automatically as the value if ipv4, ipv6, port is null - 'ipv4' => '127.0.0.1', - 'ipv6' => null, - 'port' => 9501, - ], - 'options' => [ - ], - 'sampler' => BinarySampler::createAsAlwaysSample(), - ], - 'jaeger' => [ - 'driver' => JaegerTracerFactory::class, - 'name' => 'skeleton', - 'options' => [ - ], - ], - 'noop' => [ - 'driver' => NoOpTracerFactory::class, - ], - ], - ], - ]); - $container = $this->getContainer($config); - $factory = new TracerFactory(); - - $this->assertInstanceOf(NoopTracer::class, $factory($container)); + $this->assertInstanceOf(Tracer::class, $factory($container)); } protected function getContainer($config) { $container = Mockery::mock(Container::class); - $client = Mockery::mock(HttpClientFactory::class); - $reporter = Mockery::mock(ReporterFactory::class); - $reporter->shouldReceive('make') - ->andReturn(new Http([], $client)); - $container->shouldReceive('get') - ->with(ZipkinTracerFactory::class) - ->andReturn(new ZipkinTracerFactory($config, $reporter)); - $container->shouldReceive('get') + $container->allows('get') ->with(JaegerTracerFactory::class) - ->andReturn(new JaegerTracerFactory($config)); - $container->shouldReceive('get') - ->with(NoOpTracerFactory::class) - ->andReturn(new NoOpTracerFactory()); - $container->shouldReceive('get') + ->andReturns(new JaegerTracerFactory($config)); + + $container->allows('get') ->with(ConfigInterface::class) - ->andReturn($config); + ->andReturns($config); ApplicationContext::setContainer($container); diff --git a/tests/UriTest.php b/tests/UriTest.php new file mode 100644 index 0000000..d984e3b --- /dev/null +++ b/tests/UriTest.php @@ -0,0 +1,85 @@ +', Uri::sanitize('/v2/test/123')); + self::assertSame('/v3/test//bar', Uri::sanitize('/v3/test/123/bar')); + self::assertSame('/v4/test//bar//', Uri::sanitize('/v4/test/123/bar/456/')); + self::assertSame('/v5/test//', Uri::sanitize('/v5/test/123/456')); + self::assertSame('/v6/test///', Uri::sanitize('/v6/test/123/456/')); + self::assertSame('/v7/test///', Uri::sanitize('/v7/test/123/456/789')); + self::assertSame('/v8/test////', Uri::sanitize('/v8/test/123/456/789/')); + } + + public function testSanitizeLicensePlatesStrings(): void + { + self::assertSame('/v1/test', Uri::sanitize('/v1/test')); + self::assertSame('/v2/test/', Uri::sanitize('/v2/test/PET9D49')); + self::assertSame('/v2/test/', Uri::sanitize('/v2/test/PET9349')); + self::assertSame('/v3/test//bar', Uri::sanitize('/v3/test/PET9D49/bar')); + self::assertSame('/v3/test//bar', Uri::sanitize('/v3/test/PET9349/bar')); + self::assertSame('/v4/test//bar//', Uri::sanitize('/v4/test/PET9D49/bar/PET9D49/')); + self::assertSame('/v4/test//bar//', Uri::sanitize('/v4/test/PET9349/bar/PET9349/')); + self::assertSame('/v5/test//', Uri::sanitize('/v5/test/PET9D49/PET9D49')); + self::assertSame('/v5/test//', Uri::sanitize('/v5/test/PET9349/PET9349')); + self::assertSame('/v6/test///', Uri::sanitize('/v6/test/PET9D49/PET9D49/')); + self::assertSame('/v6/test///', Uri::sanitize('/v6/test/PET9349/PET9349/')); + self::assertSame('/v7/test///', Uri::sanitize('/v7/test/PET9D49/PET9D49/PET9D49')); + self::assertSame('/v7/test///', Uri::sanitize('/v7/test/PET9349/PET9349/PET9349')); + self::assertSame('/v8/test////', Uri::sanitize('/v8/test/PET9D49/PET9D49/PET9D49/')); + self::assertSame('/v8/test////', Uri::sanitize('/v8/test/PET9349/PET9349/PET9349/')); + self::assertSame('/v8/test/PET9349FOOBAR/foo/', Uri::sanitize('/v8/test/PET9349FOOBAR/foo/PET9349')); + } + + public function testClearUriUuids(): void + { + $uuid = '123e4567-e89b-12d3-a456-426614174000'; + + self::assertSame('/v1/test', Uri::sanitize('/v1/test')); + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$uuid}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$uuid}/bar")); + self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$uuid}/bar/{$uuid}/")); + self::assertSame('/v5/test//', Uri::sanitize("/v5/test/{$uuid}/{$uuid}")); + self::assertSame('/v6/test///', Uri::sanitize("/v6/test/{$uuid}/{$uuid}/")); + self::assertSame('/v7/test///', Uri::sanitize("/v7/test/{$uuid}/{$uuid}/{$uuid}")); + self::assertSame('/v8/test////', Uri::sanitize("/v8/test/{$uuid}/{$uuid}/{$uuid}/")); + } + + public function testClearUriOids(): void + { + $oid = '650229807612bba4984d1fc7'; + $oidLonger = 'ddb21302b3c66b5111bb99a907f783e2a29947f0'; + + self::assertSame('/v1/test', Uri::sanitize('/v1/test')); + self::assertSame('/v2/test/', Uri::sanitize("/v2/test/{$oid}")); + self::assertSame('/v3/test//bar', Uri::sanitize("/v3/test/{$oid}/bar")); + self::assertSame('/v4/test//bar//', Uri::sanitize("/v4/test/{$oid}/bar/{$oid}/")); + self::assertSame('/v5/test//', Uri::sanitize("/v5/test/{$oid}/{$oid}")); + self::assertSame('/v6/test///', Uri::sanitize("/v6/test/{$oid}/{$oid}/")); + self::assertSame('/v7/test///', Uri::sanitize("/v7/test/{$oid}/{$oid}/{$oid}")); + self::assertSame('/v8/test////', Uri::sanitize("/v8/test/{$oid}/{$oid}/{$oid}/")); + self::assertSame('/v2/token//foo/', Uri::sanitize("/v2/token/{$oidLonger}/foo/{$oid}")); + self::assertSame('/v3/token//foo//bar', Uri::sanitize("/v3/token/$oidLonger/foo/{$oid}/bar")); + } +} diff --git a/tests/UuidTest.php b/tests/UuidTest.php new file mode 100644 index 0000000..eabd4ac --- /dev/null +++ b/tests/UuidTest.php @@ -0,0 +1,31 @@ +