@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>
80 lines (76 loc) • 2.75 kB
text/typescript
import { BrowserEventTypes, HttpTypes } from '@sdc-monitor/shared'
import { getTimestamp, replaceOld, _global } from '@sdc-monitor/utils'
import { BasePluginType, HttpCollectedType, HttpTransformedType, voidFun } from '@sdc-monitor/types'
import { BrowserClient } from '../browserClient'
import { httpTransform, httpTransformedDataConsumer } from './xhr'
const fetchPlugin: BasePluginType<BrowserEventTypes, BrowserClient> = {
name: BrowserEventTypes.FETCH,
monitor(notify) {
monitorFetch.call(this, notify)
},
transform(collectedData: HttpCollectedType) {
return httpTransform(collectedData)
},
consumer(transformedData: HttpTransformedType) {
httpTransformedDataConsumer.call(this, transformedData)
}
}
function monitorFetch(this: BrowserClient, notify: (eventName: BrowserEventTypes, data: any) => void) {
const { options, transport } = this
if (!('fetch' in _global)) {
return
}
replaceOld(_global, BrowserEventTypes.FETCH, (originalFetch: voidFun) => {
return function (url: string, config: Partial<Request> = {}): void {
const sTime = getTimestamp()
const method = (config && config.method) || 'GET'
const httpCollect: HttpCollectedType = {
request: {
httpType: HttpTypes.FETCH,
url,
method,
data: config && config.body
},
time: sTime,
response: {}
}
const headers = new Headers(config.headers || {})
Object.assign(headers, {
setRequestHeader: headers.set
})
options.setTraceId(url, (headerFieldName: string, traceId: string) => {
httpCollect.request.traceId = traceId
headers.set(headerFieldName, traceId)
})
options.beforeAppAjaxSend && options.beforeAppAjaxSend({ method, url }, headers)
config = {
...config,
headers
}
const isBlock = transport.isSelfDsn(url) || options.isFilterHttpUrl(url)
return originalFetch.apply(_global, [url, config]).then(
(res: Response) => {
const resClone = res.clone()
const eTime = getTimestamp()
httpCollect.elapsedTime = eTime - sTime
httpCollect.response.status = resClone.status
resClone.text().then((data) => {
if (isBlock) return
httpCollect.response.data = data
notify(BrowserEventTypes.FETCH, httpCollect)
})
return res
},
(err: Error) => {
if (isBlock) return
const eTime = getTimestamp()
httpCollect.elapsedTime = eTime - sTime
httpCollect.response.status = 0
notify(BrowserEventTypes.FETCH, httpCollect)
throw err
}
)
}
})
}
export default fetchPlugin