@datadog/browser-logs
Version:
73 lines • 3.24 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.startNetworkErrorCollection = startNetworkErrorCollection;
const browser_core_1 = require("@datadog/browser-core");
const isAuthorized_1 = require("../logger/isAuthorized");
function startNetworkErrorCollection(configuration, lifeCycle) {
if (!configuration.forwardErrorsToLogs) {
return { stop: browser_core_1.noop };
}
// XHR is not available in web workers, so we use an empty observable that never emits
const xhrSubscription = (browser_core_1.isWorkerEnvironment ? new browser_core_1.Observable() : (0, browser_core_1.initXhrObservable)(configuration)).subscribe((context) => {
if (context.state === 'complete') {
handleResponse(browser_core_1.RequestType.XHR, context);
}
});
const fetchSubscription = (0, browser_core_1.initFetchObservable)({
responseBodyAction: (context) => (isNetworkError(context) ? 2 /* ResponseBodyAction.COLLECT */ : 0 /* ResponseBodyAction.IGNORE */),
}).subscribe((context) => {
if (context.state === 'resolve') {
handleResponse(browser_core_1.RequestType.FETCH, context);
}
});
function isNetworkError(request) {
return !(0, browser_core_1.isIntakeUrl)(request.url) && (isRejected(request) || (0, browser_core_1.isServerError)(request.status));
}
function handleResponse(type, request) {
if (!isNetworkError(request)) {
return;
}
const stack = 'error' in request && request.error
? (0, browser_core_1.toStackTraceString)((0, browser_core_1.computeStackTrace)(request.error))
: request.responseBody || 'Failed to load';
const domainContext = {
isAborted: request.isAborted,
handlingStack: request.handlingStack,
};
lifeCycle.notify(0 /* LifeCycleEventType.RAW_LOG_COLLECTED */, {
rawLogsEvent: {
message: `${format(type)} error ${request.method} ${request.url}`,
date: request.startClocks.timeStamp,
error: {
stack: (0, browser_core_1.safeTruncate)(stack, configuration.requestErrorResponseLengthLimit, '...'),
// We don't know if the error was handled or not, so we set it to undefined
handling: undefined,
},
http: {
method: request.method, // Cast resource method because of case mismatch cf issue RUMF-1152
status_code: request.status,
url: request.url,
},
status: isAuthorized_1.StatusType.error,
origin: browser_core_1.ErrorSource.NETWORK,
},
domainContext,
});
}
return {
stop: () => {
xhrSubscription.unsubscribe();
fetchSubscription.unsubscribe();
},
};
}
function isRejected(request) {
return request.status === 0 && request.responseType !== 'opaque';
}
function format(type) {
if (browser_core_1.RequestType.XHR === type) {
return 'XHR';
}
return 'Fetch';
}
//# sourceMappingURL=networkErrorCollection.js.map