opusdev/vector-similarity-api
1
1import utils from '../utils.js';2import settle from '../core/settle.js';3import transitionalDefaults from '../defaults/transitional.js';4import AxiosError from '../core/AxiosError.js';5import CanceledError from '../cancel/CanceledError.js';6import parseProtocol from '../helpers/parseProtocol.js';7import platform from '../platform/index.js';8import AxiosHeaders from '../core/AxiosHeaders.js';9import {progressEventReducer} from '../helpers/progressEventReducer.js';10import resolveConfig from "../helpers/resolveConfig.js";11 12const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';13 14export default isXHRAdapterSupported && function (config) {15 return new Promise(function dispatchXhrRequest(resolve, reject) {16 const _config = resolveConfig(config);17 let requestData = _config.data;18 const requestHeaders = AxiosHeaders.from(_config.headers).normalize();19 let {responseType, onUploadProgress, onDownloadProgress} = _config;20 let onCanceled;21 let uploadThrottled, downloadThrottled;22 let flushUpload, flushDownload;23 24 function done() {25 flushUpload && flushUpload(); // flush events26 flushDownload && flushDownload(); // flush events27 28 _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);29 30 _config.signal && _config.signal.removeEventListener('abort', onCanceled);31 }32 33 let request = new XMLHttpRequest();34 35 request.open(_config.method.toUpperCase(), _config.url, true);36 37 // Set the request timeout in MS38 request.timeout = _config.timeout;39 40 function onloadend() {41 if (!request) {42 return;43 }44 // Prepare the response45 const responseHeaders = AxiosHeaders.from(46 'getAllResponseHeaders' in request && request.getAllResponseHeaders()47 );48 const responseData = !responseType || responseType === 'text' || responseType === 'json' ?49 request.responseText : request.response;50 const response = {51 data: responseData,52 status: request.status,53 statusText: request.statusText,54 headers: responseHeaders,55 config,56 request57 };58 59 settle(function _resolve(value) {60 resolve(value);61 done();62 }, function _reject(err) {63 reject(err);64 done();65 }, response);66 67 // Clean up request68 request = null;69 }70 71 if ('onloadend' in request) {72 // Use onloadend if available73 request.onloadend = onloadend;74 } else {75 // Listen for ready state to emulate onloadend76 request.onreadystatechange = function handleLoad() {77 if (!request || request.readyState !== 4) {78 return;79 }80 81 // The request errored out and we didn't get a response, this will be82 // handled by onerror instead83 // With one exception: request that using file: protocol, most browsers84 // will return status as 0 even though it's a successful request85 if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {86 return;87 }88 // readystate handler is calling before onerror or ontimeout handlers,89 // so we should call onloadend on the next 'tick'90 setTimeout(onloadend);91 };92 }93 94 // Handle browser request cancellation (as opposed to a manual cancellation)95 request.onabort = function handleAbort() {96 if (!request) {97 return;98 }99 100 reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));101 102 // Clean up request103 request = null;104 };105 106 // Handle low level network errors107 request.onerror = function handleError(event) {108 // Browsers deliver a ProgressEvent in XHR onerror109 // (message may be empty; when present, surface it)110 // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event111 const msg = event && event.message ? event.message : 'Network Error';112 const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);113 // attach the underlying event for consumers who want details114 err.event = event || null;115 reject(err);116 request = null;117 };118 119 // Handle timeout120 request.ontimeout = function handleTimeout() {121 let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';122 const transitional = _config.transitional || transitionalDefaults;123 if (_config.timeoutErrorMessage) {124 timeoutErrorMessage = _config.timeoutErrorMessage;125 }126 reject(new AxiosError(127 timeoutErrorMessage,128 transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,129 config,130 request));131 132 // Clean up request133 request = null;134 };135 136 // Remove Content-Type if data is undefined137 requestData === undefined && requestHeaders.setContentType(null);138 139 // Add headers to the request140 if ('setRequestHeader' in request) {141 utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {142 request.setRequestHeader(key, val);143 });144 }145 146 // Add withCredentials to request if needed147 if (!utils.isUndefined(_config.withCredentials)) {148 request.withCredentials = !!_config.withCredentials;149 }150 151 // Add responseType to request if needed152 if (responseType && responseType !== 'json') {153 request.responseType = _config.responseType;154 }155 156 // Handle progress if needed157 if (onDownloadProgress) {158 ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));159 request.addEventListener('progress', downloadThrottled);160 }161 162 // Not all browsers support upload events163 if (onUploadProgress && request.upload) {164 ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));165 166 request.upload.addEventListener('progress', uploadThrottled);167 168 request.upload.addEventListener('loadend', flushUpload);169 }170 171 if (_config.cancelToken || _config.signal) {172 // Handle cancellation173 // eslint-disable-next-line func-names174 onCanceled = cancel => {175 if (!request) {176 return;177 }178 reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);179 request.abort();180 request = null;181 };182 183 _config.cancelToken && _config.cancelToken.subscribe(onCanceled);184 if (_config.signal) {185 _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);186 }187 }188 189 const protocol = parseProtocol(_config.url);190 191 if (protocol && platform.protocols.indexOf(protocol) === -1) {192 reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));193 return;194 }195 196 197 // Send the request198 request.send(requestData || null);199 });200}201 