adapters.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import utils from '../utils.js';
  2. import httpAdapter from './http.js';
  3. import xhrAdapter from './xhr.js';
  4. import * as fetchAdapter from './fetch.js';
  5. import AxiosError from "../core/AxiosError.js";
  6. const knownAdapters = {
  7. http: httpAdapter,
  8. xhr: xhrAdapter,
  9. fetch: {
  10. get: fetchAdapter.getFetch,
  11. }
  12. }
  13. utils.forEach(knownAdapters, (fn, value) => {
  14. if (fn) {
  15. try {
  16. Object.defineProperty(fn, 'name', {value});
  17. } catch (e) {
  18. // eslint-disable-next-line no-empty
  19. }
  20. Object.defineProperty(fn, 'adapterName', {value});
  21. }
  22. });
  23. const renderReason = (reason) => `- ${reason}`;
  24. const isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;
  25. export default {
  26. getAdapter: (adapters, config) => {
  27. adapters = utils.isArray(adapters) ? adapters : [adapters];
  28. const {length} = adapters;
  29. let nameOrAdapter;
  30. let adapter;
  31. const rejectedReasons = {};
  32. for (let i = 0; i < length; i++) {
  33. nameOrAdapter = adapters[i];
  34. let id;
  35. adapter = nameOrAdapter;
  36. if (!isResolvedHandle(nameOrAdapter)) {
  37. adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];
  38. if (adapter === undefined) {
  39. throw new AxiosError(`Unknown adapter '${id}'`);
  40. }
  41. }
  42. if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {
  43. break;
  44. }
  45. rejectedReasons[id || '#' + i] = adapter;
  46. }
  47. if (!adapter) {
  48. const reasons = Object.entries(rejectedReasons)
  49. .map(([id, state]) => `adapter ${id} ` +
  50. (state === false ? 'is not supported by the environment' : 'is not available in the build')
  51. );
  52. let s = length ?
  53. (reasons.length > 1 ? 'since :\n' + reasons.map(renderReason).join('\n') : ' ' + renderReason(reasons[0])) :
  54. 'as no adapter specified';
  55. throw new AxiosError(
  56. `There is no suitable adapter to dispatch the request ` + s,
  57. 'ERR_NOT_SUPPORT'
  58. );
  59. }
  60. return adapter;
  61. },
  62. adapters: knownAdapters
  63. }