PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 6.2.2
Jetpack – WP Security, Backup, Speed, & Growth v6.2.2
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 All 500 releases
jetpack / sync / class.jetpack-sync-server.php
class.jetpack-sync-server.php
107 lines 3.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 require_once dirname( __FILE__ ) . '/class.jetpack-sync-json-deflate-array-codec.php';
4
5 /**
6 * Simple version of a Jetpack Sync Server - just receives arrays of events and
7 * issues them locally with the 'jetpack_sync_remote_action' action.
8 */
9 class Jetpack_Sync_Server {
10 private $codec;
11 const MAX_TIME_PER_REQUEST_IN_SECONDS = 15;
12 const BLOG_LOCK_TRANSIENT_PREFIX = 'jp_sync_req_lock_';
13 const BLOG_LOCK_TRANSIENT_EXPIRY = 60; // seconds
14
15 // this is necessary because you can't use "new" when you declare instance properties >:(
16 function __construct() {
17 $this->codec = new Jetpack_Sync_JSON_Deflate_Array_Codec();
18 }
19
20 function set_codec( iJetpack_Sync_Codec $codec ) {
21 $this->codec = $codec;
22 }
23
24 function attempt_request_lock( $blog_id, $expiry = self::BLOG_LOCK_TRANSIENT_EXPIRY ) {
25 $transient_name = $this->get_concurrent_request_transient_name( $blog_id );
26 $locked_time = get_site_transient( $transient_name );
27 if ( $locked_time ) {
28 return false;
29 }
30 set_site_transient( $transient_name, microtime( true ), $expiry );
31
32 return true;
33 }
34
35 private function get_concurrent_request_transient_name( $blog_id ) {
36 return self::BLOG_LOCK_TRANSIENT_PREFIX . $blog_id;
37 }
38
39 function remove_request_lock( $blog_id ) {
40 delete_site_transient( $this->get_concurrent_request_transient_name( $blog_id ) );
41 }
42
43 function receive( $data, $token = null, $sent_timestamp = null, $queue_id = null ) {
44 $start_time = microtime( true );
45 if ( ! is_array( $data ) ) {
46 return new WP_Error( 'action_decoder_error', 'Events must be an array' );
47 }
48
49 if ( $token && ! $this->attempt_request_lock( $token->blog_id ) ) {
50 /**
51 * Fires when the server receives two concurrent requests from the same blog
52 *
53 * @since 4.2.0
54 *
55 * @param token The token object of the misbehaving site
56 */
57 do_action( 'jetpack_sync_multi_request_fail', $token );
58
59 return new WP_Error( 'concurrent_request_error', 'There is another request running for the same blog ID' );
60 }
61
62 $events = wp_unslash( array_map( array( $this->codec, 'decode' ), $data ) );
63 $events_processed = array();
64
65 /**
66 * Fires when an array of actions are received from a remote Jetpack site
67 *
68 * @since 4.2.0
69 *
70 * @param array Array of actions received from the remote site
71 */
72 do_action( 'jetpack_sync_remote_actions', $events, $token );
73
74 foreach ( $events as $key => $event ) {
75 list( $action_name, $args, $user_id, $timestamp, $silent ) = $event;
76
77 /**
78 * Fires when an action is received from a remote Jetpack site
79 *
80 * @since 4.2.0
81 *
82 * @param string $action_name The name of the action executed on the remote site
83 * @param array $args The arguments passed to the action
84 * @param int $user_id The external_user_id who did the action
85 * @param bool $silent Whether the item was created via import
86 * @param double $timestamp Timestamp (in seconds) when the action occurred
87 * @param double $sent_timestamp Timestamp (in seconds) when the action was transmitted
88 * @param string $queue_id ID of the queue from which the event was sent (sync or full_sync)
89 * @param array $token The auth token used to invoke the API
90 */
91 do_action( 'jetpack_sync_remote_action', $action_name, $args, $user_id, $silent, $timestamp, $sent_timestamp, $queue_id, $token );
92
93 $events_processed[] = $key;
94
95 if ( microtime( true ) - $start_time > self::MAX_TIME_PER_REQUEST_IN_SECONDS ) {
96 break;
97 }
98 }
99
100 if ( $token ) {
101 $this->remove_request_lock( $token->blog_id );
102 }
103
104 return $events_processed;
105 }
106 }
107