UNPKG

@apica-io/url-xi

Version:

URL Check for integrations and API monitoring

173 lines 7.51 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.setupAxiosHttpInterceptors = exports.hasHttpInterceptors = exports.addAxiosTiming = void 0; const https = __importStar(require("https")); const http = __importStar(require("http")); const url = __importStar(require("url")); const follow_redirects_1 = require("follow-redirects"); const performance_now_1 = __importDefault(require("performance-now")); const InterceptorManager = __importStar(require("axios/lib/core/InterceptorManager")); function addAxiosTiming(axios) { const axiosExt = setupAxiosHttpInterceptors(axios); const pending = []; axiosExt.interceptors.httpRequest.use((req) => { const timingStart = (0, performance_now_1.default)(); const timings = {}; const timingData = { timingStart, timings, }; pending.push({ req, timingData }); req.on('socket', (socket) => { timings.socket = (0, performance_now_1.default)() - timingStart; const isConnecting = socket._connecting || socket.connecting; if (!isConnecting) return; const onLookupTiming = () => { timings.lookup = (0, performance_now_1.default)() - timingStart; }; const onConnectTiming = () => { timings.connect = (0, performance_now_1.default)() - timingStart; }; const onSecureConnectTiming = () => { timings.secureConnect = (0, performance_now_1.default)() - timingStart; }; socket.once('lookup', onLookupTiming); socket.once('connect', onConnectTiming); socket.once('secureConnect', onSecureConnectTiming); // clean up timing event listeners if needed on error req.once('error', () => { socket.removeListener('lookup', onLookupTiming); socket.removeListener('connect', onConnectTiming); }); }); req.on('response', () => { timings.response = (0, performance_now_1.default)() - timingStart; }); // TODO: handle errors }); axiosExt.interceptors.response.use((resp) => { const i = pending.findIndex((entry) => entry.req._currentRequest === resp.request || entry.req === resp.request); if (i < 0) return resp; const timingData = pending.splice(i, 1)[0].timingData; addTimingData(timingData); return Object.assign(Object.assign({}, resp), timingData); }, function (error) { const resp = error.response; if (resp) { const i = pending.findIndex((entry) => entry.req._currentRequest === resp.request || entry.req === resp.request); if (i < 0) return resp; const timingData = pending.splice(i, 1)[0].timingData; addTimingData(timingData); return Object.assign(Object.assign({}, resp), timingData); } else { throw error; } }); } exports.addAxiosTiming = addAxiosTiming; function addTimingData(timingData) { timingData.timings.end = (0, performance_now_1.default)() - timingData.timingStart; // fill in the blanks for any periods that didn't trigger, such as // no lookup or connect due to keep alive if (!timingData.timings.socket) { timingData.timings.socket = 0; } if (!timingData.timings.lookup) { timingData.timings.lookup = timingData.timings.socket; } if (!timingData.timings.connect) { timingData.timings.connect = timingData.timings.lookup; } if (!timingData.timings.response) { timingData.timings.response = timingData.timings.connect; } } const SyncInterceptorManager = InterceptorManager.default; function hasHttpInterceptors(axios) { const interceptors = axios.interceptors; return Boolean(interceptors.httpRequest && interceptors.httpResponse); } exports.hasHttpInterceptors = hasHttpInterceptors; const isHttps = /https:?/; function setupAxiosHttpInterceptors(axios) { if (hasHttpInterceptors(axios)) return axios; const axiosExtended = axios; axiosExtended.interceptors.httpRequest = new SyncInterceptorManager(); axiosExtended.interceptors.httpResponse = new SyncInterceptorManager(); const requestInterceptors = axiosExtended.interceptors.request; requestInterceptors.use((config) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const parsed = url.parse(config.url); // tslint:disable-next-line:no-http-string const protocol = parsed.protocol || 'http:'; const proxy = config.proxy; const isHttpsRequest = isHttps.test(protocol); // tslint:disable-next-line:no-uninitialized let rawTransport; const isHttpsProxy = isHttpsRequest && (proxy ? isHttps.test(proxy.protocol || '') : true); let isFollow = false; if (config.transport) { rawTransport = config.transport; } else if (config.maxRedirects === 0) { rawTransport = isHttpsProxy ? https : http; } else { isFollow = true; rawTransport = isHttpsProxy ? follow_redirects_1.https : follow_redirects_1.http; } const transport = { request(options, requestCb) { if (isFollow && config.maxRedirects) { options.maxRedirects = config.maxRedirects; } let req = rawTransport.request(options, (res) => { requestCb(res); axiosExtended.interceptors.httpResponse.forEach((interceptor) => { if (interceptor.fulfilled) { // tslint:disable-next-line:no-parameter-reassignment res = interceptor.fulfilled(res) || res; } }); }); axiosExtended.interceptors.httpRequest.forEach((interceptor) => { if (interceptor.fulfilled) { req = interceptor.fulfilled(req) || req; } }); return req; }, }; return Object.assign(Object.assign({}, config), { transport }); }); return axiosExtended; } exports.setupAxiosHttpInterceptors = setupAxiosHttpInterceptors; //# sourceMappingURL=axios-timing.js.map