adapters.js 1.9 KB

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