rkljw 1 gadu atpakaļ
vecāks
revīzija
4dcd1ccbfa
100 mainītis faili ar 15559 papildinājumiem un 27 dzēšanām
  1. 54 0
      Dockerfile
  2. 21 0
      LICENSE
  3. 51 27
      README.md
  4. 25 0
      app/Constants/ErrorCode.php
  5. 30 0
      app/Controller/AbstractController.php
  6. 27 0
      app/Controller/IndexController.php
  7. 38 0
      app/Exception/Handler/AppExceptionHandler.php
  8. 43 0
      app/Exception/Handler/JsonRpcExceptionHandler.php
  9. 720 0
      app/JsonRpc/ChatService.php
  10. 227 0
      app/JsonRpc/ChatServiceInterface.php
  11. 66 0
      app/Listener/DbQueryExecutedListener.php
  12. 35 0
      app/Listener/ResumeExitCoordinatorListener.php
  13. 38 0
      app/Middleware/CorsMiddleware.php
  14. 63 0
      app/Middleware/JWTAuthMiddleware.php
  15. 56 0
      app/Middleware/WebSocketAuthMiddleware.php
  16. 28 0
      app/Model/ChatChannel.php
  17. 29 0
      app/Model/Contact.php
  18. 29 0
      app/Model/ContactApply.php
  19. 28 0
      app/Model/Menu.php
  20. 19 0
      app/Model/Model.php
  21. 27 0
      app/Model/Role.php
  22. 27 0
      app/Model/RoleLog.php
  23. 28 0
      app/Model/TalkGroup.php
  24. 28 0
      app/Model/TalkGroupMember.php
  25. 29 0
      app/Model/TalkRecords.php
  26. 29 0
      app/Model/TalkRecordsFile.php
  27. 29 0
      app/Model/TalkSession.php
  28. 28 0
      app/Model/TalkSessionAssociation.php
  29. 28 0
      app/Model/TalkSessionStatus.php
  30. 28 0
      app/Model/User.php
  31. 27 0
      app/Model/UserInfo.php
  32. 27 0
      app/Model/UserLevel.php
  33. 27 0
      app/Model/UserLogin.php
  34. 27 0
      app/Model/Website.php
  35. 27 0
      app/Model/WebsiteColumn.php
  36. 53 0
      app/Tools/PublicData.php
  37. 26 0
      app/Tools/Result.php
  38. 31 0
      bin/hyperf.php
  39. 93 0
      composer.json
  40. 10510 0
      composer.lock
  41. 21 0
      config/autoload/annotations.php
  42. 13 0
      config/autoload/aspects.php
  43. 19 0
      config/autoload/cache.php
  44. 13 0
      config/autoload/commands.php
  45. 28 0
      config/autoload/config_center.php
  46. 44 0
      config/autoload/databases.php
  47. 13 0
      config/autoload/dependencies.php
  48. 44 0
      config/autoload/devtool.php
  49. 22 0
      config/autoload/exceptions.php
  50. 106 0
      config/autoload/jwt.php
  51. 15 0
      config/autoload/listeners.php
  52. 30 0
      config/autoload/logger.php
  53. 18 0
      config/autoload/middlewares.php
  54. 13 0
      config/autoload/processes.php
  55. 29 0
      config/autoload/redis.php
  56. 47 0
      config/autoload/server.php
  57. 33 0
      config/config.php
  58. 21 0
      config/container.php
  59. 25 0
      config/routes.php
  60. 30 0
      deploy.test.yml
  61. 18 0
      docker-compose.yml
  62. 14 0
      phpstan.neon.dist
  63. 16 0
      phpunit.xml.dist
  64. 1 0
      runtime/container/aspects.cache
  65. 0 0
      runtime/container/classes.cache
  66. 32 0
      runtime/container/proxy/App_Controller_AbstractController.proxy.php
  67. 31 0
      runtime/container/proxy/App_Controller_IndexController.proxy.php
  68. 0 0
      runtime/container/scan.cache
  69. 1 0
      runtime/hyperf.pid
  70. 443 0
      runtime/logs/hyperf.log
  71. 27 0
      test/Cases/ExampleTest.php
  72. 45 0
      test/HttpTestCase.php
  73. 30 0
      test/bootstrap.php
  74. 1 0
      vendor/96qbhy/hyperf-auth/.gitattributes
  75. 9 0
      vendor/96qbhy/hyperf-auth/.gitignore
  76. 87 0
      vendor/96qbhy/hyperf-auth/.php_cs
  77. 6 0
      vendor/96qbhy/hyperf-auth/.phpstorm.meta.php
  78. 40 0
      vendor/96qbhy/hyperf-auth/.travis.yml
  79. 21 0
      vendor/96qbhy/hyperf-auth/LICENSE
  80. 292 0
      vendor/96qbhy/hyperf-auth/README.md
  81. 84 0
      vendor/96qbhy/hyperf-auth/composer.json
  82. 15 0
      vendor/96qbhy/hyperf-auth/phpunit.xml
  83. 183 0
      vendor/96qbhy/hyperf-auth/publish/auth.php
  84. 23 0
      vendor/96qbhy/hyperf-auth/src/Annotation/Auth.php
  85. 31 0
      vendor/96qbhy/hyperf-auth/src/AuthAbility.php
  86. 50 0
      vendor/96qbhy/hyperf-auth/src/AuthAspect.php
  87. 42 0
      vendor/96qbhy/hyperf-auth/src/AuthCommand.php
  88. 32 0
      vendor/96qbhy/hyperf-auth/src/AuthExceptionHandler.php
  89. 31 0
      vendor/96qbhy/hyperf-auth/src/AuthGuard.php
  90. 114 0
      vendor/96qbhy/hyperf-auth/src/AuthManager.php
  91. 43 0
      vendor/96qbhy/hyperf-auth/src/AuthMiddleware.php
  92. 19 0
      vendor/96qbhy/hyperf-auth/src/Authenticatable.php
  93. 44 0
      vendor/96qbhy/hyperf-auth/src/ConfigProvider.php
  94. 40 0
      vendor/96qbhy/hyperf-auth/src/Events/ForcedOfflineEvent.php
  95. 16 0
      vendor/96qbhy/hyperf-auth/src/Exception/AuthException.php
  96. 16 0
      vendor/96qbhy/hyperf-auth/src/Exception/GuardException.php
  97. 39 0
      vendor/96qbhy/hyperf-auth/src/Exception/UnauthorizedException.php
  98. 16 0
      vendor/96qbhy/hyperf-auth/src/Exception/UserProviderException.php
  99. 60 0
      vendor/96qbhy/hyperf-auth/src/Guard/AbstractAuthGuard.php
  100. 207 0
      vendor/96qbhy/hyperf-auth/src/Guard/JwtGuard.php

+ 54 - 0
Dockerfile

@@ -0,0 +1,54 @@
+# Default Dockerfile
+#
+# @link     https://www.hyperf.io
+# @document https://hyperf.wiki
+# @contact  group@hyperf.io
+# @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+
+FROM hyperf/hyperf:8.3-alpine-v3.19-swoole
+LABEL maintainer="Hyperf Developers <group@hyperf.io>" version="1.0" license="MIT" app.name="Hyperf"
+
+##
+# ---------- env settings ----------
+##
+# --build-arg timezone=Asia/Shanghai
+ARG timezone
+
+ENV TIMEZONE=${timezone:-"Asia/Shanghai"} \
+    APP_ENV=prod \
+    SCAN_CACHEABLE=(true)
+
+# update
+RUN set -ex \
+    # show php version and extensions
+    && php -v \
+    && php -m \
+    && php --ri swoole \
+    #  ---------- some config ----------
+    && cd /etc/php* \
+    # - config PHP
+    && { \
+        echo "upload_max_filesize=128M"; \
+        echo "post_max_size=128M"; \
+        echo "memory_limit=1G"; \
+        echo "date.timezone=${TIMEZONE}"; \
+    } | tee conf.d/99_overrides.ini \
+    # - config timezone
+    && ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
+    && echo "${TIMEZONE}" > /etc/timezone \
+    # ---------- clear works ----------
+    && rm -rf /var/cache/apk/* /tmp/* /usr/share/man \
+    && echo -e "\033[42;37m Build Completed :).\033[0m\n"
+
+WORKDIR /opt/www
+
+# Composer Cache
+# COPY ./composer.* /opt/www/
+# RUN composer install --no-dev --no-scripts
+
+COPY . /opt/www
+RUN composer install --no-dev -o && php bin/hyperf.php
+
+EXPOSE 9501
+
+ENTRYPOINT ["php", "/opt/www/bin/hyperf.php", "start"]

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Hyperf
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 51 - 27
README.md

@@ -1,39 +1,63 @@
-# chat_producer
+# Introduction
 
-#### 介绍
-{**以下是 Gitee 平台说明,您可以替换此简介**
-Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台
-无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
+This is a skeleton application using the Hyperf framework. This application is meant to be used as a starting place for those looking to get their feet wet with Hyperf Framework.
 
-#### 软件架构
-软件架构说明
+# Requirements
 
+Hyperf has some requirements for the system environment, it can only run under Linux and Mac environment, but due to the development of Docker virtualization technology, Docker for Windows can also be used as the running environment under Windows.
 
-#### 安装教程
+The various versions of Dockerfile have been prepared for you in the [hyperf/hyperf-docker](https://github.com/hyperf/hyperf-docker) project, or directly based on the already built [hyperf/hyperf](https://hub.docker.com/r/hyperf/hyperf) Image to run.
 
-1.  xxxx
-2.  xxxx
-3.  xxxx
+When you don't want to use Docker as the basis for your running environment, you need to make sure that your operating environment meets the following requirements:  
 
-#### 使用说明
+ - PHP >= 8.1
+ - Any of the following network engines
+   - Swoole PHP extension >= 5.0,with `swoole.use_shortname` set to `Off` in your `php.ini`
+   - Swow PHP extension >= 1.3
+ - JSON PHP extension
+ - Pcntl PHP extension
+ - OpenSSL PHP extension (If you need to use the HTTPS)
+ - PDO PHP extension (If you need to use the MySQL Client)
+ - Redis PHP extension (If you need to use the Redis Client)
+ - Protobuf PHP extension (If you need to use the gRPC Server or Client)
 
-1.  xxxx
-2.  xxxx
-3.  xxxx
+# Installation using Composer
 
-#### 参与贡献
+The easiest way to create a new Hyperf project is to use [Composer](https://getcomposer.org/). If you don't have it already installed, then please install as per [the documentation](https://getcomposer.org/download/).
 
-1.  Fork 本仓库
-2.  新建 Feat_xxx 分支
-3.  提交代码
-4.  新建 Pull Request
+To create your new Hyperf project:
 
+```bash
+composer create-project hyperf/hyperf-skeleton path/to/install
+```
 
-#### 特技
+If your development environment is based on Docker you can use the official Composer image to create a new Hyperf project:
 
-1.  使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
-2.  Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
-3.  你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
-4.  [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
-5.  Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
-6.  Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
+```bash
+docker run --rm -it -v $(pwd):/app composer create-project --ignore-platform-reqs hyperf/hyperf-skeleton path/to/install
+```
+
+# Getting started
+
+Once installed, you can run the server immediately using the command below.
+
+```bash
+cd path/to/install
+php bin/hyperf.php start
+```
+
+Or if in a Docker based environment you can use the `docker-compose.yml` provided by the template:
+
+```bash
+cd path/to/install
+docker-compose up
+```
+
+This will start the cli-server on port `9501`, and bind it to all network interfaces. You can then visit the site at `http://localhost:9501/` which will bring up Hyperf default home page.
+
+## Hints
+
+- A nice tip is to rename `hyperf-skeleton` of files like `composer.json` and `docker-compose.yml` to your actual project name.
+- Take a look at `config/routes.php` and `app/Controller/IndexController.php` to see an example of a HTTP entrypoint.
+
+**Remember:** you can always replace the contents of this README.md file to something that fits your project description.

+ 25 - 0
app/Constants/ErrorCode.php

@@ -0,0 +1,25 @@
+<?php
+
+declare(strict_types=1);
+namespace App\Constants;
+use Hyperf\Constants\AbstractConstants;
+use Hyperf\Constants\Annotation\Constants;
+/**
+ * @Constants
+ */
+#[Constants]
+class ErrorCode extends AbstractConstants
+{
+    /**
+     * @Message("Server Error!")
+     */
+    const SERVER_ERROR = 500;
+    /**
+     * @Message("success")
+     */
+    public const SUCCESS = 200;
+    /**
+     * @Message("error")
+     */
+    public const ERROR = 0;
+}

+ 30 - 0
app/Controller/AbstractController.php

@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+
+namespace App\Controller;
+
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Contract\RequestInterface;
+use Hyperf\HttpServer\Contract\ResponseInterface;
+use Psr\Container\ContainerInterface;
+
+abstract class AbstractController
+{
+    #[Inject]
+    protected ContainerInterface $container;
+
+    #[Inject]
+    protected RequestInterface $request;
+
+    #[Inject]
+    protected ResponseInterface $response;
+}

+ 27 - 0
app/Controller/IndexController.php

@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+
+namespace App\Controller;
+
+class IndexController extends AbstractController
+{
+    public function index()
+    {
+        $user = $this->request->input('user', 'Hyperf');
+        $method = $this->request->getMethod();
+
+        return [
+            'method' => $method,
+            'message' => "Hello {$user}.",
+        ];
+    }
+}

+ 38 - 0
app/Exception/Handler/AppExceptionHandler.php

@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+
+namespace App\Exception\Handler;
+
+use Hyperf\Contract\StdoutLoggerInterface;
+use Hyperf\ExceptionHandler\ExceptionHandler;
+use Hyperf\HttpMessage\Stream\SwooleStream;
+use Psr\Http\Message\ResponseInterface;
+use Throwable;
+
+class AppExceptionHandler extends ExceptionHandler
+{
+    public function __construct(protected StdoutLoggerInterface $logger)
+    {
+    }
+
+    public function handle(Throwable $throwable, ResponseInterface $response)
+    {
+        $this->logger->error(sprintf('%s[%s] in %s', $throwable->getMessage(), $throwable->getLine(), $throwable->getFile()));
+        $this->logger->error($throwable->getTraceAsString());
+        return $response->withHeader('Server', 'Hyperf')->withStatus(500)->withBody(new SwooleStream('Internal Server Error.'));
+    }
+
+    public function isValid(Throwable $throwable): bool
+    {
+        return true;
+    }
+}

+ 43 - 0
app/Exception/Handler/JsonRpcExceptionHandler.php

@@ -0,0 +1,43 @@
+<?php
+declare(strict_types=1);
+namespace App\Exception\Handler;
+use http\Env;
+use Hyperf\Config\Annotation\Value;
+use Hyperf\Contract\ConfigInterface;
+use Hyperf\ExceptionHandler\ExceptionHandler;
+use Hyperf\HttpMessage\Stream\SwooleStream;
+use Hyperf\Context\ApplicationContext;
+use Psr\Http\Message\ResponseInterface;
+use Throwable;
+use function Hyperf\Support\env;
+class JsonRpcExceptionHandler extends ExceptionHandler
+{
+    /**
+     * @Value("app_name")
+     * @var $appName
+     */
+    public function handle(Throwable $throwable, ResponseInterface $response)
+    {
+        $responseContents = $response->getBody()->getContents();
+        $responseContents = json_decode($responseContents, true);
+        if (!empty($responseContents['error'])) {
+            $port = null;
+            $config = ApplicationContext::getContainer()->get(ConfigInterface::class);
+            $servers = $config->get('server.servers');
+            foreach ($servers as $k => $server) {
+                if ($server['name'] == 'jsonrpc-http') {
+                    $port = $server['port'];
+                    break;
+                }
+            }
+            $app_name = env("APP_NAME");
+            $responseContents['error']['message'] .= " - {$app_name}:{$port}";
+        }
+        $data = json_encode($responseContents, JSON_UNESCAPED_UNICODE);
+        return $response->withStatus(200)->withBody(new SwooleStream($data));
+    }
+    public function isValid(Throwable $throwable): bool
+    {
+        return true;
+    }
+}

+ 720 - 0
app/JsonRpc/ChatService.php

