summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/jetpack_vendor/automattic/jetpack-connection/src/class-package-version-tracker.php')
-rw-r--r--plugins/jetpack/jetpack_vendor/automattic/jetpack-connection/src/class-package-version-tracker.php112
1 files changed, 112 insertions, 0 deletions
diff --git a/plugins/jetpack/jetpack_vendor/automattic/jetpack-connection/src/class-package-version-tracker.php b/plugins/jetpack/jetpack_vendor/automattic/jetpack-connection/src/class-package-version-tracker.php
new file mode 100644
index 00000000..2514b606
--- /dev/null
+++ b/plugins/jetpack/jetpack_vendor/automattic/jetpack-connection/src/class-package-version-tracker.php
@@ -0,0 +1,112 @@
+<?php
+/**
+ * The Package_Version_Tracker class.
+ *
+ * @package automattic/jetpack-connection
+ */
+
+namespace Automattic\Jetpack\Connection;
+
+/**
+ * The Package_Version_Tracker class.
+ */
+class Package_Version_Tracker {
+
+ const PACKAGE_VERSION_OPTION = 'jetpack_package_versions';
+
+ /**
+ * The cache key for storing a failed request to update remote package versions.
+ * The caching logic is that when a failed request occurs, we cache it temporarily
+ * with a set expiration time.
+ * Only after the key has expired, we'll be able to repeat a remote request.
+ * This also implies that the cached value is redundant, however we chose the datetime
+ * of the failed request to avoid using booleans.
+ */
+ const CACHED_FAILED_REQUEST_KEY = 'jetpack_failed_update_remote_package_versions';
+
+ /**
+ * The min time difference in seconds for attempting to
+ * update remote tracked package versions after a failed remote request.
+ */
+ const CACHED_FAILED_REQUEST_EXPIRATION = 1 * HOUR_IN_SECONDS;
+
+ /**
+ * Uses the jetpack_package_versions filter to obtain the package versions from packages that need
+ * version tracking. If the package versions have changed, updates the option and notifies WPCOM.
+ */
+ public function maybe_update_package_versions() {
+ /**
+ * Obtains the package versions.
+ *
+ * @since $$next_version$$
+ *
+ * @param array An associative array of Jetpack package slugs and their corresponding versions as key/value pairs.
+ */
+ $filter_versions = apply_filters( 'jetpack_package_versions', array() );
+
+ if ( ! is_array( $filter_versions ) ) {
+ return;
+ }
+
+ $option_versions = get_option( self::PACKAGE_VERSION_OPTION, array() );
+
+ foreach ( $filter_versions as $package => $version ) {
+ if ( ! is_string( $package ) || ! is_string( $version ) ) {
+ unset( $filter_versions[ $package ] );
+ }
+ }
+
+ if ( ! is_array( $option_versions )
+ || count( array_diff_assoc( $filter_versions, $option_versions ) )
+ || count( array_diff_assoc( $option_versions, $filter_versions ) )
+ ) {
+ $this->update_package_versions_option( $filter_versions );
+ }
+ }
+
+ /**
+ * Updates the package versions:
+ * - Sends the updated package versions to wpcom.
+ * - Updates the 'jetpack_package_versions' option.
+ *
+ * @param array $package_versions The package versions.
+ */
+ protected function update_package_versions_option( $package_versions ) {
+ $connection = new Manager();
+ if ( ! $connection->is_connected() ) {
+ return;
+ }
+
+ $site_id = \Jetpack_Options::get_option( 'id' );
+
+ $last_failed_attempt_within_hour = get_transient( self::CACHED_FAILED_REQUEST_KEY );
+
+ if ( $last_failed_attempt_within_hour ) {
+ return;
+ }
+
+ $body = wp_json_encode(
+ array(
+ 'package_versions' => $package_versions,
+ )
+ );
+
+ $response = Client::wpcom_json_api_request_as_blog(
+ sprintf( '/sites/%d/jetpack-package-versions', $site_id ),
+ '2',
+ array(
+ 'headers' => array( 'content-type' => 'application/json' ),
+ 'method' => 'POST',
+ ),
+ $body,
+ 'wpcom'
+ );
+
+ if ( 200 === wp_remote_retrieve_response_code( $response ) ) {
+ update_option( self::PACKAGE_VERSION_OPTION, $package_versions );
+ } else {
+ set_transient( self::CACHED_FAILED_REQUEST_KEY, time(), self::CACHED_FAILED_REQUEST_EXPIRATION );
+ }
+ }
+
+}