Http.js 4.5 KB

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