Http.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. //const log$b = new Logger("http");
  2. import {logger} from "./Logger.js"
  3. import Xverse from "./Xverse.js"
  4. import {modelTable} from "./ModelTable.js"
  5. class Http extends EventEmitter {
  6. async get({url: e, useIndexedDb: t=!1, timeout: r=15e3, key: n, isOutPutObjectURL: o=!0}) {
  7. if (Xverse.NO_CACHE !== void 0 && (t = !Xverse.NO_CACHE),
  8. t)
  9. if (isIndexedDbSupported()) {
  10. window.performance.now();
  11. let a = null;
  12. try {
  13. a = await modelTable.query("url", e)
  14. } catch (s) {
  15. return logger.debug(s),
  16. logger.warn("cache query error", e),
  17. Promise.resolve(e)
  18. }
  19. if (a && a.model) {
  20. const s = dataURItoBlob(a.model)
  21. , l = Promise.resolve(o ? URL.createObjectURL(s) : s);
  22. return window.performance.now(),
  23. l
  24. } else
  25. return this.request({
  26. url: e,
  27. timeout: r,
  28. contentType: "blob",
  29. key: n
  30. }).then(async s=>{
  31. const l = await blobToDataURI(s.response);
  32. try {
  33. await modelTable.put({
  34. url: e,
  35. model: l
  36. })
  37. } catch (u) {
  38. logger.warn("unable to add data to indexedDB", u)
  39. }
  40. return Promise.resolve(o ? URL.createObjectURL(s.response) : s.response)
  41. }
  42. )
  43. } else
  44. return this.request({
  45. url: e,
  46. timeout: r,
  47. contentType: "blob",
  48. key: n
  49. }).then(a=>{
  50. const s = a.response;
  51. return Promise.resolve(o ? URL.createObjectURL(s) : s)
  52. }
  53. ).catch(a=>Promise.reject(a));
  54. else
  55. return this.request({
  56. url: e,
  57. timeout: r,
  58. key: n
  59. }).then(a=>a.getResponseHeader("content-type") === "application/json" ? Promise.resolve(JSON.parse(a.responseText)) : Promise.resolve(a.responseText))
  60. }
  61. request(e) {
  62. const {timeout: t=3e4, contentType: r, key: n, onRequestStart: o} = e
  63. , {url: a} = e;
  64. return new Promise((s,l)=>{
  65. window.performance.now();
  66. const u = new XMLHttpRequest;
  67. r && (u.responseType = r),
  68. u.timeout = t,
  69. u.addEventListener("readystatechange", ()=>{
  70. if (u.readyState == 4) {
  71. if (u.status == 200)
  72. return window.performance.now(),
  73. this.emit("loadend", {
  74. message: `request ${a} load success`
  75. }),
  76. s(u);
  77. {
  78. const c = `Unable to load the request ${a}`;
  79. return this.emit("error", {
  80. message: c
  81. }),
  82. logger.error(c),
  83. l(c)
  84. }
  85. }
  86. }
  87. ),
  88. o && o(u),
  89. u.open("GET", a),
  90. u.send()
  91. }
  92. )
  93. }
  94. }
  95. const http = new Http();
  96. export { http };
  97. // const http = new Http
  98. // , isIndexedDbSupported = ()=>(window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB) !== void 0
  99. // , blobToDataURI = async i=>new Promise((e,t)=>{
  100. // const r = new FileReader;
  101. // r.readAsDataURL(i),
  102. // r.onload = function(n) {
  103. // var o;
  104. // e((o = n.target) == null ? void 0 : o.result)
  105. // }
  106. // ,
  107. // r.onerror = function(n) {
  108. // t(n)
  109. // }
  110. // }
  111. // )
  112. // , dataURItoBlob = i=>{
  113. // let e;
  114. // i.split(",")[0].indexOf("base64") >= 0 ? e = atob(i.split(",")[1]) : e = unescape(i.split(",")[1]);
  115. // const t = i.split(",")[0].split(":")[1].split(";")[0]
  116. // , r = new Uint8Array(e.length);
  117. // for (let o = 0; o < e.length; o++)
  118. // r[o] = e.charCodeAt(o);
  119. // return new Blob([r],{
  120. // type: t
  121. // })
  122. // }
  123. // , urlMap = new Map
  124. // , urlTransformer = async(i,e=!1)=>typeof i != "string" ? (console.warn("url transformer error", i),
  125. // i) : i.startsWith("blob:") ? i : e ? http.get({
  126. // url: i,
  127. // useIndexedDb: !0,
  128. // key: "url",
  129. // isOutPutObjectURL: !1
  130. // }) : urlMap.has(i) ? urlMap.get(i) : http.get({
  131. // url: i,
  132. // useIndexedDb: !0,
  133. // key: "url"
  134. // }).then(t=>(urlMap.set(i, t),
  135. // t));