UNPKG

@cmtlyt/monitor

Version:
2 lines (1 loc) 3.88 kB
"use strict";const utils=require("@cmtlyt/base/fp/utils"),logger=require("@cmtlyt/logger"),webVitals=require("web-vitals");class n{head=null;tail=null;listenerSet=new Set;push(r){if(getStore("isUnload"))return console.warn("\u9875\u9762\u5DF2\u5378\u8F7D, \u65E0\u6CD5\u7EE7\u7EED\u8BB0\u5F55\u65E5\u5FD7, \u540E\u7EED\u4F1A\u5BF9\u6B64\u7C7B\u65E5\u5FD7\u8FDB\u884C\u6301\u4E45\u5316\u5904\u7406");const s={data:r,next:null};this.listenerSet.forEach(c=>c({...r,extra:{...r.extra,from:"monitor"}})),!this.listenerSet.size&&(this.head?this.tail&&(this.tail.next=s,this.tail=s):(this.head=s,this.tail=s))}pop(){const r=this.head?.data;return this.head=this.head?.next,r}viewCache(){const r=[];let s=this.head;for(;s;)r.push(s.data),s=s.next;return r}popAll(){const r=[];for(;this.head;)r.push(this.pop());return r.filter(Boolean)}onChange(r){this.listenerSet.add(r)}}const logCache=new n,e=Object.create(null),eventMap={};function putEventMap(a,r){eventMap[a]=r}function getStore(a){return a?e[a]:e}function setStore(a,r){e[a]=r}function t(a){logCache.push({kind:"systemError",message:a.message,extra:{timestamp:Date.now()}})}function o(a){logCache.push({kind:"systemError",message:a.reason.toString(),extra:{timestamp:Date.now()}})}function initErrorListener(){window.addEventListener("error",t),window.addEventListener("unhandledrejection",o),putEventMap("error",t),putEventMap("unhandledrejection",o)}function createMonitorLogger(a){const{loggerOptions:r,reportStrategy:s,reportLog:c,formatLogInfo:l=u=>u,formatReportInfo:m=u=>u}=a,{getPrintFunc:d}=r;return logger.createLogger({...r,getPrintFunc:d?.bind(a),onLogBefore(u){try{const f=l.call(a,{config:a,logInfo:u});if(!((s&&s.call(a,f))??!0))return;const p=m.call(a,f);c&&c.call(a,p)}catch(f){if(u.kind==="error")return console.error("formatLogInfo error",f);logCache.push({kind:"error",message:"formatLogInfo error",extra:{timestamp:Date.now(),error:f}})}}})}function i(a){logCache.push({kind:"system",message:"performanceInfo",extra:{timestamp:Date.now(),...utils.pick_(["name","value","rating","delta","navigationType"],a)}})}function savePagePerformanceInfo(){webVitals.onTTFB(i),webVitals.onFCP(i),webVitals.onLCP(i),webVitals.onCLS(i),webVitals.onINP(i)}function batchReportLog(a){logCache.popAll().forEach(r=>{a[r.kind](r.message,r.extra)})}function listenerCacheChange(a){logCache.onChange(r=>{a[r.kind](r.message,r.extra)})}function getTargetSelector(a){if(!a)return"";if(a.id)return`#${a.id}`;let r=a.className;if(r)try{typeof r!="string"?r="":r=`.${r.split(" ").join(".")}`}catch{r=""}else if(a.parentElement){const c=Array.from(a.parentElement.children).indexOf(a),l=a.tagName.toLowerCase();r=`${l}${l==="body"?"":`:nth-child(${c+1})`}`}const s=getTargetSelector(a.parentElement);return s?`${s}>${r}`:r}const E=["click"];function initEventListener(a=window,r){const s=getStore("monitorConfig"),{events:c=E,needListenCapture:l=!1,generateExtra:m}=r;(c||E).forEach(d=>{const u=f=>{const p=g=>{const h={timestamp:Date.now(),isCapture:l,selector:getTargetSelector(g.target)},v=typeof m=="function"?m.call(s,{event:g,systemExtra:h}):{};logCache.push({kind:"event",message:d,extra:{...h,...v},...f})};return putEventMap(d,p),p};l&&a.addEventListener(d,u({capture:!0}),{capture:!0}),a.addEventListener(d,u({capture:!1}))})}window.addEventListener("unload",()=>{setStore("isUnload",!0);const{rootElement:a}=getStore("monitorConfig");for(const r in eventMap)a.removeEventListener(r,eventMap[r],{capture:!0}),a.removeEventListener(r,eventMap[r]),window.removeEventListener(r,eventMap[r],{capture:!0}),window.removeEventListener(r,eventMap[r])},{once:!0}),initErrorListener();function createMonitor(a){setStore("monitorConfig",a),savePagePerformanceInfo(),initEventListener(a.rootElement,a.listenEventConfig);const r=createMonitorLogger(a);return batchReportLog(r),listenerCacheChange(r),r}exports.createMonitor=createMonitor;