@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>
154 lines (146 loc) • 4.48 kB
text/typescript
import { logger, Queue, isInclude, createErrorId, isEmpty, validateOptionsAndSet } from '@sdc-monitor/utils'
import { SDK_NAME, SDK_VERSION, ToStringTypes } from '@sdc-monitor/shared'
import { AuthInfo, BaseOptionsFieldsIntegrationType, BreadcrumbPushData, ReportDataType, TransportDataType } from '@sdc-monitor/types'
/**
* 传输数据抽象类
*
* @export
* @abstract
* @class BaseTransport
* @template O
*/
export abstract class BaseTransport<O extends BaseOptionsFieldsIntegrationType = BaseOptionsFieldsIntegrationType> {
apikey = ''
dsn = ''
queue: Queue
beforeDataReport: Promise<TransportDataType | null | undefined | boolean> | TransportDataType | any | null | undefined | boolean = null
backTrackerId: unknown = null
configReportUrl: unknown = null
maxDuplicateCount = 3
constructor() {
this.queue = new Queue()
}
/**
* 获取当前SDK信息
*
* @return {*} {AuthInfo}
* @memberof BaseTransport
*/
getAuthInfo(): AuthInfo {
const trackerId = this.getTrackerId()
const result: AuthInfo = {
trackerId: String(trackerId),
sdkVersion: SDK_VERSION,
sdkName: SDK_NAME,
apikey: this.apikey
}
return result
}
/**
* 获取hooks中返回的trackId,没有就返回''
*
* @return {*} {(string | number)}
* @memberof BaseTransport
*/
getTrackerId(): string | number {
if (typeof this.backTrackerId === 'function') {
const trackerId = this.backTrackerId()
if (typeof trackerId === 'string' || typeof trackerId === 'number') {
return trackerId
} else {
logger.error(`trackerId:${trackerId} 期望 string 或 number 类型,但是传入 ${typeof trackerId}`)
}
}
return ''
}
/**
* 判断当前url是不是你配置的dsn
*
* @param {string} targetUrl
* @return {*} {boolean}
* @memberof BaseTransport
*/
isSelfDsn(targetUrl: string): boolean {
return this.dsn && isInclude(targetUrl, this.dsn)
}
/**
* 绑定配置项
*
* @param {Partial<O>} [options={}]
* @memberof BaseTransport
*/
bindOptions(options: Partial<O> = {}): void {
const { dsn, beforeDataReport, apikey, maxDuplicateCount, backTrackerId, configReportUrl } = options
const functionType = ToStringTypes.Function
const optionArr = [
[apikey, 'apikey', ToStringTypes.String],
[dsn, 'dsn', ToStringTypes.String],
[maxDuplicateCount, 'maxDuplicateCount', ToStringTypes.Number],
[beforeDataReport, 'beforeDataReport', functionType],
[backTrackerId, 'backTrackerId', functionType],
[configReportUrl, 'configReportUrl', functionType]
]
validateOptionsAndSet.call(this, optionArr)
}
/**
* 发送数据到服务端
*
* @param {*} data
* @param {BreadcrumbPushData[]} breadcrumb
* @return {*}
* @memberof BaseTransport
*/
async send(data: any, breadcrumb: BreadcrumbPushData[] = []): Promise<void> {
// 如果是埋点则不需要生成errorId
if (!data.isTrack) {
const errorId = createErrorId(data, this.apikey, this.maxDuplicateCount)
if (!errorId) return
data.errorId = errorId
}
let transportData = {
...this.getTransportData(data),
breadcrumb
}
if (typeof this.beforeDataReport === 'function') {
transportData = await this.beforeDataReport(transportData)
if (!transportData) return
}
let dsn = this.dsn
if (isEmpty(dsn)) {
logger.error('dsn is empty,pass in when initializing please')
return
}
if (typeof this.configReportUrl === 'function') {
dsn = this.configReportUrl(transportData, dsn)
if (!dsn) return
}
return this.sendToServer(transportData, dsn)
}
/**
* post方式,子类需要重写
*
* @abstract
* @param {(TransportDataType | any)} data
* @param {string} url
* @memberof BaseTransport
*/
abstract post(data: TransportDataType | any, url: string): void
/**
* 最终上报到服务器的方法,需要子类重写
*
* @abstract
* @param {(TransportDataType | any)} data
* @param {string} url
* @memberof BaseTransport
*/
abstract sendToServer(data: TransportDataType | any, url: string): void
/**
* 获取上报的格式
*
* @abstract
* @param {ReportDataType} data
* @return {TransportDataType} {TransportDataType}
* @memberof BaseTransport
*/
abstract getTransportData(data: ReportDataType): TransportDataType
}