/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** * Get the API endpoint URL for an action * @param {String} action * @return {String} */ function getActionUrl(action) { return SETTINGS["server"] + "/" + action; } /** * Compare two version strings. * http://stackoverflow.com/a/16187766/2534036 * @param {string} a * @param {string} b * @returns a number < 0 if a < b, a number > 0 if a > b, 0 if a = b */ function compareVersions(a, b) { var i, diff; var regExStrip0 = /(\.0+)+$/; var segmentsA = a.replace(regExStrip0, '').split('.'); var segmentsB = b.replace(regExStrip0, '').split('.'); var l = Math.min(segmentsA.length, segmentsB.length); for (i = 0; i < l; i++) { diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10); if (diff) { return diff; } } return segmentsA.length - segmentsB.length; } function checkClientVersion(success, failure) { return $.ajax({ type: 'GET', url: getActionUrl("version.txt"), timeout: 5000, success: function (version) { $.getJSON("package.json", {}, function (local) { if (compareVersions(local.version, version) < 0) { success(false); } else { success(true); } }); }, error: function (xhr, textStatus, errorThrown) { if (typeof failure != 'function') { return; } switch (textStatus) { case "timeout": failure("Couldn't connect to the server (timeout).", xhr); break; case "error": failure("Couldn't connect to the server (error).", xhr); break; case "parseerror": failure("The server sent a malformed response.", xhr); break; default: failure("Couldn't connect to the server.", xhr); } } }); } /** * Call an API function on the server. * @param {string} action * @param {array} data key: value array of arguments for the server. * @param {function} success Called with the JSON response object. * @param {function} failure Called with an error message string. * @return {undefined} */ function callAPI(action, data, success, failure) { if (typeof data.username == "undefined" && typeof data.password == "undefined") { data.username = localStorage.getItem("username"); data.password = localStorage.getItem("password"); } return $.ajax({ type: 'POST', dataType: 'json', url: getActionUrl(action), data: data, timeout: 5000, success: function (data, textStatus) { if (data.status === "OK") { success(data); return; } if (typeof failure != 'function') { return; } if (data.status === "ERROR") { failure(data.msg); } else { failure("The server sent an invalid response."); } }, error: function (xhr, textStatus, errorThrown) { if (typeof failure != 'function') { return; } switch (textStatus) { case "timeout": failure("Couldn't connect to the server (timeout)."); break; case "error": failure("Couldn't connect to the server (error)."); break; case "parseerror": failure("The server sent a malformed response."); break; default: failure("Couldn't connect to the server."); } } }); } /** * Call an API function on the server. Makes fewer assumptions about what * constitutes a success response. * @param {string} action * @param {array} data key: value array of arguments for the server. * @param {function} success Called with the JSON response object. * @param {function} failure Called with an error message string. * @return {undefined} */ function callAPIRawResponse(action, data, success, failure) { if (typeof data.username == "undefined" && typeof data.password == "undefined") { data.username = localStorage.getItem("username"); data.password = localStorage.getItem("password"); } return $.ajax({ type: 'POST', url: getActionUrl(action), data: data, timeout: 5000, success: function (data, textStatus) { success(data); }, error: function (xhr, textStatus, errorThrown) { if (typeof failure != 'function') { return; } switch (textStatus) { case "timeout": failure("Couldn't connect to the server (timeout).", xhr); break; case "error": failure("Couldn't connect to the server (error).", xhr); break; case "parseerror": failure("The server sent a malformed response.", xhr); break; default: failure("Couldn't connect to the server.", xhr); } } }); }