123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- const log$b = new Logger("http");
- class Http extends EventEmitter {
- async get({url: e, useIndexedDb: t=!1, timeout: r=15e3, key: n, isOutPutObjectURL: o=!0}) {
- if (Xverse$1.NO_CACHE !== void 0 && (t = !Xverse$1.NO_CACHE),
- t)
- if (isIndexedDbSupported()) {
- window.performance.now();
- let a = null;
- try {
- a = await modelTable.query("url", e)
- } catch (s) {
- return log$b.debug(s),
- log$b.warn("cache query error", e),
- Promise.resolve(e)
- }
- if (a && a.model) {
- const s = dataURItoBlob(a.model)
- , l = Promise.resolve(o ? URL.createObjectURL(s) : s);
- return window.performance.now(),
- l
- } else
- return this.request({
- url: e,
- timeout: r,
- contentType: "blob",
- key: n
- }).then(async s=>{
- const l = await blobToDataURI(s.response);
- try {
- await modelTable.put({
- url: e,
- model: l
- })
- } catch (u) {
- log$b.warn("unable to add data to indexedDB", u)
- }
- return Promise.resolve(o ? URL.createObjectURL(s.response) : s.response)
- }
- )
- } else
- return this.request({
- url: e,
- timeout: r,
- contentType: "blob",
- key: n
- }).then(a=>{
- const s = a.response;
- return Promise.resolve(o ? URL.createObjectURL(s) : s)
- }
- ).catch(a=>Promise.reject(a));
- else
- return this.request({
- url: e,
- timeout: r,
- key: n
- }).then(a=>a.getResponseHeader("content-type") === "application/json" ? Promise.resolve(JSON.parse(a.responseText)) : Promise.resolve(a.responseText))
- }
- request(e) {
- const {timeout: t=3e4, contentType: r, key: n, onRequestStart: o} = e
- , {url: a} = e;
- return new Promise((s,l)=>{
- window.performance.now();
- const u = new XMLHttpRequest;
- r && (u.responseType = r),
- u.timeout = t,
- u.addEventListener("readystatechange", ()=>{
- if (u.readyState == 4) {
- if (u.status == 200)
- return window.performance.now(),
- this.emit("loadend", {
- message: `request ${a} load success`
- }),
- s(u);
- {
- const c = `Unable to load the request ${a}`;
- return this.emit("error", {
- message: c
- }),
- log$b.error(c),
- l(c)
- }
- }
- }
- ),
- o && o(u),
- u.open("GET", a),
- u.send()
- }
- )
- }
- }
- const http = new Http
- , isIndexedDbSupported = ()=>(window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB) !== void 0
- , blobToDataURI = async i=>new Promise((e,t)=>{
- const r = new FileReader;
- r.readAsDataURL(i),
- r.onload = function(n) {
- var o;
- e((o = n.target) == null ? void 0 : o.result)
- }
- ,
- r.onerror = function(n) {
- t(n)
- }
- }
- )
- , dataURItoBlob = i=>{
- let e;
- i.split(",")[0].indexOf("base64") >= 0 ? e = atob(i.split(",")[1]) : e = unescape(i.split(",")[1]);
- const t = i.split(",")[0].split(":")[1].split(";")[0]
- , r = new Uint8Array(e.length);
- for (let o = 0; o < e.length; o++)
- r[o] = e.charCodeAt(o);
- return new Blob([r],{
- type: t
- })
- }
- , urlMap = new Map
- , urlTransformer = async(i,e=!1)=>typeof i != "string" ? (console.warn("url transformer error", i),
- i) : i.startsWith("blob:") ? i : e ? http.get({
- url: i,
- useIndexedDb: !0,
- key: "url",
- isOutPutObjectURL: !1
- }) : urlMap.has(i) ? urlMap.get(i) : http.get({
- url: i,
- useIndexedDb: !0,
- key: "url"
- }).then(t=>(urlMap.set(i, t),
- t));
|