@@ -0,0 +1,720 @@
+<?php
+namespace App\JsonRpc;
+use App\Model\ChatChannel;
+use App\Model\ContactApply;
+use App\Model\Contact;
+use App\Model\TalkSession;
+use App\Model\TalkRecords;
+use App\Model\TalkRecordsFile;
+use App\Model\TalkGroup;
+use App\Model\TalkGroupMember;
+use App\Model\TalkSessionAssociation;
+use App\Tools\PublicData;
+use Hyperf\DbConnection\Db;
+use Hyperf\RpcServer\Annotation\RpcService;
+use App\Tools\Result;
+#[RpcService(name: "ChatService", protocol: "jsonrpc-http", server: "jsonrpc-http")]
+class ChatService implements ChatServiceInterface
+{
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function getChatChannelList(array $data): array
+    {
+        $result = ChatChannel::get();
+        return Result::success($result);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function delChatChannel(array $data): array
+    {
+        $result = ChatChannel::where(['fd'=>$data['fd']])->delete();
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function addChatChannel(array $data): array
+    {
+        $result = ChatChannel::insertGetId($data);
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+    /**
+     * 添加申请
+     * @param array $data
+     * @return array
+     */
+    public function addContactApply(array $data): array
+    {
+        $result = ContactApply::insertGetId($data);
+        if($result){
+            return Result::success($result);
+        }else{
+            return Result::error('添加申请失败');
+        }
+    }
+
+    /**
+     * 更新申请
+     * @param array $data
+     * @return array
+     */
+    public function updateContactApply(array $data): array
+    {
+        $type = $data['type'];
+        //判断同意还是不同意
+        if($type == 1){
+            Db::beginTransaction();
+            try{
+                //同意 双方互为好友 -添加好友关系
+                $data1 = [
+                    'user_id'=>$data['user_id'],
+                    'friend_id'=>$data['friend_id'],
+                ];
+                Contact::insertGetId($data1);
+                $data2 = [
+                    'user_id'=>$data['friend_id'],
+                    'friend_id'=>$data['user_id'],
+                ];
+                Contact::insertGetId($data2);
+                $where1 = [
+                    'friend_id'=>$data['user_id'],
+                    'user_id'=>$data['friend_id'],
+                ];
+                ContactApply::where($where1)->delete();
+                //创建会话
+                $sessionData = [
+                    'id'=>PublicData::uuid(),
+                    'talk_type'=>'1',
+                ];
+                TalkSession::insert($sessionData);
+
+                //添加会话关系
+                $talkSessionAssociationData = [
+                    [
+                        'id'=>PublicData::uuid(),
+                        'user_id'=>$data['user_id'],
+                        'to_user_id'=>$data['friend_id'],
+                        'session_id'=>$sessionData['id']
+                    ]
+                    ,[
+                        'id'=>PublicData::uuid(),
+                        'user_id'=>$data['friend_id'],
+                        'to_user_id'=>$data['user_id'],
+                        'session_id'=>$sessionData['id']
+                    ]
+
+                ];
+                TalkSessionAssociation::insert($talkSessionAssociationData);
+                Db::commit();
+            } catch(\Throwable $ex){
+                Db::rollBack();
+                var_dump($ex->getMessage());
+                return Result::error("同意添加为好友失败",0);
+            }
+        }else if($type == 2){
+            Db::beginTransaction();
+            try{
+                $where1 = [
+                    'friend_id'=>$data['user_id'],
+                    'user_id'=>$data['friend_id'],
+                ];
+                ContactApply::where($where1)->delete();
+                Db::commit();
+            } catch(\Throwable $ex){
+                Db::rollBack();
+                var_dump($ex->getMessage());
+                return Result::error("拒绝添加好友失败",0);
+            }
+        }
+        return Result::success([]);
+
+    }
+
+    /**
+     * 好友申请列表
+     * @param array $data
+     * @return array
+     */
+    public function getContactApplyList(array $data): array
+    {
+        $where = [
+            'friend_id'=>$data['user_id']
+        ];
+        $result = ContactApply::where($where)->get();
+        return Result::success($result);
+    }
+
+    /**
+     * 好有查询
+     * @param array $data
+     * @return array
+     */
+    public function getContactList(array $data): array
+    {
+        $where = [
+            ['contact.status','=','1'],
+            ['contact.user_id','=',$data['user_id']],
+        ];
+        if(isset($data['pageSize'])){
+            $result = Contact::where($where)
+                ->where(function ($query) use ($data) {
+                $query->where('user.nickname', 'like','%'.$data['keyWord'].'%')
+                    ->orWhere('contact.remark', 'like','%'.$data['keyWord'].'%');
+                })
+                ->leftJoin('user', 'user.id', '=', 'contact.friend_id')
+                ->select('contact.*', 'user.nickname','user.avatar')
+                ->limit($data['pageSize'])->offset(($data['page']-1)*$data['pageSize'])->orderBy("contact.created_at","desc")->get();
+        }else{
+            $result = Contact::where($where)
+                ->where(function ($query) use ($data) {
+                    $query->where('user.nickname', 'like','%'.$data['keyWord'].'%')
+                        ->orWhere('contact.remark', 'like','%'.$data['keyWord'].'%');
+                })
+                ->leftJoin('user', 'user.id', '=', 'contact.friend_id')
+                ->select('contact.*', 'user.nickname','user.avatar')
+                ->get();
+        }
+
+        $count = Contact::where($where)
+            ->where(function ($query) use ($data) {
+                $query->where('user.nickname', 'like','%'.$data['keyWord'].'%')
+                    ->orWhere('contact.remark', 'like','%'.$data['keyWord'].'%');
+            })
+            ->leftJoin('user', 'user.id', '=', 'contact.friend_id')
+            ->count();
+        if (empty($result)) {
+            return Result::error("没有数据",0);
+        }
+        $rep = $result->toArray();
+        $data = [
+            'rows'=>$rep,
+            'count'=>$count
+        ];
+        return Result::success($data);
+    }
+    /**
+     * 添加好友
+     * @param array $data
+     * @return array
+     */
+    public function addContact(array $data): array
+    {
+        $result = Contact::insertGetId($data);
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+    /**
+     * 更新好友
+     * @param array $data
+     * @return array
+     */
+    public function updateContact(array $data): array
+    {
+        $where = [
+            'id'=>$data['id']
+        ];
+        $result = Contact::where($where)->update($data);
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+
+    /**
+     * 删除好友 -- 软删除
+     * @param array $data
+     * @return array
+     */
+    public function delContact(array $data): array
+    {
+        $where = [
+            'user_id'=>$data['user_id'],
+            'friend_id'=>$data['friend_id'],
+        ];
+        $result = Contact::where($where)->update(['status'=>2]);
+        if($result){
+            return Result::success($result);
+        }else{
+            return Result::error('删除失败');
+        }
+    }
+
+    /**
+     * 会话列表
+     * @param array $data
+     * @return array
+     */
+    public function getTalkSessionList(array $data): array
+    {
+        $where = [
+            'talk_session_association.status'=>'1',
+            'talk_session_association.user_id'=>$data['user_id']
+        ];
+        $result = TalkSessionAssociation::where($where)
+            ->leftJoin('talk_session','talk_session.id','talk_session_association.session_id')
+            ->leftJoin('user','user.id','talk_session_association.to_user_id')
+            ->leftJoin('talk_group','talk_group.id','talk_session_association.to_user_id')
+            ->select(
+                'talk_session.talk_type',
+                'talk_group.group_name',
+                'talk_group.avatar as group_avatar',
+                'user.avatar as user_avatar',
+                'user.nickname',
+                'talk_session.last_content',
+                'user.user_name',
+                'talk_session.id as session_id',
+                'talk_session.talk_type'
+            )
+            ->limit($data['pageSize'])->offset(($data['page']-1)*$data['pageSize'])->orderBy("talk_session.updated_at","desc")->get();
+        $count =   TalkSessionAssociation::where($where)
+            ->leftJoin('talk_session','talk_session.id','talk_session_association.session_id')
+            ->leftJoin('user','user.id','talk_session_association.to_user_id')
+            ->leftJoin('talk_group','talk_group.id','talk_session_association.to_user_id')
+            ->count();
+        $repData = [
+            'row'=>$result,
+            'count'=>$count
+        ];
+        return Result::success($repData);
+    }
+    /**
+     * 添加会话
+     * @param array $data
+     * @return array
+     */
+    public function addTalkSession(array $data): array
+    {
+        $result = TalkSession::insert($data);
+        if($result){
+            return Result::success(['id'=>$data['id']]);
+        }else{
+            return Result::error('创建会话失败');
+        }
+    }
+
+    /**
+     * 更新会话
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkSession(array $data): array
+    {
+        $where = [
+            'id'=>$data['id']
+        ];
+        $result = TalkSession::where($where)->update($data);
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+    /**
+     * 删除会话
+     * @param array $data
+     * @return array
+     */
+    public function delTalkSession(array $data): array
+    {
+        $where = [
+            'id'=>$data['id']
+        ];
+        $result = TalkSession::where($where)->delete();
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+
+    /**
+     * 聊天内容-获取聊天内容列表
+     * @param array $data
+     * @return array
+     */
+    public function getTalkRecordsList(array $data): array
+    {
+        $talkSessionAssociationInfo = TalkSessionAssociation::where(['session_id'=>$data['session_id'],'to_user_id'=>$data['user_id']])->first();
+        $where = [
+            'talk_records.session_id' =>$data['session_id'],
+        ];
+        if($talkSessionAssociationInfo['status'] == 2){
+            $where[] = ['talk_records.created_at','>=',$talkSessionAssociationInfo['del_at']];
+        }
+        $result = TalkRecords::where($where)
+            ->leftJoin('user','user.id','talk_records.user_id')
+            ->select("user.avatar","talk_records.*")
+            ->limit($data['pageSize'])
+            ->offset(($data['page']-1)*$data['pageSize'])
+            ->orderBy("talk_session.updated_at","desc")
+            ->get();
+
+        return Result::success($result);
+    }
+    /**
+     * 添加聊天内容
+     * @param array $data
+     * @return array
+     */
+    public function addTalkRecords(array $data): array
+    {
+        Db::beginTransaction();
+        try{
+            //添加会话内容
+            $talkRecordsData = [
+                'id'=>PublicData::uuid(),
+                'msg_type'=>$data['msg_type']??0,
+                'user_id'=>$data['user_id']??0,
+                'session_id'=>$data['session_id']??'',
+                'talk_type'=>$data['talk_type']??0,
+                'content'=>$data['content']??'',
+            ];
+            TalkRecords::insert($talkRecordsData);
+            $fileData = [
+                'id'=>PublicData::uuid(),
+                'record_id'=>$talkRecordsData['id']??'',
+                'user_id'=>$data['user_id']??0,
+                'source'=>$data['source']??'',
+                'type'=>$data['type']??0,
+                'drive'=>$data['drive']??'',
+                'original_name'=>$data['original_name']??'',
+                'suffix'=>$data['suffix']??'',
+                'size'=>$data['size']??0,
+                'path'=>$data['path']??'',
+            ];
+            TalkRecordsFile::insert($fileData);
+            Db::commit();
+        } catch(\Throwable $ex){
+            Db::rollBack();
+            var_dump($ex->getMessage());
+            return Result::error("存储消息失败",0);
+        }
+
+        return Result::success([]);
+    }
+
+    /**
+     * 更新聊天内容
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkRecords(array $data): array
+    {
+        $where = [
+            'id'=>$data['id']
+        ];
+        $result = TalkRecords::where($where)->update($data);
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+    /**
+     * 删除聊天内容
+     * @param array $data
+     * @return array
+     */
+    public function delTalkRecords(array $data): array
+    {
+        $where = [
+            'id'=>$data['id']
+        ];
+        $result = TalkRecords::where($where)->delete();
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+
+    /**
+     * 聊天内容-附件列表
+     * @param array $data
+     * @return array
+     */
+    public function getTalkRecordsFileList(array $data): array
+    {
+        $result = TalkRecordsFile::get();
+        return Result::success($result);
+    }
+    /**
+     * 聊天内容-添加附件
+     * @param array $data
+     * @return array
+     */
+    public function addTalkRecordsFile(array $data): array
+    {
+        $result = TalkRecordsFile::insertGetId($data);
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+    /**
+     * 聊天内容 - 更新附件
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkRecordsFile(array $data): array
+    {
+        $where = [
+            'id'=>$data['id']
+        ];
+        $result = TalkRecordsFile::where($where)->update($data);
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+    /**
+     * 聊天内容 - 删除附件
+     * @param array $data
+     * @return array
+     */
+    public function delTalkRecordsFile(array $data): array
+    {
+        $where = [
+            'id'=>$data['id']
+        ];
+        $result = TalkRecordsFile::where($where)->delete();
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+    /**
+     * 群组 - 群列表
+     * @param array $data
+     * @return array
+     */
+    public function getTalkGroupList(array $data): array
+    {
+        $result = TalkGroup::get();
+        return Result::success($result);
+    }
+    /**
+     * 群组 - 创建群
+     * @param array $data
+     * @return array
+     */
+    public function addTalkGroup(array $data): array
+    {
+        Db::beginTransaction();
+        try{
+            //创建群
+            $groupData = [
+                'id' => PublicData::uuid(),
+                'creator_id'=>$data['user_id'],
+                'group_name'=>$data['group_name']
+            ];
+            TalkGroup::insert($groupData);
+
+            //创建群用户
+            $groupMemberData = [];
+            if($data['user_id_arr']){
+                foreach ($data['user_id_arr'] as $key=>$val){
+                    $groupMemberData[$key] = [
+                        'id' => PublicData::uuid(),
+                        'group_id' => $groupData['id'],
+                        'user_id' =>$val,
+                        'leader' =>$data['user_id'] == $val?2:0,
+                    ];
+                }
+            }
+            TalkGroupMember::insert($groupMemberData);
+            //创建会话
+            $sessionData = [
+                'id' =>  PublicData::uuid(),
+                'talk_type' => '2'
+            ];
+            TalkSession::insertGetId($sessionData);
+            //创建会话关系
+            $talkSessionAssociationData = [];
+            if($data['user_id_arr']){
+                foreach ($data['user_id_arr'] as $key=>$val){
+                    $talkSessionAssociationData[$key] = [
+                        'id' =>  PublicData::uuid(),
+                        'user_id' => $val,
+                        'to_user_id' => $groupData['id'],
+                        'session_id' =>$sessionData['id']
+                    ];
+                }
+            }
+            TalkSessionAssociation::insert($talkSessionAssociationData);
+            Db::commit();
+        } catch(\Throwable $ex){
+            Db::rollBack();
+            var_dump($ex->getMessage());
+            return Result::error("创建群失败",0);
+        }
+        return Result::success([]);
+    }
+
+    /**
+     * 群组 - 更新群
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkGroup(array $data): array
+    {
+        $where = [
+            'id'=>$data['id']
+        ];
+        $result = TalkGroup::where($where)->update($data);
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+    /**
+     * 群组 - 删除群
+     * @param array $data
+     * @return array
+     */
+    public function delTalkGroup(array $data): array
+    {
+        $where = [
+            'id'=>$data['id']
+        ];
+        $result = TalkGroup::where($where)->delete();
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+
+    /**
+     * 群组 - 群用户列表
+     * @param array $data
+     * @return array
+     */
+    public function getTalkGroupMember(array $data): array
+    {
+        $result = TalkGroupMember::get();
+        return Result::success($result);
+    }
+    /**
+     * 群组 - 创建群用户
+     * @param array $data
+     * @return array
+     */
+    public function addTalkGroupMember(array $data): array
+    {
+        $result = TalkGroupMember::insertGetId($data);
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+    /**
+     * 群组 - 更新群用户
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkGroupMember(array $data): array
+    {
+        $where = [
+            'id'=>$data['id']
+        ];
+        $result = TalkGroupMember::where($where)->update($data);
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+    /**
+     * 群组 - 删除群用户
+     * @param array $data
+     * @return array
+     */
+    public function delTalkGroupMember(array $data): array
+    {
+        $where = [
+            'id'=>$data['id']
+        ];
+        $result = TalkGroupMember::where($where)->delete();
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+    /**
+     * 更新 会话关系
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkSessionAssociation(array $data): array
+    {
+        $where = [
+            'id'=>$data['id']
+        ];
+        $result = TalkSessionAssociation::where($where)->update($data);
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+    /**
+     * 添加会话关系
+     * @param array $data
+     * @return array
+     */
+    public function addTalkSessionAssociation(array $data): array
+    {
+        var_dump($data);
+        $result = TalkSessionAssociation::insertGetId($data);
+        if($result){
+            return Result::success($data);
+        }else{
+            return Result::error($data);
+        }
+    }
+
+
+
+}

+ 227 - 0
app/JsonRpc/ChatServiceInterface.php

@@ -0,0 +1,227 @@
+<?php
+
+namespace App\JsonRpc;
+interface ChatServiceInterface
+{
+    /**
+     * 获取通道列表
+     * @param array $data
+     * @return array
+     */
+    public function getChatChannelList(array $data): array;
+
+    /**
+     * 删除通道
+     * @param array $data
+     * @return array
+     */
+    public function delChatChannel(array $data): array;
+
+    /**
+     * 创建通道
+     * @param array $data
+     * @return array
+     */
+    public function addChatChannel(array $data): array;
+
+    /**
+     * 添加申请
+     * @param array $data
+     * @return array
+     */
+    public function addContactApply(array $data): array;
+
+    /**
+     * 更新申请
+     * @param array $data
+     * @return array
+     */
+    public function updateContactApply(array $data): array;
+
+    /**
+     * 好友申请列表
+     * @param array $data
+     * @return array
+     */
+    public function getContactApplyList(array $data): array;
+
+    /**
+     * 好有查询
+     * @param array $data
+     * @return array
+     */
+    public function getContactList(array $data): array;
+    /**
+     * 添加好友
+     * @param array $data
+     * @return array
+     */
+    public function addContact(array $data): array;
+
+    /**
+     * 更新好友
+     * @param array $data
+     * @return array
+     */
+    public function updateContact(array $data): array;
+
+    /**
+     * 删除好友
+     * @param array $data
+     * @return array
+     */
+    public function delContact(array $data): array;
+
+    /**
+     * 会话列表
+     * @param array $data
+     * @return array
+     */
+    public function getTalkSessionList(array $data): array;
+    /**
+     * 添加会话
+     * @param array $data
+     * @return array
+     */
+    public function addTalkSession(array $data): array;
+
+    /**
+     * 更新会话
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkSession(array $data): array;
+
+    /**
+     * 删除会话
+     * @param array $data
+     * @return array
+     */
+    public function delTalkSession(array $data): array;
+
+
+    /**
+     * 聊天内容
+     * @param array $data
+     * @return array
+     */
+    public function getTalkRecordsList(array $data): array;
+    /**
+     * 添加聊天内容
+     * @param array $data
+     * @return array
+     */
+    public function addTalkRecords(array $data): array;
+
+    /**
+     * 更新聊天内容
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkRecords(array $data): array;
+
+    /**
+     * 删除聊天内容
+     * @param array $data
+     * @return array
+     */
+    public function delTalkRecords(array $data): array;
+
+
+    /**
+     * 聊天内容-附件列表
+     * @param array $data
+     * @return array
+     */
+    public function getTalkRecordsFileList(array $data): array;
+    /**
+     * 聊天内容-添加附件
+     * @param array $data
+     * @return array
+     */
+    public function addTalkRecordsFile(array $data): array;
+
+    /**
+     * 聊天内容 - 更新附件
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkRecordsFile(array $data): array;
+
+    /**
+     * 聊天内容 - 删除附件
+     * @param array $data
+     * @return array
+     */
+    public function delTalkRecordsFile(array $data): array;
+
+    /**
+     * 群组 - 群列表
+     * @param array $data
+     * @return array
+     */
+    public function getTalkGroupList(array $data): array;
+    /**
+     * 群组 - 创建群
+     * @param array $data
+     * @return array
+     */
+    public function addTalkGroup(array $data): array;
+
+    /**
+     * 群组 - 更新群
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkGroup(array $data): array;
+
+    /**
+     * 群组 - 删除群
+     * @param array $data
+     * @return array
+     */
+    public function delTalkGroup(array $data): array;
+
+
+    /**
+     * 群组 - 群用户列表
+     * @param array $data
+     * @return array
+     */
+    public function getTalkGroupMember(array $data): array;
+    /**
+     * 群组 - 创建群用户
+     * @param array $data
+     * @return array
+     */
+    public function addTalkGroupMember(array $data): array;
+
+    /**
+     * 群组 - 更新群用户
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkGroupMember(array $data): array;
+
+    /**
+     * 群组 - 删除群用户
+     * @param array $data
+     * @return array
+     */
+    public function delTalkGroupMember(array $data): array;
+
+    /**
+     * 添加会话关系
+     * @param array $data
+     * @return array
+     */
+    public function addTalkSessionAssociation(array $data): array;
+
+    /**
+     * 更新会话关系
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkSessionAssociation(array $data): array;
+
+}

+ 66 - 0
app/Listener/DbQueryExecutedListener.php

@@ -0,0 +1,66 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+
+namespace App\Listener;
+
+use Hyperf\Collection\Arr;
+use Hyperf\Database\Events\QueryExecuted;
+use Hyperf\Event\Annotation\Listener;
+use Hyperf\Event\Contract\ListenerInterface;
+use Hyperf\Logger\LoggerFactory;
+use Psr\Container\ContainerInterface;
+use Psr\Log\LoggerInterface;
+
+#[Listener]
+class DbQueryExecutedListener implements ListenerInterface
+{
+    /**
+     * @var LoggerInterface
+     */
+    private $logger;
+
+    public function __construct(ContainerInterface $container)
+    {
+        $this->logger = $container->get(LoggerFactory::class)->get('sql');
+    }
+
+    public function listen(): array
+    {
+        return [
+            QueryExecuted::class,
+        ];
+    }
+
+    /**
+     * @param QueryExecuted $event
+     */
+    public function process(object $event): void
+    {
+        if ($event instanceof QueryExecuted) {
+            $sql = $event->sql;
+            if (! Arr::isAssoc($event->bindings)) {
+                $position = 0;
+                foreach ($event->bindings as $value) {
+                    $position = strpos($sql, '?', $position);
+                    if ($position === false) {
+                        break;
+                    }
+                    $value = "'{$value}'";
+                    $sql = substr_replace($sql, $value, $position, 1);
+                    $position += strlen($value);
+                }
+            }
+
+            $this->logger->info(sprintf('[%s] %s', $event->time, $sql));
+        }
+    }
+}

+ 35 - 0
app/Listener/ResumeExitCoordinatorListener.php

@@ -0,0 +1,35 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+
+namespace App\Listener;
+
+use Hyperf\Command\Event\AfterExecute;
+use Hyperf\Coordinator\Constants;
+use Hyperf\Coordinator\CoordinatorManager;
+use Hyperf\Event\Annotation\Listener;
+use Hyperf\Event\Contract\ListenerInterface;
+
+#[Listener]
+class ResumeExitCoordinatorListener implements ListenerInterface
+{
+    public function listen(): array
+    {
+        return [
+            AfterExecute::class,
+        ];
+    }
+
+    public function process(object $event): void
+    {
+        CoordinatorManager::until(Constants::WORKER_EXIT)->resume();
+    }
+}

+ 38 - 0
app/Middleware/CorsMiddleware.php

@@ -0,0 +1,38 @@
+<?php
+declare(strict_types=1);
+
+/**
+ * This is my open source code, please do not use it for commercial applications.
+ * For the full copyright and license information,
+ * please view the LICENSE file that was distributed with this source code
+ *
+ * @author Yuandong<837215079@qq.com>
+ * @link   https://github.com/gzydong/hyperf-chat
+ */
+
+namespace App\Middleware;
+
+use Hyperf\Utils\Context;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\MiddlewareInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+
+class CorsMiddleware implements MiddlewareInterface
+{
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
+    {
+        $response = Context::get(ResponseInterface::class);
+        $response = $response->withHeader('Access-Control-Allow-Origin', '*')
+            ->withHeader('Access-Control-Allow-Credentials', 'true')
+            ->withHeader('Access-Control-Allow-Headers', 'DNT,Keep-Alive,User-Agent,Cache-Control,Content-Type,Authorization');
+
+        Context::set(ResponseInterface::class, $response);
+
+        if ($request->getMethod() == 'OPTIONS' || $request->getUri()->getPath() == '/favicon.ico') {
+            return $response;
+        }
+
+        return $handler->handle($request);
+    }
+}

+ 63 - 0
app/Middleware/JWTAuthMiddleware.php

@@ -0,0 +1,63 @@
+<?php
+declare(strict_types=1);
+
+/**
+ * This is my open source code, please do not use it for commercial applications.
+ * For the full copyright and license information,
+ * please view the LICENSE file that was distributed with this source code
+ *
+ * @author Yuandong<837215079@qq.com>
+ * @link   https://github.com/gzydong/hyperf-chat
+ */
+
+namespace App\Middleware;
+
+use Hyperf\HttpServer\Contract\RequestInterface;
+use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\MiddlewareInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+
+/**
+ * Http Token 授权验证中间件
+ *
+ * @package App\Middleware
+ */
+class JWTAuthMiddleware implements MiddlewareInterface
+{
+    /**
+     * @var RequestInterface
+     */
+    protected $request;
+
+    /**
+     * @var HttpResponse
+     */
+    protected $response;
+
+    /**
+     * 授权验证守卫
+     *
+     * @var string
+     */
+    private $guard = 'jwt';
+
+    public function __construct(HttpResponse $response, RequestInterface $request)
+    {
+        $this->response = $response;
+        $this->request  = $request;
+    }
+
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
+    {
+        if (auth($this->guard)->guest()) {
+            return $this->response->withStatus(401)->json([
+                'code'    => 401,
+                'message' => 'Token authentication does not pass !',
+            ]);
+        }
+
+        return $handler->handle($request);
+    }
+}

+ 56 - 0
app/Middleware/WebSocketAuthMiddleware.php

@@ -0,0 +1,56 @@
+<?php
+declare(strict_types=1);
+
+/**
+ * This is my open source code, please do not use it for commercial applications.
+ * For the full copyright and license information,
+ * please view the LICENSE file that was distributed with this source code
+ *
+ * @author Yuandong<837215079@qq.com>
+ * @link   https://github.com/gzydong/hyperf-chat
+ */
+
+namespace App\Middleware;
+
+use Hyperf\Di\Annotation\Inject;
+use Psr\Container\ContainerInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Server\MiddlewareInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+
+
+/**
+ * WebSocket token 授权验证中间件
+ *
+ * @package App\Middleware
+ */
+class WebSocketAuthMiddleware implements MiddlewareInterface
+{
+    /**
+     * @var ContainerInterface
+     */
+    protected $container;
+
+    /**
+     * 授权验证守卫
+     *
+     * @var string
+     */
+    private $guard = 'jwt';
+
+    public function __construct(ContainerInterface $container)
+    {
+        $this->container = $container;
+    }
+
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
+    {
+        // 授权验证拦截握手请求并实现权限检查
+//        if (auth($this->guard)->guest()) {
+//            return $this->container->get(\Hyperf\HttpServer\Contract\ResponseInterface::class)->raw('Forbidden');
+//        }
+
+        return $handler->handle($request);
+    }
+}

+ 28 - 0
app/Model/ChatChannel.php

@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class ChatChannel extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'chat_channel';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+
+}

+ 29 - 0
app/Model/Contact.php

@@ -0,0 +1,29 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class Contact extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'contact';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+
+}
+

+ 29 - 0
app/Model/ContactApply.php

@@ -0,0 +1,29 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class ContactApply extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'contact_apply';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+
+}
+

+ 28 - 0
app/Model/Menu.php

@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class Menu extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'menu';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+
+}

+ 19 - 0
app/Model/Model.php

@@ -0,0 +1,19 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model as BaseModel;
+
+abstract class Model extends BaseModel
+{
+}

+ 27 - 0
app/Model/Role.php

@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class Role extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'role';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+}

+ 27 - 0
app/Model/RoleLog.php

@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class RoleLog extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'role_log';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+}

+ 28 - 0
app/Model/TalkGroup.php

@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class TalkGroup extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'talk_group';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+
+}

+ 28 - 0
app/Model/TalkGroupMember.php

@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class TalkGroupMember extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'talk_group_member';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+
+}

+ 29 - 0
app/Model/TalkRecords.php

@@ -0,0 +1,29 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class TalkRecords extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'talk_records';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+
+}
+

+ 29 - 0
app/Model/TalkRecordsFile.php

@@ -0,0 +1,29 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class TalkRecordsFile extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'talk_records_file';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+
+}
+

+ 29 - 0
app/Model/TalkSession.php

@@ -0,0 +1,29 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class TalkSession extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'talk_session';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+
+}
+

+ 28 - 0
app/Model/TalkSessionAssociation.php

@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class TalkSessionAssociation extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'talk_session_association';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+
+}

+ 28 - 0
app/Model/TalkSessionStatus.php

@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class TalkSessionStatus extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'talk_session_status';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+
+}

+ 28 - 0
app/Model/User.php

@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class User extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'user';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = ["user_name","avatar","status","email","rong_token"];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+
+}

+ 27 - 0
app/Model/UserInfo.php

@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class UserInfo extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'user_info';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+}

+ 27 - 0
app/Model/UserLevel.php

@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class UserLevel extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'user_level';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+}

+ 27 - 0
app/Model/UserLogin.php

@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class UserLogin extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'user_login';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+}

+ 27 - 0
app/Model/Website.php

@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class Website extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'website';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+}

+ 27 - 0
app/Model/WebsiteColumn.php

@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class WebsiteColumn extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'website_column';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+}

+ 53 - 0
app/Tools/PublicData.php

@@ -0,0 +1,53 @@
+<?php
+namespace App\Tools;
+use App\Constants\ErrorCode;
+use Hyperf\Snowflake\IdGeneratorInterface;
+use Hyperf\Context\ApplicationContext;
+class PublicData
+{
+    /**
+     * 递归查询
+     * @param $menuItems
+     * @param $parentId
+     * @return array
+     */
+    public static  function buildMenuTree($menuItems, $parentId = 0) {
+        $tree = [];
+        foreach ($menuItems as $item) {
+            if ($item['pid'] == $parentId) {
+                // 找到子菜单
+                $children = self::buildMenuTree($menuItems, $item['id']);
+                // 如果子菜单存在,则添加到当前菜单的children中
+                if ($children) {
+                    $item['children'] = $children;
+                }
+                // 将当前菜单添加到树中
+                $tree[] = $item;
+            }
+        }
+        return $tree;
+    }
+
+    /**
+     * 计算两个时间差的天数
+     * @param $sTime
+     * @param $eTime
+     * @return float
+     */
+    public static function residueDay($sTime,$eTime)
+    {
+        $startTime = strtotime($sTime);
+        $endTime = strtotime($eTime);
+        $diffDays = floor(($endTime - $startTime) / (60 * 60 * 24));
+        return $diffDays;
+    }
+
+    public static function uuid()
+    {
+        $container = ApplicationContext::getContainer();
+        $generator = $container->get(IdGeneratorInterface::class);
+
+        return $generator->generate();
+    }
+
+}

+ 26 - 0
app/Tools/Result.php

@@ -0,0 +1,26 @@
+<?php
+namespace App\Tools;
+use App\Constants\ErrorCode;
+class Result
+{
+    public static function success($data = [])
+    {
+        return static::result(ErrorCode::SUCCESS, ErrorCode::getMessage(ErrorCode::SUCCESS), $data);
+    }
+    public static function error($message = '', $code = ErrorCode::ERROR, $data = [])
+    {
+        if (empty($message)) {
+            return static::result($code, ErrorCode::getMessage($code), $data);
+        } else {
+            return static::result($code, $message, $data);
+        }
+    }
+    protected static function result($code, $message, $data)
+    {
+        return [
+            'code' => $code,
+            'message' => $message,
+            'data' => $data,
+        ];
+    }
+}

+ 31 - 0
bin/hyperf.php

@@ -0,0 +1,31 @@
+#!/usr/bin/env php
+<?php
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+ini_set('display_errors', 'on');
+ini_set('display_startup_errors', 'on');
+ini_set('memory_limit', '1G');
+
+error_reporting(E_ALL);
+
+! defined('BASE_PATH') && define('BASE_PATH', dirname(__DIR__, 1));
+
+require BASE_PATH . '/vendor/autoload.php';
+
+! defined('SWOOLE_HOOK_FLAGS') && define('SWOOLE_HOOK_FLAGS', Hyperf\Engine\DefaultOption::hookFlags());
+
+// Self-called anonymous function that creates its own scope and keep the global namespace clean.
+(function () {
+    Hyperf\Di\ClassLoader::init();
+    /** @var Psr\Container\ContainerInterface $container */
+    $container = require BASE_PATH . '/config/container.php';
+
+    $application = $container->get(Hyperf\Contract\ApplicationInterface::class);
+    $application->run();
+})();

+ 93 - 0
composer.json

@@ -0,0 +1,93 @@
+{
+    "name": "hyperf/hyperf-skeleton",
+    "type": "project",
+    "keywords": [
+        "php",
+        "swoole",
+        "framework",
+        "hyperf",
+        "microservice",
+        "middleware"
+    ],
+    "description": "A coroutine framework that focuses on hyperspeed and flexible, specifically use for build microservices and middlewares.",
+    "license": "Apache-2.0",
+    "require": {
+        "php": ">=8.1",
+        "doctrine/annotations": "^2.0",
+        "hyperf/cache": "~3.1.0",
+        "hyperf/command": "~3.1.0",
+        "hyperf/config": "~3.1.0",
+        "hyperf/config-nacos": "^3.1",
+        "hyperf/constants": "^3.1",
+        "hyperf/database": "~3.1.0",
+        "hyperf/db-connection": "~3.1.0",
+        "hyperf/di": "^3.1",
+        "hyperf/engine": "^2.10",
+        "hyperf/framework": "~3.1.0",
+        "hyperf/guzzle": "~3.1.0",
+        "hyperf/http-server": "~3.1.0",
+        "hyperf/json-rpc": "^3.1",
+        "hyperf/logger": "~3.1.0",
+        "hyperf/memory": "~3.1.0",
+        "hyperf/nacos": "^3.1",
+        "hyperf/process": "~3.1.0",
+        "hyperf/redis": "^3.1",
+        "hyperf/rpc-server": "^3.1",
+        "hyperf/service-governance": "^3.1",
+        "hyperf/service-governance-consul": "^3.1",
+        "hyperf/service-governance-nacos": "^3.1",
+        "hyperf/snowflake": "^3.1",
+        "hyperf/socketio-server": "^3.1",
+        "hyperf/utils": "^3.1",
+        "hyperf/websocket-server": "^3.1"
+    },
+    "require-dev": {
+        "friendsofphp/php-cs-fixer": "^3.0",
+        "hyperf/devtool": "~3.1.0",
+        "hyperf/testing": "~3.1.0",
+        "hyperf/watcher": "^3.1",
+        "mockery/mockery": "^1.0",
+        "phpstan/phpstan": "^1.0",
+        "swoole/ide-helper": "^5.0"
+    },
+    "suggest": {
+        "ext-openssl": "Required to use HTTPS.",
+        "ext-json": "Required to use JSON.",
+        "ext-pdo": "Required to use MySQL Client.",
+        "ext-pdo_mysql": "Required to use MySQL Client.",
+        "ext-redis": "Required to use Redis Client."
+    },
+    "autoload": {
+        "psr-4": {
+            "App\\": "app/"
+        },
+        "files": []
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "HyperfTest\\": "./test/"
+        }
+    },
+    "minimum-stability": "dev",
+    "prefer-stable": true,
+    "config": {
+        "optimize-autoloader": true,
+        "sort-packages": true
+    },
+    "extra": [],
+    "scripts": {
+        "post-root-package-install": [
+            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
+        ],
+        "post-autoload-dump": [
+            "rm -rf runtime/container"
+        ],
+        "test": "co-phpunit --prepend test/bootstrap.php --colors=always",
+        "cs-fix": "php-cs-fixer fix $1",
+        "analyse": "phpstan analyse --memory-limit 300M",
+        "start": [
+            "Composer\\Config::disableProcessTimeout",
+            "php ./bin/hyperf.php start"
+        ]
+    }
+}

+ 10510 - 0
composer.lock

