- // Next update.
- if (!backend_url.match(/history/)) {
- current_analysis_request_timer = setTimeout(function() { request_update(); }, timeout);
- }
- }).fail(function(jqXHR, textStatus, errorThrown) {
- document.body.style.opacity = null;
- if (textStatus === "abort") {
- // Aborted because we are switching backends. Abandon and don't retry,
- // because another one is already started for us.
- } else {
- // Backend error or similar. Wait ten seconds, then try again.
- current_analysis_request_timer = setTimeout(function() { request_update(); }, 10000);
+}
+
+var process_update_response = function(data, headers) {
+ sync_server_clock(headers.get('Date'));
+ ims = headers.get('X-RGLM');
+ var num_viewers = headers.get('X-RGNV');
+ var new_data;
+ if (Array.isArray(data)) {
+ new_data = JSON.parse(JSON.stringify(current_analysis_data));
+ JSON_delta.patch(new_data, data);
+ } else {
+ new_data = data;
+ }
+
+ var minimum_version = headers.get('X-RGMV');
+ if (minimum_version && minimum_version > SCRIPT_VERSION) {
+ // Upgrade to latest version with a force-reload.
+ location.reload(true);
+ }
+
+ // Verify that the PV makes sense.
+ var valid = true;
+ if (new_data['pv']) {
+ var hiddenboard = new Chess(new_data['position']['fen']);
+ for (var i = 0; i < new_data['pv'].length; ++i) {
+ if (hiddenboard.move(new_data['pv'][i]) === null) {
+ valid = false;
+ break;
+ }