in extensions/applicationinsights-dependencies-js/src/ajax.ts [815:876]
function _findPerfResourceEntry(initiatorType:string, ajaxData:ajaxRecord, trackCallback:() => void, reportError:(e:any) => void): void {
let perfMark = ajaxData.perfMark;
let performance = getPerformance();
let maxAttempts = _config.maxAjaxPerfLookupAttempts;
let retryDelay = _config.ajaxPerfLookupDelay;
let requestUrl = ajaxData.requestUrl;
let attempt = 0;
(function locateResourceTiming() {
try {
if (performance && perfMark) {
attempt++;
let perfTiming:PerformanceResourceTiming = null;
let entries = performance.getEntries();
for (let lp = entries.length - 1; lp >= 0; lp--) {
let entry:PerformanceEntry = entries[lp];
if (entry) {
if (entry.entryType === "resource") {
if ((entry as PerformanceResourceTiming).initiatorType === initiatorType &&
(_indexOf(entry.name, requestUrl) !== -1 || _indexOf(requestUrl, entry.name) !== -1)) {
perfTiming = entry as PerformanceResourceTiming;
}
} else if (entry.entryType === "mark" && entry.name === perfMark.name) {
// We hit the start event
ajaxData.perfTiming = perfTiming;
break;
}
if (entry.startTime < perfMark.startTime - 1000) {
// Fallback to try and reduce the time spent looking for the perf entry
break;
}
}
}
}
if (!perfMark || // - we don't have a perfMark or
ajaxData.perfTiming || // - we have not found the perf entry or
attempt >= maxAttempts || // - we have tried too many attempts or
ajaxData.async === false) { // - this is a sync request
if (perfMark && isFunction(performance.clearMarks)) {
// Remove the mark so we don't fill up the performance resources too much
performance.clearMarks(perfMark.name);
}
ajaxData.perfAttempts = attempt;
// just continue and report the track event
trackCallback();
} else {
// We need to wait for the browser to populate the window.performance entry
// This needs to be at least 1ms as waiting <= 1 (on firefox) is not enough time for fetch or xhr,
// this is a scheduling issue for the browser implementation
setTimeout(locateResourceTiming, retryDelay);
}
} catch (e) {
reportError(e);
}
})();
}