@@ -0,0 +1,10510 @@
+{
+    "_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": "7bf44d0b53b6ea9b9a5760a8499d05a5",
+    "packages": [
+        {
+            "name": "carbonphp/carbon-doctrine-types",
+            "version": "3.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git",
+                "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
+                "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.1"
+            },
+            "conflict": {
+                "doctrine/dbal": "<4.0.0 || >=5.0.0"
+            },
+            "require-dev": {
+                "doctrine/dbal": "^4.0.0",
+                "nesbot/carbon": "^2.71.0 || ^3.0.0",
+                "phpunit/phpunit": "^10.3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Carbon\\Doctrine\\": "src/Carbon/Doctrine/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "KyleKatarn",
+                    "email": "kylekatarnls@gmail.com"
+                }
+            ],
+            "description": "Types to use Carbon in Doctrine",
+            "keywords": [
+                "carbon",
+                "date",
+                "datetime",
+                "doctrine",
+                "time"
+            ],
+            "support": {
+                "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
+                "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/kylekatarnls",
+                    "type": "github"
+                },
+                {
+                    "url": "https://opencollective.com/Carbon",
+                    "type": "open_collective"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-02-09T16:56:22+00:00"
+        },
+        {
+            "name": "doctrine/annotations",
+            "version": "2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/annotations.git",
+                "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f",
+                "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/lexer": "^2 || ^3",
+                "ext-tokenizer": "*",
+                "php": "^7.2 || ^8.0",
+                "psr/cache": "^1 || ^2 || ^3"
+            },
+            "require-dev": {
+                "doctrine/cache": "^2.0",
+                "doctrine/coding-standard": "^10",
+                "phpstan/phpstan": "^1.8.0",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+                "symfony/cache": "^5.4 || ^6",
+                "vimeo/psalm": "^4.10"
+            },
+            "suggest": {
+                "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
+                }
+            },
+            "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": "Docblock Annotations Parser",
+            "homepage": "https://www.doctrine-project.org/projects/annotations.html",
+            "keywords": [
+                "annotations",
+                "docblock",
+                "parser"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/annotations/issues",
+                "source": "https://github.com/doctrine/annotations/tree/2.0.1"
+            },
+            "time": "2023-02-02T22:02:53+00:00"
+        },
+        {
+            "name": "doctrine/inflector",
+            "version": "2.0.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/inflector.git",
+                "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc",
+                "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc",
+                "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.10"
+            },
+            "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": "2024-02-18T20:23:39+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": "doctrine/lexer",
+            "version": "3.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/lexer.git",
+                "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+                "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.1"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^12",
+                "phpstan/phpstan": "^1.10",
+                "phpunit/phpunit": "^10.5",
+                "psalm/plugin-phpunit": "^0.18.3",
+                "vimeo/psalm": "^5.21"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\Lexer\\": "src"
+                }
+            },
+            "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": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+            "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+            "keywords": [
+                "annotations",
+                "docblock",
+                "lexer",
+                "parser",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/lexer/issues",
+                "source": "https://github.com/doctrine/lexer/tree/3.0.1"
+            },
+            "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%2Flexer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-02-05T11:56:58+00:00"
+        },
+        {
+            "name": "fig/http-message-util",
+            "version": "1.1.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-message-util.git",
+                "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765",
+                "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3 || ^7.0 || ^8.0"
+            },
+            "suggest": {
+                "psr/http-message": "The package containing the PSR-7 interfaces"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Fig\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Utility classes and constants for use with PSR-7 (psr/http-message)",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "issues": "https://github.com/php-fig/http-message-util/issues",
+                "source": "https://github.com/php-fig/http-message-util/tree/1.1.5"
+            },
+            "time": "2020-11-24T22:02:12+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/cache",
+            "version": "v3.1.23",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/cache.git",
+                "reference": "7783e220b984b26409d621da49b853340f788a6d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/cache/zipball/7783e220b984b26409d621da49b853340f788a6d",
+                "reference": "7783e220b984b26409d621da49b853340f788a6d",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/codec": "~3.1.0",
+                "hyperf/collection": "~3.1.0",
+                "hyperf/contract": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "php": ">=8.1",
+                "psr/container": "^1.0|^2.0",
+                "psr/simple-cache": "^1.0|^2.0|^3.0"
+            },
+            "suggest": {
+                "hyperf/di": "Use cache annotations.",
+                "hyperf/event": "Use listener to delete annotation cache."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\Cache\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Cache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A cache component for hyperf.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "cache",
+                "hyperf",
+                "php"
+            ],
+            "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": "2024-05-23T03:43:58+00:00"
+        },
+        {
+            "name": "hyperf/code-parser",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/code-parser.git",
+                "reference": "820e8e6680f0d04e4187a3037a2a3eaf7141913d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/code-parser/zipball/820e8e6680f0d04e4187a3037a2a3eaf7141913d",
+                "reference": "820e8e6680f0d04e4187a3037a2a3eaf7141913d",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/codec",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/codec.git",
+                "reference": "198c364ad8eadda13f1a0decdbb9221ac9c4c260"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/codec/zipball/198c364ad8eadda13f1a0decdbb9221ac9c4c260",
+                "reference": "198c364ad8eadda13f1a0decdbb9221ac9c4c260",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/collection",
+            "version": "v3.1.23.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/collection.git",
+                "reference": "8d10ca88228ee47c9cee578ac3699e795f468ada"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/collection/zipball/8d10ca88228ee47c9cee578ac3699e795f468ada",
+                "reference": "8d10ca88228ee47c9cee578ac3699e795f468ada",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/conditionable": "~3.1.0",
+                "hyperf/contract": "~3.1.0",
+                "hyperf/macroable": "~3.1.0",
+                "hyperf/stringable": "~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": "2024-05-24T08:33:42+00:00"
+        },
+        {
+            "name": "hyperf/command",
+            "version": "v3.1.24",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/command.git",
+                "reference": "b1ca85876f35f85fe3f52b0cc75bcc3da418769d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/command/zipball/b1ca85876f35f85fe3f52b0cc75bcc3da418769d",
+                "reference": "b1ca85876f35f85fe3f52b0cc75bcc3da418769d",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/collection": "~3.1.0",
+                "hyperf/context": "~3.1.0",
+                "hyperf/contract": "~3.1.0",
+                "hyperf/coroutine": "~3.1.0",
+                "hyperf/di": "~3.1.0",
+                "hyperf/stringable": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/tappable": "~3.1.0",
+                "php": ">=8.1",
+                "psr/event-dispatcher": "^1.0",
+                "symfony/console": "^5.0|^6.0|^7.0"
+            },
+            "suggest": {
+                "hyperf/di": "Required to use annotations.",
+                "hyperf/event": "Required to use listeners."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\Command\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Command\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Command for hyperf",
+            "keywords": [
+                "command",
+                "php",
+                "swoole"
+            ],
+            "support": {
+                "issues": "https://github.com/hyperf/command/issues",
+                "source": "https://github.com/hyperf/command/tree/v3.1.24"
+            },
+            "funding": [
+                {
+                    "url": "https://hyperf.wiki/#/zh-cn/donate",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://opencollective.com/hyperf",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2024-05-27T12:37:07+00:00"
+        },
+        {
+            "name": "hyperf/conditionable",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/conditionable.git",
+                "reference": "2c1555891d136904b890ba6d812d9ff50ca13ae3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/conditionable/zipball/2c1555891d136904b890ba6d812d9ff50ca13ae3",
+                "reference": "2c1555891d136904b890ba6d812d9ff50ca13ae3",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/config",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/config.git",
+                "reference": "5a92774d6db6bc02fc511c005c01f99d922aa292"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/config/zipball/5a92774d6db6bc02fc511c005c01f99d922aa292",
+                "reference": "5a92774d6db6bc02fc511c005c01f99d922aa292",
+                "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|^7.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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/config-center",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/config-center.git",
+                "reference": "a47acc3279ca173fa393b81175b6807859cd144e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/config-center/zipball/a47acc3279ca173fa393b81175b6807859cd144e",
+                "reference": "a47acc3279ca173fa393b81175b6807859cd144e",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/support": "~3.1.0",
+                "php": ">=8.1"
+            },
+            "suggest": {
+                "hyperf/process": "^2.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\ConfigCenter\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\ConfigCenter\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "The abstraction component of config center",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "config-center",
+                "hyperf",
+                "php"
+            ],
+            "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/config-nacos",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/config-nacos.git",
+                "reference": "e66bd614a5bc789f6ca28152a206218f77bc8dd2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/config-nacos/zipball/e66bd614a5bc789f6ca28152a206218f77bc8dd2",
+                "reference": "e66bd614a5bc789f6ca28152a206218f77bc8dd2",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/codec": "~3.1.0",
+                "hyperf/config-center": "~3.1.0",
+                "hyperf/contract": "~3.1.0",
+                "hyperf/guzzle": "~3.1.0",
+                "hyperf/nacos": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "jetbrains/phpstorm-attributes": "^1.0",
+                "php": ">=8.1"
+            },
+            "suggest": {
+                "ext-json": "*",
+                "ext-simplexml": "*",
+                "ext-yaml": "*",
+                "hyperf/event": "Required to use listeners. (~2.2.0)",
+                "hyperf/framework": "Required to use listeners. (~2.2.0)",
+                "hyperf/process": "Required to use processes. (~2.2.0)"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\ConfigNacos\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\ConfigNacos\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A nacos adapter for config center component.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "hyperf",
+                "nacos",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/constants",
+            "version": "v3.1.16",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/constants.git",
+                "reference": "55d46901660e4540195145d0e4066296cf0dc130"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/constants/zipball/55d46901660e4540195145d0e4066296cf0dc130",
+                "reference": "55d46901660e4540195145d0e4066296cf0dc130",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/di": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "php": ">=8.1"
+            },
+            "suggest": {
+                "hyperf/translation": "Required to use translation."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\Constants\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Constants\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A constants component for hyperf.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "constants",
+                "hyperf",
+                "php"
+            ],
+            "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": "2024-03-31T11:35:28+00:00"
+        },
+        {
+            "name": "hyperf/consul",
+            "version": "v3.1.22",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/consul.git",
+                "reference": "6e5e6936513c76812d6c1a066530543b15aec5e8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/consul/zipball/6e5e6936513c76812d6c1a066530543b15aec5e8",
+                "reference": "6e5e6936513c76812d6c1a066530543b15aec5e8",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/guzzle": "^6.3|^7.0",
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "hyperf/guzzle": "~3.1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\Consul\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Consul\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A Consul Client for Hyperf.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "consul",
+                "consul-client",
+                "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": "2024-05-15T06:42:24+00:00"
+        },
+        {
+            "name": "hyperf/context",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/context.git",
+                "reference": "ad913fd50eb5f738c038e172c120bc6956c0da69"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/context/zipball/ad913fd50eb5f738c038e172c120bc6956c0da69",
+                "reference": "ad913fd50eb5f738c038e172c120bc6956c0da69",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/contract",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/contract.git",
+                "reference": "9950abe963cc6b30c6d3506fa5b3adbd58cb1945"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/contract/zipball/9950abe963cc6b30c6d3506fa5b3adbd58cb1945",
+                "reference": "9950abe963cc6b30c6d3506fa5b3adbd58cb1945",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/coordinator",
+            "version": "v3.1.21",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/coordinator.git",
+                "reference": "caf5a70f96b7f22950e1caa3ba74f72c8382493c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/coordinator/zipball/caf5a70f96b7f22950e1caa3ba74f72c8382493c",
+                "reference": "caf5a70f96b7f22950e1caa3ba74f72c8382493c",
+                "shasum": ""
+            },
+            "require": {
+                "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\\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": "2024-05-09T02:35:08+00:00"
+        },
+        {
+            "name": "hyperf/coroutine",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/coroutine.git",
+                "reference": "8f4c573a9457646db3e629dacabe064eebaf8cc1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/coroutine/zipball/8f4c573a9457646db3e629dacabe064eebaf8cc1",
+                "reference": "8f4c573a9457646db3e629dacabe064eebaf8cc1",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/database",
+            "version": "v3.1.24",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/database.git",
+                "reference": "9897c211ada78b0603f4249466f0c1b3e2d6d938"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/database/zipball/9897c211ada78b0603f4249466f0c1b3e2d6d938",
+                "reference": "9897c211ada78b0603f4249466f0c1b3e2d6d938",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/code-parser": "~3.1.0",
+                "hyperf/collection": "~3.1.0",
+                "hyperf/macroable": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/tappable": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "nesbot/carbon": "^2.0",
+                "php": ">=8.1",
+                "psr/container": "^1.0|^2.0",
+                "psr/event-dispatcher": "^1.0"
+            },
+            "suggest": {
+                "doctrine/dbal": "Required to rename columns (^3.0).",
+                "nikic/php-parser": "Required to use ModelCommand. (^4.0)",
+                "php-di/phpdoc-reader": "Required to use ModelCommand. (^2.2)"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Database\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A flexible database library.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "database",
+                "hyperf",
+                "php"
+            ],
+            "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": "2024-05-24T06:14:27+00:00"
+        },
+        {
+            "name": "hyperf/db-connection",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/db-connection.git",
+                "reference": "bfe44b0365a555fb4b947df37b662fce26b905c0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/db-connection/zipball/bfe44b0365a555fb4b947df37b662fce26b905c0",
+                "reference": "bfe44b0365a555fb4b947df37b662fce26b905c0",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/database": "~3.1.0",
+                "hyperf/di": "~3.1.0",
+                "hyperf/framework": "~3.1.0",
+                "hyperf/model-listener": "~3.1.0",
+                "hyperf/pool": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "php": ">=8.1",
+                "psr/container": "^1.0|^2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\DbConnection\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\DbConnection\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A hyperf db connection handler for hyperf/database.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "Connection",
+                "database",
+                "hyperf",
+                "php"
+            ],
+            "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/di",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/di.git",
+                "reference": "681120f158739bde07dc5c761e11be56e8d07109"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/di/zipball/681120f158739bde07dc5c761e11be56e8d07109",
+                "reference": "681120f158739bde07dc5c761e11be56e8d07109",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "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|^7.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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/dispatcher",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/dispatcher.git",
+                "reference": "6a6f0f149081291664ff14bf34aecf2c01f89328"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/dispatcher/zipball/6a6f0f149081291664ff14bf34aecf2c01f89328",
+                "reference": "6a6f0f149081291664ff14bf34aecf2c01f89328",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/engine",
+            "version": "v2.11.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/engine.git",
+                "reference": "26e0b65fc2a63a00266e7124e221c6f3fb2c8e95"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/engine/zipball/26e0b65fc2a63a00266e7124e221c6f3fb2c8e95",
+                "reference": "26e0b65fc2a63a00266e7124e221c6f3fb2c8e95",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/engine-contract": "~1.10.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": "5.*"
+            },
+            "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.11-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.11.0"
+            },
+            "funding": [
+                {
+                    "url": "https://hyperf.wiki/#/zh-cn/donate",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://opencollective.com/hyperf",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2024-04-17T13:36:28+00:00"
+        },
+        {
+            "name": "hyperf/engine-contract",
+            "version": "v1.10.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/engine-contract.git",
+                "reference": "2714a8ba6d6b916e5bd373ff680df9569a4c9eef"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/engine-contract/zipball/2714a8ba6d6b916e5bd373ff680df9569a4c9eef",
+                "reference": "2714a8ba6d6b916e5bd373ff680df9569a4c9eef",
+                "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.10.1"
+            },
+            "funding": [
+                {
+                    "url": "https://hyperf.wiki/#/zh-cn/donate",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://opencollective.com/hyperf",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2024-04-17T13:34:51+00:00"
+        },
+        {
+            "name": "hyperf/event",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/event.git",
+                "reference": "8d008682c028e958197589e90232bb2a1d3c77d9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/event/zipball/8d008682c028e958197589e90232bb2a1d3c77d9",
+                "reference": "8d008682c028e958197589e90232bb2a1d3c77d9",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/exception-handler",
+            "version": "v3.1.22",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/exception-handler.git",
+                "reference": "6eefe07081ffaa0d6534273caa96722c606da6a8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/exception-handler/zipball/6eefe07081ffaa0d6534273caa96722c606da6a8",
+                "reference": "6eefe07081ffaa0d6534273caa96722c606da6a8",
+                "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": "2024-05-15T07:12:41+00:00"
+        },
+        {
+            "name": "hyperf/framework",
+            "version": "v3.1.23",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/framework.git",
+                "reference": "c40d529fafc197c67a64e9ca918498d417d4102c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/framework/zipball/c40d529fafc197c67a64e9ca918498d417d4102c",
+                "reference": "c40d529fafc197c67a64e9ca918498d417d4102c",
+                "shasum": ""
+            },
+            "require": {
+                "fig/http-message-util": "^1.1.2",
+                "hyperf/contract": "~3.1.0",
+                "hyperf/coordinator": "~3.1.0",
+                "hyperf/coroutine": "~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"
+            },
+            "suggest": {
+                "ext-swoole": "Required to use swoole engine.",
+                "hyperf/command": "Required to use Command annotation.",
+                "hyperf/di": "Required to use Command annotation.",
+                "hyperf/dispatcher": "Required to use BootApplication event.",
+                "symfony/event-dispatcher": "Required to use symfony event dispatcher (^5.0|^6.0)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\Framework\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Framework\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A coroutine framework that focuses on hyperspeed and flexible, specifically use for build microservices and middlewares.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "Microservice",
+                "framework",
+                "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": "2024-05-21T05:43:48+00:00"
+        },
+        {
+            "name": "hyperf/guzzle",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/guzzle.git",
+                "reference": "1281abe876925b8ef64a7372d53701fdb9a519cf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/guzzle/zipball/1281abe876925b8ef64a7372d53701fdb9a519cf",
+                "reference": "1281abe876925b8ef64a7372d53701fdb9a519cf",
+                "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.15"
+            },
+            "funding": [
+                {
+                    "url": "https://hyperf.wiki/#/zh-cn/donate",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://opencollective.com/hyperf",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/http-message",
+            "version": "v3.1.19",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/http-message.git",
+                "reference": "f96e372203bd6109bc1f6c15ee8eee3a76c8f92e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/http-message/zipball/f96e372203bd6109bc1f6c15ee8eee3a76c8f92e",
+                "reference": "f96e372203bd6109bc1f6c15ee8eee3a76c8f92e",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/codec": "~3.1.0",
+                "hyperf/engine": "^2.11",
+                "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.19"
+            },
+            "funding": [
+                {
+                    "url": "https://hyperf.wiki/#/zh-cn/donate",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://opencollective.com/hyperf",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2024-04-17T13:55:51+00:00"
+        },
+        {
+            "name": "hyperf/http-server",
+            "version": "v3.1.17",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/http-server.git",
+                "reference": "d2c633123dd8e7d5b2bcd1b24b7047fe3adc6424"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/http-server/zipball/d2c633123dd8e7d5b2bcd1b24b7047fe3adc6424",
+                "reference": "d2c633123dd8e7d5b2bcd1b24b7047fe3adc6424",
+                "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": "2024-04-08T07:53:54+00:00"
+        },
+        {
+            "name": "hyperf/json-rpc",
+            "version": "v3.1.23",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/json-rpc.git",
+                "reference": "234a3d8f9873a3d391cf9229fc5033638c5c9a93"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/json-rpc/zipball/234a3d8f9873a3d391cf9229fc5033638c5c9a93",
+                "reference": "234a3d8f9873a3d391cf9229fc5033638c5c9a93",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/codec": "~3.1.0",
+                "hyperf/context": "~3.1.0",
+                "hyperf/contract": "~3.1.0",
+                "hyperf/engine": "^2.0",
+                "hyperf/http-message": "~3.1.0",
+                "hyperf/load-balancer": "~3.1.0",
+                "hyperf/rpc": "~3.1.0",
+                "hyperf/serializer": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "php": ">=8.1",
+                "psr/container": "^1.0|^2.0",
+                "swow/psr7-plus": "^1.0"
+            },
+            "suggest": {
+                "hyperf/event": "Register the objects to ProtocolManager automatically.",
+                "hyperf/framework": "Register the objects to ProtocolManager automatically.",
+                "hyperf/guzzle": "Required to use JSON RPC with HTTP protocol.",
+                "hyperf/rpc-client": "Reqiured to use JSON RPC in hyperf rpc client.",
+                "hyperf/rpc-server": "Reqiured to use JSON RPC in hyperf rpc server."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\JsonRpc\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\JsonRpc\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A JSON RPC component for Hyperf RPC Server or Client.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "hyperf",
+                "json-rpc",
+                "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": "2024-05-23T03:43:58+00:00"
+        },
+        {
+            "name": "hyperf/load-balancer",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/load-balancer.git",
+                "reference": "f4bfecb7e6ef7c7cca008c90510a9e2c7f0c8f5a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/load-balancer/zipball/f4bfecb7e6ef7c7cca008c90510a9e2c7f0c8f5a",
+                "reference": "f4bfecb7e6ef7c7cca008c90510a9e2c7f0c8f5a",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/coordinator": "~3.1.0",
+                "hyperf/coroutine": "~3.1.0",
+                "markrogoyski/math-php": "^2.0",
+                "php": ">=8.1",
+                "psr/log": "^1.0|^2.0|^3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\LoadBalancer\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\LoadBalancer\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A load balancer library for Hyperf.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "hyperf",
+                "load-balancer",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/logger",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/logger.git",
+                "reference": "014f511449f84f6dea0cf368531ac07f31408496"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/logger/zipball/014f511449f84f6dea0cf368531ac07f31408496",
+                "reference": "014f511449f84f6dea0cf368531ac07f31408496",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/contract": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "monolog/monolog": "^2.7|^3.1",
+                "php": ">=8.1",
+                "psr/container": "^1.0|^2.0",
+                "psr/log": "^1.0|^2.0|^3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\Logger\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Logger\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A logger component for hyperf.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "hyperf",
+                "logger",
+                "php"
+            ],
+            "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/macroable",
+            "version": "v3.1.23",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/macroable.git",
+                "reference": "5f555c40bfec6aaab46f1bb1cac9ef556fbfbe72"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/macroable/zipball/5f555c40bfec6aaab46f1bb1cac9ef556fbfbe72",
+                "reference": "5f555c40bfec6aaab46f1bb1cac9ef556fbfbe72",
+                "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": "2024-05-20T09:55:40+00:00"
+        },
+        {
+            "name": "hyperf/memory",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/memory.git",
+                "reference": "1ad9df27b0817e74bb31b000735072c75fb41943"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/memory/zipball/1ad9df27b0817e74bb31b000735072c75fb41943",
+                "reference": "1ad9df27b0817e74bb31b000735072c75fb41943",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\Memory\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Memory\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "An independent component that use to operate and manage memory.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "hyperf",
+                "memory",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/model-listener",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/model-listener.git",
+                "reference": "a65804ea8cac4e383d275a1fff7f79cd6f387da6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/model-listener/zipball/a65804ea8cac4e383d275a1fff7f79cd6f387da6",
+                "reference": "a65804ea8cac4e383d275a1fff7f79cd6f387da6",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/contract": "~3.1.0",
+                "hyperf/database": "~3.1.0",
+                "hyperf/di": "~3.1.0",
+                "hyperf/event": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "php": ">=8.1",
+                "psr/container": "^1.0|^2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\ModelListener\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\ModelListener\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A model listener for Hyperf.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "hyperf",
+                "model-listener",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/nacos",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/nacos.git",
+                "reference": "b0dbfdf67f12740faab73a9496269f230c7459be"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/nacos/zipball/b0dbfdf67f12740faab73a9496269f230c7459be",
+                "reference": "b0dbfdf67f12740faab73a9496269f230c7459be",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/guzzle": "^6.5|^7.0",
+                "hyperf/codec": "~3.1.0",
+                "hyperf/contract": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "jetbrains/phpstorm-attributes": "^1.0",
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\Nacos\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Nacos\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Nacos SDK",
+            "keywords": [
+                "hyperf",
+                "nacos",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/hyperf/nacos/issues",
+                "source": "https://github.com/hyperf/nacos/tree/v3.1.15"
+            },
+            "funding": [
+                {
+                    "url": "https://hyperf.wiki/#/zh-cn/donate",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://opencollective.com/hyperf",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/pipeline",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/pipeline.git",
+                "reference": "ad4dbaeea2dc1166bb02e3ac5572f4eb773315a8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/pipeline/zipball/ad4dbaeea2dc1166bb02e3ac5572f4eb773315a8",
+                "reference": "ad4dbaeea2dc1166bb02e3ac5572f4eb773315a8",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/pool",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/pool.git",
+                "reference": "34d907adf5bb2727160bfcdeafe0e98cab00d6c7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/pool/zipball/34d907adf5bb2727160bfcdeafe0e98cab00d6c7",
+                "reference": "34d907adf5bb2727160bfcdeafe0e98cab00d6c7",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/contract": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "php": ">=8.1",
+                "psr/container": "^1.0|^2.0"
+            },
+            "suggest": {
+                "psr/event-dispatcher": "Required to use events."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\Pool\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Pool\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "An independent universal connection pool component.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "connection-pool",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/process",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/process.git",
+                "reference": "2d45d4002a64f23406e3c36d3edf5da42147156b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/process/zipball/2d45d4002a64f23406e3c36d3edf5da42147156b",
+                "reference": "2d45d4002a64f23406e3c36d3edf5da42147156b",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/contract": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "php": ">=8.1",
+                "psr/container": "^1.0|^2.0",
+                "psr/event-dispatcher": "^1.0"
+            },
+            "suggest": {
+                "hyperf/di": "Required to use annotations.",
+                "hyperf/event": "Required to dump the message before and after process.",
+                "hyperf/framework": "Required to use BootProcessListener."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\Process\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Process\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A process component for hyperf.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "hyperf",
+                "php",
+                "process"
+            ],
+            "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/redis",
+            "version": "v3.1.27",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/redis.git",
+                "reference": "535f5f107b6d531b56fabe017a5f544cc53fc194"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/redis/zipball/535f5f107b6d531b56fabe017a5f544cc53fc194",
+                "reference": "535f5f107b6d531b56fabe017a5f544cc53fc194",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-redis": "^5.0 || ^6.0",
+                "hyperf/contract": "~3.1.0",
+                "hyperf/pool": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/tappable": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "php": ">=8.1",
+                "psr/container": "^1.0 || ^2.0"
+            },
+            "suggest": {
+                "ext-redis": "Required to use sentinel mode (>=5.2).",
+                "hyperf/di": "Create the RedisPool via dependency injection."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\Redis\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Redis\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A redis component for hyperf.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "hyperf",
+                "php",
+                "pool",
+                "redis"
+            ],
+            "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": "2024-06-17T01:51:06+00:00"
+        },
+        {
+            "name": "hyperf/rpc",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/rpc.git",
+                "reference": "f5b0109aec760272357270662ad0914c4848b8c0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/rpc/zipball/f5b0109aec760272357270662ad0914c4848b8c0",
+                "reference": "f5b0109aec760272357270662ad0914c4848b8c0",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/codec": "~3.1.0",
+                "hyperf/contract": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "jetbrains/phpstorm-attributes": "^1.0",
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": []
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Rpc\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A rpc basic library for Hyperf.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "hyperf",
+                "php",
+                "rpc",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/rpc-server",
+            "version": "v3.1.20",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/rpc-server.git",
+                "reference": "9c820dc51893c6443c01fd0f2f534fc4bcc8a4f1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/rpc-server/zipball/9c820dc51893c6443c01fd0f2f534fc4bcc8a4f1",
+                "reference": "9c820dc51893c6443c01fd0f2f534fc4bcc8a4f1",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/http-server": "~3.1.0",
+                "hyperf/rpc": "~3.1.0",
+                "php": ">=8.1"
+            },
+            "suggest": {
+                "hyperf/di": "Required to use annotations."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\RpcServer\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\RpcServer\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "An abstract rpc server component for Hyperf.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "hyperf",
+                "php",
+                "rpc",
+                "rpc-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": "2024-04-22T01:46:29+00:00"
+        },
+        {
+            "name": "hyperf/serializer",
+            "version": "v3.1.23",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/serializer.git",
+                "reference": "d9b4f012565c90176c7cc117043c5907ea3795bb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/serializer/zipball/d9b4f012565c90176c7cc117043c5907ea3795bb",
+                "reference": "d9b4f012565c90176c7cc117043c5907ea3795bb",
+                "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": "2024-05-23T03:43:58+00:00"
+        },
+        {
+            "name": "hyperf/server",
+            "version": "v3.1.23",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/server.git",
+                "reference": "56c34b808df8f1e85991c26ee47c17025a29581c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/server/zipball/56c34b808df8f1e85991c26ee47c17025a29581c",
+                "reference": "56c34b808df8f1e85991c26ee47c17025a29581c",
+                "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|^7.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": "2024-05-23T03:43:58+00:00"
+        },
+        {
+            "name": "hyperf/service-governance",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/service-governance.git",
+                "reference": "e2d11bc91cc0ac5c32bf0ffa3a8c95ef3987b06a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/service-governance/zipball/e2d11bc91cc0ac5c32bf0ffa3a8c95ef3987b06a",
+                "reference": "e2d11bc91cc0ac5c32bf0ffa3a8c95ef3987b06a",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/contract": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "jetbrains/phpstorm-attributes": "^1.0",
+                "php": ">=8.1"
+            },
+            "suggest": {
+                "hyperf/event": "Required to use RegisterServiceListener.",
+                "hyperf/framework": "Required to use RegisterServiceListener.",
+                "hyperf/service-governance-consul": "Required to use consul adapter.",
+                "hyperf/service-governance-nacos": "Required to use nacos adapter."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\ServiceGovernance\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\ServiceGovernance\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A service governance component for Hyperf.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "hyperf",
+                "php",
+                "service-governance",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/service-governance-consul",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/service-governance-consul.git",
+                "reference": "fba1aa56a3298559ff290de9640e6eb5cfcf9ce4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/service-governance-consul/zipball/fba1aa56a3298559ff290de9640e6eb5cfcf9ce4",
+                "reference": "fba1aa56a3298559ff290de9640e6eb5cfcf9ce4",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/consul": "~3.1.0",
+                "hyperf/contract": "~3.1.0",
+                "hyperf/service-governance": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\ServiceGovernanceConsul\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\ServiceGovernanceConsul\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A consul adapter for service governance.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "consul-adapter",
+                "hyperf",
+                "php",
+                "service-governance",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/service-governance-nacos",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/service-governance-nacos.git",
+                "reference": "8f27ed823c17f55c88aa81ff31003f8995fa87cf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/service-governance-nacos/zipball/8f27ed823c17f55c88aa81ff31003f8995fa87cf",
+                "reference": "8f27ed823c17f55c88aa81ff31003f8995fa87cf",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/codec": "~3.1.0",
+                "hyperf/contract": "~3.1.0",
+                "hyperf/nacos": "~3.1.0",
+                "hyperf/service-governance": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\ServiceGovernanceNacos\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\ServiceGovernanceNacos\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A nacos adapter for service governance.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "hyperf",
+                "nacos-adapter",
+                "php",
+                "service-governance",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/snowflake",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/snowflake.git",
+                "reference": "a77b0d4c9215ef257781967a11334d2b9366390f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/snowflake/zipball/a77b0d4c9215ef257781967a11334d2b9366390f",
+                "reference": "a77b0d4c9215ef257781967a11334d2b9366390f",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "hyperf/contract": "~3.1.0",
+                "php": ">=8.1"
+            },
+            "suggest": {
+                "hyperf/config": "Required to read snowflake config.",
+                "hyperf/redis": "Required to use RedisMilliSecondMetaGenerator or RedisSecondMetaGenerator.",
+                "psr/container": "Required to use MetaGeneratorFactory."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\Snowflake\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Snowflake\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A snowflake library",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "php",
+                "snowflake"
+            ],
+            "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/socketio-server",
+            "version": "v3.1.27",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/socketio-server.git",
+                "reference": "e0fbb6ee8e3defc47ab7591170235fad28367ee5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/socketio-server/zipball/e0fbb6ee8e3defc47ab7591170235fad28367ee5",
+                "reference": "e0fbb6ee8e3defc47ab7591170235fad28367ee5",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "ext-redis": "*",
+                "hyperf/codec": "~3.1.0",
+                "hyperf/collection": "~3.1.0",
+                "hyperf/di": "~3.1.0",
+                "hyperf/redis": "~3.1.0",
+                "hyperf/websocket-server": "~3.1.0",
+                "php": ">=8.1",
+                "psr/container": "^1.0 || ^2.0"
+            },
+            "conflict": {
+                "mix/redis-subscriber": "<3.0.4"
+            },
+            "suggest": {
+                "hyperf/command": "Required to use RemoveRedisGarbage command",
+                "hyperf/nsq": "Required to use RedisNsqAdapter",
+                "hyperf/session": "Required to use session",
+                "mix/redis-subscriber": "Suggest to use RedisAdapter (^3.0.4)"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\SocketIOServer\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\SocketIOServer\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Socket.io implementation for hyperf",
+            "keywords": [
+                "hyperf",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/hyperf/socketio-server/issues",
+                "source": "https://github.com/hyperf/socketio-server/tree/v3.1.27"
+            },
+            "funding": [
+                {
+                    "url": "https://hyperf.wiki/#/zh-cn/donate",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://opencollective.com/hyperf",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2024-06-17T01:51:06+00:00"
+        },
+        {
+            "name": "hyperf/stdlib",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/stdlib.git",
+                "reference": "636fdc1f15d9357b4747fa649874725f2276b118"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/stdlib/zipball/636fdc1f15d9357b4747fa649874725f2276b118",
+                "reference": "636fdc1f15d9357b4747fa649874725f2276b118",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/stringable",
+            "version": "v3.1.24",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/stringable.git",
+                "reference": "ee6b1788489ddb0c06c8f12ed5ccfa70dfa7efbc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/stringable/zipball/ee6b1788489ddb0c06c8f12ed5ccfa70dfa7efbc",
+                "reference": "ee6b1788489ddb0c06c8f12ed5ccfa70dfa7efbc",
+                "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": "2024-05-27T03:20:24+00:00"
+        },
+        {
+            "name": "hyperf/support",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/support.git",
+                "reference": "3fb5c6c5a4f795cb0304a032f6f5b85f62a5f872"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/support/zipball/3fb5c6c5a4f795cb0304a032f6f5b85f62a5f872",
+                "reference": "3fb5c6c5a4f795cb0304a032f6f5b85f62a5f872",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/tappable",
+            "version": "v3.1.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/tappable.git",
+                "reference": "69f22bbc8ecb5b930cc95a49ae9bf0ca0efbfdf1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/tappable/zipball/69f22bbc8ecb5b930cc95a49ae9bf0ca0efbfdf1",
+                "reference": "69f22bbc8ecb5b930cc95a49ae9bf0ca0efbfdf1",
+                "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": "2024-03-23T11:28:51+00:00"
+        },
+        {
+            "name": "hyperf/utils",
+            "version": "v3.1.27",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/utils.git",
+                "reference": "05cbe18451813d843df419eabdf6c69843796f20"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/utils/zipball/05cbe18451813d843df419eabdf6c69843796f20",
+                "reference": "05cbe18451813d843df419eabdf6c69843796f20",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "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": "2024-06-17T01:51:06+00:00"
+        },
+        {
+            "name": "hyperf/websocket-server",
+            "version": "v3.1.16",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/websocket-server.git",
+                "reference": "b4b0903ff87a1763941c014bf755b352663d73d4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/websocket-server/zipball/b4b0903ff87a1763941c014bf755b352663d73d4",
+                "reference": "b4b0903ff87a1763941c014bf755b352663d73d4",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "hyperf/collection": "~3.1.0",
+                "hyperf/contract": "~3.1.0",
+                "hyperf/exception-handler": "~3.1.0",
+                "hyperf/http-server": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "php": ">=8.1",
+                "psr/container": "^1.0|^2.0",
+                "psr/event-dispatcher": "^1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\WebSocketServer\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\WebSocketServer\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A websocket server library for Hyperf.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "hyperf",
+                "php",
+                "swoole",
+                "websocket"
+            ],
+            "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": "2024-04-02T02:40:09+00:00"
+        },
+        {
+            "name": "jetbrains/phpstorm-attributes",
+            "version": "1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/JetBrains/phpstorm-attributes.git",
+                "reference": "22fb28d679deceedba8366dbae65cc8ebfc17e26"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/JetBrains/phpstorm-attributes/zipball/22fb28d679deceedba8366dbae65cc8ebfc17e26",
+                "reference": "22fb28d679deceedba8366dbae65cc8ebfc17e26",
+                "shasum": ""
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "JetBrains\\PhpStorm\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "JetBrains",
+                    "homepage": "https://www.jetbrains.com"
+                }
+            ],
+            "description": "PhpStorm specific attributes",
+            "keywords": [
+                "attributes",
+                "jetbrains",
+                "phpstorm"
+            ],
+            "support": {
+                "issues": "https://youtrack.jetbrains.com/newIssue?project=WI",
+                "source": "https://github.com/JetBrains/phpstorm-attributes/tree/1.1"
+            },
+            "time": "2023-09-01T08:50:25+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.19.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/laminas/laminas-stdlib.git",
+                "reference": "6a192dd0882b514e45506f533b833b623b78fff3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/6a192dd0882b514e45506f533b833b623b78fff3",
+                "reference": "6a192dd0882b514e45506f533b833b623b78fff3",
+                "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.15",
+                "phpunit/phpunit": "^10.5.8",
+                "psalm/plugin-phpunit": "^0.18.4",
+                "vimeo/psalm": "^5.20.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": "2024-01-19T12:39:49+00:00"
+        },
+        {
+            "name": "markrogoyski/math-php",
+            "version": "v2.10.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/markrogoyski/math-php.git",
+                "reference": "e587bfe3aadddfba0f3a40f49d2ed91132f30c5a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/markrogoyski/math-php/zipball/e587bfe3aadddfba0f3a40f49d2ed91132f30c5a",
+                "reference": "e587bfe3aadddfba0f3a40f49d2ed91132f30c5a",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "php": ">=7.2.0"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "^2.0",
+                "php-parallel-lint/php-parallel-lint": "^1.2",
+                "phploc/phploc": "*",
+                "phpmd/phpmd": "^2.6",
+                "phpstan/phpstan": "^1.10",
+                "phpunit/phpunit": "^8.5",
+                "squizlabs/php_codesniffer": "3.*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "MathPHP\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mark Rogoyski",
+                    "email": "mark@rogoyski.com",
+                    "homepage": "https://github.com/markrogoyski",
+                    "role": "Lead developer"
+                },
+                {
+                    "name": "Kevin Nowaczyk",
+                    "homepage": "https://github.com/Beakerboy",
+                    "role": "Developer"
+                },
+                {
+                    "name": "MathPHP Community of Contributors",
+                    "homepage": "https://github.com/markrogoyski/math-php/graphs/contributors"
+                }
+            ],
+            "description": "Math Library for PHP. Features descriptive statistics and regressions; Continuous and discrete probability distributions; Linear algebra with matrices and vectors, Numerical analysis; special mathematical functions; Algebra",
+            "homepage": "https://github.com/markrogoyski/math-php/",
+            "keywords": [
+                "algebra",
+                "combinatorics",
+                "distributions",
+                "linear algebra",
+                "math",
+                "mathematics",
+                "matrix",
+                "numerical analysis",
+                "probability",
+                "regressions",
+                "statistics"
+            ],
+            "support": {
+                "issues": "https://github.com/markrogoyski/math-php/issues",
+                "source": "https://github.com/markrogoyski/math-php/tree/v2.10.0"
+            },
+            "time": "2024-04-17T00:09:51+00:00"
+        },
+        {
+            "name": "monolog/monolog",
+            "version": "3.6.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/monolog.git",
+                "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4b18b21a5527a3d5ffdac2fd35d3ab25a9597654",
+                "reference": "4b18b21a5527a3d5ffdac2fd35d3ab25a9597654",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "psr/log": "^2.0 || ^3.0"
+            },
+            "provide": {
+                "psr/log-implementation": "3.0.0"
+            },
+            "require-dev": {
+                "aws/aws-sdk-php": "^3.0",
+                "doctrine/couchdb": "~1.0@dev",
+                "elasticsearch/elasticsearch": "^7 || ^8",
+                "ext-json": "*",
+                "graylog2/gelf-php": "^1.4.2 || ^2.0",
+                "guzzlehttp/guzzle": "^7.4.5",
+                "guzzlehttp/psr7": "^2.2",
+                "mongodb/mongodb": "^1.8",
+                "php-amqplib/php-amqplib": "~2.4 || ^3",
+                "phpstan/phpstan": "^1.9",
+                "phpstan/phpstan-deprecation-rules": "^1.0",
+                "phpstan/phpstan-strict-rules": "^1.4",
+                "phpunit/phpunit": "^10.5.17",
+                "predis/predis": "^1.1 || ^2",
+                "ruflin/elastica": "^7",
+                "symfony/mailer": "^5.4 || ^6",
+                "symfony/mime": "^5.4 || ^6"
+            },
+            "suggest": {
+                "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+                "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+                "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
+                "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+                "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
+                "ext-mbstring": "Allow to work properly with unicode symbols",
+                "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+                "ext-openssl": "Required to send log messages using SSL",
+                "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
+                "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+                "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
+                "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+                "rollbar/rollbar": "Allow sending log messages to Rollbar",
+                "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Monolog\\": "src/Monolog"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "https://seld.be"
+                }
+            ],
+            "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+            "homepage": "https://github.com/Seldaek/monolog",
+            "keywords": [
+                "log",
+                "logging",
+                "psr-3"
+            ],
+            "support": {
+                "issues": "https://github.com/Seldaek/monolog/issues",
+                "source": "https://github.com/Seldaek/monolog/tree/3.6.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/Seldaek",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-04-12T21:02:21+00:00"
+        },
+        {
+            "name": "nesbot/carbon",
+            "version": "2.72.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/briannesbitt/Carbon.git",
+                "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/afd46589c216118ecd48ff2b95d77596af1e57ed",
+                "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed",
+                "shasum": ""
+            },
+            "require": {
+                "carbonphp/carbon-doctrine-types": "*",
+                "ext-json": "*",
+                "php": "^7.1.8 || ^8.0",
+                "psr/clock": "^1.0",
+                "symfony/polyfill-mbstring": "^1.0",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0"
+            },
+            "provide": {
+                "psr/clock-implementation": "1.0"
+            },
+            "require-dev": {
+                "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0",
+                "doctrine/orm": "^2.7 || ^3.0",
+                "friendsofphp/php-cs-fixer": "^3.0",
+                "kylekatarnls/multi-tester": "^2.0",
+                "ondrejmirtes/better-reflection": "*",
+                "phpmd/phpmd": "^2.9",
+                "phpstan/extension-installer": "^1.0",
+                "phpstan/phpstan": "^0.12.99 || ^1.7.14",
+                "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6",
+                "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20",
+                "squizlabs/php_codesniffer": "^3.4"
+            },
+            "bin": [
+                "bin/carbon"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev",
+                    "dev-2.x": "2.x-dev"
+                },
+                "laravel": {
+                    "providers": [
+                        "Carbon\\Laravel\\ServiceProvider"
+                    ]
+                },
+                "phpstan": {
+                    "includes": [
+                        "extension.neon"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Carbon\\": "src/Carbon/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Brian Nesbitt",
+                    "email": "brian@nesbot.com",
+                    "homepage": "https://markido.com"
+                },
+                {
+                    "name": "kylekatarnls",
+                    "homepage": "https://github.com/kylekatarnls"
+                }
+            ],
+            "description": "An API extension for DateTime that supports 281 different languages.",
+            "homepage": "https://carbon.nesbot.com",
+            "keywords": [
+                "date",
+                "datetime",
+                "time"
+            ],
+            "support": {
+                "docs": "https://carbon.nesbot.com/docs",
+                "issues": "https://github.com/briannesbitt/Carbon/issues",
+                "source": "https://github.com/briannesbitt/Carbon"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sponsors/kylekatarnls",
+                    "type": "github"
+                },
+                {
+                    "url": "https://opencollective.com/Carbon#sponsor",
+                    "type": "opencollective"
+                },
+                {
+                    "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2024-06-03T19:18:41+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": "nikic/php-parser",
+            "version": "v4.19.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nikic/PHP-Parser.git",
+                "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b",
+                "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": ">=7.1"
+            },
+            "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.19.1"
+            },
+            "time": "2024-03-17T08:10:35+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/clock",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/clock.git",
+                "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+                "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.0 || ^8.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Clock\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for reading the clock.",
+            "homepage": "https://github.com/php-fig/clock",
+            "keywords": [
+                "clock",
+                "now",
+                "psr",
+                "psr-20",
+                "time"
+            ],
+            "support": {
+                "issues": "https://github.com/php-fig/clock/issues",
+                "source": "https://github.com/php-fig/clock/tree/1.0.0"
+            },
+            "time": "2022-11-25T14:36:26+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/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-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.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-factory.git",
+                "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+                "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1",
+                "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": "PSR-17: 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"
+            },
+            "time": "2024-04-15T12:06:14+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/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": "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": "psr/simple-cache",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/simple-cache.git",
+                "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865",
+                "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\SimpleCache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interfaces for simple caching",
+            "keywords": [
+                "cache",
+                "caching",
+                "psr",
+                "psr-16",
+                "simple-cache"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/simple-cache/tree/3.0.0"
+            },
+            "time": "2021-10-29T13:26:27+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": "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.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/console.git",
+                "reference": "be5854cee0e8c7b110f00d695d11debdfa1a2a91"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/console/zipball/be5854cee0e8c7b110f00d695d11debdfa1a2a91",
+                "reference": "be5854cee0e8c7b110f00d695d11debdfa1a2a91",
+                "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.8"
+            },
+            "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": "2024-05-31T14:49:08+00:00"
+        },
+        {
+            "name": "symfony/deprecation-contracts",
+            "version": "v3.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/deprecation-contracts.git",
+                "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
+                "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.5-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.5.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": "2024-04-18T09:32:20+00:00"
+        },
+        {
+            "name": "symfony/finder",
+            "version": "v6.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/finder.git",
+                "reference": "3ef977a43883215d560a2cecb82ec8e62131471c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/3ef977a43883215d560a2cecb82ec8e62131471c",
+                "reference": "3ef977a43883215d560a2cecb82ec8e62131471c",
+                "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.8"
+            },
+            "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": "2024-05-31T14:49:08+00:00"
+        },
+        {
+            "name": "symfony/polyfill-ctype",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-ctype.git",
+                "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4",
+                "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-ctype": "*"
+            },
+            "suggest": {
+                "ext-ctype": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "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.29.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": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-grapheme",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+                "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f",
+                "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "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.29.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": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-normalizer",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+                "reference": "bc45c394692b948b4d383a08d7753968bed9a83d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d",
+                "reference": "bc45c394692b948b4d383a08d7753968bed9a83d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "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.29.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": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
+                "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-mbstring": "*"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "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.29.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": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php80",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php80.git",
+                "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
+                "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "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.29.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": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/service-contracts",
+            "version": "v3.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/service-contracts.git",
+                "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
+                "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "psr/container": "^1.1|^2.0",
+                "symfony/deprecation-contracts": "^2.5|^3"
+            },
+            "conflict": {
+                "ext-psr": "<1.1|>=2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.5-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.5.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": "2024-04-18T09:32:20+00:00"
+        },
+        {
+            "name": "symfony/string",
+            "version": "v6.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/string.git",
+                "reference": "a147c0f826c4a1f3afb763ab8e009e37c877a44d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/string/zipball/a147c0f826c4a1f3afb763ab8e009e37c877a44d",
+                "reference": "a147c0f826c4a1f3afb763ab8e009e37c877a44d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "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": "^5.4|^6.0|^7.0",
+                "symfony/http-client": "^5.4|^6.0|^7.0",
+                "symfony/intl": "^6.2|^7.0",
+                "symfony/translation-contracts": "^2.5|^3.0",
+                "symfony/var-exporter": "^5.4|^6.0|^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/v6.4.8"
+            },
+            "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": "2024-05-31T14:49:08+00:00"
+        },
+        {
+            "name": "symfony/translation",
+            "version": "v6.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/translation.git",
+                "reference": "a002933b13989fc4bd0b58e04bf7eec5210e438a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/a002933b13989fc4bd0b58e04bf7eec5210e438a",
+                "reference": "a002933b13989fc4bd0b58e04bf7eec5210e438a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "symfony/deprecation-contracts": "^2.5|^3",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/translation-contracts": "^2.5|^3.0"
+            },
+            "conflict": {
+                "symfony/config": "<5.4",
+                "symfony/console": "<5.4",
+                "symfony/dependency-injection": "<5.4",
+                "symfony/http-client-contracts": "<2.5",
+                "symfony/http-kernel": "<5.4",
+                "symfony/service-contracts": "<2.5",
+                "symfony/twig-bundle": "<5.4",
+                "symfony/yaml": "<5.4"
+            },
+            "provide": {
+                "symfony/translation-implementation": "2.3|3.0"
+            },
+            "require-dev": {
+                "nikic/php-parser": "^4.18|^5.0",
+                "psr/log": "^1|^2|^3",
+                "symfony/config": "^5.4|^6.0|^7.0",
+                "symfony/console": "^5.4|^6.0|^7.0",
+                "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+                "symfony/finder": "^5.4|^6.0|^7.0",
+                "symfony/http-client-contracts": "^2.5|^3.0",
+                "symfony/http-kernel": "^5.4|^6.0|^7.0",
+                "symfony/intl": "^5.4|^6.0|^7.0",
+                "symfony/polyfill-intl-icu": "^1.21",
+                "symfony/routing": "^5.4|^6.0|^7.0",
+                "symfony/service-contracts": "^2.5|^3",
+                "symfony/yaml": "^5.4|^6.0|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/functions.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\Translation\\": ""
+                },
+                "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 to internationalize your application",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/translation/tree/v6.4.8"
+            },
+            "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": "2024-05-31T14:49:08+00:00"
+        },
+        {
+            "name": "symfony/translation-contracts",
+            "version": "v3.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/translation-contracts.git",
+                "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a",
+                "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.5-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Translation\\": ""
+                },
+                "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 translation",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/translation-contracts/tree/v3.5.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": "2024-04-18T09:32:20+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": "clue/ndjson-react",
+            "version": "v1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/clue/reactphp-ndjson.git",
+                "reference": "392dc165fce93b5bb5c637b67e59619223c931b0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0",
+                "reference": "392dc165fce93b5bb5c637b67e59619223c931b0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3",
+                "react/stream": "^1.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35",
+                "react/event-loop": "^1.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Clue\\React\\NDJson\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering"
+                }
+            ],
+            "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.",
+            "homepage": "https://github.com/clue/reactphp-ndjson",
+            "keywords": [
+                "NDJSON",
+                "json",
+                "jsonlines",
+                "newline",
+                "reactphp",
+                "streaming"
+            ],
+            "support": {
+                "issues": "https://github.com/clue/reactphp-ndjson/issues",
+                "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0"
+            },
+            "funding": [
+                {
+                    "url": "https://clue.engineering/support",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/clue",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-12-23T10:58:28+00:00"
+        },
+        {
+            "name": "composer/pcre",
+            "version": "3.1.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/pcre.git",
+                "reference": "04229f163664973f68f38f6f73d917799168ef24"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/pcre/zipball/04229f163664973f68f38f6f73d917799168ef24",
+                "reference": "04229f163664973f68f38f6f73d917799168ef24",
+                "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.4"
+            },
+            "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": "2024-05-27T13:40:54+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.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/xdebug-handler.git",
+                "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef",
+                "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef",
+                "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",
+                "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5"
+            },
+            "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": "ircs://irc.libera.chat:6697/composer",
+                "issues": "https://github.com/composer/xdebug-handler/issues",
+                "source": "https://github.com/composer/xdebug-handler/tree/3.0.5"
+            },
+            "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": "2024-05-06T16:37:16+00:00"
+        },
+        {
+            "name": "evenement/evenement",
+            "version": "v3.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/igorw/evenement.git",
+                "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc",
+                "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9 || ^6"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Evenement\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Igor Wiedler",
+                    "email": "igor@wiedler.ch"
+                }
+            ],
+            "description": "Événement is a very simple event dispatching library for PHP",
+            "keywords": [
+                "event-dispatcher",
+                "event-emitter"
+            ],
+            "support": {
+                "issues": "https://github.com/igorw/evenement/issues",
+                "source": "https://github.com/igorw/evenement/tree/v3.0.2"
+            },
+            "time": "2023-08-08T05:53:35+00:00"
+        },
+        {
+            "name": "fidry/cpu-core-counter",
+            "version": "1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/theofidry/cpu-core-counter.git",
+                "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/f92996c4d5c1a696a6a970e20f7c4216200fcc42",
+                "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "fidry/makefile": "^0.2.0",
+                "fidry/php-cs-fixer-config": "^1.1.2",
+                "phpstan/extension-installer": "^1.2.0",
+                "phpstan/phpstan": "^1.9.2",
+                "phpstan/phpstan-deprecation-rules": "^1.0.0",
+                "phpstan/phpstan-phpunit": "^1.2.2",
+                "phpstan/phpstan-strict-rules": "^1.4.4",
+                "phpunit/phpunit": "^8.5.31 || ^9.5.26",
+                "webmozarts/strict-phpunit": "^7.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Fidry\\CpuCoreCounter\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Théo FIDRY",
+                    "email": "theo.fidry@gmail.com"
+                }
+            ],
+            "description": "Tiny utility to get the number of CPU cores.",
+            "keywords": [
+                "CPU",
+                "core"
+            ],
+            "support": {
+                "issues": "https://github.com/theofidry/cpu-core-counter/issues",
+                "source": "https://github.com/theofidry/cpu-core-counter/tree/1.1.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/theofidry",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-02-07T09:43:46+00:00"
+        },
+        {
+            "name": "friendsofphp/php-cs-fixer",
+            "version": "v3.58.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
+                "reference": "04e9424025677a86914b9a4944dbbf4060bb0aff"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/04e9424025677a86914b9a4944dbbf4060bb0aff",
+                "reference": "04e9424025677a86914b9a4944dbbf4060bb0aff",
+                "shasum": ""
+            },
+            "require": {
+                "clue/ndjson-react": "^1.0",
+                "composer/semver": "^3.4",
+                "composer/xdebug-handler": "^3.0.3",
+                "ext-filter": "*",
+                "ext-json": "*",
+                "ext-tokenizer": "*",
+                "fidry/cpu-core-counter": "^1.0",
+                "php": "^7.4 || ^8.0",
+                "react/child-process": "^0.6.5",
+                "react/event-loop": "^1.0",
+                "react/promise": "^2.0 || ^3.0",
+                "react/socket": "^1.0",
+                "react/stream": "^1.0",
+                "sebastian/diff": "^4.0 || ^5.0 || ^6.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",
+                "infection/infection": "^0.27.11",
+                "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",
+                "phpunit/phpunit": "^9.6 || ^10.5.5 || ^11.0.2",
+                "symfony/var-dumper": "^5.4 || ^6.0 || ^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.58.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/keradus",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-05-29T16:39:07+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/devtool",
+            "version": "v3.1.19",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/devtool.git",
+                "reference": "cdce9f26c3a18d5d0302acdf83d26d4686223476"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/devtool/zipball/cdce9f26c3a18d5d0302acdf83d26d4686223476",
+                "reference": "cdce9f26c3a18d5d0302acdf83d26d4686223476",
+                "shasum": ""
+            },
+            "require": {
+                "hyperf/code-parser": "~3.1.0",
+                "hyperf/command": "~3.1.0",
+                "hyperf/contract": "~3.1.0",
+                "hyperf/di": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "hyperf/utils": "~3.1.0",
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\Devtool\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Hyperf\\Devtool\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A Devtool for Hyperf.",
+            "homepage": "https://hyperf.io",
+            "keywords": [
+                "dev",
+                "devtool",
+                "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": "2024-04-13T06:53:08+00:00"
+        },
+        {
+            "name": "hyperf/testing",
+            "version": "v3.1.21",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/testing.git",
+                "reference": "923e862f9ccd5947baac4d4d1e09383c8ac75dc8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/testing/zipball/923e862f9ccd5947baac4d4d1e09383c8ac75dc8",
+                "reference": "923e862f9ccd5947baac4d4d1e09383c8ac75dc8",
+                "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.21"
+            },
+            "funding": [
+                {
+                    "url": "https://hyperf.wiki/#/zh-cn/donate",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://opencollective.com/hyperf",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2024-05-07T05:34:51+00:00"
+        },
+        {
+            "name": "hyperf/watcher",
+            "version": "v3.1.21",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hyperf/watcher.git",
+                "reference": "e95490f91a95ec9c7f52255aba563f59fd9b396c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hyperf/watcher/zipball/e95490f91a95ec9c7f52255aba563f59fd9b396c",
+                "reference": "e95490f91a95ec9c7f52255aba563f59fd9b396c",
+                "shasum": ""
+            },
+            "require": {
+                "ext-posix": "*",
+                "hyperf/codec": "~3.1.0",
+                "hyperf/command": "~3.1.0",
+                "hyperf/di": "~3.1.0",
+                "hyperf/framework": "~3.1.0",
+                "hyperf/support": "~3.1.0",
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                },
+                "hyperf": {
+                    "config": "Hyperf\\Watcher\\ConfigProvider"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/Functions.php"
+                ],
+                "psr-4": {
+                    "Hyperf\\Watcher\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Hot reload watcher for Hyperf",
+            "keywords": [
+                "dev",
+                "hyperf",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/hyperf/watcher/issues",
+                "source": "https://github.com/hyperf/watcher/tree/v3.1.21"
+            },
+            "funding": [
+                {
+                    "url": "https://hyperf.wiki/#/zh-cn/donate",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://opencollective.com/hyperf",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2024-05-09T13:40:44+00:00"
+        },
+        {
+            "name": "mockery/mockery",
+            "version": "1.6.12",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/mockery/mockery.git",
+                "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699",
+                "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699",
+                "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.17",
+                "symplify/easy-coding-standard": "^12.1.14"
+            },
+            "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": "2024-05-16T03:13:13+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": "phar-io/manifest",
+            "version": "2.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phar-io/manifest.git",
+                "reference": "54750ef60c58e43759730615a392c31c80e23176"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+                "reference": "54750ef60c58e43759730615a392c31c80e23176",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-libxml": "*",
+                "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.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/theseer",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-03T12:33:53+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/phpstan",
+            "version": "1.11.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/phpstan.git",
+                "reference": "e64220a05c1209fc856d58e789c3b7a32c0bb9a5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e64220a05c1209fc856d58e789c3b7a32c0bb9a5",
+                "reference": "e64220a05c1209fc856d58e789c3b7a32c0bb9a5",
+                "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"
+                }
+            ],
+            "time": "2024-05-31T13:53:37+00:00"
+        },
+        {
+            "name": "phpunit/php-code-coverage",
+            "version": "10.1.14",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+                "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b",
+                "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-libxml": "*",
+                "ext-xmlwriter": "*",
+                "nikic/php-parser": "^4.18 || ^5.0",
+                "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.14"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-12T15:33:41+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.20",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit.git",
+                "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/547d314dc24ec1e177720d45c6263fb226cc2ae3",
+                "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3",
+                "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.20"
+            },
+            "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": "2024-04-24T06:32:35+00:00"
+        },
+        {
+            "name": "react/cache",
+            "version": "v1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/cache.git",
+                "reference": "d47c472b64aa5608225f47965a484b75c7817d5b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b",
+                "reference": "d47c472b64aa5608225f47965a484b75c7817d5b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "react/promise": "^3.0 || ^2.0 || ^1.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\Cache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "reactphp@ceesjankiewiet.nl",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "cboden@gmail.com",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "Async, Promise-based cache interface for ReactPHP",
+            "keywords": [
+                "cache",
+                "caching",
+                "promise",
+                "reactphp"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/cache/issues",
+                "source": "https://github.com/reactphp/cache/tree/v1.2.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2022-11-30T15:59:55+00:00"
+        },
+        {
+            "name": "react/child-process",
+            "version": "v0.6.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/child-process.git",
+                "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43",
+                "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43",
+                "shasum": ""
+            },
+            "require": {
+                "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+                "php": ">=5.3.0",
+                "react/event-loop": "^1.2",
+                "react/stream": "^1.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35",
+                "react/socket": "^1.8",
+                "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\ChildProcess\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "reactphp@ceesjankiewiet.nl",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "cboden@gmail.com",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "Event-driven library for executing child processes with ReactPHP.",
+            "keywords": [
+                "event-driven",
+                "process",
+                "reactphp"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/child-process/issues",
+                "source": "https://github.com/reactphp/child-process/tree/v0.6.5"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/WyriHaximus",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/clue",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-09-16T13:41:56+00:00"
+        },
+        {
+            "name": "react/dns",
+            "version": "v1.12.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/dns.git",
+                "reference": "c134600642fa615b46b41237ef243daa65bb64ec"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/dns/zipball/c134600642fa615b46b41237ef243daa65bb64ec",
+                "reference": "c134600642fa615b46b41237ef243daa65bb64ec",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "react/cache": "^1.0 || ^0.6 || ^0.5",
+                "react/event-loop": "^1.2",
+                "react/promise": "^3.0 || ^2.7 || ^1.2.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+                "react/async": "^4 || ^3 || ^2",
+                "react/promise-timer": "^1.9"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\Dns\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "reactphp@ceesjankiewiet.nl",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "cboden@gmail.com",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "Async DNS resolver for ReactPHP",
+            "keywords": [
+                "async",
+                "dns",
+                "dns-resolver",
+                "reactphp"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/dns/issues",
+                "source": "https://github.com/reactphp/dns/tree/v1.12.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2023-11-29T12:41:06+00:00"
+        },
+        {
+            "name": "react/event-loop",
+            "version": "v1.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/event-loop.git",
+                "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",
+                "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
+            },
+            "suggest": {
+                "ext-pcntl": "For signal handling support when using the StreamSelectLoop"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\EventLoop\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "reactphp@ceesjankiewiet.nl",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "cboden@gmail.com",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.",
+            "keywords": [
+                "asynchronous",
+                "event-loop"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/event-loop/issues",
+                "source": "https://github.com/reactphp/event-loop/tree/v1.5.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2023-11-13T13:48:05+00:00"
+        },
+        {
+            "name": "react/promise",
+            "version": "v3.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/promise.git",
+                "reference": "8a164643313c71354582dc850b42b33fa12a4b63"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63",
+                "reference": "8a164643313c71354582dc850b42b33fa12a4b63",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "1.10.39 || 1.4.10",
+                "phpunit/phpunit": "^9.6 || ^7.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "React\\Promise\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "reactphp@ceesjankiewiet.nl",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "cboden@gmail.com",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "A lightweight implementation of CommonJS Promises/A for PHP",
+            "keywords": [
+                "promise",
+                "promises"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/promise/issues",
+                "source": "https://github.com/reactphp/promise/tree/v3.2.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2024-05-24T10:39:05+00:00"
+        },
+        {
+            "name": "react/socket",
+            "version": "v1.15.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/socket.git",
+                "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/socket/zipball/216d3aec0b87f04a40ca04f481e6af01bdd1d038",
+                "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038",
+                "shasum": ""
+            },
+            "require": {
+                "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+                "php": ">=5.3.0",
+                "react/dns": "^1.11",
+                "react/event-loop": "^1.2",
+                "react/promise": "^3 || ^2.6 || ^1.2.1",
+                "react/stream": "^1.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+                "react/async": "^4 || ^3 || ^2",
+                "react/promise-stream": "^1.4",
+                "react/promise-timer": "^1.10"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\Socket\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "reactphp@ceesjankiewiet.nl",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "cboden@gmail.com",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP",
+            "keywords": [
+                "Connection",
+                "Socket",
+                "async",
+                "reactphp",
+                "stream"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/socket/issues",
+                "source": "https://github.com/reactphp/socket/tree/v1.15.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2023-12-15T11:02:10+00:00"
+        },
+        {
+            "name": "react/stream",
+            "version": "v1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/stream.git",
+                "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66",
+                "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66",
+                "shasum": ""
+            },
+            "require": {
+                "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+                "php": ">=5.3.8",
+                "react/event-loop": "^1.2"
+            },
+            "require-dev": {
+                "clue/stream-filter": "~1.2",
+                "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\Stream\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "reactphp@ceesjankiewiet.nl",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "cboden@gmail.com",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP",
+            "keywords": [
+                "event-driven",
+                "io",
+                "non-blocking",
+                "pipe",
+                "reactphp",
+                "readable",
+                "stream",
+                "writable"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/stream/issues",
+                "source": "https://github.com/reactphp/stream/tree/v1.3.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2023-06-16T10:52:11+00:00"
+        },
+        {
+            "name": "sebastian/cli-parser",
+            "version": "2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/cli-parser.git",
+                "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084",
+                "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084",
+                "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",
+                "security": "https://github.com/sebastianbergmann/cli-parser/security/policy",
+                "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-02T07:12:49+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.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/complexity.git",
+                "reference": "68ff824baeae169ec9f2137158ee529584553799"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799",
+                "reference": "68ff824baeae169ec9f2137158ee529584553799",
+                "shasum": ""
+            },
+            "require": {
+                "nikic/php-parser": "^4.18 || ^5.0",
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.2-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.2.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-12-21T08:37:17+00:00"
+        },
+        {
+            "name": "sebastian/diff",
+            "version": "5.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/diff.git",
+                "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e",
+                "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0",
+                "symfony/process": "^6.4"
+            },
+            "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": "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.1.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-02T07:15:17+00:00"
+        },
+        {
+            "name": "sebastian/environment",
+            "version": "6.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/environment.git",
+                "reference": "8074dbcd93529b357029f5cc5058fd3e43666984"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984",
+                "reference": "8074dbcd93529b357029f5cc5058fd3e43666984",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^10.0"
+            },
+            "suggest": {
+                "ext-posix": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "6.1-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.1.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-23T08:47:14+00:00"
+        },
+        {
+            "name": "sebastian/exporter",
+            "version": "5.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/exporter.git",
+                "reference": "955288482d97c19a372d3f31006ab3f37da47adf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf",
+                "reference": "955288482d97c19a372d3f31006ab3f37da47adf",
+                "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.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-02T07:17:12+00:00"
+        },
+        {
+            "name": "sebastian/global-state",
+            "version": "6.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/global-state.git",
+                "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9",
+                "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9",
+                "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": "https://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.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-02T07:19:19+00:00"
+        },
+        {
+            "name": "sebastian/lines-of-code",
+            "version": "2.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+                "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0",
+                "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0",
+                "shasum": ""
+            },
+            "require": {
+                "nikic/php-parser": "^4.18 || ^5.0",
+                "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.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-12-21T08:38:20+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": "swoole/ide-helper",
+            "version": "5.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/swoole/ide-helper.git",
+                "reference": "33ec7af9111b76d06a70dd31191cc74793551112"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/swoole/ide-helper/zipball/33ec7af9111b76d06a70dd31191cc74793551112",
+                "reference": "33ec7af9111b76d06a70dd31191cc74793551112",
+                "shasum": ""
+            },
+            "type": "library",
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Team Swoole",
+                    "email": "team@swoole.com"
+                }
+            ],
+            "description": "IDE help files for Swoole.",
+            "support": {
+                "issues": "https://github.com/swoole/ide-helper/issues",
+                "source": "https://github.com/swoole/ide-helper/tree/5.1.2"
+            },
+            "time": "2024-02-01T22:28:11+00:00"
+        },
+        {
+            "name": "symfony/event-dispatcher",
+            "version": "v6.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/event-dispatcher.git",
+                "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8d7507f02b06e06815e56bb39aa0128e3806208b",
+                "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "symfony/event-dispatcher-contracts": "^2.5|^3"
+            },
+            "conflict": {
+                "symfony/dependency-injection": "<5.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": "^5.4|^6.0|^7.0",
+                "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+                "symfony/error-handler": "^5.4|^6.0|^7.0",
+                "symfony/expression-language": "^5.4|^6.0|^7.0",
+                "symfony/http-foundation": "^5.4|^6.0|^7.0",
+                "symfony/service-contracts": "^2.5|^3",
+                "symfony/stopwatch": "^5.4|^6.0|^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/v6.4.8"
+            },
+            "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": "2024-05-31T14:49:08+00:00"
+        },
+        {
+            "name": "symfony/event-dispatcher-contracts",
+            "version": "v3.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+                "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50",
+                "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "psr/event-dispatcher": "^1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.5-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.5.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": "2024-04-18T09:32:20+00:00"
+        },
+        {
+            "name": "symfony/filesystem",
+            "version": "v6.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/filesystem.git",
+                "reference": "4d37529150e7081c51b3c5d5718c55a04a9503f3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/4d37529150e7081c51b3c5d5718c55a04a9503f3",
+                "reference": "4d37529150e7081c51b3c5d5718c55a04a9503f3",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-mbstring": "~1.8"
+            },
+            "require-dev": {
+                "symfony/process": "^5.4|^6.4|^7.0"
+            },
+            "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/v6.4.8"
+            },
+            "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": "2024-05-31T14:49:08+00:00"
+        },
+        {
+            "name": "symfony/http-foundation",
+            "version": "v6.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-foundation.git",
+                "reference": "27de8cc95e11db7a50b027e71caaab9024545947"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/27de8cc95e11db7a50b027e71caaab9024545947",
+                "reference": "27de8cc95e11db7a50b027e71caaab9024545947",
+                "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.8"
+            },
+            "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": "2024-05-31T14:49:08+00:00"
+        },
+        {
+            "name": "symfony/options-resolver",
+            "version": "v6.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/options-resolver.git",
+                "reference": "22ab9e9101ab18de37839074f8a1197f55590c1b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/22ab9e9101ab18de37839074f8a1197f55590c1b",
+                "reference": "22ab9e9101ab18de37839074f8a1197f55590c1b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "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/v6.4.8"
+            },
+            "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": "2024-05-31T14:49:08+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php81",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php81.git",
+                "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d",
+                "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "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.29.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": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php83",
+            "version": "v1.29.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php83.git",
+                "reference": "86fcae159633351e5fd145d1c47de6c528f8caff"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff",
+                "reference": "86fcae159633351e5fd145d1c47de6c528f8caff",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1",
+                "symfony/polyfill-php80": "^1.14"
+            },
+            "type": "library",
+            "extra": {
+                "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.29.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": "2024-01-29T20:11:03+00:00"
+        },
+        {
+            "name": "symfony/process",
+            "version": "v6.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/process.git",
+                "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5",
+                "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "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/v6.4.8"
+            },
+            "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": "2024-05-31T14:49:08+00:00"
+        },
+        {
+            "name": "symfony/stopwatch",
+            "version": "v6.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/stopwatch.git",
+                "reference": "63e069eb616049632cde9674c46957819454b8aa"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/stopwatch/zipball/63e069eb616049632cde9674c46957819454b8aa",
+                "reference": "63e069eb616049632cde9674c46957819454b8aa",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "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/v6.4.8"
+            },
+            "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": "2024-05-31T14:49:08+00:00"
+        },
+        {
+            "name": "theseer/tokenizer",
+            "version": "1.2.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/theseer/tokenizer.git",
+                "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+                "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+                "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.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/theseer",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-03-03T12:36:25+00:00"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "dev",
+    "stability-flags": [],
+    "prefer-stable": true,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=8.1"
+    },
+    "platform-dev": [],
+    "plugin-api-version": "2.6.0"
+}

