var /** * @type {number} next period to wait before next retry in case of failure, in seconds **/ NEXT_RETRY = 0 /** * @type {SlackChan|SlackIms|SlackGroup} **/ ,SELECTED_ROOM = null ; /** * @param {SlackChan|SlackIms|SlackGroup} room * @param {function(boolean)} cb **/ function fetchHistory(room, cb) { var xhr = new XMLHttpRequest(); xhr.open('GET', 'api/hist?room=' +room.id, true); xhr.send(null); } function poll(callback) { var xhr = new XMLHttpRequest(); xhr.timeout = 1000 * 60 * 1; // 3 min timeout xhr.onreadystatechange = function(e) { if (xhr.readyState === 4) { if (xhr.status === 0) { if (NEXT_RETRY) { NEXT_RETRY = 0; onNetworkStateUpdated(true); } poll(callback); // retry on timeout return; } var resp = null ,success = Math.floor(xhr.status / 100) === 2; if (success) { if (NEXT_RETRY) { NEXT_RETRY = 0; onNetworkStateUpdated(true); } resp = xhr.response; try { resp = JSON.parse(/** @type {string} */ (resp)); } catch (e) { resp = null; } } else { if (NEXT_RETRY) { NEXT_RETRY += Math.floor((NEXT_RETRY || 5)/2); NEXT_RETRY = Math.min(60, NEXT_RETRY); } else { NEXT_RETRY = 5; onNetworkStateUpdated(false); } } callback(success, resp); } }; xhr.open('GET', 'api?v=' +SLACK.lastServerVersion, true); xhr.send(null); } /** * @param {boolean} success * @param {*} response **/ function onPollResponse(success, response) { if (success) { if (response) { SLACK.update(response); } startPolling(); } else { setTimeout(startPolling, NEXT_RETRY * 1000); } } function startPolling() { poll(onPollResponse); } /** * @param {SlackChan|SlackIms|SlackGroup} room **/ function selectRoom(room) { if (SELECTED_ROOM) unselectRoom(); document.getElementById(room.id).classList.add(R.klass.selected); document.body.classList.remove(R.klass.noRoomSelected); SELECTED_ROOM = room; onRoomSelected(); if (SELECTED_ROOM.lastRead && !SLACK.history[SELECTED_ROOM.id]) { fetchHistory(SELECTED_ROOM, function(success) { if (!success) { // TODO handle error } }); } } function unselectRoom() { document.getElementById(SELECTED_ROOM.id).classList.remove(R.klass.selected); } /** * @param {SlackChan|SlackGroup|SlackIms} chan * @param {string} msg **/ function sendMsg(chan, msg) { var xhr = new XMLHttpRequest(); xhr.open('POST', 'api/msg?room=' +chan.id +"&text=" +encodeURIComponent(msg), true); xhr.send(null); }