requester-browser-xhr.esm.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. function createBrowserXhrRequester() {
  2. return {
  3. send(request) {
  4. return new Promise((resolve) => {
  5. const baseRequester = new XMLHttpRequest();
  6. baseRequester.open(request.method, request.url, true);
  7. Object.keys(request.headers).forEach(key => baseRequester.setRequestHeader(key, request.headers[key]));
  8. const createTimeout = (timeout, content) => {
  9. return setTimeout(() => {
  10. baseRequester.abort();
  11. resolve({
  12. status: 0,
  13. content,
  14. isTimedOut: true,
  15. });
  16. }, timeout * 1000);
  17. };
  18. const connectTimeout = createTimeout(request.connectTimeout, 'Connection timeout');
  19. // eslint-disable-next-line functional/no-let
  20. let responseTimeout;
  21. // eslint-disable-next-line functional/immutable-data
  22. baseRequester.onreadystatechange = () => {
  23. if (baseRequester.readyState > baseRequester.OPENED && responseTimeout === undefined) {
  24. clearTimeout(connectTimeout);
  25. responseTimeout = createTimeout(request.responseTimeout, 'Socket timeout');
  26. }
  27. };
  28. // eslint-disable-next-line functional/immutable-data
  29. baseRequester.onerror = () => {
  30. // istanbul ignore next
  31. if (baseRequester.status === 0) {
  32. clearTimeout(connectTimeout);
  33. clearTimeout(responseTimeout);
  34. resolve({
  35. content: baseRequester.responseText || 'Network request failed',
  36. status: baseRequester.status,
  37. isTimedOut: false,
  38. });
  39. }
  40. };
  41. // eslint-disable-next-line functional/immutable-data
  42. baseRequester.onload = () => {
  43. clearTimeout(connectTimeout);
  44. clearTimeout(responseTimeout);
  45. resolve({
  46. content: baseRequester.responseText,
  47. status: baseRequester.status,
  48. isTimedOut: false,
  49. });
  50. };
  51. baseRequester.send(request.data);
  52. });
  53. },
  54. };
  55. }
  56. export { createBrowserXhrRequester };