+ 21 - 0
config/autoload/annotations.php

@@ -0,0 +1,21 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+return [
+    'scan' => [
+        'paths' => [
+            BASE_PATH . '/app',
+        ],
+        'ignore_annotations' => [
+            'mixin',
+        ],
+    ],
+];

+ 13 - 0
config/autoload/aspects.php

@@ -0,0 +1,13 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+return [
+];

+ 19 - 0
config/autoload/cache.php

@@ -0,0 +1,19 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+return [
+    'default' => [
+        'driver' => Hyperf\Cache\Driver\RedisDriver::class,
+        'packer' => Hyperf\Codec\Packer\PhpSerializerPacker::class,
+        'prefix' => 'c:',
+        'skip_cache_results' => [],
+    ],
+];

+ 13 - 0
config/autoload/commands.php

@@ -0,0 +1,13 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+return [
+];

+ 28 - 0
config/autoload/config_center.php

@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+use Hyperf\ConfigCenter\Mode;
+
+use function Hyperf\Support\env;
+
+return [
+//    'enable' => (bool) env('CONFIG_CENTER_ENABLE', true),
+//    'driver' => env('CONFIG_CENTER_DRIVER', 'nacos'),
+//    'mode' => env('CONFIG_CENTER_MODE', Mode::PROCESS),
+//    'drivers' => [
+//
+//    ],
+    'server' => [
+        'settings' => [
+            'timezone' => 'Asia/Shanghai',
+        ],
+    ],
+];

