UNPKG

@sdc-monitor/demo

Version:

<div align="center"> <a href="#" target="_blank"> <img src="https://i.loli.net/2021/07/28/EvPwd4NjVH3tBfO.jpg" alt="mito-logo" height="90"> </a> <p>A Lightweight SDK For Monitor Web</p>

94 lines (87 loc) 2.83 kB
import { BrowserBreadcrumbTypes, BrowserEventTypes, ErrorTypes, ERROR_TYPE_RE } from '@sdc-monitor/shared' import { extractErrorStack, getLocationHref, getTimestamp, interceptStr, isError, on, Severity, _global } from '@sdc-monitor/utils' import { BasePluginType, ReportDataType } from '@sdc-monitor/types' import { BrowserClient } from '../browserClient' import { addBreadcrumbInBrowser } from '../utils' export interface ResourceErrorTarget { src?: string href?: string localName?: string } const errorPlugin: BasePluginType<BrowserEventTypes, BrowserClient> = { name: BrowserEventTypes.ERROR, monitor(notify) { on( _global, 'error', function (e: ErrorEvent) { notify(BrowserEventTypes.ERROR, e) }, true ) }, transform(errorEvent: ErrorEvent) { const target = errorEvent.target as ResourceErrorTarget if (target.localName) { // resource error return resourceTransform(errorEvent.target as ResourceErrorTarget) } // code error return codeErrorTransform(errorEvent) }, consumer(transformedData: ReportDataType) { const type = transformedData.type === ErrorTypes.RESOURCE ? BrowserBreadcrumbTypes.RESOURCE : BrowserBreadcrumbTypes.CODE_ERROR const breadcrumbStack = addBreadcrumbInBrowser.call(this, transformedData, type, Severity.Error) this.transport.send(transformedData, breadcrumbStack) } } const resourceMap = { img: '图片', script: 'JS脚本' } function resourceTransform(target: ResourceErrorTarget) { return { type: ErrorTypes.RESOURCE, url: getLocationHref(), message: '资源地址: ' + (interceptStr(target.src, 120) || interceptStr(target.href, 120)), level: Severity.Low, time: getTimestamp(), name: `${resourceMap[target.localName] || target.localName}加载失败` } } function codeErrorTransform(errorEvent: ErrorEvent) { const { message, filename, lineno, colno, error } = errorEvent let result: ReportDataType if (error && isError(error)) { result = extractErrorStack(error, Severity.Normal) } result || (result = handleNotErrorInstance(message, filename, lineno, colno)) result.type = ErrorTypes.JAVASCRIPT return result } function handleNotErrorInstance(message: string, filename: string, lineno: number, colno: number) { let name: string | ErrorTypes = ErrorTypes.UNKNOWN const url = filename || getLocationHref() let msg = message const matches = message.match(ERROR_TYPE_RE) if (matches[1]) { name = matches[1] msg = matches[2] } const element = { url, func: ErrorTypes.UNKNOWN_FUNCTION, args: ErrorTypes.UNKNOWN, line: lineno, col: colno } return { url, name, message: msg, level: Severity.Normal, time: getTimestamp(), stack: [element] } } export default errorPlugin