@apica-io/url-xi
Version:
URL Check for integrations and API monitoring
173 lines • 7.51 kB
JavaScript
;
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