UNPKG

@datadog/browser-logs

Version:
70 lines 3 kB
import { isWorkerEnvironment, Observable, ErrorSource, initXhrObservable, RequestType, initFetchObservable, computeStackTrace, toStackTraceString, noop, isServerError, isIntakeUrl, safeTruncate, } from '@datadog/browser-core'; import { StatusType } from '../logger/isAuthorized'; export function startNetworkErrorCollection(configuration, lifeCycle) { if (!configuration.forwardErrorsToLogs) { return { stop: noop }; } // XHR is not available in web workers, so we use an empty observable that never emits const xhrSubscription = (isWorkerEnvironment ? new Observable() : initXhrObservable(configuration)).subscribe((context) => { if (context.state === 'complete') { handleResponse(RequestType.XHR, context); } }); const fetchSubscription = initFetchObservable({ responseBodyAction: (context) => (isNetworkError(context) ? 2 /* ResponseBodyAction.COLLECT */ : 0 /* ResponseBodyAction.IGNORE */), }).subscribe((context) => { if (context.state === 'resolve') { handleResponse(RequestType.FETCH, context); } }); function isNetworkError(request) { return !isIntakeUrl(request.url) && (isRejected(request) || isServerError(request.status)); } function handleResponse(type, request) { if (!isNetworkError(request)) { return; } const stack = 'error' in request && request.error ? toStackTraceString(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: 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: StatusType.error, origin: ErrorSource.NETWORK, }, domainContext, }); } return { stop: () => { xhrSubscription.unsubscribe(); fetchSubscription.unsubscribe(); }, }; } function isRejected(request) { return request.status === 0 && request.responseType !== 'opaque'; } function format(type) { if (RequestType.XHR === type) { return 'XHR'; } return 'Fetch'; } //# sourceMappingURL=networkErrorCollection.js.map