this repo has no description
at cactus 79 lines 2.3 kB view raw
1"use strict" 2class RequestError extends Error { 3 constructor(xhr) { 4 let data = xhr.response 5 if (data.title) 6 data = data.title 7 else if ('string'==typeof data && data.startsWith("Unhandled exception: ")) 8 data = data.replace(/^ at [^]* ---$/m, "...") 9 10 super(xhr.responseURL+" "+xhr.status+" "+xhr.statusText+"\n"+data) 11 12 this.stack = this.stack.replace(/^RequestError@.*\n/, "") 13 } 14} 15RequestError.prototype.name = 'RequestError' 16 17let server = "qcs.shsbs.xyz/api" 18 19async function request(endpoint, data, cb) { 20 let last = performance.now() 21 function report(str) { 22 let now = performance.now() 23 let diff = now-last 24 //last = now 25 cb(diff, str) 26 //console.log(diff.toFixed(0), str) 27 } 28 return await {then:y=>{ 29 let x = new XMLHttpRequest() 30 x.open('POST', "https://"+server+"/"+endpoint) 31 x.setRequestHeader('CACHE-CONTROL', "L, ratio, no-store, no-cache, must-revalidate") 32 //x.setRequestHeader('AUTHORIZATION', "Bearer "+Req.auth) 33 x.upload.addEventListener('progress', ev=>{ 34 //last_time = ev.timeStamp 35 report("preflight finished") 36 }, {once:true, passive:true}) 37 let last_size = 0 38 let last_time = 0 39 x.onprogress = ev=>{ 40 let size_change = ev.loaded-last_size 41 let time_change = ev.timeStamp-last_time 42 let speed = (size_change*8/1000)/(time_change/1000) 43 last_size = ev.loaded 44 last_time = ev.timeStamp 45 report("downloaded "+(ev.loaded/1000).toFixed(1)+"kB ("+speed.toFixed(0)+" kbps)") 46 } 47 x.onreadystatechange = ev=>{ 48 switch (x.readyState) { 49 case XMLHttpRequest.HEADERS_RECEIVED: 50 report("got headers") 51 let type = x.getResponseHeader('Content-Type') 52 if (/[\/+]json(;| |$)/i.test(type)) 53 x.responseType = 'json' 54 break 55 case XMLHttpRequest.DONE: 56 report("finished") 57 if (x.status==200) 58 y(x.response) 59 else 60 throw new RequestError(x) 61 break 62 default: 63 //report("state change "+x.readyState) 64 } 65 } 66 report("starting request") 67 x.send(new Blob([JSON.stringify(data)], {type: "application/json;charset=UTF-8"})) 68 }} 69} 70 71async function load_data(requests) { 72 $xhr_time.textContent = "" 73 let data = await request('request', {values:{true:true},requests}, (t,m)=>{ 74 $xhr_time.textContent += "\n"+(t/1000).toFixed(2)+"sec: "+m 75 }) 76 console.log('got', data) 77 let lmm = data.objects 78 return lmm 79}