UNPKG

cp-axios

Version:

axios wrapper that provides an advanced cancellation api

55 lines (46 loc) 2.21 kB
const axios = require('axios'); const {CPromise} = require('c-promise2'); const {Axios} = axios; const isThenable = (thing) => thing && typeof thing.then === 'function'; const _setImmediate = typeof setImmediate === 'function' ? setImmediate : setTimeout; class CPAxios extends Axios { request(config) { if (typeof config === 'string') { config = arguments[1] || {}; config.url = arguments[0]; } const {cancelToken, signal, onDownloadProgress, onUploadProgress, ...axiosConfig} = config; if (cancelToken) { if (!isThenable(cancelToken.promise)) { return CPromise.reject(new Error('Unknown cancelToken object type')) } cancelToken.promise.then((reason) => { promise.cancel(reason.message); }) } const promise = new CPromise((resolve, reject, scope) => { _setImmediate(() => { const {isCaptured, isCanceled} = scope; if (isCanceled) return; super.request({ ...axiosConfig, onDownloadProgress: isCaptured ? /* istanbul ignore next */ function (event) { const {loaded, total} = event; scope.progress(0.5 + loaded / total / 2, {loaded, total, type: 'download'}); onDownloadProgress && onDownloadProgress(event); } : onDownloadProgress, onUploadProgress: isCaptured ? /* istanbul ignore next */ function (event) { const {loaded, total} = event; scope.progress(loaded / total / 2, {loaded, total, type: 'upload'}); onUploadProgress && onUploadProgress(event); } : onUploadProgress, cancelToken: new axios.CancelToken(function executor(cancel) { scope.onCancel(cancel) }), }).then(resolve, reject); }) }, {signal, nativeController: true}); return promise; } } module.exports = CPAxios;