UNPKG

perimeterx-axios-interceptor

Version:

🧱 Intercept requests which are blocked by PerimeterX - pop up the challenge and retry the request

83 lines (73 loc) • 2.45 kB
const isPXResponse = require('../isPXResponse'); const openModal = require('../openModal'); const stack = require('../stack'); /** * Handle status codes that falls outside the range of 2xx * @param error AxiosError thrown by non 2xx responses * @returns Promise.reject<error> */ module.exports = function rejected(error) { const { axios, filter, onintercept, onignore, onsuccess, onfailure, onerror, simulate, modalConfig } = this; return new Promise( ((resolve, reject) => { try { const { response = {} } = error; const { data, status } = response; if (status !== 403 || !isPXResponse(data)) { reject(error); return; } const filtered = filter(Object.assign( {}, data, { path: error.config && error.config.url } )); if (!filtered) { error.ignored = true; onignore(error.config); reject(error); return; } onintercept(error.config); // Simulate mode - report only if (simulate) { reject(error); return; } const shouldOpenModal = stack.size === 0; // Go back to start, collect 200 const resolution = (rejection) => rejection ? reject(rejection) || onfailure(error.config, rejection) : axios(error.config).then(resolve).catch(reject) && onsuccess(error.config) ; stack.enqueue(resolution); shouldOpenModal && openModal(data, modalConfig).then( () => stack.release() ).catch( (error) => stack.release(error) ); } catch (_) { reject(error); _.toJSON = () => ({ message: _.message, stack: _.stack, code: 'AXIOS_INTERCEPTOR_ERROR', config: JSON.stringify(error.config) }); onerror(_); } }) ); };