82 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import utils from '../utils.js';
 | |
| import httpAdapter from './http.js';
 | |
| import xhrAdapter from './xhr.js';
 | |
| import * as fetchAdapter from './fetch.js';
 | |
| import AxiosError from "../core/AxiosError.js";
 | |
| 
 | |
| const knownAdapters = {
 | |
|   http: httpAdapter,
 | |
|   xhr: xhrAdapter,
 | |
|   fetch: {
 | |
|     get: fetchAdapter.getFetch,
 | |
|   }
 | |
| }
 | |
| 
 | |
| utils.forEach(knownAdapters, (fn, value) => {
 | |
|   if (fn) {
 | |
|     try {
 | |
|       Object.defineProperty(fn, 'name', {value});
 | |
|     } catch (e) {
 | |
|       // eslint-disable-next-line no-empty
 | |
|     }
 | |
|     Object.defineProperty(fn, 'adapterName', {value});
 | |
|   }
 | |
| });
 | |
| 
 | |
| const renderReason = (reason) => `- ${reason}`;
 | |
| 
 | |
| const isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;
 | |
| 
 | |
| export default {
 | |
|   getAdapter: (adapters, config) => {
 | |
|     adapters = utils.isArray(adapters) ? adapters : [adapters];
 | |
| 
 | |
|     const {length} = adapters;
 | |
|     let nameOrAdapter;
 | |
|     let adapter;
 | |
| 
 | |
|     const rejectedReasons = {};
 | |
| 
 | |
|     for (let i = 0; i < length; i++) {
 | |
|       nameOrAdapter = adapters[i];
 | |
|       let id;
 | |
| 
 | |
|       adapter = nameOrAdapter;
 | |
| 
 | |
|       if (!isResolvedHandle(nameOrAdapter)) {
 | |
|         adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];
 | |
| 
 | |
|         if (adapter === undefined) {
 | |
|           throw new AxiosError(`Unknown adapter '${id}'`);
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {
 | |
|         break;
 | |
|       }
 | |
| 
 | |
|       rejectedReasons[id || '#' + i] = adapter;
 | |
|     }
 | |
| 
 | |
|     if (!adapter) {
 | |
| 
 | |
|       const reasons = Object.entries(rejectedReasons)
 | |
|         .map(([id, state]) => `adapter ${id} ` +
 | |
|           (state === false ? 'is not supported by the environment' : 'is not available in the build')
 | |
|         );
 | |
| 
 | |
|       let s = length ?
 | |
|         (reasons.length > 1 ? 'since :\n' + reasons.map(renderReason).join('\n') : ' ' + renderReason(reasons[0])) :
 | |
|         'as no adapter specified';
 | |
| 
 | |
|       throw new AxiosError(
 | |
|         `There is no suitable adapter to dispatch the request ` + s,
 | |
|         'ERR_NOT_SUPPORT'
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     return adapter;
 | |
|   },
 | |
|   adapters: knownAdapters
 | |
| }
 |