workflow.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. var
  2. /**
  3. * @type {number} next period to wait before next retry in case of failure, in seconds
  4. **/
  5. NEXT_RETRY = 5
  6. /**
  7. * @type {SlackChan|SlackIms|SlackGroup}
  8. **/
  9. ,SELECTED_ROOM = null
  10. ;
  11. /**
  12. * @param {SlackChan|SlackIms|SlackGroup} room
  13. * @param {function(boolean)} cb
  14. **/
  15. function fetchHistory(room, cb) {
  16. var xhr = new XMLHttpRequest();
  17. xhr.open('GET', 'api?room=' +room.id, true);
  18. xhr.send(null);
  19. }
  20. function poll(callback) {
  21. var xhr = new XMLHttpRequest();
  22. xhr.timeout = 1000 * 60 * 1; // 3 min timeout
  23. xhr.onreadystatechange = function(e) {
  24. if (xhr.readyState === 4) {
  25. if (xhr.status === 0) {
  26. poll(callback); // retry on timeout
  27. NEXT_RETRY = 5;
  28. return;
  29. }
  30. var resp = null
  31. ,success = Math.floor(xhr.status / 100) === 2;
  32. if (success) {
  33. NEXT_RETRY = 5;
  34. resp = xhr.response;
  35. try {
  36. resp = JSON.parse(/** @type {string} */ (resp));
  37. } catch (e) {
  38. resp = null;
  39. }
  40. } else {
  41. NEXT_RETRY += Math.floor(NEXT_RETRY /2);
  42. NEXT_RETRY = Math.min(60, NEXT_RETRY);
  43. }
  44. callback(success, resp);
  45. }
  46. };
  47. xhr.open('GET', 'api?v=' +SLACK.lastServerVersion, true);
  48. xhr.send(null);
  49. }
  50. /**
  51. * @param {boolean} success
  52. * @param {*} response
  53. **/
  54. function onPollResponse(success, response) {
  55. if (success) {
  56. if (response) {
  57. SLACK.update(response);
  58. }
  59. startPolling();
  60. } else {
  61. setTimeout(startPolling, NEXT_RETRY * 1000);
  62. }
  63. }
  64. function startPolling() {
  65. poll(onPollResponse);
  66. }
  67. /**
  68. * @param {SlackChan|SlackIms|SlackGroup} room
  69. **/
  70. function selectRoom(room) {
  71. if (SELECTED_ROOM)
  72. unselectRoom();
  73. document.getElementById(room.id).classList.add(R.klass.selected);
  74. document.body.classList.remove(R.klass.noRoomSelected);
  75. SELECTED_ROOM = room;
  76. onRoomSelected();
  77. if (SELECTED_ROOM.lastRead && !SLACK.history[SELECTED_ROOM.id]) {
  78. fetchHistory(SELECTED_ROOM, function(success) {
  79. if (!success) {
  80. // TODO handle error
  81. }
  82. });
  83. }
  84. }
  85. function unselectRoom() {
  86. document.getElementById(SELECTED_ROOM.id).classList.remove(R.klass.selected);
  87. }