From 2e701df21a146cb0775efc4a2295e9a8e84ae2c0 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 27 May 2025 21:26:17 +0000 Subject: [PATCH 1/3] Avoid warnings in the Jetstream process --- bin/console.php | 3 ++ src/Protocol/ATProtocol/Actor.php | 2 +- src/Protocol/ATProtocol/Jetstream.php | 46 ++++++++++++++++++++++++--- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/bin/console.php b/bin/console.php index a20f3f7e02..88382e1665 100755 --- a/bin/console.php +++ b/bin/console.php @@ -13,6 +13,9 @@ if (php_sapi_name() !== 'cli') { exit(); } +// Ensure that te console is executed from the base path of the installation +chdir(dirname(__DIR__)); + require dirname(__DIR__) . '/vendor/autoload.php'; $container = \Friendica\Core\DiceContainer::fromBasePath(dirname(__DIR__)); diff --git a/src/Protocol/ATProtocol/Actor.php b/src/Protocol/ATProtocol/Actor.php index 38da819dfc..4dae8b75cf 100755 --- a/src/Protocol/ATProtocol/Actor.php +++ b/src/Protocol/ATProtocol/Actor.php @@ -133,7 +133,7 @@ class Actor } $directory = $this->atprotocol->get(ATProtocol::DIRECTORY . '/' . $profile->did); - if (!empty($directory)) { + if (!empty($directory->service)) { foreach ($directory->service as $service) { if (($service->id == '#atproto_pds') && ($service->type == 'AtprotoPersonalDataServer') && !empty($service->serviceEndpoint)) { $fields['baseurl'] = $service->serviceEndpoint; diff --git a/src/Protocol/ATProtocol/Jetstream.php b/src/Protocol/ATProtocol/Jetstream.php index 8051e47126..86e28c0124 100755 --- a/src/Protocol/ATProtocol/Jetstream.php +++ b/src/Protocol/ATProtocol/Jetstream.php @@ -84,6 +84,8 @@ class Jetstream $timeout_limit = 10; $timestamp = $this->keyValue->get('jetstream_timestamp') ?? 0; $cursor = ''; + $this->logger->notice('Start listening'); + while (true) { if ($timestamp) { $cursor = '&cursor=' . $timestamp; @@ -92,12 +94,21 @@ class Jetstream $this->syncContacts(); try { + set_error_handler(function ($errno, $errstr, $errfile, $errline) { + restore_error_handler(); + throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); + }, E_WARNING); // @todo make the path configurable $this->client = new \WebSocket\Client('wss://jetstream1.us-west.bsky.network/subscribe?requireHello=true' . $cursor); $this->client->setTimeout($timeout); $this->client->setLogger($this->logger); + restore_error_handler(); } catch (\WebSocket\ConnectionException $e) { - $this->logger->error('Error while trying to establish the connection', ['code' => $e->getCode(), 'message' => $e->getMessage()]); + $this->logger->error('Error while trying to establish the connection', ['code' => $e->getCode(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); + echo "Connection wasn't established.\n"; + exit(1); + } catch (\ErrorException $e) { + $this->logger->notice('Warning while trying to establish the connection', ['code' => $e->getCode(), 'severity' => $e->getSeverity(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); echo "Connection wasn't established.\n"; exit(1); } @@ -105,7 +116,13 @@ class Jetstream $last_timeout = time(); while (true) { try { - $message = @$this->client->receive(); + set_error_handler(function ($errno, $errstr, $errfile, $errline) { + restore_error_handler(); + throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); + }, E_WARNING); + $message = $this->client->receive(); + restore_error_handler(); + if (empty($message)) { $this->logger->notice('Empty message received'); break; @@ -128,19 +145,31 @@ class Jetstream break; } $this->logger->notice('Timeout', ['duration' => $timeout_duration, 'timestamp' => $timestamp, 'code' => $e->getCode(), 'message' => $e->getMessage()]); + break; } else { - $this->logger->error('Error', ['code' => $e->getCode(), 'message' => $e->getMessage()]); + $this->logger->error('Error while trying to receive a message', ['code' => $e->getCode(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); break; } + } catch (\ErrorException $e) { + $this->logger->notice('Warning while trying to receive a message', ['code' => $e->getCode(), 'severity' => $e->getSeverity(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); + break; } $last_timeout = time(); } try { + set_error_handler(function ($errno, $errstr, $errfile, $errline) { + restore_error_handler(); + throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); + }, E_WARNING); $this->client->close(); + restore_error_handler(); } catch (\WebSocket\ConnectionException $e) { - $this->logger->error('Error while trying to close the connection', ['code' => $e->getCode(), 'message' => $e->getMessage()]); + $this->logger->error('Error while trying to close the connection', ['code' => $e->getCode(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); + } catch (\ErrorException $e) { + $this->logger->notice('Warning while trying to close the connection', ['code' => $e->getCode(), 'severity' => $e->getSeverity(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); } } + $this->logger->notice('Stop listening'); } /** @@ -234,9 +263,16 @@ class Jetstream ] ]; try { + set_error_handler(function ($errno, $errstr, $errfile, $errline) { + restore_error_handler(); + throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); + }, E_WARNING); $this->client->send(json_encode($update)); + restore_error_handler(); } catch (\WebSocket\ConnectionException $e) { - $this->logger->error('Error while trying to send options.', ['code' => $e->getCode(), 'message' => $e->getMessage()]); + $this->logger->error('Error while trying to send options.', ['code' => $e->getCode(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); + } catch (\ErrorException $e) { + $this->logger->notice('Warning while trying to send options.', ['code' => $e->getCode(), 'severity' => $e->getSeverity(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); } } From 3883bdf96f1d6a123854ef6e3334348e79aac3da Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 30 May 2025 05:55:18 +0000 Subject: [PATCH 2/3] Updated PHP package --- composer.json | 2 +- composer.lock | 178 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 125 insertions(+), 55 deletions(-) diff --git a/composer.json b/composer.json index d86bfac2b2..9973336590 100644 --- a/composer.json +++ b/composer.json @@ -67,6 +67,7 @@ "patrickschur/language-detection": "^5.0.0", "pear/console_table": "^1.3", "phpseclib/phpseclib": "^3.0", + "phrity/websocket": "^1.7", "pragmarx/google2fa": "^5.0", "pragmarx/recovery": "^0.2", "psr/clock": "^1.0", @@ -76,7 +77,6 @@ "seld/cli-prompt": "^1.0", "smarty/smarty": "^4", "symfony/event-dispatcher": "^5.4", - "textalk/websocket": "^1.6", "ua-parser/uap-php": "^3.9", "xemlock/htmlpurifier-html5": "^0.1.11" }, diff --git a/composer.lock b/composer.lock index bca6007c01..fb9fadddbd 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8aa73e21ed198d8013c09de14e8230cd", + "content-hash": "897b878d6db24b9a6437bd9f971478be", "packages": [ { "name": "asika/simple-console", @@ -2860,6 +2860,66 @@ ], "time": "2024-03-03T02:14:58+00:00" }, + { + "name": "phrity/net-stream", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/sirn-se/phrity-net-stream.git", + "reference": "9105931b65ad90c75f4885a40b268b0f65802e3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sirn-se/phrity-net-stream/zipball/9105931b65ad90c75f4885a40b268b0f65802e3e", + "reference": "9105931b65ad90c75f4885a40b268b0f65802e3e", + "shasum": "" + }, + "require": { + "php": "^7.4 | ^8.0", + "phrity/util-errorhandler": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0 | ^2.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.0", + "phpunit/phpunit": "^9.0 | ^10.0", + "phrity/net-uri": "^1.1", + "squizlabs/php_codesniffer": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Phrity\\Net\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sören Jensen", + "email": "sirn@sirn.se", + "homepage": "https://phrity.sirn.se" + } + ], + "description": "Socket stream classes implementing PSR-7 Stream and PSR-17 StreamFactory", + "homepage": "https://phrity.sirn.se/net-stream", + "keywords": [ + "Socket", + "client", + "psr-17", + "psr-7", + "server", + "stream", + "stream factory" + ], + "support": { + "issues": "https://github.com/sirn-se/phrity-net-stream/issues", + "source": "https://github.com/sirn-se/phrity-net-stream/tree/1.3.0" + }, + "time": "2023-10-22T10:47:03+00:00" + }, { "name": "phrity/net-uri", "version": "1.3.0", @@ -2958,6 +3018,67 @@ ], "time": "2024-09-12T06:49:16+00:00" }, + { + "name": "phrity/websocket", + "version": "1.7.3", + "source": { + "type": "git", + "url": "https://github.com/sirn-se/websocket-php.git", + "reference": "8a525da4457b599ab1960f24183f25626c96ce3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sirn-se/websocket-php/zipball/8a525da4457b599ab1960f24183f25626c96ce3c", + "reference": "8a525da4457b599ab1960f24183f25626c96ce3c", + "shasum": "" + }, + "require": { + "php": "^7.4 | ^8.0", + "phrity/net-stream": "^1.2", + "phrity/net-uri": "^1.2", + "phrity/util-errorhandler": "^1.0", + "psr/http-message": "^1.1 | ^2.0", + "psr/log": "^1.0 | ^2.0 | ^3.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.0", + "phpunit/phpunit": "^9.0 | ^10.0", + "phrity/net-mock": "^1.3", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "WebSocket\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Fredrik Liljegren" + }, + { + "name": "Sören Jensen", + "email": "sirn@sirn.se", + "homepage": "https://phrity.sirn.se" + } + ], + "description": "WebSocket client and server", + "homepage": "https://phrity.sirn.se/websocket", + "keywords": [ + "client", + "server", + "websocket" + ], + "support": { + "issues": "https://github.com/sirn-se/websocket-php/issues", + "source": "https://github.com/sirn-se/websocket-php/tree/1.7.3" + }, + "time": "2024-05-31T13:43:32+00:00" + }, { "name": "pragmarx/google2fa", "version": "v5.0.0", @@ -4140,57 +4261,6 @@ ], "time": "2024-09-09T11:45:10+00:00" }, - { - "name": "textalk/websocket", - "version": "1.6.3", - "source": { - "type": "git", - "url": "https://github.com/Textalk/websocket-php.git", - "reference": "67de79745b1a357caf812bfc44e0abf481cee012" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Textalk/websocket-php/zipball/67de79745b1a357caf812bfc44e0abf481cee012", - "reference": "67de79745b1a357caf812bfc44e0abf481cee012", - "shasum": "" - }, - "require": { - "php": "^7.4 | ^8.0", - "phrity/net-uri": "^1.0", - "phrity/util-errorhandler": "^1.0", - "psr/http-message": "^1.0", - "psr/log": "^1.0 | ^2.0 | ^3.0" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.0", - "phpunit/phpunit": "^9.0", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "WebSocket\\": "lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "ISC" - ], - "authors": [ - { - "name": "Fredrik Liljegren" - }, - { - "name": "Sören Jensen" - } - ], - "description": "WebSocket client and server", - "support": { - "issues": "https://github.com/Textalk/websocket-php/issues", - "source": "https://github.com/Textalk/websocket-php/tree/1.6.3" - }, - "time": "2022-11-07T18:59:33+00:00" - }, { "name": "ua-parser/uap-php", "version": "v3.9.14", @@ -7698,9 +7768,9 @@ "ext-simplexml": "*", "ext-xml": "*" }, - "platform-dev": [], + "platform-dev": {}, "platform-overrides": { "php": "7.4" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } From 497798b45522bcc33b1ed176b150e021b9430202 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 1 Jun 2025 04:27:52 +0000 Subject: [PATCH 3/3] Warning handler removed --- src/Protocol/ATProtocol/Jetstream.php | 31 --------------------------- 1 file changed, 31 deletions(-) diff --git a/src/Protocol/ATProtocol/Jetstream.php b/src/Protocol/ATProtocol/Jetstream.php index 86e28c0124..a4771cae44 100755 --- a/src/Protocol/ATProtocol/Jetstream.php +++ b/src/Protocol/ATProtocol/Jetstream.php @@ -94,34 +94,20 @@ class Jetstream $this->syncContacts(); try { - set_error_handler(function ($errno, $errstr, $errfile, $errline) { - restore_error_handler(); - throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); - }, E_WARNING); // @todo make the path configurable $this->client = new \WebSocket\Client('wss://jetstream1.us-west.bsky.network/subscribe?requireHello=true' . $cursor); $this->client->setTimeout($timeout); $this->client->setLogger($this->logger); - restore_error_handler(); } catch (\WebSocket\ConnectionException $e) { $this->logger->error('Error while trying to establish the connection', ['code' => $e->getCode(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); echo "Connection wasn't established.\n"; exit(1); - } catch (\ErrorException $e) { - $this->logger->notice('Warning while trying to establish the connection', ['code' => $e->getCode(), 'severity' => $e->getSeverity(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); - echo "Connection wasn't established.\n"; - exit(1); } $this->setOptions(); $last_timeout = time(); while (true) { try { - set_error_handler(function ($errno, $errstr, $errfile, $errline) { - restore_error_handler(); - throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); - }, E_WARNING); $message = $this->client->receive(); - restore_error_handler(); if (empty($message)) { $this->logger->notice('Empty message received'); @@ -150,23 +136,13 @@ class Jetstream $this->logger->error('Error while trying to receive a message', ['code' => $e->getCode(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); break; } - } catch (\ErrorException $e) { - $this->logger->notice('Warning while trying to receive a message', ['code' => $e->getCode(), 'severity' => $e->getSeverity(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); - break; } $last_timeout = time(); } try { - set_error_handler(function ($errno, $errstr, $errfile, $errline) { - restore_error_handler(); - throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); - }, E_WARNING); $this->client->close(); - restore_error_handler(); } catch (\WebSocket\ConnectionException $e) { $this->logger->error('Error while trying to close the connection', ['code' => $e->getCode(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); - } catch (\ErrorException $e) { - $this->logger->notice('Warning while trying to close the connection', ['code' => $e->getCode(), 'severity' => $e->getSeverity(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); } } $this->logger->notice('Stop listening'); @@ -263,16 +239,9 @@ class Jetstream ] ]; try { - set_error_handler(function ($errno, $errstr, $errfile, $errline) { - restore_error_handler(); - throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); - }, E_WARNING); $this->client->send(json_encode($update)); - restore_error_handler(); } catch (\WebSocket\ConnectionException $e) { $this->logger->error('Error while trying to send options.', ['code' => $e->getCode(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); - } catch (\ErrorException $e) { - $this->logger->notice('Warning while trying to send options.', ['code' => $e->getCode(), 'severity' => $e->getSeverity(), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]); } }