Http.js 5.3 KB

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