PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0.1
Jetpack – WP Security, Backup, Speed, & Growth v16.0.1
16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-sync / src / class-server.php
jetpack / jetpack_vendor / automattic / jetpack-sync / src Last commit date
modules 3 weeks ago replicastore 3 months ago sync-queue 5 months ago class-actions.php 1 month ago class-activity-log-event.php 3 weeks ago class-data-settings.php 1 month ago class-dedicated-sender.php 7 months ago class-default-filter-settings.php 4 years ago class-defaults.php 2 days ago class-functions.php 1 month ago class-health.php 4 months ago class-json-deflate-array-codec.php 7 months ago class-listener.php 1 month ago class-lock.php 4 years ago class-main.php 2 months ago class-modules.php 1 year ago class-package-version.php 2 days ago class-queue-buffer.php 4 years ago class-queue.php 1 month ago class-replicastore.php 1 month ago class-rest-endpoints.php 4 months ago class-rest-sender.php 1 month ago class-sender.php 1 month ago class-server.php 4 months ago class-settings.php 3 months ago class-simple-codec.php 7 months ago class-users.php 3 months ago class-utils.php 4 years ago interface-codec.php 4 years ago interface-replicastore.php 1 month ago
class-server.php
197 lines
1 <?php
2 /**
3 * Sync server.
4 *
5 * @package automattic/jetpack-sync
6 */
7
8 namespace Automattic\Jetpack\Sync;
9
10 use WP_Error;
11
12 /**
13 * Simple version of a Jetpack Sync Server - just receives arrays of events and
14 * issues them locally with the 'jetpack_sync_remote_action' action.
15 */
16 class Server {
17 /**
18 * Codec used to decode sync events.
19 *
20 * @access private
21 *
22 * @var \Automattic\Jetpack\Sync\Codec_Interface
23 */
24 private $codec;
25
26 /**
27 * Maximum time for processing sync actions.
28 *
29 * @access public
30 *
31 * @var int
32 */
33 const MAX_TIME_PER_REQUEST_IN_SECONDS = 15;
34
35 /**
36 * Prefix of the blog lock transient.
37 *
38 * @access public
39 *
40 * @var string
41 */
42 const BLOG_LOCK_TRANSIENT_PREFIX = 'jp_sync_req_lock_';
43
44 /**
45 * Lifetime of the blog lock transient.
46 *
47 * @access public
48 *
49 * @var int
50 */
51 const BLOG_LOCK_TRANSIENT_EXPIRY = 60; // Seconds.
52
53 /**
54 * Constructor.
55 *
56 * This is necessary because you can't use "new" when you declare instance properties >:(
57 *
58 * @access public
59 */
60 public function __construct() {
61 $this->codec = new JSON_Deflate_Array_Codec();
62 }
63
64 /**
65 * Set the codec instance.
66 *
67 * @access public
68 *
69 * @param Automattic\Jetpack\Sync\Codec_Interface $codec Codec instance.
70 */
71 public function set_codec( Codec_Interface $codec ) {
72 $this->codec = $codec;
73 }
74
75 /**
76 * Attempt to lock the request when the server receives concurrent requests from the same blog.
77 *
78 * @access public
79 *
80 * @param int $blog_id ID of the blog.
81 * @param int $expiry Blog lock transient lifetime.
82 * @return boolean True if succeeded, false otherwise.
83 */
84 public function attempt_request_lock( $blog_id, $expiry = self::BLOG_LOCK_TRANSIENT_EXPIRY ) {
85 $transient_name = $this->get_concurrent_request_transient_name( $blog_id );
86 $locked_time = get_site_transient( $transient_name );
87 if ( $locked_time ) {
88 return false;
89 }
90 set_site_transient( $transient_name, microtime( true ), $expiry );
91
92 return true;
93 }
94
95 /**
96 * Retrieve the blog lock transient name for a particular blog.
97 *
98 * @access public
99 *
100 * @param int $blog_id ID of the blog.
101 * @return string Name of the blog lock transient.
102 */
103 private function get_concurrent_request_transient_name( $blog_id ) {
104 return self::BLOG_LOCK_TRANSIENT_PREFIX . $blog_id;
105 }
106
107 /**
108 * Remove the request lock from a particular blog ID.
109 *
110 * @access public
111 *
112 * @param int $blog_id ID of the blog.
113 */
114 public function remove_request_lock( $blog_id ) {
115 delete_site_transient( $this->get_concurrent_request_transient_name( $blog_id ) );
116 }
117
118 /**
119 * Receive and process sync events.
120 *
121 * @access public
122 *
123 * @param array $data Sync events.
124 * @param object $token The auth token used to invoke the API.
125 * @param int $sent_timestamp Timestamp (in seconds) when the actions were transmitted.
126 * @param string $queue_id ID of the queue from which the event was sent (`sync` or `full_sync`).
127 * @return array Processed sync events.
128 */
129 public function receive( $data, $token = null, $sent_timestamp = null, $queue_id = null ) {
130 $start_time = microtime( true );
131 if ( ! is_array( $data ) ) {
132 return new WP_Error( 'action_decoder_error', 'Events must be an array' );
133 }
134
135 if ( $token && ! $this->attempt_request_lock( $token->blog_id ) ) {
136 /**
137 * Fires when the server receives two concurrent requests from the same blog
138 *
139 * @since 1.6.3
140 * @since-jetpack 4.2.0
141 *
142 * @param object|null $token The token object of the misbehaving site
143 */
144 do_action( 'jetpack_sync_multi_request_fail', $token );
145
146 return new WP_Error( 'concurrent_request_error', 'There is another request running for the same blog ID' );
147 }
148
149 $events = wp_unslash( array_map( array( $this->codec, 'decode' ), $data ) );
150 $events_processed = array();
151
152 /**
153 * Fires when an array of actions are received from a remote Jetpack site
154 *
155 * @since 1.6.3
156 * @since-jetpack 4.2.0
157 *
158 * @param array $events Array of actions received from the remote site
159 * @param object|null $token The auth token used to invoke the API
160 */
161 do_action( 'jetpack_sync_remote_actions', $events, $token );
162
163 foreach ( $events as $key => $event ) {
164 list( $action_name, $args, $user_id, $timestamp, $silent ) = $event;
165
166 /**
167 * Fires when an action is received from a remote Jetpack site
168 *
169 * @since 1.6.3
170 * @since-jetpack 4.2.0
171 *
172 * @param string $action_name The name of the action executed on the remote site
173 * @param array $args The arguments passed to the action
174 * @param int $user_id The external_user_id who did the action
175 * @param bool $silent Whether the item was created via import
176 * @param double $timestamp Timestamp (in seconds) when the action occurred
177 * @param double $sent_timestamp Timestamp (in seconds) when the action was transmitted
178 * @param string $queue_id ID of the queue from which the event was sent (sync or full_sync)
179 * @param object|null $token The auth token used to invoke the API
180 */
181 do_action( 'jetpack_sync_remote_action', $action_name, $args, $user_id, $silent, $timestamp, $sent_timestamp, $queue_id, $token );
182
183 $events_processed[] = $key;
184
185 if ( microtime( true ) - $start_time > self::MAX_TIME_PER_REQUEST_IN_SECONDS ) {
186 break;
187 }
188 }
189
190 if ( $token ) {
191 $this->remove_request_lock( $token->blog_id );
192 }
193
194 return $events_processed;
195 }
196 }
197