+ 44 - 0
config/autoload/databases.php

@@ -0,0 +1,44 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+use function Hyperf\Support\env;
+
+return [
+    'default' => [
+        'driver' => env('DB_DRIVER', 'mysql'),
+        'host' => env('DB_HOST', 'localhost'),
+        'database' => env('DB_DATABASE', 'hyperf'),
+        'port' => env('DB_PORT', 3306),
+        'username' => env('DB_USERNAME', 'root'),
+        'password' => env('DB_PASSWORD', ''),
+        'charset' => env('DB_CHARSET', 'utf8'),
+        'collation' => env('DB_COLLATION', 'utf8_unicode_ci'),
+        'prefix' => env('DB_PREFIX', ''),
+        'pool' => [
+            'min_connections' => 1,
+            'max_connections' => 10,
+            'connect_timeout' => 10.0,
+            'wait_timeout' => 3.0,
+            'heartbeat' => -1,
+            'max_idle_time' => (float) env('DB_MAX_IDLE_TIME', 60),
+        ],
+        'variables' => [
+            'time_zone' => 'Asia/Shanghai', // 设置MySQL连接的时区
+        ],
+        'commands' => [
+            'gen:model' => [
+                'path' => 'app/Model',
+                'force_casts' => true,
+                'inheritance' => 'Model',
+            ],
+        ],
+    ],
+];

+ 13 - 0
config/autoload/dependencies.php

@@ -0,0 +1,13 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+return [
+];

+ 44 - 0
config/autoload/devtool.php

@@ -0,0 +1,44 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+return [
+    'generator' => [
+        'amqp' => [
+            'consumer' => [
+                'namespace' => 'App\\Amqp\\Consumer',
+            ],
+            'producer' => [
+                'namespace' => 'App\\Amqp\\Producer',
+            ],
+        ],
+        'aspect' => [
+            'namespace' => 'App\\Aspect',
+        ],
+        'command' => [
+            'namespace' => 'App\\Command',
+        ],
+        'controller' => [
+            'namespace' => 'App\\Controller',
+        ],
+        'job' => [
+            'namespace' => 'App\\Job',
+        ],
+        'listener' => [
+            'namespace' => 'App\\Listener',
+        ],
+        'middleware' => [
+            'namespace' => 'App\\Middleware',
+        ],
+        'Process' => [
+            'namespace' => 'App\\Processes',
+        ],
+    ],
+];

+ 22 - 0
config/autoload/exceptions.php

@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+return [
+    'handler' => [
+        'http' => [
+            Hyperf\HttpServer\Exception\Handler\HttpExceptionHandler::class,
+            App\Exception\Handler\AppExceptionHandler::class,
+        ],
+        'jsonrpc-http' => [
+            App\Exception\Handler\JsonRpcExceptionHandler::class,
+        ],
+    ],
+];

+ 106 - 0
config/autoload/jwt.php

@@ -0,0 +1,106 @@
+<?php
+declare(strict_types=1);
+use function Hyperf\Support\env;
+return [
+    /**
+     * 不需要检查的路由,如果使用jwt提供的默认中间件,可以对某些不用做检验的路由进行配置,例如登录等
+     * 具体的逻辑可以效仿JWT提供的默认中间件
+     * [
+     *      ["GET", "/index/test"],
+     *      ["**", "/test"]
+     * ]
+     *
+     * 第一个填写请求方法('**'代表支持所有的请求方法),第二个填写路由路径('/**'代表支持所有的路径)
+     * 如果数组中存在["**", "/**"],则默认所有的请求路由都不做jwt token的校验,直接放行,如果no_check_route为一个空数组,则
+     * 所有的请求路由都需要做jwt token校验
+     * 路由路径支持正则的写法
+     * 正则写法:["**", "/api/{name:.+}"]  支持模块化不做jwt token的校验,例如:/api/login/login
+     */
+    'no_check_route' => [
+//        ["**", "/api/{name:.+}"],
+    ],
+
+    'login_type' => env('JWT_LOGIN_TYPE', 'mpop'), //  登录方式,sso为单点登录,同一个用户只能登录一个端,mpop为多点登录
+
+    /**
+     * 单点登录自定义数据中必须存在uid的键值,这个key你可以自行定义,只要自定义数据中存在该键即可
+     */
+    'sso_key' => 'uid',
+
+    /**
+     * 只能用于Hmac包下的加密非对称算法,其它的都会使用公私钥
+     */
+    'secret' => env('JWT_SECRET', 'phper666'),
+
+    /**
+     * JWT 权限keys
+     * 对称算法: HS256, HS384 & HS512 使用 `JWT_SECRET`.
+     * 非对称算法: RS256, RS384 & RS512 / ES256, ES384 & ES512 使用下面的公钥私钥,需要自己去生成.
+     */
+    'keys' => [
+//        'public' => env('JWT_PUBLIC_KEY'), // 公钥,例如:'file:///path/to/public/key'
+//        'private' => env('JWT_PRIVATE_KEY'), // 私钥,例如:'file:///path/to/private/key'
+
+        /**
+         * 你的私钥的密码。不需要密码可以不用设置
+         */
+//        'passphrase' => env('JWT_PASSPHRASE'),
+    ],
+
+    'ttl' => env('JWT_TTL', 86400*30), // token过期时间,单位为秒
+
+    /**
+     * 支持的对称算法:HS256、HS384、HS512
+     * 支持的非对称算法:RS256、RS384、RS512、ES256、ES384、ES512
+     */
+    'alg' => env('JWT_ALG', 'HS256'), // jwt的hearder加密算法
+
+    /**
+     * jwt使用到的缓存前缀
+     * 建议使用独立的redis做缓存,这样比较好做分布式
+     */
+    'cache_prefix' => 'phper666:jwt',
+
+    /**
+     * 是否开启黑名单,单点登录和多点登录的注销、刷新使原token失效,必须要开启黑名单,目前黑名单缓存只支持hyperf缓存驱动
+     */
+    'blacklist_enabled' => env('JWT_BLACKLIST_ENABLED', true),
+
+    /**
+     * 黑名单的宽限时间 单位为:秒,注意:如果使用单点登录,该宽限时间无效
+     */
+    'blacklist_grace_period' => env('JWT_BLACKLIST_GRACE_PERIOD', 0),
+
+    /**
+     * 签发者
+     */
+    'issued_by' => 'phper666/jwt',
+
+    /**
+     * 区分不同场景的token,比如你一个项目可能会有多种类型的应用接口鉴权,下面自行定义,我只是举例子
+     * 下面的配置会自动覆盖根配置,比如application1会里面的数据会覆盖掉根数据
+     * 下面的scene会和根数据合并
+     * scene必须存在一个default
+     * 什么叫根数据,这个配置的一维数组,除了scene都叫根配置
+     */
+    'scene' => [
+        'default' => [],
+        'application' => [
+            'secret' => 'application', // 非对称加密使用字符串,请使用自己加密的字符串
+            'login_type' => 'sso', //  登录方式,sso为单点登录,mpop为多点登录
+            'sso_key' => 'uid',
+            'ttl' => 7200, // token过期时间,单位为秒
+        ],
+        'application1' => [
+            'secret' => 'application1', // 非对称加密使用字符串,请使用自己加密的字符串
+            'login_type' => 'sso', //  登录方式,sso为单点登录,mpop为多点登录
+            'sso_key' => 'uid',
+            'ttl' => 7200, // token过期时间,单位为秒
+        ],
+        'application2' => [
+            'secret' => 'application2', // 非对称加密使用字符串,请使用自己加密的字符串
+            'login_type' => 'mpop', //  登录方式,sso为单点登录,mpop为多点登录
+            'ttl' => 7200, // token过期时间,单位为秒
+        ]
+    ]
+];

+ 15 - 0
config/autoload/listeners.php

@@ -0,0 +1,15 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+return [
+    Hyperf\ExceptionHandler\Listener\ErrorExceptionHandler::class,
+    Hyperf\Command\Listener\FailToHandleListener::class,
+];

+ 30 - 0
config/autoload/logger.php

@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+return [
+    'default' => [
+        'handler' => [
+            'class' => Monolog\Handler\StreamHandler::class,
+            'constructor' => [
+                'stream' => BASE_PATH . '/runtime/logs/hyperf.log',
+                'level' => Monolog\Logger::DEBUG,
+            ],
+        ],
+        'formatter' => [
+            'class' => Monolog\Formatter\LineFormatter::class,
+            'constructor' => [
+                'format' => null,
+                'dateFormat' => 'Y-m-d H:i:s',
+                'allowInlineLineBreaks' => true,
+            ],
+        ],
+    ],
+];

+ 18 - 0
config/autoload/middlewares.php

@@ -0,0 +1,18 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+return [
+    'http' => [
+    ],
+    'ws' => [
+        \App\Middleware\WebSocketAuthMiddleware::class
+    ]
+];

+ 13 - 0
config/autoload/processes.php

@@ -0,0 +1,13 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+return [
+];

+ 29 - 0
config/autoload/redis.php

@@ -0,0 +1,29 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+use function Hyperf\Support\env;
+
+return [
+    'default' => [
+        'host' => env('REDIS_HOST', '192.168.31.193'),
+        'auth' => env('REDIS_AUTH', 123456),
+        'port' => (int) env('REDIS_PORT', 6379),
+        'db' => (int) env('REDIS_DB', 0),
+        'pool' => [
+            'min_connections' => 1,
+            'max_connections' => 10,
+            'connect_timeout' => 10.0,
+            'wait_timeout' => 3.0,
+            'heartbeat' => -1,
+            'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
+        ],
+    ],
+];

+ 47 - 0
config/autoload/server.php

@@ -0,0 +1,47 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+use Hyperf\Server\Event;
+use Hyperf\Server\Server;
+use Swoole\Constant;
+
+return [
+    'mode' => SWOOLE_PROCESS,
+    'servers' => [
+        [
+            'name' => 'jsonrpc-http',
+            'type' => Server::SERVER_HTTP,
+            'host' => '0.0.0.0',
+            'port' => 9507,
+            'sock_type' => SWOOLE_SOCK_TCP,
+            'callbacks' => [
+                Event::ON_REQUEST => [Hyperf\JsonRpc\HttpServer::class, 'onRequest'],
+            ],
+        ],
+
+    ],
+    'settings' => [
+        Constant::OPTION_ENABLE_COROUTINE => true,
+        Constant::OPTION_WORKER_NUM => swoole_cpu_num(),
+        Constant::OPTION_PID_FILE => BASE_PATH . '/runtime/hyperf.pid',
+        Constant::OPTION_OPEN_TCP_NODELAY => true,
+        Constant::OPTION_MAX_COROUTINE => 100000,
+        Constant::OPTION_OPEN_HTTP2_PROTOCOL => true,
+        Constant::OPTION_MAX_REQUEST => 100000,
+        Constant::OPTION_SOCKET_BUFFER_SIZE => 2 * 1024 * 1024,
+        Constant::OPTION_BUFFER_OUTPUT_SIZE => 2 * 1024 * 1024,
+    ],
+    'callbacks' => [
+        Event::ON_WORKER_START => [Hyperf\Framework\Bootstrap\WorkerStartCallback::class, 'onWorkerStart'],
+        Event::ON_PIPE_MESSAGE => [Hyperf\Framework\Bootstrap\PipeMessageCallback::class, 'onPipeMessage'],
+        Event::ON_WORKER_EXIT => [Hyperf\Framework\Bootstrap\WorkerExitCallback::class, 'onWorkerExit'],
+    ],
+];

+ 33 - 0
config/config.php

@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+use Hyperf\Contract\StdoutLoggerInterface;
+use Psr\Log\LogLevel;
+
+use function Hyperf\Support\env;
+
+return [
+    'app_name' => env('APP_NAME', 'skeleton'),
+    'app_env' => env('APP_ENV', 'dev'),
+    'scan_cacheable' => env('SCAN_CACHEABLE', false),
+    StdoutLoggerInterface::class => [
+        'log_level' => [
+            LogLevel::ALERT,
+            LogLevel::CRITICAL,
+            LogLevel::DEBUG,
+            LogLevel::EMERGENCY,
+            LogLevel::ERROR,
+            LogLevel::INFO,
+            LogLevel::NOTICE,
+            LogLevel::WARNING,
+        ],
+    ],
+];

+ 21 - 0
config/container.php

@@ -0,0 +1,21 @@
+<?php
+/**
+ * Initialize a dependency injection container that implemented PSR-11 and return the container.
+ */
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+use Hyperf\Context\ApplicationContext;
+use Hyperf\Di\Container;
+use Hyperf\Di\Definition\DefinitionSourceFactory;
+
+$container = new Container((new DefinitionSourceFactory())());
+
+return ApplicationContext::setContainer($container);

+ 25 - 0
config/routes.php

@@ -0,0 +1,25 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+use Hyperf\HttpServer\Router\Router;
+
+Router::addRoute(['GET', 'POST', 'HEAD'], '/', 'App\Controller\IndexController@index');
+
+Router::get('/favicon.ico', function () {
+    return '';
+});
+
+
+//Router::addServer('ws', function () {
+//    Router::get('/', 'App\Controller\WebSocketController');
+//
+//
+//});

+ 30 - 0
deploy.test.yml

@@ -0,0 +1,30 @@
+version: '3.7'
+services:
+  hyperf:
+    image: $REGISTRY_URL/$PROJECT_NAME:test
+    environment:
+      - "APP_PROJECT=hyperf"
+      - "APP_ENV=testing"
+    ports:
+      - "9501:9501"
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+        delay: 5s
+        max_attempts: 5
+      update_config:
+        parallelism: 2
+        delay: 5s
+        order: start-first
+    networks:
+      - hyperf_net
+    configs:
+      - source: hyperf_v1.0
+        target: /opt/www/.env
+configs:
+  hyperf_v1.0:
+    external: true
+networks:
+  hyperf_net:
+    external: true

+ 18 - 0
docker-compose.yml

@@ -0,0 +1,18 @@
+version: '3'
+services:
+  hyperf-skeleton:
+    container_name: hyperf-skeleton
+    image: hyperf-skeleton
+    build:
+      context: .
+    volumes:
+      - ./:/opt/www
+    ports:
+      - 9501:9501
+    environment:
+      - APP_ENV=dev
+      - SCAN_CACHEABLE=false
+
+networks:
+  default:
+    name: hyperf-skeleton

+ 14 - 0
phpstan.neon.dist

@@ -0,0 +1,14 @@
+# Magic behaviour with __get, __set, __call and __callStatic is not exactly static analyser-friendly :)
+# Fortunately, You can ignore it by the following config.
+#
+# vendor/bin/phpstan analyse app --memory-limit 200M -l 0
+#
+parameters:
+  level: 0
+  paths:
+    - ./app
+    - ./config
+  reportUnmatchedIgnoredErrors: false
+  ignoreErrors:
+    - '#Static call to instance method Hyperf\\HttpServer\\Router\\Router::[a-zA-Z0-9\\_]+\(\)#'
+    - '#Static call to instance method Hyperf\\DbConnection\\Db::[a-zA-Z0-9\\_]+\(\)#'

+ 16 - 0
phpunit.xml.dist

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" backupGlobals="false" bootstrap="./test/bootstrap.php" colors="true" processIsolation="false" stopOnFailure="false" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd" cacheDirectory=".phpunit.cache" backupStaticProperties="false">
+  <testsuites>
+    <testsuite name="Tests">
+      <directory suffix="Test.php">./test</directory>
+    </testsuite>
+  </testsuites>
+  <php>
+    <env name="APP_ENV" value="testing" force="true"/>
+  </php>
+  <source>
+    <include>
+      <directory suffix=".php">./app</directory>
+    </include>
+  </source>
+</phpunit>

+ 1 - 0
runtime/container/aspects.cache

@@ -0,0 +1 @@
+a:8:{i:0;s:35:"Hyperf\Cache\Aspect\CacheableAspect";i:1;s:36:"Hyperf\Cache\Aspect\CacheAheadAspect";i:2;s:36:"Hyperf\Cache\Aspect\CacheEvictAspect";i:3;s:34:"Hyperf\Cache\Aspect\CachePutAspect";i:4;s:35:"Hyperf\Cache\Aspect\FailCacheAspect";i:5;s:36:"Hyperf\Config\Annotation\ValueAspect";i:6;s:44:"Hyperf\DbConnection\Aspect\TransactionAspect";i:7;s:33:"Hyperf\Di\Annotation\InjectAspect";}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
runtime/container/classes.cache


+ 32 - 0
runtime/container/proxy/App_Controller_AbstractController.proxy.php

