function continue_enqueuing($configs = null, $enqueue_status = null)
 {
     if (!$this->is_started() || $this->get_status_option('queue_finished')) {
         return;
     }
     // if full sync queue is full, don't enqueue more items
     $max_queue_size_full_sync = Jetpack_Sync_Settings::get_setting('max_queue_size_full_sync');
     $full_sync_queue = new Jetpack_Sync_Queue('full_sync');
     $available_queue_slots = $max_queue_size_full_sync - $full_sync_queue->size();
     if ($available_queue_slots <= 0) {
         return;
     } else {
         $remaining_items_to_enqueue = min(Jetpack_Sync_Settings::get_setting('max_enqueue_full_sync'), $available_queue_slots);
     }
     if (!$configs) {
         $configs = $this->get_config();
     }
     if (!$enqueue_status) {
         $enqueue_status = $this->get_enqueue_status();
     }
     foreach (Jetpack_Sync_Modules::get_modules() as $module) {
         $module_name = $module->name();
         // skip module if not configured for this sync or module is done
         if (!isset($configs[$module_name]) || !$configs[$module_name] || !$enqueue_status[$module_name] || true === $enqueue_status[$module_name][2]) {
             continue;
         }
         list($items_enqueued, $next_enqueue_state) = $module->enqueue_full_sync_actions($configs[$module_name], $remaining_items_to_enqueue, $enqueue_status[$module_name][2]);
         $enqueue_status[$module_name][2] = $next_enqueue_state;
         // if items were processed, subtract them from the limit
         if (!is_null($items_enqueued) && $items_enqueued > 0) {
             $enqueue_status[$module_name][1] += $items_enqueued;
             $remaining_items_to_enqueue -= $items_enqueued;
         }
         // stop processing if we've reached our limit of items to enqueue
         if (0 >= $remaining_items_to_enqueue) {
             $this->set_enqueue_status($enqueue_status);
             return;
         }
     }
     $this->set_enqueue_status($enqueue_status);
     // setting autoload to true means that it's faster to check whether we should continue enqueuing
     $this->update_status_option('queue_finished', time(), true);
     /**
      * Fires when a full sync ends. This action is serialized
      * and sent to the server with checksums so that we can confirm the
      * sync was successful.
      *
      * @since 4.2.0
      */
     do_action('jetpack_full_sync_end', '');
 }
 protected function result()
 {
     $args = $this->input();
     $queue_name = $this->validate_queue($args['queue']);
     if (is_wp_error($queue_name)) {
         return $queue_name;
     }
     if ($args['number_of_items'] < 1 || $args['number_of_items'] > 100) {
         return new WP_Error('invalid_number_of_items', 'Number of items needs to be an integer that is larger than 0 and less then 100', 400);
     }
     require_once JETPACK__PLUGIN_DIR . 'sync/class.jetpack-sync-queue.php';
     $queue = new Jetpack_Sync_Queue($queue_name);
     if (0 === $queue->size()) {
         return new WP_Error('queue_size', 'The queue is empty and there is nothing to send', 400);
     }
     require_once JETPACK__PLUGIN_DIR . 'sync/class.jetpack-sync-sender.php';
     $sender = Jetpack_Sync_Sender::get_instance();
     // try to give ourselves as much time as possible
     set_time_limit(0);
     // let's delete the checkin state
     if ($args['force']) {
         $queue->unlock();
     }
     $buffer = $this->get_buffer($queue, $args['number_of_items']);
     // Check that the $buffer is not checkout out already
     if (is_wp_error($buffer)) {
         return new WP_Error('buffer_open', "We couldn't get the buffer it is currently checked out", 400);
     }
     if (!is_object($buffer)) {
         return new WP_Error('buffer_non-object', 'Buffer is not an object', 400);
     }
     Jetpack_Sync_Settings::set_is_syncing(true);
     list($items_to_send, $skipped_items_ids, $items) = $sender->get_items_to_send($buffer, $args['encode']);
     Jetpack_Sync_Settings::set_is_syncing(false);
     return array('buffer_id' => $buffer->id, 'items' => $items_to_send, 'skipped_items' => $skipped_items_ids, 'codec' => $args['encode'] ? $sender->get_codec()->name() : null, 'sent_timestamp' => time());
 }