123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- function createBrowserXhrRequester() {
- return {
- send(request) {
- return new Promise((resolve) => {
- const baseRequester = new XMLHttpRequest();
- baseRequester.open(request.method, request.url, true);
- Object.keys(request.headers).forEach(key => baseRequester.setRequestHeader(key, request.headers[key]));
- const createTimeout = (timeout, content) => {
- return setTimeout(() => {
- baseRequester.abort();
- resolve({
- status: 0,
- content,
- isTimedOut: true,
- });
- }, timeout * 1000);
- };
- const connectTimeout = createTimeout(request.connectTimeout, 'Connection timeout');
- // eslint-disable-next-line functional/no-let
- let responseTimeout;
- // eslint-disable-next-line functional/immutable-data
- baseRequester.onreadystatechange = () => {
- if (baseRequester.readyState > baseRequester.OPENED && responseTimeout === undefined) {
- clearTimeout(connectTimeout);
- responseTimeout = createTimeout(request.responseTimeout, 'Socket timeout');
- }
- };
- // eslint-disable-next-line functional/immutable-data
- baseRequester.onerror = () => {
- // istanbul ignore next
- if (baseRequester.status === 0) {
- clearTimeout(connectTimeout);
- clearTimeout(responseTimeout);
- resolve({
- content: baseRequester.responseText || 'Network request failed',
- status: baseRequester.status,
- isTimedOut: false,
- });
- }
- };
- // eslint-disable-next-line functional/immutable-data
- baseRequester.onload = () => {
- clearTimeout(connectTimeout);
- clearTimeout(responseTimeout);
- resolve({
- content: baseRequester.responseText,
- status: baseRequester.status,
- isTimedOut: false,
- });
- };
- baseRequester.send(request.data);
- });
- },
- };
- }
- export { createBrowserXhrRequester };
|