Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | 6x 6x 6x 6x 6x 6x 6x 26x 26x 2x 2x 2x 2x 2x 1x 1x 24x 6x 25x 25x 4x 25x 25x 6x 4x 6x 5x 6x 9x 6x 16x 4x 2x 3x 7x 6x 6x 3x 3x 6x 6x 6x | import { BREADCRUMBTYPES, BREADCRUMBCATEGORYS } from '../common/constant'
import { logger, validateOption, getTimestamp, slientConsoleScope } from '../utils/index'
import { _support } from '../utils/global'
import { BreadcrumbPushData } from '../types/breadcrumb'
import { InitOptions } from '../types/options'
export class Breadcrumb {
private maxBreadcrumbs = 10
private beforePushBreadcrumb: unknown = null
private stack: BreadcrumbPushData[] = []
constructor() {}
/**
* 添加用户行为栈
*
* ../param {BreadcrumbPushData} data
* ../memberof Breadcrumb
*/
push(data: BreadcrumbPushData): void {
if (typeof this.beforePushBreadcrumb === 'function') {
let result: BreadcrumbPushData = null
// 如果用户输入console,并且logger是打开的会造成无限递归,
// 应该加入一个开关,执行这个函数前,把监听console的行为关掉
const beforePushBreadcrumb = this.beforePushBreadcrumb
slientConsoleScope(() => {
result = beforePushBreadcrumb(this, data)
})
if (!result) return
this.immediatePush(result)
return
}
this.immediatePush(data)
}
immediatePush(data: BreadcrumbPushData): void {
data.time = getTimestamp()
if (this.stack.length >= this.maxBreadcrumbs) {
this.shift()
}
this.stack.push(data)
logger.log(this.stack)
}
shift(): boolean {
return this.stack.shift() !== undefined
}
clear(): void {
this.stack = []
}
getStack(): BreadcrumbPushData[] {
return this.stack
}
getCategory(type: BREADCRUMBTYPES) {
switch (type) {
case BREADCRUMBTYPES.XHR:
case BREADCRUMBTYPES.FETCH:
return BREADCRUMBCATEGORYS.HTTP
case BREADCRUMBTYPES.CLICK:
case BREADCRUMBTYPES.ROUTE:
case BREADCRUMBTYPES.TAP:
case BREADCRUMBTYPES.TOUCHMOVE:
return BREADCRUMBCATEGORYS.USER
case BREADCRUMBTYPES.CUSTOMER:
case BREADCRUMBTYPES.CONSOLE:
return BREADCRUMBCATEGORYS.DEBUG
case BREADCRUMBTYPES.APP_ON_LAUNCH:
case BREADCRUMBTYPES.APP_ON_SHOW:
case BREADCRUMBTYPES.APP_ON_HIDE:
case BREADCRUMBTYPES.PAGE_ON_SHOW:
case BREADCRUMBTYPES.PAGE_ON_HIDE:
case BREADCRUMBTYPES.PAGE_ON_SHARE_APP_MESSAGE:
case BREADCRUMBTYPES.PAGE_ON_SHARE_TIMELINE:
case BREADCRUMBTYPES.PAGE_ON_TAB_ITEM_TAP:
return BREADCRUMBCATEGORYS.LIFECYCLE
case BREADCRUMBTYPES.UNHANDLEDREJECTION:
case BREADCRUMBTYPES.CODE_ERROR:
case BREADCRUMBTYPES.RESOURCE:
case BREADCRUMBTYPES.VUE:
case BREADCRUMBTYPES.REACT:
default:
return BREADCRUMBCATEGORYS.EXCEPTION
}
}
bindOptions(Ioptions: InitOptions = {}): void {
const { maxBreadcrumbs, beforePushBreadcrumb } = options
validateOption(maxBreadcrumbs, 'maxBreadcrumbs', 'number') && (this.maxBreadcrumbs = maxBreadcrumbs)
validateOption(beforePushBreadcrumb, 'beforePushBreadcrumb', 'function') && (this.beforePushBreadcrumb = beforePushBreadcrumb)
}
}
const breadcrumb = _support.breadcrumb || (_support.breadcrumb = new Breadcrumb())
export { breadcrumb }
|