run('change'); } public function onHeartbeat() { $this->run('heartbeat'); } /** * @return array{ok: bool, status: int, body: array, error: string|null}|null */ public function run($reason) { if (!Settings::isConnected()) { return null; } $inventory = new Inventory(); $payload = $inventory->collect(); $hash = $inventory->hash($payload); $always = in_array($reason, array('manual', 'connect', 'heartbeat'), true); if (!$always && $hash === Settings::get('inventory_hash')) { return null; } $result = (new Client())->pushInventory($payload); if ($result['ok']) { $body = $result['body']; Settings::merge(array( 'inventory_hash' => isset($body['inventory_hash']) ? $body['inventory_hash'] : $hash, 'last_sync' => time(), 'last_error' => null, 'needs_reconnect' => false, )); return $result; } if ($result['status'] === 401 || $result['status'] === 403) { Settings::merge(array( 'needs_reconnect' => true, 'last_error' => $result['error'], )); return $result; } if ($result['status'] === 429 && !wp_next_scheduled(Plugin::CRON_SYNC)) { wp_schedule_single_event(time() + self::BACKOFF, Plugin::CRON_SYNC); } Settings::merge(array('last_error' => $result['error'])); return $result; } }