this repo has no description
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}