UNPKG

1.32 kBJavaScriptView Raw
1export default function(url, options) {
2 options = options || {};
3 return new Promise( (resolve, reject) => {
4 const request = new XMLHttpRequest();
5 const keys = [];
6 const all = [];
7 const headers = {};
8
9 const response = () => ({
10 ok: (request.status/100|0) == 2, // 200-299
11 statusText: request.statusText,
12 status: request.status,
13 url: request.responseURL,
14 text: () => Promise.resolve(request.responseText),
15 json: () => Promise.resolve(request.responseText).then(JSON.parse),
16 blob: () => Promise.resolve(new Blob([request.response])),
17 clone: response,
18 headers: {
19 keys: () => keys,
20 entries: () => all,
21 get: n => headers[n.toLowerCase()],
22 has: n => n.toLowerCase() in headers
23 }
24 });
25
26 request.open(options.method || 'get', url, true);
27
28 request.onload = () => {
29 request.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm, (m, key, value) => {
30 keys.push(key = key.toLowerCase());
31 all.push([key, value]);
32 headers[key] = headers[key] ? `${headers[key]},${value}` : value;
33 });
34 resolve(response());
35 };
36
37 request.onerror = reject;
38
39 request.withCredentials = options.credentials=='include';
40
41 for (const i in options.headers) {
42 request.setRequestHeader(i, options.headers[i]);
43 }
44
45 request.send(options.body || null);
46 });
47}