@@ -0,0 +1,32 @@
+<?php
+
+declare (strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+namespace App\Controller;
+
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Contract\RequestInterface;
+use Hyperf\HttpServer\Contract\ResponseInterface;
+use Psr\Container\ContainerInterface;
+abstract class AbstractController
+{
+    use \Hyperf\Di\Aop\ProxyTrait;
+    use \Hyperf\Di\Aop\PropertyHandlerTrait;
+    function __construct()
+    {
+        $this->__handlePropertyHandler(__CLASS__);
+    }
+    #[Inject]
+    protected ContainerInterface $container;
+    #[Inject]
+    protected RequestInterface $request;
+    #[Inject]
+    protected ResponseInterface $response;
+}

+ 31 - 0
runtime/container/proxy/App_Controller_IndexController.proxy.php

@@ -0,0 +1,31 @@
+<?php
+
+declare (strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+namespace App\Controller;
+
+class IndexController extends AbstractController
+{
+    use \Hyperf\Di\Aop\ProxyTrait;
+    use \Hyperf\Di\Aop\PropertyHandlerTrait;
+    function __construct()
+    {
+        if (method_exists(parent::class, '__construct')) {
+            parent::__construct(...func_get_args());
+        }
+        $this->__handlePropertyHandler(__CLASS__);
+    }
+    public function index()
+    {
+        $user = $this->request->input('user', 'Hyperf');
+        $method = $this->request->getMethod();
+        return ['method' => $method, 'message' => "Hello {$user}."];
+    }
+}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
runtime/container/scan.cache


+ 1 - 0
runtime/hyperf.pid

@@ -0,0 +1 @@
+7014

+ 443 - 0
runtime/logs/hyperf.log

@@ -0,0 +1,443 @@
+[2024-07-11 10:16:41] sql.INFO: [363.84] insert into `chat_channel` (`user_id`, `fd`) values ('32', '4') [] []
+[2024-07-11 10:25:11] sql.INFO: [56.01] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-11 10:25:19] sql.INFO: [26.82] insert into `chat_channel` (`user_id`, `fd`) values ('32', '4') [] []
+[2024-07-11 10:27:41] sql.INFO: [924.46] insert into `chat_channel` (`user_id`, `fd`) values ('32', '6') [] []
+[2024-07-11 10:27:41] sql.INFO: [983.59] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-11 10:27:45] sql.INFO: [595.05] insert into `chat_channel` (`user_id`, `fd`) values ('32', '10') [] []
+[2024-07-11 10:28:59] sql.INFO: [1621.88] insert into `chat_channel` (`user_id`, `fd`) values ('32', '13') [] []
+[2024-07-11 10:29:04] sql.INFO: [690.62] insert into `chat_channel` (`user_id`, `fd`) values ('32', '14') [] []
+[2024-07-11 10:29:19] sql.INFO: [24.82] insert into `chat_channel` (`user_id`, `fd`) values ('32', '15') [] []
+[2024-07-11 10:31:30] sql.INFO: [89.95] delete from `chat_channel` where (`fd` = '15') [] []
+[2024-07-11 10:31:32] sql.INFO: [32.26] delete from `chat_channel` where (`fd` = '14') [] []
+[2024-07-11 10:31:35] sql.INFO: [21.35] delete from `chat_channel` where (`fd` = '13') [] []
+[2024-07-11 10:31:37] sql.INFO: [465.75] insert into `chat_channel` (`user_id`, `fd`) values ('32', '20') [] []
+[2024-07-11 10:31:41] sql.INFO: [656.7] insert into `chat_channel` (`user_id`, `fd`) values ('32', '21') [] []
+[2024-07-11 10:31:42] sql.INFO: [485.24] insert into `chat_channel` (`user_id`, `fd`) values ('32', '25') [] []
+[2024-07-11 10:31:59] sql.INFO: [40.98] delete from `chat_channel` where (`fd` = '25') [] []
+[2024-07-11 10:32:02] sql.INFO: [245.74] delete from `chat_channel` where (`fd` = '20') [] []
+[2024-07-11 10:32:03] sql.INFO: [232.4] insert into `chat_channel` (`user_id`, `fd`) values ('32', '28') [] []
+[2024-07-11 10:32:04] sql.INFO: [390.01] delete from `chat_channel` where (`fd` = '21') [] []
+[2024-07-11 10:32:09] sql.INFO: [514.18] insert into `chat_channel` (`user_id`, `fd`) values ('32', '29') [] []
+[2024-07-11 10:32:18] sql.INFO: [68.19] delete from `chat_channel` where (`fd` = '28') [] []
+[2024-07-11 10:32:18] sql.INFO: [293.38] insert into `chat_channel` (`user_id`, `fd`) values ('32', '33') [] []
+[2024-07-11 10:32:20] sql.INFO: [126.92] delete from `chat_channel` where (`fd` = '29') [] []
+[2024-07-11 10:32:24] sql.INFO: [857.66] insert into `chat_channel` (`user_id`, `fd`) values ('32', '34') [] []
+[2024-07-11 10:32:26] sql.INFO: [645.13] delete from `chat_channel` where (`fd` = '34') [] []
+[2024-07-11 10:32:31] sql.INFO: [620.43] insert into `chat_channel` (`user_id`, `fd`) values ('32', '38') [] []
+[2024-07-11 10:32:37] sql.INFO: [17.05] insert into `chat_channel` (`user_id`, `fd`) values ('32', '39') [] []
+[2024-07-11 10:33:17] sql.INFO: [172] delete from `chat_channel` where (`fd` = '39') [] []
+[2024-07-11 10:33:18] sql.INFO: [116.12] insert into `chat_channel` (`user_id`, `fd`) values ('32', '42') [] []
+[2024-07-11 10:33:20] sql.INFO: [61.44] delete from `chat_channel` where (`fd` = '33') [] []
+[2024-07-11 10:33:21] sql.INFO: [122.17] insert into `chat_channel` (`user_id`, `fd`) values ('32', '47') [] []
+[2024-07-11 10:33:23] sql.INFO: [192.68] delete from `chat_channel` where (`fd` = '38') [] []
+[2024-07-11 10:33:30] sql.INFO: [287.39] insert into `chat_channel` (`user_id`, `fd`) values ('32', '48') [] []
+[2024-07-11 17:18:05] sql.INFO: [70.15] delete from `chat_channel` where (`fd` = '47') [] []
+[2024-07-12 00:23:07] sql.INFO: [156.18] insert into `chat_channel` (`user_id`, `fd`) values ('32', '49') [] []
+[2024-07-12 00:31:19] sql.INFO: [55.29] delete from `chat_channel` where (`fd` = '42') [] []
+[2024-07-12 00:42:24] sql.INFO: [1318.4] insert into `chat_channel` (`user_id`, `fd`) values ('32', '52') [] []
+[2024-07-12 00:42:50] sql.INFO: [120.25] delete from `chat_channel` where (`fd` = '49') [] []
+[2024-07-12 00:42:53] sql.INFO: [34.36] delete from `chat_channel` where (`fd` = '48') [] []
+[2024-07-12 00:42:55] sql.INFO: [103.5] delete from `chat_channel` where (`fd` = '52') [] []
+[2024-07-12 00:42:57] sql.INFO: [348.47] insert into `chat_channel` (`user_id`, `fd`) values ('32', '55') [] []
+[2024-07-12 00:43:03] sql.INFO: [113.13] insert into `chat_channel` (`user_id`, `fd`) values ('32', '58') [] []
+[2024-07-12 00:44:00] sql.INFO: [213.12] insert into `chat_channel` (`user_id`, `fd`) values ('32', '59') [] []
+[2024-07-12 05:52:06] sql.INFO: [272.62] insert into `contact_apply` (`friend_id`, `remark`) values ('33', '我是刘德华') [] []
+[2024-07-12 06:26:34] sql.INFO: [138.8] insert into `contact_apply` (`friend_id`, `remark`, `user_id`) values ('33', '我是刘德华', '32') [] []
+[2024-07-12 06:27:47] sql.INFO: [165.88] insert into `contact_apply` (`friend_id`, `remark`, `user_id`) values ('33', '我是刘德华', '32') [] []
+[2024-07-12 06:28:09] sql.INFO: [15.36] insert into `contact_apply` (`friend_id`, `remark`, `user_id`) values ('33', '我是刘德华', '32') [] []
+[2024-07-12 06:28:11] sql.INFO: [19.33] insert into `contact_apply` (`friend_id`, `remark`, `user_id`) values ('33', '我是刘德华', '32') [] []
+[2024-07-12 06:28:12] sql.INFO: [22.22] insert into `contact_apply` (`friend_id`, `remark`, `user_id`) values ('33', '我是刘德华', '32') [] []
+[2024-07-12 06:28:13] sql.INFO: [19.58] insert into `contact_apply` (`friend_id`, `remark`, `user_id`) values ('33', '我是刘德华', '32') [] []
+[2024-07-12 06:28:32] sql.INFO: [11.76] insert into `contact_apply` (`friend_id`, `remark`, `user_id`) values ('34', '我是刘德华', '32') [] []
+[2024-07-12 06:28:37] sql.INFO: [20.67] insert into `contact_apply` (`friend_id`, `remark`, `user_id`) values ('35', '我是刘德华', '32') [] []
+[2024-07-12 06:28:41] sql.INFO: [14.7] insert into `contact_apply` (`friend_id`, `remark`, `user_id`) values ('36', '我是刘德华', '32') [] []
+[2024-07-12 06:55:13] sql.INFO: [206.14] select * from `contact_apply` where (`friend_id` = '32') [] []
+[2024-07-12 07:42:23] sql.INFO: [30.36] insert into `contact` (`user_id`, `friend_id`) values ('32', '37') [] []
+[2024-07-12 07:42:23] sql.INFO: [12.57] insert into `contact` (`user_id`, `friend_id`) values ('37', '32') [] []
+[2024-07-12 07:42:23] sql.INFO: [29.49] delete from `contact_apply` where (`user_id` = '32') [] []
+[2024-07-12 07:46:23] sql.INFO: [42.56] select * from `contact_apply` where (`friend_id` = '32') [] []
+[2024-07-12 07:46:44] sql.INFO: [11.31] insert into `contact` (`user_id`, `friend_id`) values ('32', '36') [] []
+[2024-07-12 07:46:44] sql.INFO: [15.23] insert into `contact` (`user_id`, `friend_id`) values ('36', '32') [] []
+[2024-07-12 07:46:44] sql.INFO: [10.74] delete from `contact_apply` where (`user_id` = '32' and `friend_id` = '36') [] []
+[2024-07-12 07:50:16] sql.INFO: [111.45] insert into `contact` (`user_id`, `friend_id`) values ('32', '36') [] []
+[2024-07-12 07:50:16] sql.INFO: [4.01] insert into `contact` (`user_id`, `friend_id`) values ('36', '32') [] []
+[2024-07-12 07:50:16] sql.INFO: [9.56] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '36') [] []
+[2024-07-12 07:51:08] sql.INFO: [5.39] insert into `contact` (`user_id`, `friend_id`) values ('32', '37') [] []
+[2024-07-12 07:51:08] sql.INFO: [9.48] insert into `contact` (`user_id`, `friend_id`) values ('37', '32') [] []
+[2024-07-12 07:51:08] sql.INFO: [9.23] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '37') [] []
+[2024-07-12 07:51:28] sql.INFO: [5] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '38') [] []
+[2024-07-12 08:17:46] sql.INFO: [2394.17] update `contact` set `status` = '2', `contact`.`updated_at` = '2024-07-12 08:17:44' where (`user_id` = '32' and `friend_id` = '36') [] []
+[2024-07-12 08:38:25] sql.INFO: [111.43] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`user`.`nickname` like '%%' and `contact`.`remark` like '%%' and `contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:39:32] sql.INFO: [178.2] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`user`.`nickname` like '%%' and `contact`.`remark` like '%%' and `contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:39:32] sql.INFO: [19.83] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`user`.`nickname` like '%%' and `contact`.`remark` like '%%' and `contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:39:43] sql.INFO: [9.97] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`user`.`nickname` like '%%' and `contact`.`remark` like '%%' and `contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:39:43] sql.INFO: [4.26] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`user`.`nickname` like '%%' and `contact`.`remark` like '%%' and `contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:40:11] sql.INFO: [5.39] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`user`.`nickname` like '%%' and `contact`.`remark` like '%%' and `contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:40:11] sql.INFO: [3.25] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`user`.`nickname` like '%%' and `contact`.`remark` like '%%' and `contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:40:58] sql.INFO: [1.8] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`user`.`nickname` like '%%' and `contact`.`remark` like '%%' and `contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:40:58] sql.INFO: [7.46] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`user`.`nickname` like '%%' and `contact`.`remark` like '%%' and `contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:48:46] sql.INFO: [180.31] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:48:46] sql.INFO: [11.78] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:49:06] sql.INFO: [3.28] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:49:06] sql.INFO: [10.82] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:53:44] sql.INFO: [297.5] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') or `user`.`nickname` like '%%' or `contact`.`remark` like '%%' [] []
+[2024-07-12 08:53:45] sql.INFO: [12.8] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:54:08] sql.INFO: [8.4] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') or `user`.`nickname` like '%%' or `contact`.`remark` like '%%' [] []
+[2024-07-12 08:54:08] sql.INFO: [10.49] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 08:59:47] sql.INFO: [3726.53] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '1' or `contact`.`remark` like '2') order by `contact`.`created_at` desc limit 1 offset 9 [] []
+[2024-07-12 08:59:47] sql.INFO: [9.94] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') [] []
+[2024-07-12 09:03:39] sql.INFO: [75.09] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%%' or `contact`.`remark` like '%%') order by `contact`.`created_at` desc limit 1 offset 9 [] []
+[2024-07-12 09:03:39] sql.INFO: [5.03] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%%' or `contact`.`remark` like '%%') [] []
+[2024-07-12 09:04:36] sql.INFO: [12.71] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%%' or `contact`.`remark` like '%%') order by `contact`.`created_at` desc limit 10 offset 0 [] []
+[2024-07-12 09:04:36] sql.INFO: [9.19] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%%' or `contact`.`remark` like '%%') [] []
+[2024-07-12 09:17:57] sql.INFO: [52.21] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') order by `contact`.`created_at` desc limit 10 offset 0 [] []
+[2024-07-12 09:17:57] sql.INFO: [18.07] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') [] []
+[2024-07-12 09:18:02] sql.INFO: [10.37] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称就%' or `contact`.`remark` like '%称就%') order by `contact`.`created_at` desc limit 10 offset 0 [] []
+[2024-07-12 09:18:02] sql.INFO: [11.61] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称就%' or `contact`.`remark` like '%称就%') [] []
+[2024-07-12 09:18:42] sql.INFO: [2.85] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') order by `contact`.`created_at` desc limit 10 offset 0 [] []
+[2024-07-12 09:18:42] sql.INFO: [14.97] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') [] []
+[2024-07-15 02:51:08] sql.INFO: [97.91] insert into `chat_channel` (`user_id`, `fd`) values ('32', '4') [] []
+[2024-07-15 02:54:30] sql.INFO: [270.66] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') order by `contact`.`created_at` desc limit 10 offset 0 [] []
+[2024-07-15 02:54:30] sql.INFO: [8.58] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') [] []
+[2024-07-15 02:56:47] sql.INFO: [31.19] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') order by `contact`.`created_at` desc limit 10 offset 0 [] []
+[2024-07-15 02:56:47] sql.INFO: [3.31] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') [] []
+[2024-07-15 02:58:13] sql.INFO: [15.34] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') order by `contact`.`created_at` desc limit 10 offset 0 [] []
+[2024-07-15 02:58:13] sql.INFO: [3.66] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') [] []
+[2024-07-15 02:58:15] sql.INFO: [2] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') order by `contact`.`created_at` desc limit 10 offset 0 [] []
+[2024-07-15 02:58:15] sql.INFO: [3.55] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') [] []
+[2024-07-15 03:12:13] sql.INFO: [23.58] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') order by `contact`.`created_at` desc limit 10 offset 0 [] []
+[2024-07-15 03:12:13] sql.INFO: [2.57] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') [] []
+[2024-07-15 07:03:59] sql.INFO: [187.89] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-15 07:04:11] sql.INFO: [14.58] insert into `chat_channel` (`user_id`, `fd`) values ('32', '2') [] []
+[2024-07-15 07:05:09] sql.INFO: [59.36] delete from `chat_channel` where (`fd` = '2') [] []
+[2024-07-15 07:05:10] sql.INFO: [88.25] delete from `chat_channel` where (`fd` = '1') [] []
+[2024-07-15 07:05:15] sql.INFO: [98.46] insert into `chat_channel` (`user_id`, `fd`) values ('32', '3') [] []
+[2024-07-15 07:10:39] sql.INFO: [53.49] insert into `chat_channel` (`user_id`, `fd`) values ('32', '10') [] []
+[2024-07-15 07:12:05] sql.INFO: [80.78] insert into `chat_channel` (`user_id`, `fd`) values ('32', '11') [] []
+[2024-07-15 07:12:06] sql.INFO: [8.62] insert into `chat_channel` (`user_id`, `fd`) values ('32', '12') [] []
+[2024-07-15 07:15:21] sql.INFO: [38.61] insert into `chat_channel` (`user_id`, `fd`) values ('32', '13') [] []
+[2024-07-15 07:15:22] sql.INFO: [7.11] insert into `chat_channel` (`user_id`, `fd`) values ('32', '14') [] []
+[2024-07-15 07:15:32] sql.INFO: [11.34] insert into `chat_channel` (`user_id`, `fd`) values ('32', '15') [] []
+[2024-07-15 07:15:32] sql.INFO: [32.49] insert into `chat_channel` (`user_id`, `fd`) values ('32', '16') [] []
+[2024-07-15 08:33:21] sql.INFO: [48.08] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') order by `contact`.`created_at` desc limit 10 offset 0 [] []
+[2024-07-15 08:33:21] sql.INFO: [5.82] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') [] []
+[2024-07-15 08:33:49] sql.INFO: [2.6] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') order by `contact`.`created_at` desc limit 10 offset 0 [] []
+[2024-07-15 08:33:49] sql.INFO: [2.9] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') [] []
+[2024-07-15 08:34:09] sql.INFO: [4] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') order by `contact`.`created_at` desc limit 10 offset 0 [] []
+[2024-07-15 08:34:09] sql.INFO: [5.04] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') [] []
+[2024-07-15 08:38:32] sql.INFO: [31.86] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') order by `contact`.`created_at` desc limit 10 offset 0 [] []
+[2024-07-15 08:38:32] sql.INFO: [13.68] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') [] []
+[2024-07-15 08:38:40] sql.INFO: [5.34] select `contact`.*, `user`.`nickname`, `user`.`avatar` from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') order by `contact`.`created_at` desc limit 10 offset 0 [] []
+[2024-07-15 08:38:40] sql.INFO: [4.01] select count(*) as aggregate from `contact` left join `user` on `user`.`id` = `contact`.`friend_id` where (`contact`.`status` = '1' and `contact`.`user_id` = '32') and (`user`.`nickname` like '%称%' or `contact`.`remark` like '%称%') [] []
+[2024-07-15 09:17:46] sql.INFO: [4.69] insert into `contact` (`user_id`, `friend_id`) values ('32', '39') [] []
+[2024-07-15 09:17:46] sql.INFO: [1.57] insert into `contact` (`user_id`, `friend_id`) values ('39', '32') [] []
+[2024-07-15 09:17:46] sql.INFO: [8.34] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '39') [] []
+[2024-07-15 09:17:46] sql.INFO: [12.27] insert into `talk_session` (`id`, `talk_type`, `from_user_id`, `to_user_id`) values ('671403493331841025', '1', '32', '39') [] []
+[2024-07-15 09:22:00] sql.INFO: [5.38] insert into `contact` (`user_id`, `friend_id`) values ('32', '39') [] []
+[2024-07-15 09:22:00] sql.INFO: [7.85] insert into `contact` (`user_id`, `friend_id`) values ('39', '32') [] []
+[2024-07-15 09:22:00] sql.INFO: [7.21] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '39') [] []
+[2024-07-15 09:22:00] sql.INFO: [11.34] insert into `talk_session` (`id`, `talk_type`, `from_user_id`, `to_user_id`) values ('671404557233831937', '1', '32', '39') [] []
+[2024-07-15 09:23:24] sql.INFO: [23.9] insert into `contact` (`user_id`, `friend_id`) values ('32', '39') [] []
+[2024-07-15 09:23:24] sql.INFO: [3.98] insert into `contact` (`user_id`, `friend_id`) values ('39', '32') [] []
+[2024-07-15 09:23:24] sql.INFO: [14.63] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '39') [] []
+[2024-07-15 09:23:24] sql.INFO: [12.6] insert into `talk_session` (`id`, `talk_type`, `from_user_id`, `to_user_id`) values ('671404909895106560', '1', '32', '39') [] []
+[2024-07-15 09:26:22] sql.INFO: [7.33] insert into `contact` (`user_id`, `friend_id`) values ('32', '39') [] []
+[2024-07-15 09:26:22] sql.INFO: [32.16] insert into `contact` (`user_id`, `friend_id`) values ('39', '32') [] []
+[2024-07-15 09:26:22] sql.INFO: [3.3] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '39') [] []
+[2024-07-15 09:26:22] sql.INFO: [11.18] insert into `talk_session` (`id`, `talk_type`, `from_user_id`, `to_user_id`) values ('671405657533992961', '1', '32', '39') [] []
+[2024-07-15 09:30:25] sql.INFO: [7.17] insert into `contact` (`user_id`, `friend_id`) values ('32', '39') [] []
+[2024-07-15 09:30:25] sql.INFO: [8.22] insert into `contact` (`user_id`, `friend_id`) values ('39', '32') [] []
+[2024-07-15 09:30:25] sql.INFO: [4.76] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '39') [] []
+[2024-07-15 09:30:25] sql.INFO: [10.77] insert into `talk_session` (`id`, `talk_type`, `from_user_id`, `to_user_id`) values ('671406674283614208', '1', '32', '39') [] []
+[2024-07-15 09:31:10] sql.INFO: [4.23] insert into `contact` (`user_id`, `friend_id`) values ('32', '40') [] []
+[2024-07-15 09:31:10] sql.INFO: [11.8] insert into `contact` (`user_id`, `friend_id`) values ('40', '32') [] []
+[2024-07-15 09:31:10] sql.INFO: [8.08] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '40') [] []
+[2024-07-15 09:31:10] sql.INFO: [16.2] insert into `talk_session` (`id`, `talk_type`, `from_user_id`, `to_user_id`) values ('671406864608546816', '1', '32', '40') [] []
+[2024-07-15 09:35:47] sql.INFO: [4.78] insert into `contact` (`user_id`, `friend_id`) values ('32', '40') [] []
+[2024-07-15 09:35:47] sql.INFO: [8.6] insert into `contact` (`user_id`, `friend_id`) values ('40', '32') [] []
+[2024-07-15 09:35:47] sql.INFO: [4.3] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '40') [] []
+[2024-07-15 09:35:47] sql.INFO: [10.12] insert into `talk_session` (`id`, `talk_type`, `from_user_id`, `to_user_id`) values ('671408024023224320', '1', '32', '40') [] []
+[2024-07-15 09:37:04] sql.INFO: [43.3] insert into `contact` (`user_id`, `friend_id`) values ('32', '39') [] []
+[2024-07-15 09:37:04] sql.INFO: [8.02] insert into `contact` (`user_id`, `friend_id`) values ('39', '32') [] []
+[2024-07-15 09:37:04] sql.INFO: [17] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '39') [] []
+[2024-07-15 09:37:05] sql.INFO: [74.96] insert into `talk_session` (`id`, `talk_type`, `from_user_id`, `to_user_id`) values ('671408350780477440', '1', '32', '39') [] []
+[2024-07-15 09:37:22] sql.INFO: [5.44] insert into `contact` (`user_id`, `friend_id`) values ('32', '39') [] []
+[2024-07-15 09:37:22] sql.INFO: [6.72] insert into `contact` (`user_id`, `friend_id`) values ('39', '32') [] []
+[2024-07-15 09:37:22] sql.INFO: [1.91] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '39') [] []
+[2024-07-15 09:37:22] sql.INFO: [11.01] insert into `talk_session` (`id`, `talk_type`, `from_user_id`, `to_user_id`) values ('671408424000442368', '1', '32', '39') [] []
+[2024-07-15 09:40:55] sql.INFO: [3.7] insert into `contact` (`user_id`, `friend_id`) values ('32', '38') [] []
+[2024-07-15 09:40:55] sql.INFO: [11.87] insert into `contact` (`user_id`, `friend_id`) values ('38', '32') [] []
+[2024-07-15 09:40:55] sql.INFO: [12.39] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '38') [] []
+[2024-07-15 09:40:55] sql.INFO: [8.05] insert into `talk_session` (`id`, `talk_type`, `from_user_id`, `to_user_id`) values ('671409317609492480', '1', '32', '38') [] []
+[2024-07-15 09:45:42] sql.INFO: [7.97] insert into `contact` (`user_id`, `friend_id`) values ('32', '38') [] []
+[2024-07-15 09:45:42] sql.INFO: [2] insert into `contact` (`user_id`, `friend_id`) values ('38', '32') [] []
+[2024-07-15 09:45:42] sql.INFO: [9.19] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '38') [] []
+[2024-07-15 09:45:42] sql.INFO: [8.7] insert into `talk_session` (`id`, `talk_type`, `from_user_id`, `to_user_id`) values ('671410521831919616', '1', '32', '38') [] []
+[2024-07-15 09:53:40] sql.INFO: [5.74] insert into `contact` (`user_id`, `friend_id`) values ('32', '39') [] []
+[2024-07-15 09:53:40] sql.INFO: [3.43] insert into `contact` (`user_id`, `friend_id`) values ('39', '32') [] []
+[2024-07-15 09:53:40] sql.INFO: [6.8] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '39') [] []
+[2024-07-15 09:53:40] sql.INFO: [105.78] insert into `talk_session` (`id`, `talk_type`, `from_user_id`, `to_user_id`) values ('671412526436605953', '1', '32', '39') [] []
+[2024-07-15 09:58:22] sql.INFO: [5.34] insert into `contact` (`user_id`, `friend_id`) values ('32', '40') [] []
+[2024-07-15 09:58:22] sql.INFO: [5.65] insert into `contact` (`user_id`, `friend_id`) values ('40', '32') [] []
+[2024-07-15 09:58:22] sql.INFO: [8.83] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '40') [] []
+[2024-07-15 09:58:22] sql.INFO: [13.87] insert into `talk_session` (`id`, `talk_type`, `from_user_id`, `to_user_id`) values ('671413709976924161', '1', '32', '40') [] []
+[2024-07-15 09:58:22] sql.INFO: [16.32] insert into `talk_session_association` (`id`, `user_id`, `session_id`) values ('671413710136307712', '32', '671413709976924161') [] []
+[2024-07-15 09:58:22] sql.INFO: [12.46] insert into `talk_session_association` (`id`, `user_id`, `session_id`) values ('671413710295691264', '40', '671413709976924161') [] []
+[2024-07-15 09:59:46] sql.INFO: [7.75] insert into `contact` (`user_id`, `friend_id`) values ('32', '41') [] []
+[2024-07-15 09:59:46] sql.INFO: [1.82] insert into `contact` (`user_id`, `friend_id`) values ('41', '32') [] []
+[2024-07-15 09:59:46] sql.INFO: [8.19] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '41') [] []
+[2024-07-15 09:59:46] sql.INFO: [52.51] insert into `talk_session` (`id`, `talk_type`, `from_user_id`, `to_user_id`) values ('671414061828698112', '1', '32', '41') [] []
+[2024-07-15 09:59:46] sql.INFO: [18.76] insert into `talk_session_association` (`id`, `user_id`, `session_id`) values ('671414062164242432', '32', '671414061828698112') [] []
+[2024-07-15 09:59:46] sql.INFO: [19.25] insert into `talk_session_association` (`id`, `user_id`, `session_id`) values ('671414062344597504', '41', '671414061828698112') [] []
+[2024-07-15 11:48:16] sql.INFO: [26.08] select * from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session`.`to_user_id` left join `talk_group` on `talk_group`.`session_id` = `talk_session`.`id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-15 11:55:52] sql.INFO: [96.31] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session`.`to_user_id` left join `talk_group` on `talk_group`.`session_id` = `talk_session`.`id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-15 11:57:06] sql.INFO: [1493.02] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session`.`to_user_id` left join `talk_group` on `talk_group`.`session_id` = `talk_session`.`id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-16 09:56:58] sql.INFO: [16.02] insert into `talk_group` (`id`, `creator_id`, `group_name`) values ('671775745332248577', '32', '群名称') [] []
+[2024-07-16 09:57:31] sql.INFO: [2.47] insert into `talk_group` (`id`, `creator_id`, `group_name`) values ('671775883949801472', '32', '群名称') [] []
+[2024-07-16 09:58:14] sql.INFO: [1.01] insert into `talk_group` (`id`, `creator_id`, `group_name`) values ('671776062664900608', '32', '群名称') [] []
+[2024-07-16 09:58:33] sql.INFO: [7.23] insert into `talk_group` (`id`, `creator_id`, `group_name`) values ('671776144671932416', '32', '群名称') [] []
+[2024-07-16 10:00:16] sql.INFO: [10.07] insert into `talk_group` (`id`, `creator_id`, `group_name`) values ('671776573052977152', '32', '群名称') [] []
+[2024-07-16 10:00:36] sql.INFO: [4.55] insert into `talk_group` (`id`, `creator_id`, `group_name`) values ('671776658579030016', '32', '群名称') [] []
+[2024-07-16 10:03:47] sql.INFO: [13.32] insert into `talk_group` (`id`, `creator_id`, `group_name`) values ('671777459875643392', '32', '群名称') [] []
+[2024-07-16 10:05:41] sql.INFO: [7.68] insert into `talk_group` (`id`, `creator_id`, `group_name`) values ('671777938743529473', '32', '群名称') [] []
+[2024-07-16 10:05:41] sql.INFO: [9.94] insert into `talk_group_member` (`group_id`, `id`, `leader`, `user_id`) values ('671777938743529473', '671777938986799104', '0', '32'), ('671777938743529473', '671777938986799105', '0', '32'), ('671777938743529473', '671777938986799106', '0', '32'), ('671777938743529473', '671777938986799107', '0', '32'), ('671777938743529473', '671777938986799108', '0', '32'), ('671777938743529473', '671777938986799109', '0', '32'), ('671777938743529473', '671777938986799110', '0', '32'), ('671777938743529473', '671777938986799111', '0', '32'), ('671777938743529473', '671777938986799112', '0', '32'), ('671777938743529473', '671777938986799113', '0', '32'), ('671777938743529473', '671777938986799114', '0', '32'), ('671777938743529473', '671777938986799115', '0', '32'), ('671777938743529473', '671777938986799116', '0', '32'), ('671777938743529473', '671777938986799117', '0', '32'), ('671777938743529473', '671777938986799118', '0', '32'), ('671777938743529473', '671777938986799119', '2', '32') [] []
+[2024-07-16 10:05:41] sql.INFO: [5.52] insert into `talk_session` (`id`, `talk_type`, `group_id`) values ('671777939062296576', '2', '671777938743529473') [] []
+[2024-07-16 10:05:41] sql.INFO: [6.82] insert into `talk_session_association` (`id`, `session_id`, `user_id`) values ('671777939137794048', '671777939062296576', '1'), ('671777939137794049', '671777939062296576', '2'), ('671777939137794050', '671777939062296576', '3'), ('671777939137794051', '671777939062296576', '4'), ('671777939137794052', '671777939062296576', '5'), ('671777939137794053', '671777939062296576', '6'), ('671777939137794054', '671777939062296576', '7'), ('671777939137794055', '671777939062296576', '8'), ('671777939137794056', '671777939062296576', '9'), ('671777939137794057', '671777939062296576', '11'), ('671777939137794058', '671777939062296576', '22'), ('671777939137794059', '671777939062296576', '33'), ('671777939137794060', '671777939062296576', '44'), ('671777939137794061', '671777939062296576', '55'), ('671777939137794062', '671777939062296576', '66'), ('671777939137794063', '671777939062296576', '32') [] []
+[2024-07-16 10:16:29] sql.INFO: [13.88] insert into `talk_group` (`id`, `creator_id`, `group_name`) values ('671780657713684481', '32', '群名称') [] []
+[2024-07-16 10:16:29] sql.INFO: [15.64] insert into `talk_group_member` (`group_id`, `id`, `leader`, `user_id`) values ('671780657713684481', '671780657982119936', '0', '1'), ('671780657713684481', '671780657982119937', '0', '2'), ('671780657713684481', '671780657982119938', '0', '3'), ('671780657713684481', '671780657982119939', '0', '4'), ('671780657713684481', '671780657982119940', '0', '5'), ('671780657713684481', '671780657982119941', '0', '6'), ('671780657713684481', '671780657982119942', '0', '7'), ('671780657713684481', '671780657982119943', '0', '8'), ('671780657713684481', '671780657982119944', '0', '9'), ('671780657713684481', '671780657982119945', '0', '11'), ('671780657713684481', '671780657982119946', '0', '22'), ('671780657713684481', '671780657982119947', '0', '33'), ('671780657713684481', '671780657982119948', '0', '44'), ('671780657713684481', '671780657982119949', '0', '55'), ('671780657713684481', '671780657982119950', '0', '66'), ('671780657713684481', '671780657982119951', '2', '32') [] []
+[2024-07-16 10:16:29] sql.INFO: [8.84] insert into `talk_session` (`id`, `talk_type`, `group_id`) values ('671780658057617408', '2', '671780657713684481') [] []
+[2024-07-16 10:16:29] sql.INFO: [15.51] insert into `talk_session_association` (`id`, `session_id`, `user_id`) values ('671780658107949056', '671780658057617408', '1'), ('671780658107949057', '671780658057617408', '2'), ('671780658107949058', '671780658057617408', '3'), ('671780658107949059', '671780658057617408', '4'), ('671780658107949060', '671780658057617408', '5'), ('671780658107949061', '671780658057617408', '6'), ('671780658107949062', '671780658057617408', '7'), ('671780658107949063', '671780658057617408', '8'), ('671780658107949064', '671780658057617408', '9'), ('671780658107949065', '671780658057617408', '11'), ('671780658107949066', '671780658057617408', '22'), ('671780658107949067', '671780658057617408', '33'), ('671780658107949068', '671780658057617408', '44'), ('671780658107949069', '671780658057617408', '55'), ('671780658107949070', '671780658057617408', '66'), ('671780658107949071', '671780658057617408', '32') [] []
+[2024-07-17 00:42:11] sql.INFO: [5.41] insert into `talk_group` (`id`, `creator_id`, `group_name`) values ('671998516876324865', '32', '群名称') [] []
+[2024-07-17 00:42:11] sql.INFO: [5.46] insert into `talk_group_member` (`group_id`, `id`, `leader`, `user_id`) values ('671998516876324865', '671998517094428672', '0', '1'), ('671998516876324865', '671998517094428673', '0', '2'), ('671998516876324865', '671998517094428674', '0', '3'), ('671998516876324865', '671998517094428675', '0', '4'), ('671998516876324865', '671998517094428676', '0', '5'), ('671998516876324865', '671998517094428677', '0', '6'), ('671998516876324865', '671998517094428678', '0', '7'), ('671998516876324865', '671998517094428679', '0', '8'), ('671998516876324865', '671998517094428680', '0', '9'), ('671998516876324865', '671998517094428681', '0', '11'), ('671998516876324865', '671998517094428682', '0', '22'), ('671998516876324865', '671998517094428683', '0', '33'), ('671998516876324865', '671998517094428684', '0', '44'), ('671998516876324865', '671998517094428685', '0', '55'), ('671998516876324865', '671998517094428686', '0', '66'), ('671998516876324865', '671998517094428687', '2', '32') [] []
+[2024-07-17 00:43:09] sql.INFO: [14.11] insert into `talk_group` (`id`, `creator_id`, `group_name`) values ('671998759009304577', '32', '群名称') [] []
+[2024-07-17 00:43:09] sql.INFO: [13.26] insert into `talk_group_member` (`group_id`, `id`, `leader`, `user_id`) values ('671998759009304577', '671998759357431808', '0', '1'), ('671998759009304577', '671998759357431809', '0', '2'), ('671998759009304577', '671998759357431810', '0', '3'), ('671998759009304577', '671998759357431811', '0', '4'), ('671998759009304577', '671998759357431812', '0', '5'), ('671998759009304577', '671998759357431813', '0', '6'), ('671998759009304577', '671998759357431814', '0', '7'), ('671998759009304577', '671998759357431815', '0', '8'), ('671998759009304577', '671998759357431816', '0', '9'), ('671998759009304577', '671998759357431817', '0', '11'), ('671998759009304577', '671998759357431818', '0', '22'), ('671998759009304577', '671998759357431819', '0', '33'), ('671998759009304577', '671998759357431820', '0', '44'), ('671998759009304577', '671998759357431821', '0', '55'), ('671998759009304577', '671998759357431822', '0', '66'), ('671998759009304577', '671998759357431823', '2', '32') [] []
+[2024-07-17 00:43:09] sql.INFO: [7.43] insert into `talk_session` (`id`, `talk_type`) values ('671998759474872320', '2') [] []
+[2024-07-17 00:43:09] sql.INFO: [15.52] insert into `talk_session_association` (`id`, `session_id`, `to_user_id`, `user_id`) values ('671998759554564096', '671998759474872320', '671998759009304577', '1'), ('671998759554564097', '671998759474872320', '671998759009304577', '2'), ('671998759554564098', '671998759474872320', '671998759009304577', '3'), ('671998759554564099', '671998759474872320', '671998759009304577', '4'), ('671998759554564100', '671998759474872320', '671998759009304577', '5'), ('671998759554564101', '671998759474872320', '671998759009304577', '6'), ('671998759554564102', '671998759474872320', '671998759009304577', '7'), ('671998759554564103', '671998759474872320', '671998759009304577', '8'), ('671998759554564104', '671998759474872320', '671998759009304577', '9'), ('671998759558758400', '671998759474872320', '671998759009304577', '11'), ('671998759558758401', '671998759474872320', '671998759009304577', '22'), ('671998759558758402', '671998759474872320', '671998759009304577', '33'), ('671998759558758403', '671998759474872320', '671998759009304577', '44'), ('671998759558758404', '671998759474872320', '671998759009304577', '55'), ('671998759558758405', '671998759474872320', '671998759009304577', '66'), ('671998759558758406', '671998759474872320', '671998759009304577', '32') [] []
+[2024-07-17 00:55:48] sql.INFO: [6] insert into `contact` (`user_id`, `friend_id`) values ('32', '42') [] []
+[2024-07-17 00:55:48] sql.INFO: [4.11] insert into `contact` (`user_id`, `friend_id`) values ('42', '32') [] []
+[2024-07-17 00:55:48] sql.INFO: [9.82] delete from `contact_apply` where (`friend_id` = '32' and `user_id` = '42') [] []
+[2024-07-17 00:55:48] sql.INFO: [8.37] insert into `talk_session` (`id`, `talk_type`) values ('672001943631089665', '1') [] []
+[2024-07-17 00:55:48] sql.INFO: [3.39] insert into `talk_session_association` (`id`, `session_id`, `to_user_id`, `user_id`) values ('672001943731752960', '672001943631089665', '42', '32'), ('672001943731752961', '672001943631089665', '32', '42') [] []
+[2024-07-17 01:38:04] sql.INFO: [31.43] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-17 01:41:18] sql.INFO: [58.32] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-17 02:07:22] sql.INFO: [89.25] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-17 02:08:51] sql.INFO: [162.21] delete from `chat_channel` where (`fd` = '1') [] []
+[2024-07-17 02:08:56] sql.INFO: [10.45] insert into `chat_channel` (`user_id`, `fd`) values ('32', '4') [] []
+[2024-07-17 02:10:29] sql.INFO: [80.38] insert into `chat_channel` (`user_id`, `fd`) values ('32', '7') [] []
+[2024-07-17 02:28:25] sql.INFO: [77.61] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-17 02:43:18] sql.INFO: [166.55] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-17 02:44:51] sql.INFO: [186.83] delete from `chat_channel` where (`fd` = '1') [] []
+[2024-07-17 02:44:57] sql.INFO: [122.31] insert into `chat_channel` (`user_id`, `fd`) values ('32', '4') [] []
+[2024-07-17 03:02:19] sql.INFO: [83.87] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-17 03:14:59] sql.INFO: [225.95] insert into `chat_channel` (`user_id`, `fd`) values ('32', '4') [] []
+[2024-07-17 03:15:01] sql.INFO: [31.82] insert into `chat_channel` (`user_id`, `fd`) values ('32', '5') [] []
+[2024-07-17 03:23:13] sql.INFO: [347.7] delete from `chat_channel` where (`fd` = '1') [] []
+[2024-07-17 03:23:14] sql.INFO: [94.03] delete from `chat_channel` where (`fd` = '4') [] []
+[2024-07-17 03:23:17] sql.INFO: [26.91] delete from `chat_channel` where (`fd` = '5') [] []
+[2024-07-17 03:24:48] sql.INFO: [256.77] insert into `chat_channel` (`user_id`, `fd`) values ('32', '10') [] []
+[2024-07-17 03:26:12] sql.INFO: [237.08] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-17 03:27:33] sql.INFO: [157.1] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-18 09:01:04] sql.INFO: [116.53] insert into `chat_channel` (`user_id`, `fd`) values ('32', '13') [] []
+[2024-07-18 09:03:33] sql.INFO: [123.48] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-18 09:05:54] sql.INFO: [108.25] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-18 09:05:54] sql.INFO: [2.16] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-18 09:05:59] sql.INFO: [3.16] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-18 09:05:59] sql.INFO: [13.95] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-18 09:06:23] sql.INFO: [23.07] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-18 09:06:23] sql.INFO: [4.82] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-18 09:07:34] sql.INFO: [60.45] insert into `chat_channel` (`user_id`, `fd`) values ('32', '15') [] []
+[2024-07-18 09:22:12] sql.INFO: [53.56] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-18 09:23:10] sql.INFO: [15.91] insert into `chat_channel` (`user_id`, `fd`) values ('32', '4') [] []
+[2024-07-18 09:38:21] sql.INFO: [83.01] insert into `chat_channel` (`user_id`, `fd`) values ('32', '5') [] []
+[2024-07-18 09:39:30] sql.INFO: [76.44] delete from `chat_channel` where (`fd` = '4') [] []
+[2024-07-18 09:39:30] sql.INFO: [63.66] delete from `chat_channel` where (`fd` = '5') [] []
+[2024-07-18 09:39:30] sql.INFO: [117.61] delete from `chat_channel` where (`fd` = '1') [] []
+[2024-07-18 09:39:33] sql.INFO: [49.19] insert into `chat_channel` (`user_id`, `fd`) values ('32', '6') [] []
+[2024-07-18 09:39:34] sql.INFO: [135.29] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-18 09:39:34] sql.INFO: [5.68] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-18 09:40:47] sql.INFO: [391.33] delete from `chat_channel` where (`fd` = '6') [] []
+[2024-07-18 09:40:51] sql.INFO: [30.13] insert into `chat_channel` (`user_id`, `fd`) values ('32', '10') [] []
+[2024-07-18 09:40:51] sql.INFO: [60.58] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-18 09:40:51] sql.INFO: [248.11] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-18 09:42:04] sql.INFO: [84.77] insert into `chat_channel` (`user_id`, `fd`) values ('32', '14') [] []
+[2024-07-18 09:42:04] sql.INFO: [4.56] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-18 09:42:04] sql.INFO: [7.23] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-18 09:42:19] sql.INFO: [127.26] insert into `chat_channel` (`user_id`, `fd`) values ('32', '16') [] []
+[2024-07-18 09:42:19] sql.INFO: [141.31] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-18 09:42:19] sql.INFO: [15.76] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-18 10:25:42] sql.INFO: [42.77] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-18 10:25:42] sql.INFO: [64.98] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-18 10:25:42] sql.INFO: [29.61] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-18 10:26:32] sql.INFO: [15.6] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-18 10:26:32] sql.INFO: [15.57] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-18 10:26:32] sql.INFO: [6.3] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-18 10:27:31] sql.INFO: [126.97] delete from `chat_channel` where (`fd` = '1') [] []
+[2024-07-18 10:27:37] sql.INFO: [12.34] insert into `chat_channel` (`user_id`, `fd`) values ('32', '5') [] []
+[2024-07-18 10:27:37] sql.INFO: [4.91] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-18 10:27:37] sql.INFO: [2.53] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-18 10:28:08] sql.INFO: [59.68] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-18 10:28:08] sql.INFO: [59.51] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-18 10:28:08] sql.INFO: [6.01] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-19 02:30:27] sql.INFO: [446.1] insert into `chat_channel` (`user_id`, `fd`) values ('32', '6') [] []
+[2024-07-19 02:30:27] sql.INFO: [479.77] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-19 02:30:27] sql.INFO: [8.49] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-19 03:23:00] sql.INFO: [176.34] insert into `chat_channel` (`user_id`, `fd`) values ('32', '8') [] []
+[2024-07-19 03:23:00] sql.INFO: [89.64] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-19 03:23:00] sql.INFO: [15.23] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-19 06:54:53] sql.INFO: [354.49] delete from `chat_channel` where (`fd` = '8') [] []
+[2024-07-19 06:54:53] sql.INFO: [497.49] delete from `chat_channel` where (`fd` = '6') [] []
+[2024-07-19 06:54:53] sql.INFO: [175.49] delete from `chat_channel` where (`fd` = '1') [] []
+[2024-07-19 07:06:08] sql.INFO: [96.74] insert into `chat_channel` (`user_id`, `fd`) values ('32', '47') [] []
+[2024-07-19 07:06:08] sql.INFO: [246.88] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-19 07:06:08] sql.INFO: [11.28] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-19 07:14:48] sql.INFO: [110.01] delete from `chat_channel` where (`fd` = '47') [] []
+[2024-07-19 08:50:47] sql.INFO: [71.11] insert into `chat_channel` (`user_id`, `fd`) values ('32', '79') [] []
+[2024-07-19 08:50:47] sql.INFO: [55.77] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-19 08:50:47] sql.INFO: [3.58] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-19 09:00:05] sql.INFO: [132.47] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-19 09:00:05] sql.INFO: [5.55] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-19 09:00:05] sql.INFO: [56.34] insert into `chat_channel` (`user_id`, `fd`) values ('32', '86') [] []
+[2024-07-19 09:08:04] sql.INFO: [88.97] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-19 09:08:04] sql.INFO: [93.1] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-19 09:08:05] sql.INFO: [76.08] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-19 09:11:03] sql.INFO: [94.61] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-19 09:11:03] sql.INFO: [85.6] insert into `chat_channel` (`user_id`, `fd`) values ('32', '1') [] []
+[2024-07-19 09:11:03] sql.INFO: [18.2] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-19 09:12:47] sql.INFO: [56.34] delete from `chat_channel` where (`fd` = '1') [] []
+[2024-07-19 09:12:57] sql.INFO: [504.48] insert into `chat_channel` (`user_id`, `fd`) values ('32', '5') [] []
+[2024-07-22 07:21:05] sql.INFO: [152.23] delete from `chat_channel` where (`fd` = '7') [] []
+[2024-07-22 07:21:07] sql.INFO: [221.37] insert into `chat_channel` (`user_id`, `fd`) values ('32', '8') [] []
+[2024-07-22 07:21:07] sql.INFO: [280.23] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-22 07:21:07] sql.INFO: [14.88] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 00:54:24] sql.INFO: [58.27] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 00:54:24] sql.INFO: [4.92] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 01:44:31] sql.INFO: [53.28] delete from `chat_channel` where (`fd` = '1') [] []
+[2024-07-23 02:19:35] sql.INFO: [94.78] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 02:19:35] sql.INFO: [18.6] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 06:47:50] sql.INFO: [1513.07] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 06:47:50] sql.INFO: [50.99] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 08:12:27] sql.INFO: [2929.33] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 08:12:27] sql.INFO: [22.16] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 08:13:34] sql.INFO: [146.06] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 08:13:34] sql.INFO: [84.29] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 08:14:00] sql.INFO: [92.74] delete from `chat_channel` where (`fd` = '1') [] []
+[2024-07-23 08:14:05] sql.INFO: [15.01] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 08:14:05] sql.INFO: [7.46] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 08:36:29] sql.INFO: [103.58] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 08:36:29] sql.INFO: [6.46] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 08:36:35] sql.INFO: [12.16] delete from `chat_channel` where (`fd` = '1') [] []
+[2024-07-23 08:36:40] sql.INFO: [30.69] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 08:36:40] sql.INFO: [4.78] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 08:38:02] sql.INFO: [56.79] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 08:38:02] sql.INFO: [6] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 08:38:31] sql.INFO: [40.32] delete from `chat_channel` where (`fd` = '1') [] []
+[2024-07-23 08:38:36] sql.INFO: [32.3] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 08:38:36] sql.INFO: [9.43] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 08:38:48] sql.INFO: [16.29] delete from `chat_channel` where (`fd` = '5') [] []
+[2024-07-23 08:38:52] sql.INFO: [19.43] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 08:38:52] sql.INFO: [5.37] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 08:40:20] sql.INFO: [93.31] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 08:40:20] sql.INFO: [24.16] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 08:43:20] sql.INFO: [156.39] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 08:43:20] sql.INFO: [13.01] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 09:53:00] sql.INFO: [174.06] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 09:53:00] sql.INFO: [21.88] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 09:53:13] sql.INFO: [105.47] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 09:53:13] sql.INFO: [75.5] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 09:56:20] sql.INFO: [208.78] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 09:56:20] sql.INFO: [121.27] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 09:57:30] sql.INFO: [52.81] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 09:57:30] sql.INFO: [9.06] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 09:58:42] sql.INFO: [71.31] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 09:58:42] sql.INFO: [51.37] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 10:01:08] sql.INFO: [56.38] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 10:01:08] sql.INFO: [7.36] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 10:03:09] sql.INFO: [64.3] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 10:03:09] sql.INFO: [35.27] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 10:04:56] sql.INFO: [48.2] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 10:04:56] sql.INFO: [3.23] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 10:05:42] sql.INFO: [2.59] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 10:05:42] sql.INFO: [6.75] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 10:08:06] sql.INFO: [144] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 10:08:06] sql.INFO: [16.86] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 10:47:25] sql.INFO: [125.59] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 10:47:25] sql.INFO: [19.45] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 10:55:49] sql.INFO: [138.49] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 10:55:49] sql.INFO: [2.79] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 10:57:20] sql.INFO: [52.13] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 10:57:20] sql.INFO: [122.82] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 10:57:30] sql.INFO: [39.89] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 10:57:30] sql.INFO: [24.64] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 10:58:47] sql.INFO: [279.58] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 10:58:47] sql.INFO: [72.2] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-23 11:00:05] sql.INFO: [61.82] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-23 11:00:05] sql.INFO: [3.78] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 05:47:44] sql.INFO: [1166.73] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 05:47:44] sql.INFO: [57.09] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 05:51:27] sql.INFO: [1938.43] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 05:51:27] sql.INFO: [10.23] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 05:52:15] sql.INFO: [19.34] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 05:52:15] sql.INFO: [2.46] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 05:54:24] sql.INFO: [356.43] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 05:54:24] sql.INFO: [164.88] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 05:55:21] sql.INFO: [1376.62] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 05:55:21] sql.INFO: [14.29] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 05:56:58] sql.INFO: [160.17] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 05:56:58] sql.INFO: [16.91] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 06:00:18] sql.INFO: [318.04] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 06:00:18] sql.INFO: [3.27] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 06:01:44] sql.INFO: [153.35] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 06:01:44] sql.INFO: [6.56] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 06:03:23] sql.INFO: [52.86] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 06:03:23] sql.INFO: [6.56] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 06:04:53] sql.INFO: [99.66] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 06:04:53] sql.INFO: [9.8] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 06:05:48] sql.INFO: [17.4] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 06:05:48] sql.INFO: [3.08] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 06:07:09] sql.INFO: [375.69] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 06:07:09] sql.INFO: [46.91] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 08:34:59] sql.INFO: [83.41] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 08:34:59] sql.INFO: [126.63] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 08:36:33] sql.INFO: [81.69] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 08:36:33] sql.INFO: [154.29] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 08:39:28] sql.INFO: [145.32] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 08:39:28] sql.INFO: [10.96] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 08:44:03] sql.INFO: [64.08] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 08:44:03] sql.INFO: [12.28] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 08:46:37] sql.INFO: [429.03] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 08:46:37] sql.INFO: [34.51] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 08:48:10] sql.INFO: [170.4] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 08:48:10] sql.INFO: [40.38] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 08:49:22] sql.INFO: [105.74] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 08:49:22] sql.INFO: [7.08] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 08:51:35] sql.INFO: [104.42] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 08:51:35] sql.INFO: [33.49] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 08:52:48] sql.INFO: [75.57] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 08:52:48] sql.INFO: [18.73] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 08:57:28] sql.INFO: [64.95] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 08:57:28] sql.INFO: [3.04] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 08:58:41] sql.INFO: [158.77] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 08:58:41] sql.INFO: [3.19] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 09:04:09] sql.INFO: [67.21] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 09:04:09] sql.INFO: [5.56] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 09:04:55] sql.INFO: [62.37] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 09:04:55] sql.INFO: [7.59] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 09:16:22] sql.INFO: [137.98] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 09:16:22] sql.INFO: [11.44] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 09:17:11] sql.INFO: [2.5] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 09:17:11] sql.INFO: [4.33] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 09:17:23] sql.INFO: [3.75] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 09:17:23] sql.INFO: [7.86] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 09:20:42] sql.INFO: [39.68] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 09:20:42] sql.INFO: [4.45] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 09:21:32] sql.INFO: [5.07] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 09:21:32] sql.INFO: [5.4] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-24 09:39:47] sql.INFO: [291.97] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-24 09:39:47] sql.INFO: [81.39] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-25 02:09:19] sql.INFO: [272.31] select `talk_session`.`talk_type`, `talk_group`.`group_name`, `talk_group`.`avatar` as `group_avatar`, `user`.`avatar` as `user_avatar`, `user`.`nickname`, `talk_session`.`last_content`, `user`.`user_name`, `talk_session`.`id` as `session_id`, `talk_session`.`talk_type` from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') order by `talk_session`.`updated_at` desc limit 10 offset 0 [] []
+[2024-07-25 02:09:19] sql.INFO: [36.67] select count(*) as aggregate from `talk_session_association` left join `talk_session` on `talk_session`.`id` = `talk_session_association`.`session_id` left join `user` on `user`.`id` = `talk_session_association`.`to_user_id` left join `talk_group` on `talk_group`.`id` = `talk_session_association`.`to_user_id` where (`talk_session_association`.`status` = '1' and `talk_session_association`.`user_id` = '32') [] []
+[2024-07-25 02:12:19] sql.INFO: [107.44] insert into `talk_records` (`id`, `msg_type`, `user_id`, `session_id`, `talk_type`, `content`) values ('674920300260892673', '1', '32', '672001943631089665', '1', '对对对') [] []
+[2024-07-25 02:31:42] sql.INFO: [9.61] insert into `talk_records` (`id`, `msg_type`, `user_id`, `session_id`, `talk_type`, `content`) values ('674925178379051008', '1', '32', '672001943631089665', '1', '对对对') [] []
+[2024-07-25 02:33:04] sql.INFO: [9.9] insert into `talk_records` (`id`, `msg_type`, `user_id`, `session_id`, `talk_type`, `content`) values ('674925523318611968', '1', '32', '672001943631089665', '1', '对对对') [] []
+[2024-07-25 02:33:53] sql.INFO: [15.56] insert into `talk_records` (`id`, `msg_type`, `user_id`, `session_id`, `talk_type`, `content`) values ('674925726524256257', '1', '32', '672001943631089665', '1', '111') [] []
+[2024-07-25 02:33:53] sql.INFO: [30.96] insert into `talk_records_file` (`id`, `record_id`, `user_id`, `source`, `type`, `drive`, `original_name`, `suffix`, `size`, `path`) values ('674925727958708224', '674925726524256257', '32', '', '0', '', '', '', '0', '') [] []

+ 27 - 0
test/Cases/ExampleTest.php

@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+
+namespace HyperfTest\Cases;
+
+use Hyperf\Testing\TestCase;
+
+/**
+ * @internal
+ * @coversNothing
+ */
+class ExampleTest extends TestCase
+{
+    public function testExample()
+    {
+        $this->get('/')->assertOk()->assertSee('Hyperf');
+    }
+}

+ 45 - 0
test/HttpTestCase.php

@@ -0,0 +1,45 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+
+namespace HyperfTest;
+
+use Hyperf\Testing\Client;
+use PHPUnit\Framework\TestCase;
+
+use function Hyperf\Support\make;
+
+/**
+ * Class HttpTestCase.
+ * @method get($uri, $data = [], $headers = [])
+ * @method post($uri, $data = [], $headers = [])
+ * @method json($uri, $data = [], $headers = [])
+ * @method file($uri, $data = [], $headers = [])
+ * @method request($method, $path, $options = [])
+ */
+abstract class HttpTestCase extends TestCase
+{
+    /**
+     * @var Client
+     */
+    protected $client;
+
+    public function __construct($name = null, array $data = [], $dataName = '')
+    {
+        parent::__construct($name, $data, $dataName);
+        $this->client = make(Client::class);
+    }
+
+    public function __call($name, $arguments)
+    {
+        return $this->client->{$name}(...$arguments);
+    }
+}

+ 30 - 0
test/bootstrap.php

@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+ini_set('display_errors', 'on');
+ini_set('display_startup_errors', 'on');
+
+error_reporting(E_ALL);
+date_default_timezone_set('Asia/Shanghai');
+
+Swoole\Runtime::enableCoroutine(true);
+
+! defined('BASE_PATH') && define('BASE_PATH', dirname(__DIR__, 1));
+
+require BASE_PATH . '/vendor/autoload.php';
+
+! defined('SWOOLE_HOOK_FLAGS') && define('SWOOLE_HOOK_FLAGS', Hyperf\Engine\DefaultOption::hookFlags());
+
+Hyperf\Di\ClassLoader::init();
+
+$container = require BASE_PATH . '/config/container.php';
+
+$container->get(Hyperf\Contract\ApplicationInterface::class);

+ 1 - 0
vendor/96qbhy/hyperf-auth/.gitattributes

@@ -0,0 +1 @@
+/tests export-ignore

+ 9 - 0
vendor/96qbhy/hyperf-auth/.gitignore

@@ -0,0 +1,9 @@
+/vendor/
+composer.lock
+*.cache
+*.log
+/hooks
+.idea
+runtime
+config
+.env*

+ 87 - 0
vendor/96qbhy/hyperf-auth/.php_cs

@@ -0,0 +1,87 @@
+<?php
+
+$header = <<<'EOF'
+This file is part of qbhy/hyperf-auth.
+
+@link     https://github.com/qbhy/hyperf-auth
+@document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+@contact  qbhy0715@qq.com
+@license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+EOF;
+
+return PhpCsFixer\Config::create()
+    ->setRiskyAllowed(true)
+    ->setRules([
+        '@PSR2' => true,
+        '@Symfony' => true,
+        '@DoctrineAnnotation' => true,
+        '@PhpCsFixer' => true,
+        'header_comment' => [
+            'commentType' => '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',
+        ],
+        'class_attributes_separation' => true,
+        'combine_consecutive_unsets' => true,
+        'declare_strict_types' => true,
+        'linebreak_after_opening_tag' => true,
+        'lowercase_constants' => 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,
+    ])
+    ->setFinder(
+        PhpCsFixer\Finder::create()
+            ->exclude('vendor')
+            ->in(__DIR__)
+    )
+    ->setUsingCache(false);

+ 6 - 0
vendor/96qbhy/hyperf-auth/.phpstorm.meta.php

@@ -0,0 +1,6 @@
+<?php
+
+namespace PHPSTORM_META {
+    // Reflect
+    override(\Psr\Container\ContainerInterface::get(0), map('@'));
+}

+ 40 - 0
vendor/96qbhy/hyperf-auth/.travis.yml

@@ -0,0 +1,40 @@
+language: php
+
+sudo: required
+
+matrix:
+  include:
+    - php: 7.2
+      env: SW_VERSION="4.4.7"
+    - php: 7.3
+      env: SW_VERSION="4.4.7"
+    - php: master
+      env: SW_VERSION="4.4.7"
+
+  allow_failures:
+    - php: master
+
+services:
+  - mysql
+  - redis-server
+  - docker
+
+before_install:
+  - export PHP_MAJOR="$(`phpenv which php` -r 'echo phpversion();' | cut -d '.' -f 1)"
+  - export PHP_MINOR="$(`phpenv which php` -r 'echo phpversion();' | cut -d '.' -f 2)"
+  - echo $PHP_MAJOR
+  - echo $PHP_MINOR
+
+install:
+  - cd $TRAVIS_BUILD_DIR
+  - bash ./tests/swoole.install.sh
+  - phpenv config-rm xdebug.ini || echo "xdebug not available"
+  - phpenv config-add ./tests/ci.ini
+
+before_script:
+  - cd $TRAVIS_BUILD_DIR
+  - composer config -g process-timeout 900 && composer update
+
+script:
+  - composer analyse
+  - composer test

+ 21 - 0
vendor/96qbhy/hyperf-auth/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 桥边红药
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 292 - 0
vendor/96qbhy/hyperf-auth/README.md

@@ -0,0 +1,292 @@
+# qbhy/hyperf-auth
+
+hyperf 的 auth 组件,目前支持 jwt、session、sso 驱动。用户可以自行扩展。  
+本组件参考了 laravel 的 auth 组件设计,使用体验大体和 laravel 的 auth 差不多。
+
+[![Latest Stable Version](https://poser.pugx.org/96qbhy/hyperf-auth/v/stable)](https://packagist.org/packages/96qbhy/hyperf-auth)
+[![Total Downloads](https://poser.pugx.org/96qbhy/hyperf-auth/downloads)](https://packagist.org/packages/96qbhy/hyperf-auth)
+[![Latest Unstable Version](https://poser.pugx.org/96qbhy/hyperf-auth/v/unstable)](https://packagist.org/packages/96qbhy/hyperf-auth)
+[![License](https://poser.pugx.org/96qbhy/hyperf-auth/license)](https://packagist.org/packages/96qbhy/hyperf-auth)
+[![Monthly Downloads](https://poser.pugx.org/96qbhy/hyperf-auth/d/monthly)](https://packagist.org/packages/96qbhy/hyperf-auth)
+[![Daily Downloads](https://poser.pugx.org/96qbhy/hyperf-auth/d/daily)](https://packagist.org/packages/96qbhy/hyperf-auth)
+
+## 支持的验证方式
+
+* session
+* jwt
+* sso (单点登录,继承自jwt,需要 hyperf/redis,支持多客户端)
+
+> 任何问题请加QQ群提问:873213948
+
+## 安装 - install
+
+```bash
+$ composer require 96qbhy/hyperf-auth
+```
+
+> hyperf 1.1 请使用 ^v1.0 版本
+
+## 配置 - configuration
+
+使用 `Qbhy\HyperfAuth\AuthExceptionHandler` ,此步骤可选,开发者可以自行捕捉 `AuthException`  和 `JWTException` 进行处理
+
+```php
+<?php
+// config/autoload/exceptions.php
+return [
+    'handler' => [
+        'http' => [
+            \Qbhy\HyperfAuth\AuthExceptionHandler::class,
+        ],    
+    ],
+];
+```
+
+发布配置 vendor:publish
+```bash
+php bin/hyperf.php vendor:publish 96qbhy/hyperf-auth
+```
+
+生成 `.env` 配置项 
+```bash
+php bin/hyperf.php gen:auth-env
+```
+
+修改 `config/autoload/auth.php`
+> 如不需要自定义 guard、model 和 user provider,则可以不修改
+
+```php
+<?php
+
+use Doctrine\Common\Cache\FilesystemCache;
+use Qbhy\SimpleJwt\Encoders\Base64UrlSafeEncoder;
+use Qbhy\SimpleJwt\EncryptAdapters\PasswordHashEncrypter;
+
+return [
+    'default' => [
+        'guard'=> 'jwt',
+        'provider'=> 'users',
+    ] ,
+    'guards' => [ // 开发者可以在这里添加自己的 guard ,guard Qbhy\HyperfAuth\AuthGuard 接口
+        'sso'=> [
+            // 支持的设备,env配置时用英文逗号隔开
+            'clients' => explode(',', env('AUTH_SSO_CLIENTS', 'pc')),
+
+            // hyperf/redis 实例
+            'redis' => function () {
+                return make(\Hyperf\Redis\Redis::class);
+            },
+
+            // 自定义 redis key,必须包含 {uid},{uid} 会被替换成用户ID
+            'redis_key' => 'u:token:{uid}',
+
+            'driver' => Qbhy\HyperfAuth\Guard\SsoGuard::class,
+            // ...$jwtConfig, // 其他配置和 jwt guard的配置一样
+        ],
+        'jwt' => [
+            'driver' => Qbhy\HyperfAuth\Guard\JwtGuard::class,
+            'provider' => 'users',
+
+            // 以下是 simple-jwt 所需的参数,具体配置文档可以看 config/autoload/auth.php
+            'secret' =>env('JWT_SECRET', 'qbhy/hyperf-auth'),
+            'ttl' => 60 * 60, // 单位秒
+            'default' => PasswordHashEncrypter::class,
+            'encoder' => new Base64UrlSafeEncoder(),
+//            'cache' => new FilesystemCache(sys_get_temp_dir()), // 如果需要分布式部署,请选择 redis 或者其他支持分布式的缓存驱动
+            'cache' => function() {
+                return make(Qbhy\HyperfAuth\HyperfRedisCache::class);
+            }, 
+        ],
+        'session' => [
+            'driver' => Qbhy\HyperfAuth\Guard\SessionGuard::class,
+            'provider' => 'users',
+        ],
+    ],
+    'providers' => [
+        'users' => [
+            'driver' => \Qbhy\HyperfAuth\Provider\EloquentProvider::class, // user provider 需要实现 Qbhy\HyperfAuth\UserProvider 接口
+            'model' => App\Model\User::class, //  需要实现 Qbhy\HyperfAuth\Authenticatable 接口
+        ],
+    ],
+];
+```
+
+## 使用 - usage
+
+> 以下是伪代码,仅供参考。Auth 注解可以用于类或者方法。
+
+```php
+<?php
+declare(strict_types=1);
+
+namespace App\Controller;
+
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Annotation\Controller;
+use Hyperf\HttpServer\Annotation\GetMapping;
+use Qbhy\HyperfAuth\Annotation\Auth;
+use Qbhy\HyperfAuth\AuthManager;
+
+/**
+* @Controller
+* Class IndexController
+*/
+class IndexController extends AbstractController
+{
+  /**
+   * @Inject
+   * @var AuthManager
+   */
+  protected $auth;
+
+  /**
+   * @GetMapping(path="/login")
+   * @return array
+   */
+  public function login()
+  {
+      /** @var User $user */
+      $user = User::query()->firstOrCreate(['name' => 'test', 'avatar' => 'avatar']);
+      return [
+          'status' => $this->auth->guard('session')->login($user),
+      ];
+  }
+  
+  /**
+   * @GetMapping(path="/sso/login")
+   * @return array
+   */
+  public function ssoLogin()
+  {
+      /** @var User $user */
+      $user = User::query()->firstOrCreate(['name' => 'test', 'avatar' => 'avatar']);
+      return [
+          'token' => $this->auth->guard('sso')->login($user, [],  'pc'), // sso 方法支持第二个参数,传定义好的客户端
+      ];
+  }
+
+  /**
+   * @Auth("session")
+   * @GetMapping(path="/logout")
+   */
+  public function logout()
+  {
+      $this->auth->guard('session')->logout();
+      return 'logout ok';
+  }
+
+  /**
+   * 使用 Auth 注解可以保证该方法必须通过某个 guard 的授权,支持同时传多个 guard,不传参数使用默认 guard
+   * @Auth("session")
+   * @GetMapping(path="/user")
+   * @return string
+   */
+  public function user()
+  {
+      $user = $this->auth->guard('session')->user();
+      return 'hello '.$user->name;
+  }
+}
+```
+
+除了上面的 Auth 注解用法,还支持中间件用法
+
+```php
+<?php
+
+declare(strict_types=1);
+
+namespace App\Controller;
+
+use Hyperf\HttpServer\Annotation\Middleware;
+use Qbhy\HyperfAuth\AuthMiddleware; 
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Annotation\GetMapping;
+use Qbhy\HyperfAuth\AuthManager;
+
+/**
+* @Middleware(AuthMiddleware::class)
+* Class IndexController
+*/
+class IndexController extends AbstractController
+{
+  /**
+   * @Inject
+   * @var AuthManager
+   */
+  protected $auth;
+  
+  /**
+   * @GetMapping(path="/user")
+   * @return string
+   */
+  public function user()
+  {
+      $user = $this->auth->guard()->user();
+      return 'hello '.$user->name;
+  }
+}
+```
+
+由于 hyperf 还不支持中间件传参,所以 `Qbhy\HyperfAuth\AuthMiddleware` 中间件只支持默认guard校验  
+但是开发者可以继承该中间自行扩展。或者直接使用 Auth 注解进行自定义 guard 校验,与中间件的效果是一致的。
+
+```php
+<?php
+
+declare(strict_types=1);
+
+use Qbhy\HyperfAuth\AuthMiddleware; 
+
+class SessionAuthMiddleware extends AuthMiddleware { 
+    protected $guards = ['session']; // 支持多个 guard
+
+ }
+```
+
+## 更多用法 - API
+
+```php
+<?php
+
+$auth = auth(); // 控制器内也可以通过 @Inject 注入
+
+$user = new \HyperfTest\DemoUser(1);
+
+// 直接调用 AuthGuard 方法,这种情况下会获取 默认 guard 然后调用 guard 的对应方法
+$auth->login($user); // 默认使用 jwt 驱动,该方法将返回 token 字符串
+$auth->logout(); // 退出登录
+$auth->check(); // 检查是否登录
+$auth->id(); // 获取当前登录用户的id,无需查数据库
+$auth->guest(); // 是否游客/是否未登录
+$auth->user(); // 若登录返回当前登录用户,否则返回null
+
+/** @var \Qbhy\HyperfAuth\Guard\JwtGuard $jwtGuard */
+$jwtGuard = $auth->guard('jwt');
+$jwtGuard->user('your token or null'); // jwt 驱动支持手动传入 token,如不传或者传null则从 request 中解析
+$jwtGuard->check('your token or null');
+$jwtGuard->id('your token or null'); // 无需查数据库
+$jwtGuard->guest('your token or null');
+$jwtGuard->refresh('your token or null'); // 该方法返回新的 token 或者 null
+$jwtGuard->login($user, ['sub' => 'qbhy0715','iss' => 'hyperf-auth',]); // 自定义payload
+$jwtGuard->getPayload('your token or null'); // 获取自定义 payload
+
+$auth->guard()->login($user); // guard 方法不传参数或者传null都将使用默认值
+
+// 使用 session 驱动需要安装 hyperf/session 并启用 session
+$auth->guard('session')->login($user); // guard 方法不传参数或者传null都会获取默认值
+```
+
+> 注意事项:使用 jwt 驱动且令牌异常的情况下调用 user 方法,会抛出相应的异常,需要自行捕捉处理,不想抛异常,可以调用 check 进行判断。
+
+## 扩展 - extension
+
+由于本组件参考了 laravel auth 的设计,所以 guard 和 user provider 的扩展也和 laravel 类似。只需要实现对应接口即可。
+
+* guard ===> Qbhy\HyperfAuth\AuthGuard
+* user provider ===> Qbhy\HyperfAuth\UserProvider
+
+> 扩展教程请移步 [hyperf教程之hyperf-auth高级用法](https://mp.weixin.qq.com/s/jlbbN6zhWEVteimpi0mLjg)
+
+https://github.com/qbhy/hyperf-auth  
+qbhy0715@qq.com  

+ 84 - 0
vendor/96qbhy/hyperf-auth/composer.json

@@ -0,0 +1,84 @@
+{
+    "name": "96qbhy/hyperf-auth",
+    "description": "hyperf 的 auth 组件",
+    "type": "library",
+    "license": "MIT",
+    "keywords": [
+        "php",
+        "hyperf",
+        "hyperf-auth",
+        "jwt-auth"
+    ],
+    "autoload": {
+        "psr-4": {
+            "Qbhy\\HyperfAuth\\": "src/"
+        },
+        "files": [
+            "src/helper.php"
+        ]
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "HyperfTest\\": "tests"
+        }
+    },
+    "require": {
+        "php": ">=8.1",
+        "96qbhy/simple-jwt": "^v1.5",
+        "hyperf/cache": "^3.1",
+        "hyperf/di": "^3.1",
+        "ext-json": "*",
+        "ext-redis": "*"
+    },
+    "suggest": {
+        "ext-redis": "*"
+    },
+    "require-dev": {
+        "brainmaestro/composer-git-hooks": "^2.8",
+        "friendsofphp/php-cs-fixer": "^2.14",
+        "hyperf/command": "^3.1",
+        "hyperf/config": "^3.1",
+        "hyperf/database": "^3.1",
+        "hyperf/event": "^3.1",
+        "hyperf/framework": "^3.1",
+        "hyperf/redis": "^3.1",
+        "hyperf/session": "^3.1",
+        "hyperf/testing": "^3.1",
+        "hyperf/utils": "^3.1",
+        "itsgoingd/clockwork": "^5.0",
+        "phpstan/phpstan": "^0.12",
+        "swoft/swoole-ide-helper": "dev-master",
+        "symfony/console": "^5.3",
+        "symfony/var-dumper": "^5.3"
+    },
+    "minimum-stability": "dev",
+    "config": {
+        "sort-packages": true
+    },
+    "scripts": {
+        "test": "phpunit -c phpunit.xml --colors=always",
+        "analyse": "phpstan analyse --memory-limit 300M -l 0 ./src",
+        "cs-fix": "php-cs-fixer fix $1",
+        "post-install-cmd": "cghooks add --ignore-lock",
+        "post-update-cmd": "cghooks update"
+    },
+    "extra": {
+        "hyperf": {
+            "config": "Qbhy\\HyperfAuth\\ConfigProvider"
+        },
+        "hooks": {
+            "pre-commit": [
+                "echo committing as $(git config user.name)",
+                "vendor/bin/php-cs-fixer fix .",
+                "git add .",
+                "composer test"
+            ]
+        }
+    },
+    "repositories": {
+        "packagist": {
+            "type": "composer",
+            "url": "https://mirrors.aliyun.com/composer/"
+        }
+    }
+}

+ 15 - 0
vendor/96qbhy/hyperf-auth/phpunit.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit bootstrap="tests/bootstrap.php"
+         backupGlobals="false"
+         backupStaticAttributes="false"
+         verbose="true"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         stopOnFailure="false">
+    <testsuite name="Testsuite">
+        <directory>./tests/</directory>
+    </testsuite>
+</phpunit>

+ 183 - 0
vendor/96qbhy/hyperf-auth/publish/auth.php

@@ -0,0 +1,183 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+use Qbhy\SimpleJwt\Encoders;
+use Qbhy\SimpleJwt\EncryptAdapters as Encrypter;
+use function Hyperf\Support\env;
+use function Hyperf\Support\make;
+
+return [
+    'default' => [
+        'guard' => 'jwt',
+        'provider' => 'users',
+    ],
+    'guards' => [
+        'sso' => [
+            // 支持的设备,env配置时用英文逗号隔开
+            'clients' => explode(',', env('AUTH_SSO_CLIENTS', 'pc')),
+
+            // hyperf/redis 实例
+            'redis' => function () {
+                return make(\Hyperf\Redis\Redis::class);
+            },
+
+            // 自定义 redis key,必须包含 {uid},{uid} 会被替换成用户ID
+            'redis_key' => 'u:token:{uid}',
+
+            'driver' => Qbhy\HyperfAuth\Guard\SsoGuard::class,
+            'provider' => 'users',
+
+            /*
+             * 以下是 simple-jwt 配置
+             * 必填
+             * jwt 服务端身份标识
+             */
+            'secret' => env('SSO_JWT_SECRET'),
+
+            /*
+             * 可选配置
+             * jwt 默认头部token使用的字段
+             */
+            'header_name' => env('JWT_HEADER_NAME', 'Authorization'),
+
+            /*
+             * 可选配置
+             * jwt 生命周期,单位秒,默认一天
+             */
+            'ttl' => (int) env('SIMPLE_JWT_TTL', 60 * 60 * 24),
+
+            /*
+             * 可选配置
+             * 允许过期多久以内的 token 进行刷新,单位秒,默认一周
+             */
+            'refresh_ttl' => (int) env('SIMPLE_JWT_REFRESH_TTL', 60 * 60 * 24 * 7),
+
+            /*
+             * 可选配置
+             * 默认使用的加密类
+             */
+            'default' => Encrypter\SHA1Encrypter::class,
+
+            /*
+             * 可选配置
+             * 加密类必须实现 Qbhy\SimpleJwt\Interfaces\Encrypter 接口
+             */
+            'drivers' => [
+                Encrypter\PasswordHashEncrypter::alg() => Encrypter\PasswordHashEncrypter::class,
+                Encrypter\CryptEncrypter::alg() => Encrypter\CryptEncrypter::class,
+                Encrypter\SHA1Encrypter::alg() => Encrypter\SHA1Encrypter::class,
+                Encrypter\Md5Encrypter::alg() => Encrypter\Md5Encrypter::class,
+            ],
+
+            /*
+             * 可选配置
+             * 编码类
+             */
+            'encoder' => new Encoders\Base64UrlSafeEncoder(),
+            //            'encoder' => new Encoders\Base64Encoder(),
+
+            /*
+             * 可选配置
+             * 缓存类
+             */
+            'cache' => new \Doctrine\Common\Cache\FilesystemCache(sys_get_temp_dir()),
+            // 如果需要分布式部署,请选择 redis 或者其他支持分布式的缓存驱动
+            //            'cache' => function () {
+            //                return make(\Qbhy\HyperfAuth\HyperfRedisCache::class);
+            //            },
+
+            /*
+             * 可选配置
+             * 缓存前缀
+             */
+            'prefix' => env('SIMPLE_JWT_PREFIX', 'default'),
+        ],
+        'jwt' => [
+            'driver' => Qbhy\HyperfAuth\Guard\JwtGuard::class,
+            'provider' => 'users',
+
+            /*
+             * 以下是 simple-jwt 配置
+             * 必填
+             * jwt 服务端身份标识
+             */
+            'secret' => env('SIMPLE_JWT_SECRET'),
+
+            /*
+             * 可选配置
+             * jwt 默认头部token使用的字段
+             */
+            'header_name' => env('JWT_HEADER_NAME', 'Authorization'),
+
+            /*
+             * 可选配置
+             * jwt 生命周期,单位秒,默认一天
+             */
+            'ttl' => (int) env('SIMPLE_JWT_TTL', 60 * 60 * 24),
+
+            /*
+             * 可选配置
+             * 允许过期多久以内的 token 进行刷新,单位秒,默认一周
+             */
+            'refresh_ttl' => (int) env('SIMPLE_JWT_REFRESH_TTL', 60 * 60 * 24 * 7),
+
+            /*
+             * 可选配置
+             * 默认使用的加密类
+             */
+            'default' => Encrypter\SHA1Encrypter::class,
+
+            /*
+             * 可选配置
+             * 加密类必须实现 Qbhy\SimpleJwt\Interfaces\Encrypter 接口
+             */
+            'drivers' => [
+                Encrypter\PasswordHashEncrypter::alg() => Encrypter\PasswordHashEncrypter::class,
+                Encrypter\CryptEncrypter::alg() => Encrypter\CryptEncrypter::class,
+                Encrypter\SHA1Encrypter::alg() => Encrypter\SHA1Encrypter::class,
+                Encrypter\Md5Encrypter::alg() => Encrypter\Md5Encrypter::class,
+            ],
+
+            /*
+             * 可选配置
+             * 编码类
+             */
+            'encoder' => new Encoders\Base64UrlSafeEncoder(),
+            //            'encoder' => new Encoders\Base64Encoder(),
+
+            /*
+             * 可选配置
+             * 缓存类
+             */
+            'cache' => new \Doctrine\Common\Cache\FilesystemCache(sys_get_temp_dir()),
+            // 如果需要分布式部署,请选择 redis 或者其他支持分布式的缓存驱动
+            //            'cache' => function () {
+            //                return make(\Qbhy\HyperfAuth\HyperfRedisCache::class);
+            //            },
+
+            /*
+             * 可选配置
+             * 缓存前缀
+             */
+            'prefix' => env('SIMPLE_JWT_PREFIX', 'default'),
+        ],
+        'session' => [
+            'driver' => Qbhy\HyperfAuth\Guard\SessionGuard::class,
+            'provider' => 'users',
+        ],
+    ],
+    'providers' => [
+        'users' => [
+            'driver' => \Qbhy\HyperfAuth\Provider\EloquentProvider::class,
+            'model' => App\Model\User::class, // 需要实现 Qbhy\HyperfAuth\Authenticatable 接口
+        ],
+    ],
+];

+ 23 - 0
vendor/96qbhy/hyperf-auth/src/Annotation/Auth.php

@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth\Annotation;
+
+use Attribute;
+use Hyperf\Di\Annotation\AbstractAnnotation;
+
+#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_CLASS)]
+class Auth extends AbstractAnnotation
+{
+    public function __construct(public ?string $value = null)
+    {
+    }
+}

+ 31 - 0
vendor/96qbhy/hyperf-auth/src/AuthAbility.php

@@ -0,0 +1,31 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth;
+
+use Hyperf\Database\Model\Model;
+
+/**
+ * Trait AuthAbility.
+ * @mixin Authenticatable|Model
+ */
+trait AuthAbility
+{
+    public function getId()
+    {
+        return $this->getKey();
+    }
+
+    public static function retrieveById($key): ?Authenticatable
+    {
+        return self::query()->find($key);
+    }
+}

+ 50 - 0
vendor/96qbhy/hyperf-auth/src/AuthAspect.php

@@ -0,0 +1,50 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth;
+
+use Hyperf\Di\Annotation\Aspect;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\Di\Aop\AbstractAspect;
+use Hyperf\Di\Aop\ProceedingJoinPoint;
+use Qbhy\HyperfAuth\Annotation\Auth;
+use Qbhy\HyperfAuth\Exception\UnauthorizedException;
+
+#[Aspect]
+class AuthAspect extends AbstractAspect
+{
+    public array $annotations = [
+        Auth::class,
+    ];
+
+    #[Inject(AuthManager::class)]
+    protected AuthManager $auth;
+
+    public function process(ProceedingJoinPoint $proceedingJoinPoint)
+    {
+        $annotation = $proceedingJoinPoint->getAnnotationMetadata();
+
+        /** @var Auth $authAnnotation */
+        $authAnnotation = $annotation->class[Auth::class] ?? $annotation->method[Auth::class];
+
+        $guards = is_array($authAnnotation->value) ? $authAnnotation->value : [$authAnnotation->value];
+
+        foreach ($guards as $name) {
+            $guard = $this->auth->guard($name);
+
+            if (! $guard->user() instanceof Authenticatable) {
+                throw new UnauthorizedException("Without authorization from {$guard->getName()} guard", $guard);
+            }
+        }
+
+        return $proceedingJoinPoint->process();
+    }
+}

+ 42 - 0
vendor/96qbhy/hyperf-auth/src/AuthCommand.php

@@ -0,0 +1,42 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth;
+
+use Hyperf\Command\Annotation\Command;
+use Hyperf\Command\Command as HyperfCommand;
+use function Hyperf\Support\env;
+
+#[Command]
+class AuthCommand extends HyperfCommand
+{
+    /**
+     * 执行的命令行.
+     */
+    protected ?string $name = 'gen:auth-env';
+
+    public function handle()
+    {
+        $this->gen('AUTH_SSO_CLIENTS', 'h5,weapp');
+        $this->gen('SSO_JWT_SECRET');
+        $this->gen('SIMPLE_JWT_SECRET');
+    }
+
+    public function gen($key, string $value = null)
+    {
+        if (empty(env($key))) {
+            file_put_contents(BASE_PATH . '/.env', sprintf(PHP_EOL . '%s=%s', $key, $value ?? str_random(16)), FILE_APPEND);
+            $this->info($key . ' 已生成!');
+        } else {
+            $this->info($key . ' 已存在!');
+        }
+    }
+}

+ 32 - 0
vendor/96qbhy/hyperf-auth/src/AuthExceptionHandler.php

@@ -0,0 +1,32 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth;
+
+use Hyperf\ExceptionHandler\ExceptionHandler;
+use Hyperf\HttpMessage\Stream\SwooleStream;
+use Psr\Http\Message\ResponseInterface;
+use Qbhy\HyperfAuth\Exception\UnauthorizedException;
+use Throwable;
+
+class AuthExceptionHandler extends ExceptionHandler
+{
+    public function handle(Throwable $throwable, ResponseInterface $response)
+    {
+        $this->stopPropagation();
+        return $response->withStatus($throwable->getStatusCode())->withBody(new SwooleStream('Unauthorized.'));
+    }
+
+    public function isValid(Throwable $throwable): bool
+    {
+        return $throwable instanceof UnauthorizedException;
+    }
+}

+ 31 - 0
vendor/96qbhy/hyperf-auth/src/AuthGuard.php

@@ -0,0 +1,31 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth;
+
+interface AuthGuard
+{
+    public function id();
+
+    public function login(Authenticatable $user);
+
+    public function user(): ?Authenticatable;
+
+    public function check(): bool;
+
+    public function guest(): bool;
+
+    public function logout();
+
+    public function getProvider(): UserProvider;
+
+    public function getName(): string;
+}

+ 114 - 0
vendor/96qbhy/hyperf-auth/src/AuthManager.php

@@ -0,0 +1,114 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth;
+
+use Hyperf\Contract\ConfigInterface;
+use Qbhy\HyperfAuth\Exception\GuardException;
+use Qbhy\HyperfAuth\Exception\UserProviderException;
+use function Hyperf\Support\make;
+
+/**
+ * Class AuthManager.
+ * @method login(Authenticatable $user)
+ * @method null|Authenticatable user($token = null)
+ * @method bool check($token = null)
+ * @method logout()
+ * @method string getName()
+ * @method bool guest()
+ * @method getProvider()
+ * @method id($token = null)
+ * @mixin AuthGuard
+ */
+class AuthManager
+{
+    protected string $defaultDriver = 'default';
+
+    protected array $guards = [];
+
+    protected array $providers = [];
+
+    protected array $config;
+
+    public function __construct(ConfigInterface $config)
+    {
+        $this->config = $config->get('auth');
+    }
+
+    public function __call($name, $arguments)
+    {
+        $guard = $this->guard();
+
+        if (method_exists($guard, $name)) {
+            return call_user_func_array([$guard, $name], $arguments);
+        }
+
+        throw new GuardException('Method not defined. method:' . $name);
+    }
+
+    /**
+     * @throws GuardException
+     * @throws UserProviderException
+     */
+    public function guard(?string $name = null): AuthGuard
+    {
+        $name = $name ?? $this->defaultGuard();
+
+        if (empty($this->config['guards'][$name])) {
+            throw new GuardException("Does not support this driver: {$name}");
+        }
+
+        $config = $this->config['guards'][$name];
+        $userProvider = $this->provider($config['provider'] ?? $this->defaultDriver);
+
+        return $this->guards[$name] ?? $this->guards[$name] = make(
+            $config['driver'],
+            compact('name', 'config', 'userProvider')
+        );
+    }
+
+    /**
+     * @throws UserProviderException
+     */
+    public function provider(?string $name = null): UserProvider
+    {
+        $name = $name ?? $this->defaultProvider();
+
+        if (empty($this->config['providers'][$name])) {
+            throw new UserProviderException("Does not support this provider: {$name}");
+        }
+
+        $config = $this->config['providers'][$name];
+
+        return $this->providers[$name] ?? $this->providers[$name] = make(
+            $config['driver'],
+            [
+                'config' => $config,
+                'name' => $name,
+            ]
+        );
+    }
+
+    public function defaultGuard(): string
+    {
+        return $this->config['default']['guard'] ?? $this->defaultDriver;
+    }
+
+    public function defaultProvider(): string
+    {
+        return $this->config['default']['provider'] ?? $this->defaultDriver;
+    }
+
+    public function getGuards(): array
+    {
+        return $this->guards;
+    }
+}

+ 43 - 0
vendor/96qbhy/hyperf-auth/src/AuthMiddleware.php

@@ -0,0 +1,43 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth;
+
+use Hyperf\Di\Annotation\Inject;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\MiddlewareInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+use Qbhy\HyperfAuth\Exception\UnauthorizedException;
+
+/**
+ * Class AuthMiddleware.
+ */
+class AuthMiddleware implements MiddlewareInterface
+{
+    protected array $guards = [null];
+
+    #[Inject(AuthManager::class)]
+    protected AuthManager $auth;
+
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
+    {
+        foreach ($this->guards as $name) {
+            $guard = $this->auth->guard($name);
+
+            if (! $guard->user() instanceof Authenticatable) {
+                throw new UnauthorizedException("Without authorization from {$guard->getName()} guard", $guard);
+            }
+        }
+
+        return $handler->handle($request);
+    }
+}

+ 19 - 0
vendor/96qbhy/hyperf-auth/src/Authenticatable.php

@@ -0,0 +1,19 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth;
+
+interface Authenticatable
+{
+    public function getId();
+
+    public static function retrieveById($key): ?Authenticatable;
+}

+ 44 - 0
vendor/96qbhy/hyperf-auth/src/ConfigProvider.php

@@ -0,0 +1,44 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth;
+
+class ConfigProvider
+{
+    public function __invoke(): array
+    {
+        return [
+            'dependencies' => [
+            ],
+            'commands' => [
+            ],
+            'annotations' => [
+                'scan' => [
+                    'paths' => [
+                        __DIR__,
+                    ],
+                    'ignore_annotations' => [
+                        'mixin',
+                    ],
+                ],
+            ],
+            'publish' => [
+                [
+                    'id' => 'auth',
+                    'description' => 'auth 组件配置.', // 描述
+                    // 建议默认配置放在 publish 文件夹中,文件命名和组件名称相同
+                    'source' => __DIR__ . '/../publish/auth.php',  // 对应的配置文件路径
+                    'destination' => BASE_PATH . '/config/autoload/auth.php', // 复制为这个路径下的该文件
+                ],
+            ],
+        ];
+    }
+}

+ 40 - 0
vendor/96qbhy/hyperf-auth/src/Events/ForcedOfflineEvent.php

@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth\Events;
+
+use Qbhy\HyperfAuth\Authenticatable;
+
+/**
+ * 被迫下线事件
+ * Class ForcedOfflineEvent.
+ */
+class ForcedOfflineEvent
+{
+    /**
+     * 用户实例.
+     */
+    public Authenticatable $user;
+
+    /**
+     * 客户端标识.
+     */
+    public string $client;
+
+    /**
+     * ForcedOfflineEvent constructor.
+     */
+    public function __construct(Authenticatable $user, string $client)
+    {
+        $this->user = $user;
+        $this->client = $client;
+    }
+}

+ 16 - 0
vendor/96qbhy/hyperf-auth/src/Exception/AuthException.php

@@ -0,0 +1,16 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth\Exception;
+
+abstract class AuthException extends \RuntimeException
+{
+}

+ 16 - 0
vendor/96qbhy/hyperf-auth/src/Exception/GuardException.php

@@ -0,0 +1,16 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth\Exception;
+
+class GuardException extends AuthException
+{
+}

+ 39 - 0
vendor/96qbhy/hyperf-auth/src/Exception/UnauthorizedException.php

@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth\Exception;
+
+use Qbhy\HyperfAuth\AuthGuard;
+use Throwable;
+
+class UnauthorizedException extends AuthException
+{
+    protected ?AuthGuard $guard;
+
+    protected int $statusCode = 401;
+
+    public function __construct(string $message, AuthGuard $guard = null, Throwable $previous = null)
+    {
+        parent::__construct($message, 401, $previous);
+        $this->guard = $guard;
+    }
+
+    public function getStatusCode(): int
+    {
+        return $this->statusCode;
+    }
+
+    public function setStatusCode(int $statusCode): static
+    {
+        $this->statusCode = $statusCode;
+        return $this;
+    }
+}

+ 16 - 0
vendor/96qbhy/hyperf-auth/src/Exception/UserProviderException.php

@@ -0,0 +1,16 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth\Exception;
+
+class UserProviderException extends AuthException
+{
+}

+ 60 - 0
vendor/96qbhy/hyperf-auth/src/Guard/AbstractAuthGuard.php

@@ -0,0 +1,60 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth\Guard;
+
+use Qbhy\HyperfAuth\Authenticatable;
+use Qbhy\HyperfAuth\AuthGuard;
+use Qbhy\HyperfAuth\UserProvider;
+
+abstract class AbstractAuthGuard implements AuthGuard
+{
+    protected array $config;
+
+    protected string $name;
+
+    protected UserProvider $userProvider;
+
+    /**
+     * AbstractAuthGuard constructor.
+     */
+    public function __construct(array $config, string $name, UserProvider $userProvider)
+    {
+        $this->config = $config;
+        $this->name = $name;
+        $this->userProvider = $userProvider;
+    }
+
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    public function check(): bool
+    {
+        return $this->user() instanceof Authenticatable;
+    }
+
+    public function guest(): bool
+    {
+        return ! $this->check();
+    }
+
+    public function getProvider(): UserProvider
+    {
+        return $this->userProvider;
+    }
+
+    public function id()
+    {
+        return $this->user()->getId();
+    }
+}

+ 207 - 0
vendor/96qbhy/hyperf-auth/src/Guard/JwtGuard.php

@@ -0,0 +1,207 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * This file is part of qbhy/hyperf-auth.
+ *
+ * @link     https://github.com/qbhy/hyperf-auth
+ * @document https://github.com/qbhy/hyperf-auth/blob/master/README.md
+ * @contact  qbhy0715@qq.com
+ * @license  https://github.com/qbhy/hyperf-auth/blob/master/LICENSE
+ */
+namespace Qbhy\HyperfAuth\Guard;
+
+use Hyperf\Context\Context;
+use Hyperf\HttpServer\Contract\RequestInterface;
+use Hyperf\Stringable\Str;
+use Qbhy\HyperfAuth\Authenticatable;
+use Qbhy\HyperfAuth\Exception\AuthException;
+use Qbhy\HyperfAuth\Exception\UnauthorizedException;
+use Qbhy\HyperfAuth\UserProvider;
+use Qbhy\SimpleJwt\Exceptions\TokenExpiredException;
+use Qbhy\SimpleJwt\JWTManager;
+use function Hyperf\Support\make;
+
+class JwtGuard extends AbstractAuthGuard
+{
+    protected JWTManager $jwtManager;
+
+    protected RequestInterface $request;
+
+    protected mixed $headerName = 'Authorization';
+
+    /**
+     * JwtGuardAbstract constructor.
+     */
+    public function __construct(
+        array $config,
+        string $name,
+        UserProvider $userProvider,
+        RequestInterface $request
+    ) {
+        parent::__construct($config, $name, $userProvider);
+        $this->headerName = $config['header_name'] ?? 'Authorization';
+        $this->jwtManager = new JWTManager($config);
+        $this->request = $request;
+    }
+
+    public function parseToken()
+    {
+        $header = $this->request->header($this->headerName, '');
+        if (Str::startsWith($header, 'Bearer ')) {
+            return Str::substr($header, 7);
+        }
+
+        if ($this->request->has('token')) {
+            return $this->request->input('token');
+        }
+
+        return null;
+    }
+
+    public function login(Authenticatable $user, array $payload = [])
+    {
+        $token = $this->getJwtManager()->make(array_merge($payload, [
+            'uid' => $user->getId(),
+            's' => str_random(),
+        ]))->token();
+
+        Context::set($this->resultKey($token), $user);
+
+        return $token;
+    }
+
+    /**
+     * 获取用于存到 context 的 key.
+     *
+     * @param $token
+     * @return string
+     */
+    public function resultKey($token)
+    {
+        return $this->name . '.auth.result' . $this->getJti($token);
+    }
+
+    public function user(?string $token = null): ?Authenticatable
+    {
+        $token = $token ?? $this->parseToken();
+        if (Context::has($key = is_string($token) ? $this->resultKey($token) : '_nothing')) {
+            $result = Context::get($key);
+            if ($result instanceof UnauthorizedException) {
+                throw $result;
+            }
+            return $result ?: null;
+        }
+
+        try {
+            if ($token) {
+                $jwt = $this->getJwtManager()->parse($token);
+                $uid = $jwt->getPayload()['uid'] ?? null;
+                $user = $uid ? $this->userProvider->retrieveByCredentials($uid) : null;
+                Context::set($key, $user ?: 0);
+
+                return $user;
+            }
+
+            throw new UnauthorizedException('The token is required.', $this);
+        } catch (\Throwable $exception) {
+            $newException = $exception instanceof AuthException ? $exception : new UnauthorizedException(
+                $exception->getMessage(),
+                $this,
+                $exception
+            );
+            Context::set($key, $newException);
+            throw $newException;
+        }
+    }
+
+    public function check(?string $token = null): bool
+    {
+        try {
+            return $this->user($token) instanceof Authenticatable;
+        } catch (AuthException $exception) {
+            return false;
+        }
+    }
+
+    public function guest(?string $token = null): bool
+    {
+        return ! $this->check($token);
+    }
+
+    /**
+     * 刷新 token,旧 token 会失效.
+     *
+     * @throws \Qbhy\SimpleJwt\Exceptions\InvalidTokenException
+     * @throws \Qbhy\SimpleJwt\Exceptions\JWTException
+     * @throws \Qbhy\SimpleJwt\Exceptions\SignatureException
+     * @throws \Qbhy\SimpleJwt\Exceptions\TokenExpiredException
+     */
+    public function refresh(?string $token = null): ?string
+    {
+        $token = $token ?: $this->parseToken();
+
+        if ($token) {
+            Context::set($this->resultKey($token), null);
+
+            try {
+                $jwt = $this->getJwtManager()->parse($token);
+            } catch (TokenExpiredException $exception) {
+                $jwt = $exception->getJwt();
+            }
+
+            $this->getJwtManager()->addBlacklist($jwt);
+
+            return $this->getJwtManager()->refresh($jwt)->token();
+        }
+
+        return null;
+    }
+
+    public function logout($token = null)
+    {
+        if ($token = $token ?? $this->parseToken()) {
+            Context::set($this->resultKey($token), null);
+            $this->getJwtManager()->addBlacklist(
+                $this->getJwtManager()->parse($token)
+            );
+            return true;
+        }
+        return false;
+    }
+
+    public function getPayload($token = null): ?array
+    {
+        if ($token = $token ?? $this->parseToken()) {
+            return $this->getJwtManager()->justParse($token)->getPayload();
+        }
+        return null;
+    }
+
+    public function getJwtManager(): JWTManager
+    {
+        return $this->jwtManager;
+    }
+
+    public function id($token = null)
+    {
+        if ($token = $token ?? $this->parseToken()) {
+            return $this->getJwtManager()->parse($token)->getPayload()['uid'];
+        }
+        return null;
+    }
+
+    /**
+     * 获取 token 标识.
+     * 为了性能,直接 md5.
+     *
+     * @throws \Qbhy\SimpleJwt\Exceptions\SignatureException
+     * @throws \Qbhy\SimpleJwt\Exceptions\TokenExpiredException
+     * @throws \Qbhy\SimpleJwt\Exceptions\InvalidTokenException
+     * @return mixed|string
+     */
+    protected function getJti(string $token): string
+    {
+        return md5($token);
+    }
+}

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels