diff --git a/source/packages/plg_system_mokosuiteclient/Extension/MokoSuiteClient.php b/source/packages/plg_system_mokosuiteclient/Extension/MokoSuiteClient.php index 9c053db5..dd25ddd3 100644 --- a/source/packages/plg_system_mokosuiteclient/Extension/MokoSuiteClient.php +++ b/source/packages/plg_system_mokosuiteclient/Extension/MokoSuiteClient.php @@ -2428,17 +2428,30 @@ class MokoSuiteClient extends CMSPlugin implements BootableExtensionInterface $session->set('mokosuiteclient.heartbeat_sent', true); $this->sendRuntimeHeartbeat(); - // Store version so we don't re-send every session - $this->params->set('_last_heartbeat_version', $currentVersion); + // Persist version marker with a targeted DB update to avoid overwriting + // params that may have been modified by migrateMonitorParams() in the same request + $db = Factory::getDbo(); + $query = $db->getQuery(true) + ->select($db->quoteName('params')) + ->from($db->quoteName('#__extensions')) + ->where($db->quoteName('element') . ' = ' . $db->quote('mokosuiteclient')) + ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) + ->where($db->quoteName('folder') . ' = ' . $db->quote('system')); + $freshParams = json_decode((string) $db->setQuery($query)->loadResult(), true) ?: []; + $freshParams['_last_heartbeat_version'] = $currentVersion; - $extension = new \Joomla\CMS\Table\Extension(Factory::getDbo()); - $extension->load(['element' => 'mokosuiteclient', 'folder' => 'system', 'type' => 'plugin']); - $extension->params = $this->params->toString(); - $extension->store(); + $db->setQuery( + $db->getQuery(true) + ->update($db->quoteName('#__extensions')) + ->set($db->quoteName('params') . ' = ' . $db->quote(json_encode($freshParams))) + ->where($db->quoteName('element') . ' = ' . $db->quote('mokosuiteclient')) + ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) + ->where($db->quoteName('folder') . ' = ' . $db->quote('system')) + )->execute(); } catch (\Throwable $e) { - // Non-critical — never break admin for a heartbeat + Log::add('Heartbeat check failed: ' . $e->getMessage(), Log::WARNING, 'mokosuiteclient'); } } @@ -2643,6 +2656,8 @@ class MokoSuiteClient extends CMSPlugin implements BootableExtensionInterface } catch (\Throwable $e) { + Log::add('Local health fetch failed: ' . $e->getMessage(), Log::DEBUG, 'mokosuiteclient'); + return null; } } diff --git a/source/script.php b/source/script.php index ffc3cb0b..57f2be7e 100644 --- a/source/script.php +++ b/source/script.php @@ -946,16 +946,25 @@ class Pkg_MokosuiteclientInstallerScript $response = curl_exec($ch); $code = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE); + $error = curl_error($ch); curl_close($ch); - if ($code >= 200 && $code < 300) + if ($error) + { + Log::add('Heartbeat connection failed: ' . $error, Log::WARNING, 'mokosuiteclient'); + } + elseif ($code >= 200 && $code < 300) { Factory::getApplication()->enqueueMessage('MokoSuiteClientHQ heartbeat: site registered', 'message'); } + else + { + Log::add(sprintf('Heartbeat HTTP %d: %s', $code, $response), Log::WARNING, 'mokosuiteclient'); + } } catch (\Throwable $e) { - // Silent failure — heartbeat is non-critical + Log::add('Heartbeat failed: ' . $e->getMessage(), Log::WARNING, 'mokosuiteclient'); } }