nio.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. (function() {
  2. singlefile.nio = {};
  3. singlefile.nio.RequestManager = function() {
  4. var cache = {}, keys = [], pendingResponseHandlers = {}, XHR_TIMEOUT = 45000;
  5. function sendResponses(key) {
  6. if (pendingResponseHandlers[key]) {
  7. pendingResponseHandlers[key].forEach(function(callback) {
  8. callback(cache[key]);
  9. });
  10. delete pendingResponseHandlers[key];
  11. }
  12. }
  13. function arrayBufferToBase64(buffer) {
  14. var binary, bytes, len, i;
  15. binary = "";
  16. if (buffer) {
  17. bytes = new Uint8Array(buffer);
  18. len = bytes.byteLength;
  19. for (i = 0; i < len; i++) {
  20. binary += String.fromCharCode(bytes[i]);
  21. }
  22. }
  23. return btoa(binary);
  24. }
  25. this.reset = function() {
  26. cache = {};
  27. keys = [];
  28. };
  29. this.send = function(url, responseHandler, characterSet, mediaTypeParam) {
  30. var xhr, timeout, key = JSON.stringify({
  31. url : url,
  32. characterSet : characterSet,
  33. mediaTypeParam : mediaTypeParam
  34. });
  35. if (cache[key])
  36. setTimeout(function() {
  37. responseHandler(cache[key]);
  38. }, 1);
  39. else if (pendingResponseHandlers[key])
  40. pendingResponseHandlers[key].push(responseHandler);
  41. else {
  42. pendingResponseHandlers[key] = [ responseHandler ];
  43. xhr = new XMLHttpRequest();
  44. xhr.onload = function() {
  45. clearTimeout(timeout);
  46. cache[key] = {
  47. url : url,
  48. status : xhr.status,
  49. mediaType : xhr.getResponseHeader("Content-Type"),
  50. content : mediaTypeParam == "base64" ? arrayBufferToBase64(xhr.response) : xhr.responseText,
  51. mediaTypeParam : mediaTypeParam
  52. };
  53. keys.push(key);
  54. sendResponses(key);
  55. };
  56. xhr.onerror = function() {
  57. cache[key] = {};
  58. keys.push(key);
  59. sendResponses(key);
  60. };
  61. xhr.open("GET", url, true);
  62. if (mediaTypeParam == "base64") {
  63. xhr.responseType = "arraybuffer";
  64. }
  65. timeout = setTimeout(function() {
  66. xhr.abort();
  67. sendResponses(key);
  68. }, XHR_TIMEOUT);
  69. try {
  70. xhr.send(null);
  71. } catch (e) {
  72. sendResponses(key);
  73. }
  74. }
  75. };
  76. };
  77. })();