function httpRequestCoreAsync()

in share/src/components/util.ts [56:115]


function httpRequestCoreAsync(options: HttpRequestOptions) {
    return new Promise<HttpResponse>((resolve, reject) => {
        let client: XMLHttpRequest;
        let resolved = false

        let headers = { ...options.headers }

        client = new XMLHttpRequest();
        if (options.responseArrayBuffer)
            client.responseType = "arraybuffer";
        client.onreadystatechange = () => {
            if (resolved) return // Safari/iOS likes to call this thing more than once

            if (client.readyState == 4) {
                resolved = true
                let res: HttpResponse = {
                    statusCode: client.status,
                    headers: {},
                    buffer: (client as any).responseBody || client.response,
                    text: options.responseArrayBuffer ? undefined : client.responseText,
                }
                const allHeaders = client.getAllResponseHeaders();
                allHeaders.split(/\r?\n/).forEach(l => {
                    let m = /^\s*([^:]+): (.*)/.exec(l)
                    if (m) res.headers[m[1].toLowerCase()] = m[2]
                })
                resolve(res)
            }
        }

        let data = options.data
        let method = options.method || (data == null ? "GET" : "POST");

        let buf: any;

        if (data == null) {
            buf = null
        } else if (data instanceof Uint8Array) {
            buf = data
        } else if (typeof data == "object") {
            buf = JSON.stringify(data)
            headers["content-type"] = "application/json; charset=utf8"
        } else if (typeof data == "string") {
            buf = data
        } else {
            throw new Error("bad data");
        }

        client.open(method, options.url);

        Object.keys(headers).forEach(k => {
            client.setRequestHeader(k, headers[k])
        })

        if (buf == null)
            client.send();
        else
            client.send(buf);
    })
}