index.js.map 24 KB

1
  1. {"version":3,"file":"index.js","sources":["../src/utils/index.js","../src/constants/error/index.js","../src/utils/mina.adapter.js","../src/mina.js"],"sourcesContent":["import { isArray } from \"./types/index\";\nimport { parseLink } from './url/index';\nimport { CDNQUALITY } from '../constants/config/index';\n\nexport const emptyFunction = () => {};\n// https://developer.mozilla.org/zh-CN/docs/Web/API/Network_Information_API\n// http://www.honglei.net/?p=340\nexport const processStackMsg = error => {\n let stack = error.stack\n .replace(/\\n/gi, '')\n .replace(/\\bat\\b/gi, '@')\n .split('@')\n .slice(0, 9)\n .map(v => v.replace(/^\\s*|\\s*$/g, ''))\n .join('~')\n .replace(/\\?[^:]+/gi, '');\n const msg = error.toString();\n if (stack.indexOf(msg) < 0) {\n stack = `${msg}@${stack}`;\n }\n return stack;\n};\nexport const getUrlParam = ({ name, url = window.location.href }) => {\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\n var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\n results = regex.exec(url);\n if (!results) {\n return '';\n }\n if (!results[2]) {\n return '';\n }\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n};\nexport const getCookie = name => {\n var nameEQ = encodeURIComponent(name) + '=';\n var ca = document.cookie.split(';');\n for (var i = 0; i < ca.length; i++) {\n var c = ca[i];\n while (c.charAt(0) === ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0)\n return decodeURIComponent(c.substring(nameEQ.length, c.length));\n }\n\n return null;\n};\nexport const isReport = (sampling = 1) => Math.random() <= sampling;\nexport const debounce = (func, delay, callback) => {\n let timer = null;\n return function(...rest) {\n const context = this;\n clearTimeout(timer);\n timer = setTimeout(function() {\n func.apply(context, rest);\n !callback || callback();\n }, delay);\n };\n};\nexport const formatParams = data => {\n const arr = [];\n for (const name in data) {\n arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));\n }\n return arr.join('&');\n};\n\nexport const doReport = ({ baseUrl, data, method = 'GET' }) => {\n if (method === 'GET') {\n let img = new Image();\n img.onload = img.onerror = () => {\n img = null;\n };\n img.src = `${baseUrl}&${formatParams(data)}`;\n } else if (method === 'POST') {\n try {\n var _xmlhttp = null;\n if (window.XMLHttpRequest) {\n _xmlhttp = new XMLHttpRequest();\n } else {\n _xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');\n }\n _xmlhttp.open('POST', baseUrl, true);\n _xmlhttp.setRequestHeader(\n 'Content-type',\n 'application/x-www-form-urlencoded',\n );\n _xmlhttp.send(formatParams(data));\n } catch (err) {\n console.warn('xmlhttp error', err);\n }\n }\n};\n\nexport const isNumeric = n => {\n return !isNaN(parseFloat(n)) && isFinite(n);\n};\n\nexport const transformRc = source => {\n const returnedArr = [];\n if (isArray(source)) {\n source.forEach(function(item) {\n let returnedVal = {};\n for (let sr in item) {\n if (CDNQUALITY[sr]) {\n returnedVal[CDNQUALITY[sr]] = item[sr];\n if (CDNQUALITY[sr] === 'resurl') {\n const { hostname, path } = parseLink(item[sr]);\n returnedVal.reshost = hostname;\n returnedVal.respath = path;\n returnedVal.httpcode = 200;\n }\n }\n }\n returnedArr.push(returnedVal);\n })\n }\n return returnedArr;\n}","// 定义的错误类型码\nexport const ERROR_RUNTIME = 'runtime';\nexport const ERROR_SCRIPT = 'script';\nexport const ERROR_STYLE = 'link';\nexport const ERROR_IMAGE = 'img';\nexport const ERROR_AUDIO = 'audio';\nexport const ERROR_VIDEO = 'video';\nexport const ERROR_CONSOLE = 'console';\nexport const ERROR_TRY_CATCH = 'trycatch';\nexport const ERROR_FETCH = 'fetch';\nexport const ERROR_AJAX = 'ajax';\nexport const ERROR_PROMISE = 'promise';\n\nexport const ERRORTYPES = {\n SCRIPT: ERROR_SCRIPT,\n LINK: ERROR_STYLE,\n IMG: ERROR_IMAGE,\n AUDIO: ERROR_AUDIO,\n VIDEO: ERROR_VIDEO,\n FETCH: ERROR_FETCH,\n AJAX: ERROR_AJAX,\n PROMISE: ERROR_PROMISE,\n};\n","// import { formatParams } from './utils';\n\nexport const doReport = ({ baseUrl, data, method = 'GET' }) => {\n wx.request({\n url: baseUrl,\n method: method,\n data: Object.assign({}, data),\n header: {\n 'content-type': 'application/x-www-form-urlencoded'\n },\n success: function (res) {\n console.log('emonitor数据上报成功', data)\n },\n fail: function () {\n console.log('emonitor数据上报失败')\n }\n })\n};\n\n// 生成uuid\nfunction genUuid() {\n var s = [];\n var hexDigits = \"0123456789abcdef\";\n for (var i = 0; i < 36; i++) {\n s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);\n }\n s[14] = \"4\"; // bits 12-15 of the time_hi_and_version field to 0010\n s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01\n s[8] = s[13] = s[18] = s[23] = \"-\";\n\n var uuid = s.join(\"\");\n return uuid;\n}\n\n// 获取openid\nexport const getUuId = () => {\n\n // storage中存有openid\n let value = wx.getStorageSync('openid')\n if (value) {\n return value\n }\n\n // storage中存有uuid\n let pecker_uuid = 'pecker_uuid'\n let uuid = wx.getStorageSync(pecker_uuid)\n if (uuid) {\n return uuid\n }\n\n uuid = genUuid()\n wx.setStorageSync(pecker_uuid, uuid)\n return uuid\n\n};\n\nexport const getUrlParam = ({ name, url }) => {\n const pages = getCurrentPages()\n const page = pages[pages.length - 1]\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\n return page ? decodeURIComponent(page.options[name]) : '';\n};\n\n// 将参数序列化\nexport const param2String = (rest) => {\n let res = []\n rest.map((item) => {\n if (typeof item == 'object') {\n res.push(JSON.stringify(item))\n }\n else {\n res.push(item)\n }\n })\n return res\n}\n","// 小程序上报方案:\n// 1、代理console.error\n// 2、代理wx.request(网络错误、业务错误-约定接口返回规范)\n// 3、代理各API的fail函数\n// 4、wx.onError与App onError\n\nimport { isReport, debounce } from './utils/index.js';\nimport { ERRORTYPES } from './constants/error/index';\nimport { doReport, getUuId, getUrlParam, param2String } from './utils/mina.adapter.js';\n\nconst logger = wx.getLogManager()\n\nclass MinaMonitor {\n constructor({\n options = {},\n baseUrl = {},\n openid,\n codekey, // 自定义http请求返回码key\n sampling = 1,\n delay = 2000,\n name,\n params = [],\n }, ctx) {\n this.options = options;\n this.errorList = [];\n this.baseUrl = baseUrl;\n this.sampling = sampling;\n this.params = params;\n this.dealy = delay;\n this.name = name;\n this.openid = openid\n this.codekey = codekey\n this.uuid = getUuId()\n this.ctx = ctx\n this.sysInfo = wx.getSystemInfoSync()\n }\n init() {\n try {\n this.proxyRequest();\n this.proxyLifeCycle();\n this.proxyConsole();\n this.injectOptions()\n } catch (err) {\n this.send({\n err_msg: 'mina emonitor init happen error',\n err_stack: `${err}`,\n err_function: 'mina emonitor init func',\n err_desc: `${err}`,\n err_type: 'jserror',\n err_code: ``\n }, this.baseUrl.error);\n }\n }\n config(opts = {}) {// 重载option\n for (const op in opts) {\n this[op] = opts[op]\n }\n return this;\n }\n getPureOption(option) { // 获取非函数字段的option\n let res = {}\n for (let key in option) {\n if (typeof option[key] != 'function') {\n res[key] = option[key]\n }\n }\n\n return res\n }\n proxyRequest() {\n const context = this\n const apis = ['request', 'downloadFile']\n apis.map((api) => {\n const nativeApi = wx[api]\n\n Object.defineProperty(wx, api, {\n writeable: true,\n configurable: true,\n enumerable: true,\n value: function(...rest) {\n const option = rest[0]\n \n const fail = option.fail\n rest[0].fail = (...rest1) => {\n if (option.url.indexOf(context.baseUrl.error) == -1) { // 上报自身不处理\n context.send({\n err_msg: `wx.${api} error`,\n err_stack: `${JSON.stringify(context.getPureOption(option))}`,\n err_function: `wx.${api} fail callback`,\n err_desc: `${rest1[0].errMsg}`,\n err_type: `${ERRORTYPES.AJAX}`,\n err_code: `[wx.${api}]fail`\n }, context.baseUrl.error, true);\n }\n return fail ? fail.apply(this, rest1) : null\n }\n\n const success = option.success\n rest[0].success = (...rest1) => {\n if (option.url.indexOf(context.baseUrl.error) == -1) { // 上报自身不处理\n if (rest1[0].statusCode != 200) { // 请求错误上报\n context.send({\n err_msg: `wx.${api} error`,\n err_stack: `${JSON.stringify(context.getPureOption(option))}`,\n err_function: `wx.${api} success callback`,\n err_desc: `${rest1[0].data}`,\n err_type: `${ERRORTYPES.AJAX}`,\n err_code: `[wx.${api}][statusCode]${rest1[0].statusCode}`\n }, context.baseUrl.error, true);\n }\n else { // 业务错误上报\n let data = rest1[0].data\n if (data) {\n let code = data.ret || data.code || data[context.codekey] // 返回码字段\n if (typeof code != 'undefined' && code) { // 业务请求出错\n context.send({\n err_msg: `wx.${api} error`,\n err_stack: `${JSON.stringify(context.getPureOption(option))}`,\n err_function: `wx.${api} success callback`,\n err_desc: `${JSON.stringify(data)}`,\n err_type: `${ERRORTYPES.AJAX}`,\n err_code: `[wx.${api}][httpsCode]${code}`\n }, context.baseUrl.error, true);\n }\n }\n }\n }\n return success ? success.apply(this, rest1) : null\n }\n\n return nativeApi.apply(this, rest)\n }\n })\n })\n }\n proxyLifeCycle() {\n const context = this\n const oriApp = App\n App = function(opt) {\n opt.__emonitor__ = opt.__emonitor__ || {} // 注入emonitor变量\n\n const app_onError = opt.onError\n opt.onError = function(...rest) {\n context.send({\n err_msg: `mina script error or api execute error`,\n err_stack: `${rest[0]}`,\n err_function: `App onError`,\n err_desc: ``,\n err_type: `jserror`,\n err_code: ``\n }, context.baseUrl.error, true);\n \n return app_onError ? app_onError.apply(this, rest) : null\n }\n\n const app_onLaunch = opt.onLaunch\n opt.onLaunch = function(...rest) {\n opt.__emonitor__.launch = +new Date\n \n return app_onLaunch ? app_onLaunch.apply(this, rest) : null\n }\n\n const app_onShow = opt.onShow\n opt.onShow = function(...rest) {\n if (opt.__emonitor__.launch) {\n opt.__emonitor__.show = +new Date\n if (opt.__emonitor__.launch) {\n opt.__emonitor__.launchTime = opt.__emonitor__.show - opt.__emonitor__.launch\n }\n opt.__emonitor__.launch = 0\n }\n\n return app_onShow ? app_onShow.apply(this, rest) : null\n }\n\n oriApp(opt)\n }\n\n const oriPage = Page\n Page = function (opt) {\n var app = new getApp()\n opt.__emonitor__ = opt.__emonitor__ || {} // 注入emonitor变量\n\n const page_onLoad = opt.onLoad\n opt.onLoad = function(...rest) {\n opt.__emonitor__.load = +new Date\n\n return page_onLoad ? page_onLoad.apply(this, rest) : null\n }\n\n const page_onShow = opt.onShow\n opt.onShow = function(...rest) {\n if (opt.__emonitor__.load) {\n opt.__emonitor__.show = +new Date\n }\n\n return page_onShow ? page_onShow.apply(this, rest) : null\n }\n\n const page_onReady = opt.onReady\n opt.onReady = function(...rest) {\n if (opt.__emonitor__.load) {\n opt.__emonitor__.ready = +new Date\n context.send({\n time_domready: opt.__emonitor__.ready - opt.__emonitor__.load,\n time7: opt.__emonitor__.show - opt.__emonitor__.load,\n time8: app.__emonitor__.launchTime\n }, context.baseUrl.page)\n\n opt.__emonitor__.load = 0\n }\n\n return page_onReady ? page_onReady.apply(this, rest) : null\n }\n\n oriPage(opt)\n }\n }\n proxyConsole() {\n const context = this;\n if (typeof console !== 'undefined' && typeof console.error === 'function' && this.sysInfo.platform != 'devtools') {\n const nativeConsoleError = console.error;\n const nativeConsoleLog = console.log;\n \n console.error = (...rest) => {\n nativeConsoleError.apply(this, rest);\n context.send({\n err_msg: param2String(rest).join(','),\n err_stack: ``,\n err_function: `console.error`,\n err_desc: ``,\n err_type: 'console',\n err_code: ``\n }, context.baseUrl.error);\n\n logger.warn(`[${context.openid ? context.openid : context.uuid}]`, param2String(rest).join(' '))\n };\n\n console.log = (...rest) => {\n nativeConsoleLog.apply(this, rest);\n\n logger.debug(`[${context.openid ? context.openid : context.uuid}]`, param2String(rest).join(' '))\n };\n }\n }\n injectOptions() {\n const context = this;\n const params = context.params;\n params.forEach(name => {\n context.options[name] = getUrlParam({\n name,\n });\n });\n if (\n typeof context.options.qq === 'string' &&\n context.options.qq.length > 0\n ) {\n context.options.openid = '';\n }\n }\n send(data = {}, url, flag = false) {\n const context = this;\n const { err_type = 'console' } = data;\n if (isReport(context.sampling)) {\n const context = this;\n const delayTime = err_type === 'jserror' ? 300 : context.delay;\n const debounceReport = debounce(doReport, delayTime, () => {\n context.errorList = [];\n });\n const pages = getCurrentPages()\n const page = pages[pages.length - 1] || {}\n const sysInfo = this.sysInfo\n const account = wx.getAccountInfoSync()\n const ua = `${sysInfo.model};${sysInfo.system};${sysInfo.brand};${sysInfo.platform};BatteryLevel:${sysInfo.batteryLevel};MicroMessenger/${sysInfo.version};SDK/${sysInfo.SDKVersion};Language/${sysInfo.language}`\n const mergeData = Object.assign({}, this.options, data, {\n timestamps: new Date().getTime(),\n url: page.route,\n ua: ua,\n _dc: Math.random(),\n dtime: new Date().getTime(),\n hh_ua: ua,\n hh_uav: sysInfo.version,\n hh_ref: `https://servicewechat.com/${account.miniProgram.appId}/${sysInfo.SDKVersion}/page-frame.html`,\n s_url: page.route,\n s_host: `wxapp.${context.name}`,\n s_path: page.route,\n s_protocol: 'https',\n s_browser: 'MicroMessenger MiniProgram',\n s_os: sysInfo.system,\n s_qq: '',\n s_uuid: this.uuid,\n s_openid: this.openid || this.uuid,\n s_app: context.name,\n });\n debounceReport({\n baseUrl: url,\n data: mergeData,\n method: flag ? 'POST' : 'GET',\n });\n }\n }\n}\n\nconst create = ({\n // 默认选项\n options = {},\n baseUrl,\n delay = 2000,\n openid,\n codekey,\n sampling = 1, //采样上报\n name = 'news_miniapp',\n // 从url中截取那些字段上报\n params = ['qq', 'openid', 'tbkt', 'ft', 'pushid'],\n} = {}, ctx) => {\n const monitorIns = new MinaMonitor({\n options,\n baseUrl,\n params,\n delay,\n openid,\n codekey,\n name,\n sampling, //采样上报\n }, ctx);\n monitorIns.init();\n return monitorIns;\n};\nexport {\n create\n};"],"names":["isReport","sampling","Math","random","debounce","func","delay","callback","timer","rest","context","this","clearTimeout","setTimeout","apply","ERRORTYPES","SCRIPT","LINK","IMG","AUDIO","VIDEO","FETCH","AJAX","PROMISE","doReport","baseUrl","data","method","wx","request","url","Object","assign","header","content-type","success","res","console","log","fail","getUuId","value","getStorageSync","uuid","s","i","substr","floor","join","genUuid","setStorageSync","getUrlParam","name","pages","getCurrentPages","page","length","replace","decodeURIComponent","options","param2String","map","item","push","JSON","stringify","logger","getLogManager","openid","codekey","params","ctx","monitorIns","[object Object]","errorList","dealy","sysInfo","getSystemInfoSync","proxyRequest","proxyLifeCycle","proxyConsole","injectOptions","err","send","err_msg","err_stack","err_function","err_desc","err_type","err_code","error","opts","op","option","key","api","nativeApi","defineProperty","writeable","configurable","enumerable","rest1","indexOf","getPureOption","errMsg","statusCode","code","ret","oriApp","App","opt","__emonitor__","app_onError","onError","app_onLaunch","onLaunch","launch","Date","app_onShow","onShow","show","launchTime","oriPage","Page","app","getApp","page_onLoad","onLoad","load","page_onShow","page_onReady","onReady","ready","time_domready","time7","time8","platform","nativeConsoleError","nativeConsoleLog","warn","debug","forEach","qq","flag","delayTime","debounceReport","account","getAccountInfoSync","ua","model","system","brand","batteryLevel","version","SDKVersion","language","timestamps","getTime","route","_dc","dtime","hh_ua","hh_uav","hh_ref","miniProgram","appId","s_url","s_host","s_path","s_protocol","s_browser","s_os","s_qq","s_uuid","s_openid","s_app","init"],"mappings":"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"}