UNPKG

@datadog/browser-logs

Version:
73 lines 3.24 kB
"use strict"; 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