@heimdallr-sdk/wx
Version:
A SDK For Monitoring wechat applet
2 lines (1 loc) • 9.12 kB
JavaScript
var t,e=((t=e||{}).NAME="@heimdallr-sdk",t);const s="[@heimdallr-sdk]:";var n=(t=>(t[t.FATAL=1]="FATAL",t[t.ERROR=2]="ERROR",t[t.WARN=3]="WARN",t[t.INFO=4]="INFO",t[t.DEBUG=5]="DEBUG",t))(n||{}),i=(t=>(t.SESSION_ID="HEIMDALLR_SDK_SESSION_ID",t.USER_ID="HEIMDALLR_SDK_USER_ID",t.APP="HEIMDALLR_SDK_APP_ID",t))(i||{}),o=(t=>(t.GET="GET",t.POST="POST",t.PUT="PUT",t.DELETE="DELETE",t))(o||{}),r=(t=>(t[t.LIFECYCLE=1]="LIFECYCLE",t[t.ERROR=2]="ERROR",t[t.PERFORMANCE=3]="PERFORMANCE",t[t.API=4]="API",t[t.DOM=5]="DOM",t[t.ROUTE=6]="ROUTE",t[t.CONSOLE=7]="CONSOLE",t[t.RECORD=8]="RECORD",t[t.VUE=9]="VUE",t[t.CUSTOMER=10]="CUSTOMER",t[t.EXTEND=11]="EXTEND",t))(r||{}),a=(t=>(t[t.BEACON=1]="BEACON",t[t.IMG=2]="IMG",t[t.GET=3]="GET",t[t.POST=4]="POST",t))(a||{}),c=(t=>(t.LOG="log",t.INFO="info",t.WARN="warn",t.ERROR="error",t.ASSERT="assert",t))(c||{}),h=(t=>(t[t.XHR=41]="XHR",t[t.FETCH=42]="FETCH",t))(h||{}),l=(t=>(t[t.HASH=61]="HASH",t[t.HISTORY=62]="HISTORY",t))(l||{}),u=(t=>(t.LOCAL="local",t.SESSION="session",t.COOKIE="cookie",t.GLOBAL="global",t))(u||{}),E=(t=>(t[t.LOAD=11]="LOAD",t[t.UNLOAD=12]="UNLOAD",t))(E||{}),p=(t=>(t[t.MOBILE=1]="MOBILE",t[t.PC=2]="PC",t))(p||{}),d=(t=>(t[t.BROWSER=1]="BROWSER",t[t.WECHAT=2]="WECHAT",t[t.NODE=3]="NODE",t))(d||{}),O=(t=>(t[t.ROUTE=11]="ROUTE",t[t.CLICK=12]="CLICK",t[t.CONSOLE=13]="CONSOLE",t[t.XHR=14]="XHR",t[t.FETCH=15]="FETCH",t[t.UNHANDLEDREJECTION=16]="UNHANDLEDREJECTION",t[t.RESOURCE=17]="RESOURCE",t[t.CODE_ERROR=18]="CODE_ERROR",t[t.CUSTOMER=19]="CUSTOMER",t[t.FRAMEWORK=20]="FRAMEWORK",t[t.LIFECYCLE=21]="LIFECYCLE",t[t.CRASH=22]="CRASH",t))(O||{}),R=(t=>(t[t.API=21]="API",t[t.ROUTE=22]="ROUTE",t[t.CLICK=23]="CLICK",t[t.ERROR=24]="ERROR",t[t.LIFECYCLE=25]="LIFECYCLE",t[t.CUSTOMER=26]="CUSTOMER",t))(R||{});const f=(t,e)=>`${/^http(s|):\/\//.test(t||"")?t:`//${(t||"").replace(/^http(s|):\/\//,"")}`}/${"/"===(e||"")[0]?e.substring(1):e}`,x=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(t=>{const e=16*Math.random()|0;return("x"===t?e:3&e|8).toString(16)})),C=(t,e,s,n)=>{if(void 0!==t&&(e in t||n)){const n=s(t[e]);"function"==typeof n&&(t[e]=n)}};class g{constructor(){this.dep=new Map}watch(t,e){const s=this.dep.get(t);s?this.dep.set(t,s.concat(e)):this.dep.set(t,[e])}notify(t,e){const s=this.dep.get(t);t&&s&&s.forEach((t=>{try{t(e)}catch(t){console.error(t)}}))}}var S=Object.defineProperty,T=Object.getOwnPropertySymbols,m=Object.prototype.hasOwnProperty,A=Object.prototype.propertyIsEnumerable,w=(t,e,s)=>e in t?S(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s,y=(t,e)=>{for(var s in e||(e={}))m.call(e,s)&&w(t,s,e[s]);if(T)for(var s of T(e))A.call(e,s)&&w(t,s,e[s]);return t};class b{constructor(t){this.options=t,this.initConsole(),this.isRightEnv()?(this.bindOptions(),this.isReady=!1,this.taskQueue=[],this.initAPP().then((t=>{t&&this.appID!==t&&(this.appID=t),this.isReady=!0,this.executeTaskQueue()}))):console.warn(s,"Client does not match the environment")}initConsole(){const{debug:t}=this.options;t&&"undefined"!=typeof console||Object.keys(c).forEach((t=>{console[t]=()=>null}))}bindOptions(){const{dsn:t,app:e,debug:n=!1,enabled:i=!0}=this.options;if(!e||!t)return void console.warn(s,"Missing app or dsn in options");const{host:o,init:r,report:a=""}=t,c=f(o,r),h=f(o,a);this.context={app:e,uploadUrl:h,initUrl:c,debug:n,enabled:i}}use(t){const{uploadUrl:e,enabled:s}=this.context,n=new g,i=new Map;for(const o of t){const{name:t,monitor:r,transform:a}=o||{};if(!t||!r){console.warn("The plugin missing name or monitor.");continue}if(i.has(t)){console.warn(`The plugin name [${t}] is duplicate, please modify it.`);continue}i.set(t,1);try{r.call(this,n.notify.bind(n,t))}catch(t){console.error(t)}const c=(...t)=>{const n="function"==typeof a?a.apply(this,t):t;if(!n)return;const i=this.transform(n);i&&s&&(this.isReady?this.nextTick(this.report,this,e,y({aid:this.appID},i)):this.taskQueue.push(i))};n.watch(t,c)}}executeTaskQueue(){const{uploadUrl:t}=this.context;for(;this.taskQueue.length;){const e=this.taskQueue.shift();this.nextTick(this.report,this,t,y({aid:this.appID},e))}}getClientOptions(){return y({},this.options)}getContext(){return y({},this.context)}}class I{constructor(t={}){this.maxBreadcrumbs=t.maxBreadcrumbs||80,this.stack=[]}unshift(t){return t.l||(t.l=n.INFO),this.stack.length>=this.maxBreadcrumbs&&this.pop(),this.stack.unshift(t),this.stack.sort(((t,e)=>e.t-t.t)),this.stack}pop(){return void 0!==this.stack.pop()}clear(){this.stack=[]}getStack(){return this.stack.slice(0)}}var L=(t=>(t.UNCAUGHTEXCEPTION="uncaughtException",t))(L||{});var D=Object.defineProperty,P=Object.defineProperties,U=Object.getOwnPropertyDescriptors,k=Object.getOwnPropertySymbols,N=Object.prototype.hasOwnProperty,H=Object.prototype.propertyIsEnumerable,v=(t,e,s)=>e in t?D(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s,M=(t,e)=>{for(var s in e||(e={}))N.call(e,s)&&v(t,s,e[s]);if(k)for(var s of k(e))H.call(e,s)&&v(t,s,e[s]);return t},F=(t,e)=>P(t,U(e)),W=(t,e,s)=>new Promise(((n,i)=>{var o=t=>{try{a(s.next(t))}catch(t){i(t)}},r=t=>{try{a(s.throw(t))}catch(t){i(t)}},a=t=>t.done?n(t.value):Promise.resolve(t.value).then(o,r);a((s=s.apply(t,e)).next())}));const B="heimdallr-event-log";class G extends b{constructor(t){super(t),this.diff=0,this.wxContext={},this.requestTasks=new Map,this.breadcrumb=new I(t)}setWxContext(t){this.wxContext=M(M({},this.wxContext),t)}clearWxContext(){this.wxContext={}}getWxContext(){return M({},this.wxContext)}initAPP(){return W(this,null,(function*(){yield this.getWxSettings();const{initUrl:t,app:e}=this.getContext(),s=this.getTime(),n=F(M({},e),{ctime:s}),i=yield this.report(t,n),{header:o,data:{data:r={}}={}}=i;this.setDiff(o.Date);const{id:a=""}=r||{};return a}))}getWxSettings(){return W(this,null,(function*(){const{bluetoothEnabled:t,locationEnabled:e}=wx.getSystemSetting(),{brand:s,model:n,system:i}=wx.getDeviceInfo(),{windowWidth:o,windowHeight:r}=wx.getWindowInfo(),{SDKVersion:a,language:c,version:h}=wx.getAppBaseInfo(),{cameraAuthorized:l,locationAuthorized:u,microphoneAuthorized:E,notificationAuthorized:p,phoneCalendarAuthorized:d}=wx.getAppAuthorizeSetting(),O=yield wx.getRendererUserAgent();this.wxSettings={btEn:t,locEn:e,brand:s,model:n,system:i,width:o,height:r,sdk:a,lan:c,version:h,ua:O,camAuth:l,locAuth:u,micAuth:E,notifyAuth:p,calAuth:d}}))}isRightEnv(){return"undefined"!=typeof wx&&"undefined"!=typeof App}report(t,e){const{reqOption:s}=this.getClientOptions();return new Promise(((n,i)=>{const o="function"==typeof s?s(n,i):{},r=wx.request(F(M({success:t=>{n(t)},fail:t=>i(t),url:t,method:"POST"},o),{data:e,dataType:"json",complete:()=>{this.requestTasks.delete(r)}}));this.requestTasks.set(r,e)}))}transform(t){if(!t)return null;const{dat:e}=t,s=this.getWxContext();let n=F(M(M({t:this.getTime(),p:d.WECHAT},s),t),{dat:JSON.stringify(e)});const{st:i}=e;return i===E.LOAD&&(n=M(M({},n),this.wxSettings)),n}nextTick(t,e,...s){wx.nextTick((()=>{t.call(e,...s)}))}setDiff(t){const e=new Date(t),s=Date.now()-e.getTime();(!this.diff||this.diff>s)&&(this.diff=s)}getTime(){return Date.now()-(this.diff||0)}lifecycleReport(t){const{uploadUrl:e,enabled:s}=this.getContext();t&&s&&(this.appID?this.nextTick(this.report,this,e,M({aid:this.appID},t)):this.taskQueue.push(t))}handleOnShow(t){const e=wx.getStorageSync(B);Array.isArray(e)&&(e.forEach((t=>{this.lifecycleReport(t)})),wx.removeStorageSync(B));const n={sid:x(),url:t},{userStoreKey:i}=this.getClientOptions();if("string"==typeof i){const t=function(t){if(!t)return null;try{return wx.getStorageSync(t)}catch(e){return console.error(s,`Get ${t} faild`,e),null}}(i);n.ui=t}this.setWxContext(n);const o=x();this.breadcrumb.unshift({lid:o,bt:R.LIFECYCLE,msg:`Enter "${t}"`,t:this.getTime()}),this.lifecycleReport(this.transform({lid:o,e:r.LIFECYCLE,dat:{st:E.LOAD,href:t}}))}handleOnHide(t){this.requestTasks.size&&(wx.setStorage({key:B,data:[...this.requestTasks.values()]}),this.requestTasks.forEach(((t,e)=>{e.abort()})));const e=x();this.breadcrumb.unshift({lid:e,bt:R.LIFECYCLE,msg:`Leave "${t}"`,t:this.getTime()}),this.lifecycleReport(this.transform({lid:e,e:r.LIFECYCLE,dat:{st:E.UNLOAD,href:t}})),this.clearWxContext()}cusOnShow(){const t=this;return e=>function(s){e&&e.apply(this,s),t.handleOnShow(this.route)}}cusOnHide(){const t=this;return e=>function(){e&&e.apply(this),t.handleOnHide(this.route)}}}const _=t=>{const e=new G(t),{plugins:i=[]}=t;return e.use([{name:"errorPlugin",monitor(t){const e=App;App=function(n){return C(n,"onError",(function(e){return function(...n){e&&e.apply(this,n);const[i]=n;console.error(s,i),t({err:i})}}),!0),e(n)}},transform(t){const{err:e}=t,s=x();this.breadcrumb.unshift({lid:s,bt:R.ERROR,l:n.ERROR,msg:e,t:this.getTime()});const i=this.breadcrumb.getStack();return{lid:s,t:this.getTime(),e:r.ERROR,b:i,dat:{st:L.UNCAUGHTEXCEPTION,err:e}}}},...i]),{heimdallrPage:t=>{C(t,"onShow",e.cusOnShow(),!0),C(t,"onHide",e.cusOnHide(),!0),Page(t)},track:(t,n)=>{switch(t){case"show":e.handleOnShow(n);break;case"hide":e.handleOnHide(n);break;default:console.warn(s,"Unknown type")}}}};export{G as WxClient,_ as default};