cwj_monitoring 0.0.22 → 0.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +200 -34
- package/dist/index.cjs +925 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +290 -16
- package/dist/index.js +915 -1
- package/dist/index.js.map +1 -0
- package/dist/index.min.js +2 -0
- package/dist/index.min.js.map +1 -0
- package/dist/index.umd.js +931 -0
- package/dist/index.umd.js.map +1 -0
- package/package.json +23 -8
package/dist/index.js
CHANGED
|
@@ -1 +1,915 @@
|
|
|
1
|
-
var e,t=new Uint8Array(16);function r(){if(!e&&!(e="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return e(t)}for(var i=[],n=0;n<256;++n)i.push((n+256).toString(16).slice(1));var s={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function o(e,t,n){if(s.randomUUID&&!t&&!e)return s.randomUUID();var o=(e=e||{}).random||(e.rng||r)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,t){n=n||0;for(var a=0;a<16;++a)t[n+a]=o[a];return t}return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return(i[e[t+0]]+i[e[t+1]]+i[e[t+2]]+i[e[t+3]]+"-"+i[e[t+4]]+i[e[t+5]]+"-"+i[e[t+6]]+i[e[t+7]]+"-"+i[e[t+8]]+i[e[t+9]]+"-"+i[e[t+10]]+i[e[t+11]]+i[e[t+12]]+i[e[t+13]]+i[e[t+14]]+i[e[t+15]]).toLowerCase()}(o)}const a="track_uuid",c=e=>{const t=new Date(e),r=t.getFullYear(),i=t.getMonth()+1,n=t.getDate(),s=t.getHours(),o=t.getMinutes(),a=t.getSeconds(),c=e=>{let t="";return t=e<10?"0"+e:e.toString(),t};return r+"-"+c(i)+"-"+c(n)+" "+c(s)+":"+c(o)+":"+c(a)};function u(e){return/^\d+$/.test(e.toString())}const d=window.requestIdleCallback||window.requestAnimationFrame||(e=>window.setTimeout(e,1e3/60));class l{nextValidator;constructor(){this.nextValidator=null}}const h=new class extends l{constructor(){super()}setNext(e){this.nextValidator=e}validate(e){return t=e.url,new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i").test(t)?!this.nextValidator||this.nextValidator.validate(e):(console.error("请输入符合规范的url"),!1);var t}},f=new class extends l{constructor(){super()}setNext(e){this.nextValidator=e}validate(e){return e.max&&!u(e.max)?(console.error("max请输入正整数"),!1):!this.nextValidator||this.nextValidator.validate(e)}},m=new class extends l{constructor(){super()}setNext(e){this.nextValidator=e}validate(e){return e.time&&!u(e.time)?(console.error("time请输入正整数"),!1):!this.nextValidator||this.nextValidator.validate(e)}};function g(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function p(e){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p(e)}function v(e){var t=function(e,t){if("object"!=p(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var i=r.call(e,t||"default");if("object"!=p(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==p(t)?t:t+""}function w(e,t){for(var r=0;r<t.length;r++){var i=t[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,v(i.key),i)}}function b(e,t,r){return t&&w(e.prototype,t),r&&w(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}h.setNext(f),f.setNext(m);var y={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"},M={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"},k={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"},S={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"},E={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"},F=function(){function e(){g(this,e)}return b(e,null,[{key:"getFirstMatch",value:function(e,t){var r=t.match(e);return r&&r.length>0&&r[1]||""}},{key:"getSecondMatch",value:function(e,t){var r=t.match(e);return r&&r.length>1&&r[2]||""}},{key:"matchAndReturnConst",value:function(e,t,r){if(e.test(t))return r}},{key:"getWindowsVersionName",value:function(e){switch(e){case"NT":return"NT";case"XP":case"NT 5.1":return"XP";case"NT 5.0":return"2000";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}},{key:"getMacOSVersionName",value:function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),10===t[0])switch(t[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}}},{key:"getAndroidVersionName",value:function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),!(1===t[0]&&t[1]<5))return 1===t[0]&&t[1]<6?"Cupcake":1===t[0]&&t[1]>=6?"Donut":2===t[0]&&t[1]<2?"Eclair":2===t[0]&&2===t[1]?"Froyo":2===t[0]&&t[1]>2?"Gingerbread":3===t[0]?"Honeycomb":4===t[0]&&t[1]<1?"Ice Cream Sandwich":4===t[0]&&t[1]<4?"Jelly Bean":4===t[0]&&t[1]>=4?"KitKat":5===t[0]?"Lollipop":6===t[0]?"Marshmallow":7===t[0]?"Nougat":8===t[0]?"Oreo":9===t[0]?"Pie":void 0}},{key:"getVersionPrecision",value:function(e){return e.split(".").length}},{key:"compareVersions",value:function(t,r){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.getVersionPrecision(t),s=e.getVersionPrecision(r),o=Math.max(n,s),a=0,c=e.map([t,r],(function(t){var r=o-e.getVersionPrecision(t),i=t+new Array(r+1).join(".0");return e.map(i.split("."),(function(e){return new Array(20-e.length).join("0")+e})).reverse()}));for(i&&(a=o-Math.min(n,s)),o-=1;o>=a;){if(c[0][o]>c[1][o])return 1;if(c[0][o]===c[1][o]){if(o===a)return 0;o-=1}else if(c[0][o]<c[1][o])return-1}}},{key:"map",value:function(e,t){var r,i=[];if(Array.prototype.map)return Array.prototype.map.call(e,t);for(r=0;r<e.length;r+=1)i.push(t(e[r]));return i}},{key:"find",value:function(e,t){var r,i;if(Array.prototype.find)return Array.prototype.find.call(e,t);for(r=0,i=e.length;r<i;r+=1){var n=e[r];if(t(n,r))return n}}},{key:"assign",value:function(e){for(var t,r,i=e,n=arguments.length,s=new Array(n>1?n-1:0),o=1;o<n;o++)s[o-1]=arguments[o];if(Object.assign)return Object.assign.apply(Object,[e].concat(s));var a=function(){var e=s[t];"object"===p(e)&&null!==e&&Object.keys(e).forEach((function(t){i[t]=e[t]}))};for(t=0,r=s.length;t<r;t+=1)a();return e}},{key:"getBrowserAlias",value:function(e){return y[e]}},{key:"getBrowserTypeByAlias",value:function(e){return M[e]||""}}]),e}(),O=/version\/(\d+(\.?_?\d+)+)/i,R=[{test:[/googlebot/i],describe:function(e){var t={name:"Googlebot"},r=F.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/opera/i],describe:function(e){var t={name:"Opera"},r=F.getFirstMatch(O,e)||F.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opr\/|opios/i],describe:function(e){var t={name:"Opera"},r=F.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:"Samsung Internet for Android"},r=F.getFirstMatch(O,e)||F.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Whale/i],describe:function(e){var t={name:"NAVER Whale Browser"},r=F.getFirstMatch(O,e)||F.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MZBrowser/i],describe:function(e){var t={name:"MZ Browser"},r=F.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/focus/i],describe:function(e){var t={name:"Focus"},r=F.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/swing/i],describe:function(e){var t={name:"Swing"},r=F.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/coast/i],describe:function(e){var t={name:"Opera Coast"},r=F.getFirstMatch(O,e)||F.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe:function(e){var t={name:"Opera Touch"},r=F.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/yabrowser/i],describe:function(e){var t={name:"Yandex Browser"},r=F.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:"UC Browser"},r=F.getFirstMatch(O,e)||F.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Maxthon|mxios/i],describe:function(e){var t={name:"Maxthon"},r=F.getFirstMatch(O,e)||F.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/epiphany/i],describe:function(e){var t={name:"Epiphany"},r=F.getFirstMatch(O,e)||F.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/puffin/i],describe:function(e){var t={name:"Puffin"},r=F.getFirstMatch(O,e)||F.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sleipnir/i],describe:function(e){var t={name:"Sleipnir"},r=F.getFirstMatch(O,e)||F.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/k-meleon/i],describe:function(e){var t={name:"K-Meleon"},r=F.getFirstMatch(O,e)||F.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/micromessenger/i],describe:function(e){var t={name:"WeChat"},r=F.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/qqbrowser/i],describe:function(e){var t={name:/qqbrowserlite/i.test(e)?"QQ Browser Lite":"QQ Browser"},r=F.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/msie|trident/i],describe:function(e){var t={name:"Internet Explorer"},r=F.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/\sedg\//i],describe:function(e){var t={name:"Microsoft Edge"},r=F.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/edg([ea]|ios)/i],describe:function(e){var t={name:"Microsoft Edge"},r=F.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/vivaldi/i],describe:function(e){var t={name:"Vivaldi"},r=F.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/seamonkey/i],describe:function(e){var t={name:"SeaMonkey"},r=F.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sailfish/i],describe:function(e){var t={name:"Sailfish"},r=F.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,e);return r&&(t.version=r),t}},{test:[/silk/i],describe:function(e){var t={name:"Amazon Silk"},r=F.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/phantom/i],describe:function(e){var t={name:"PhantomJS"},r=F.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/slimerjs/i],describe:function(e){var t={name:"SlimerJS"},r=F.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t={name:"BlackBerry"},r=F.getFirstMatch(O,e)||F.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t={name:"WebOS Browser"},r=F.getFirstMatch(O,e)||F.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/bada/i],describe:function(e){var t={name:"Bada"},r=F.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/tizen/i],describe:function(e){var t={name:"Tizen"},r=F.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/qupzilla/i],describe:function(e){var t={name:"QupZilla"},r=F.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:"Firefox"},r=F.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/electron/i],describe:function(e){var t={name:"Electron"},r=F.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MiuiBrowser/i],describe:function(e){var t={name:"Miui"},r=F.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/chromium/i],describe:function(e){var t={name:"Chromium"},r=F.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,e)||F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:"Chrome"},r=F.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/GSA/i],describe:function(e){var t={name:"Google Search"},r=F.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t={name:"Android Browser"},r=F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/playstation 4/i],describe:function(e){var t={name:"PlayStation 4"},r=F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:"Safari"},r=F.getFirstMatch(O,e);return r&&(t.version=r),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:F.getFirstMatch(t,e),version:F.getSecondMatch(t,e)}}}],P=[{test:[/Roku\/DVP/],describe:function(e){var t=F.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,e);return{name:S.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=F.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,e);return{name:S.WindowsPhone,version:t}}},{test:[/windows /i],describe:function(e){var t=F.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,e),r=F.getWindowsVersionName(t);return{name:S.Windows,version:t,versionName:r}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(e){var t={name:S.iOS},r=F.getSecondMatch(/(Version\/)(\d[\d.]+)/,e);return r&&(t.version=r),t}},{test:[/macintosh/i],describe:function(e){var t=F.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,e).replace(/[_\s]/g,"."),r=F.getMacOSVersionName(t),i={name:S.MacOS,version:t};return r&&(i.versionName=r),i}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=F.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,e).replace(/[_\s]/g,".");return{name:S.iOS,version:t}}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t=F.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,e),r=F.getAndroidVersionName(t),i={name:S.Android,version:t};return r&&(i.versionName=r),i}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=F.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,e),r={name:S.WebOS};return t&&t.length&&(r.version=t),r}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t=F.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,e)||F.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,e)||F.getFirstMatch(/\bbb(\d+)/i,e);return{name:S.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=F.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,e);return{name:S.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=F.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,e);return{name:S.Tizen,version:t}}},{test:[/linux/i],describe:function(){return{name:S.Linux}}},{test:[/CrOS/],describe:function(){return{name:S.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=F.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,e);return{name:S.PlayStation4,version:t}}}],_=[{test:[/googlebot/i],describe:function(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe:function(e){var t=F.getFirstMatch(/(can-l01)/i,e)&&"Nova",r={type:k.mobile,vendor:"Huawei"};return t&&(r.model=t),r}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:k.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:k.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return{type:k.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:k.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:k.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:k.tablet}}},{test:function(e){var t=e.test(/ipod|iphone/i),r=e.test(/like (ipod|iphone)/i);return t&&!r},describe:function(e){var t=F.getFirstMatch(/(ipod|iphone)/i,e);return{type:k.mobile,vendor:"Apple",model:t}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:k.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe:function(){return{type:k.mobile}}},{test:function(e){return"blackberry"===e.getBrowserName(!0)},describe:function(){return{type:k.mobile,vendor:"BlackBerry"}}},{test:function(e){return"bada"===e.getBrowserName(!0)},describe:function(){return{type:k.mobile}}},{test:function(e){return"windows phone"===e.getBrowserName()},describe:function(){return{type:k.mobile,vendor:"Microsoft"}}},{test:function(e){var t=Number(String(e.getOSVersion()).split(".")[0]);return"android"===e.getOSName(!0)&&t>=3},describe:function(){return{type:k.tablet}}},{test:function(e){return"android"===e.getOSName(!0)},describe:function(){return{type:k.mobile}}},{test:function(e){return"macos"===e.getOSName(!0)},describe:function(){return{type:k.desktop,vendor:"Apple"}}},{test:function(e){return"windows"===e.getOSName(!0)},describe:function(){return{type:k.desktop}}},{test:function(e){return"linux"===e.getOSName(!0)},describe:function(){return{type:k.desktop}}},{test:function(e){return"playstation 4"===e.getOSName(!0)},describe:function(){return{type:k.tv}}},{test:function(e){return"roku"===e.getOSName(!0)},describe:function(){return{type:k.tv}}}],B=[{test:function(e){return"microsoft edge"===e.getBrowserName(!0)},describe:function(e){if(/\sedg\//i.test(e))return{name:E.Blink};var t=F.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,e);return{name:E.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:E.Trident},r=F.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){return e.test(/presto/i)},describe:function(e){var t={name:E.Presto},r=F.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=e.test(/gecko/i),r=e.test(/like gecko/i);return t&&!r},describe:function(e){var t={name:E.Gecko},r=F.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:E.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:E.WebKit},r=F.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}}],x=function(){function e(t){var r=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(g(this,e),null==t||""===t)throw new Error("UserAgent parameter can't be empty");this._ua=t,this.parsedResult={},!0!==r&&this.parse()}return b(e,[{key:"getUA",value:function(){return this._ua}},{key:"test",value:function(e){return e.test(this._ua)}},{key:"parseBrowser",value:function(){var e=this;this.parsedResult.browser={};var t=F.find(R,(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.browser=t.describe(this.getUA())),this.parsedResult.browser}},{key:"getBrowser",value:function(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()}},{key:"getBrowserName",value:function(e){return e?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""}},{key:"getBrowserVersion",value:function(){return this.getBrowser().version}},{key:"getOS",value:function(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()}},{key:"parseOS",value:function(){var e=this;this.parsedResult.os={};var t=F.find(P,(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.os=t.describe(this.getUA())),this.parsedResult.os}},{key:"getOSName",value:function(e){var t=this.getOS().name;return e?String(t).toLowerCase()||"":t||""}},{key:"getOSVersion",value:function(){return this.getOS().version}},{key:"getPlatform",value:function(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()}},{key:"getPlatformType",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.getPlatform().type;return e?String(t).toLowerCase()||"":t||""}},{key:"parsePlatform",value:function(){var e=this;this.parsedResult.platform={};var t=F.find(_,(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.platform=t.describe(this.getUA())),this.parsedResult.platform}},{key:"getEngine",value:function(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()}},{key:"getEngineName",value:function(e){return e?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""}},{key:"parseEngine",value:function(){var e=this;this.parsedResult.engine={};var t=F.find(B,(function(t){if("function"==typeof t.test)return t.test(e);if(t.test instanceof Array)return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.engine=t.describe(this.getUA())),this.parsedResult.engine}},{key:"parse",value:function(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this}},{key:"getResult",value:function(){return F.assign({},this.parsedResult)}},{key:"satisfies",value:function(e){var t=this,r={},i=0,n={},s=0;if(Object.keys(e).forEach((function(t){var o=e[t];"string"==typeof o?(n[t]=o,s+=1):"object"===p(o)&&(r[t]=o,i+=1)})),i>0){var o=Object.keys(r),a=F.find(o,(function(e){return t.isOS(e)}));if(a){var c=this.satisfies(r[a]);if(void 0!==c)return c}var u=F.find(o,(function(e){return t.isPlatform(e)}));if(u){var d=this.satisfies(r[u]);if(void 0!==d)return d}}if(s>0){var l=Object.keys(n),h=F.find(l,(function(e){return t.isBrowser(e,!0)}));if(void 0!==h)return this.compareVersion(n[h])}}},{key:"isBrowser",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=this.getBrowserName().toLowerCase(),i=e.toLowerCase(),n=F.getBrowserTypeByAlias(i);return t&&n&&(i=n.toLowerCase()),i===r}},{key:"compareVersion",value:function(e){var t=[0],r=e,i=!1,n=this.getBrowserVersion();if("string"==typeof n)return">"===e[0]||"<"===e[0]?(r=e.substr(1),"="===e[1]?(i=!0,r=e.substr(2)):t=[],">"===e[0]?t.push(1):t.push(-1)):"="===e[0]?r=e.substr(1):"~"===e[0]&&(i=!0,r=e.substr(1)),t.indexOf(F.compareVersions(n,r,i))>-1}},{key:"isOS",value:function(e){return this.getOSName(!0)===String(e).toLowerCase()}},{key:"isPlatform",value:function(e){return this.getPlatformType(!0)===String(e).toLowerCase()}},{key:"isEngine",value:function(e){return this.getEngineName(!0)===String(e).toLowerCase()}},{key:"is",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)}},{key:"some",value:function(){var e=this;return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).some((function(t){return e.is(t)}))}}]),e}(),A=function(){function e(){g(this,e)}return b(e,null,[{key:"getParser",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if("string"!=typeof e)throw new Error("UserAgent should be a string");return new x(e,t)}},{key:"parse",value:function(e){return new x(e).getResult()}},{key:"BROWSER_MAP",get:function(){return M}},{key:"ENGINE_MAP",get:function(){return E}},{key:"OS_MAP",get:function(){return S}},{key:"PLATFORMS_MAP",get:function(){return k}}]),e}();function C(){let e=0;const t=window.screen,r=navigator.userAgent.toLowerCase();return void 0!==window.devicePixelRatio?e=window.devicePixelRatio:~r.indexOf("msie")?t.deviceXDPI&&t.logicalXDPI&&(e=t.deviceXDPI/t.logicalXDPI):void 0!==window.outerWidth&&void 0!==window.innerWidth&&(e=window.outerWidth/window.innerWidth),e&&(e=Math.round(100*e)),e}class N{device;uuid;constructor(){this.device=function(){const{browser:e,os:t,platform:r}=A.parse(window.navigator.userAgent);return{browser:e,os:t,platform:r,ratio:C(),wh:{width:window.screen.width,height:window.screen.height}}}(),localStorage.getItem(a)?this.uuid=localStorage.getItem(a):(this.uuid=o(),localStorage.setItem(a,this.uuid))}}class T extends N{url;max;time;timer;visitTime;data;events;constructor(e){var t;super(),this.url=e.url,this.max=e.max||5,this.time=e.time||3e4,this.timer,this.visitTime=Date.now(),this.data=e.data,this.events=[],t=this.send.bind(this,!0),window.addEventListener("beforeunload",(()=>{t()}))}formatter(e,t){const r=Date.now(),i=Object.assign({},{device:this.device,uuid:this.uuid},{type:e,data:t,date:c(r),url:window.location.href,referrer:document.referrer,uuid:localStorage.getItem(a),duration:(n=r,s=this.visitTime,n<s&&([n,s]=[s,n]),Math.floor((n-s)/1e3)),userData:this.data});var n,s;return this.visitTime=r,i}send(e){if(this.events.length){const t=e?this.events.length:this.max,r=this.events.slice(0,t);this.events=this.events.slice(t),this.safeSend(r),this.events.length&&d(this.send.bind(this,!1))}}emit(e,t){const r=this.formatter(e,t);this.events.push(r),this.timer&&clearTimeout(this.timer),this.events.length>=this.max?this.send(!1):this.timer=setTimeout((()=>{this.send(!1)}),this.time)}safeSend(e){if(e.length)if(window.navigator.sendBeacon instanceof Function)window.navigator.sendBeacon(this.url,JSON.stringify(e));else{const t=new XMLHttpRequest;t.open("POST",this.url,!0),t.send(JSON.stringify(e))}}}class L extends T{pluginMap=new Map;constructor(e){super(e)}use(e){return this.pluginMap.has(e.name)||this.pluginMap.set(e.name,e),this}run(){this.pluginMap.forEach((e=>{e.install(this)}))}}class V{static instance;static plugins=new Map;static registerPlugin(e){this.plugins.set(e.name,e)}static start(e){h.validate(e)&&(this.instance=new L(e),window.$track=this.instance,this.loadPlugins(e))}static loadPlugins(e){const{plugin:t=[]}=e;(t.length>0?t:Array.from(this.plugins.keys())).forEach((e=>{const t=this.plugins.get(e);t&&this.instance.use(t)})),this.instance.run()}}class I{name;track;constructor(e){this.name=e}}var D=(e=>(e.ERROR="error",e.CLICK="click",e.PERFORMANCE="performance",e.ROUTER="router",e))(D||{}),z=(e=>(e.ERROR="error",e.ROUTER_HASH="hashchange",e.ROUTER_HISTORY="historychange",e.PERFORMANCE_FP="performance_fp",e.PERFORMANCE_FCP="performance_fcp",e.PERFORMANCE_LCP="performance_lcp",e.PERFORMANCE_DOMCONTENTLOADED="performance_DOMContentLoaded",e.PERFORMANCE_LOAD="performance_load",e.BEHAVIOR_CLICK="click",e))(z||{});var U=new class extends I{originalConsoleError;constructor(){super(D.ERROR)}install(e){this.track=e,this.overrideConsoleError(),this.setupErrorListeners()}overrideConsoleError(){this.originalConsoleError=console.error,console.error=(...e)=>{this.originalConsoleError?.apply(console,e);const t={type:"console",message:e.map((e=>String(e))).join(" "),stack:(new Error).stack};this.track?.emit(z.ERROR,t)}}setupErrorListeners(){window.addEventListener("error",(e=>{this.handleSyncError(e,this.track)}),!0),window.addEventListener("unhandledrejection",(e=>{this.handleAsyncError(e,this.track)}),!0)}handleSyncError(e,t){const r={type:"sync",...this.getErrorDetails(e)};t?.emit(z.ERROR,r)}handleAsyncError(e,t){const r={type:"async",...this.getPromiseErrorDetails(e)};t?.emit(z.ERROR,r)}getPromiseErrorDetails(e){return e.reason instanceof Error?{errorType:"promise",message:e.reason.message,stack:e.reason.stack}:{errorType:"promise",message:String(e.reason)}}getErrorDetails(e){const{error:t,target:r,filename:i,message:n}=e;if(t instanceof Error)return{errorType:"js",message:t.message,stack:t.stack,filename:i,colno:e.colno,lineno:e.lineno};if(this.isResourceError(r)){const e=r.src||r.href;return{errorType:"resource",message:`Resource load failed: ${e}`,url:e}}return{errorType:"unknown",message:n,filename:i}}isResourceError(e){return e&&["LINK","SCRIPT","IMG","AUDIO","VIDEO","IFRAME"].includes(e.tagName)}};var W=new class extends I{constructor(){super(D.ROUTER)}install(e){this.track=e,this.setupHashListener(),this.setupHistoryListener()}setupHashListener(){window.addEventListener("hashchange",(()=>{this.track?.emit(z.ROUTER_HASH)}))}setupHistoryListener(){const e=window.history.pushState,t=window.history.replaceState;window.history.pushState=(...t)=>{e.apply(window.history,t),this.track?.emit(z.ROUTER_HISTORY)},window.history.replaceState=(...e)=>{t.apply(window.history,e),this.track?.emit(z.ROUTER_HISTORY)},window.addEventListener("popstate",(()=>{this.track?.emit(z.ROUTER_HISTORY)}))}};var j=new class extends I{constructor(){super(D.CLICK)}install(e){this.track=e,this.setupClickListeners()}setupClickListeners(){const e=e=>{const t=e.target;if(!t)return;const r={tagName:t.tagName,id:t.id,className:t.className,text:t.textContent?.trim(),xPath:this.getElementXPath(t)};this.track?.emit(z.BEHAVIOR_CLICK,r)};document.addEventListener(z.BEHAVIOR_CLICK,(t=>{setTimeout((()=>e(t)),300)}),!0)}getElementXPath(e){if(!e||1!==e.nodeType)return"";if(e.id)return`//*[@id="${e.id}"]`;const t=Array.from(e.parentNode?.children||[]).filter((t=>t.tagName===e.tagName)).indexOf(e)+1;return`${this.getElementXPath(e.parentNode)}/${e.tagName.toLowerCase()}[${t}]`}};var H=new class extends I{constructor(){super(D.PERFORMANCE)}install(e){this.track=e,this.setupPerformanceMonitoring()}setupPerformanceMonitoring(){this.monitorPaintMetrics(),this.monitorLCP(),this.monitorDCL(),this.monitorLoad()}monitorPaintMetrics(){const e=new PerformanceObserver((t=>{for(const e of t.getEntries())"first-paint"===e.name?this.track?.emit(z.PERFORMANCE_FP,e.startTime):"first-contentful-paint"===e.name&&this.track?.emit(z.PERFORMANCE_FCP,e.startTime);e.disconnect()}));e.observe({type:"paint",buffered:!0})}monitorLCP(){const e=new PerformanceObserver((t=>{e&&e.disconnect();for(const e of t.getEntries())this.track?.emit(z.PERFORMANCE_LCP,e.startTime)}));e.observe({type:"largest-contentful-paint",buffered:!0})}monitorDCL(){window.addEventListener("DOMContentLoaded",(e=>{this.track?.emit(z.PERFORMANCE_DOMCONTENTLOADED,e.timeStamp)}))}monitorLoad(){window.addEventListener("load",(e=>{this.track?.emit(z.PERFORMANCE_LOAD,e.timeStamp)}))}};V.registerPlugin(j),V.registerPlugin(U),V.registerPlugin(H),V.registerPlugin(W);const q=function(){let e=!1;return function(t){e||(V.start(t),e=!0)}}();var G={init:q};export{D as TYPES,G as default,q as init};
|
|
1
|
+
const urlAlphabet =
|
|
2
|
+
'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict';
|
|
3
|
+
|
|
4
|
+
/* @ts-self-types="./index.d.ts" */
|
|
5
|
+
let nanoid = (size = 21) => {
|
|
6
|
+
let id = '';
|
|
7
|
+
let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)));
|
|
8
|
+
while (size--) {
|
|
9
|
+
id += urlAlphabet[bytes[size] & 63];
|
|
10
|
+
}
|
|
11
|
+
return id
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const getDate = (time = Date.now()) => {
|
|
15
|
+
const date = new Date(time);
|
|
16
|
+
const year = date.getFullYear();
|
|
17
|
+
const month = date.getMonth() + 1;
|
|
18
|
+
const day = date.getDate();
|
|
19
|
+
const hour = date.getHours();
|
|
20
|
+
const minute = date.getMinutes();
|
|
21
|
+
const second = date.getSeconds();
|
|
22
|
+
const formatter = (date2) => {
|
|
23
|
+
let res = "";
|
|
24
|
+
if (date2 < 10) {
|
|
25
|
+
res = "0" + date2;
|
|
26
|
+
} else {
|
|
27
|
+
res = date2.toString();
|
|
28
|
+
}
|
|
29
|
+
return res;
|
|
30
|
+
};
|
|
31
|
+
return year + "-" + formatter(month) + "-" + formatter(day) + " " + formatter(hour) + ":" + formatter(minute) + ":" + formatter(second);
|
|
32
|
+
};
|
|
33
|
+
const getSeconds = (timestamp1, timestamp2) => {
|
|
34
|
+
if (timestamp1 < timestamp2) {
|
|
35
|
+
[timestamp1, timestamp2] = [timestamp2, timestamp1];
|
|
36
|
+
}
|
|
37
|
+
return Math.floor((timestamp1 - timestamp2) / 1e3);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
41
|
+
|
|
42
|
+
function getDefaultExportFromCjs (x) {
|
|
43
|
+
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
var es5 = {exports: {}};
|
|
47
|
+
|
|
48
|
+
(function (module, exports) {
|
|
49
|
+
!function(e,t){module.exports=t();}(commonjsGlobal,(function(){return function(e){var t={};function r(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=e,r.c=t,r.d=function(e,t,i){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i});},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0});},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(i,n,function(t){return e[t]}.bind(null,n));return i},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=90)}({17:function(e,t,r){t.__esModule=!0,t.default=void 0;var i=r(18),n=function(){function e(){}return e.getFirstMatch=function(e,t){var r=t.match(e);return r&&r.length>0&&r[1]||""},e.getSecondMatch=function(e,t){var r=t.match(e);return r&&r.length>1&&r[2]||""},e.matchAndReturnConst=function(e,t,r){if(e.test(t))return r},e.getWindowsVersionName=function(e){switch(e){case"NT":return "NT";case"XP":return "XP";case"NT 5.0":return "2000";case"NT 5.1":return "XP";case"NT 5.2":return "2003";case"NT 6.0":return "Vista";case"NT 6.1":return "7";case"NT 6.2":return "8";case"NT 6.3":return "8.1";case"NT 10.0":return "10";default:return}},e.getMacOSVersionName=function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));t.push(0);var r=t[0],i=t[1];if(10===r)switch(i){case 5:return "Leopard";case 6:return "Snow Leopard";case 7:return "Lion";case 8:return "Mountain Lion";case 9:return "Mavericks";case 10:return "Yosemite";case 11:return "El Capitan";case 12:return "Sierra";case 13:return "High Sierra";case 14:return "Mojave";case 15:return "Catalina";default:return}switch(r){case 11:return "Big Sur";case 12:return "Monterey";case 13:return "Ventura";case 14:return "Sonoma";case 15:return "Sequoia";default:return}},e.getAndroidVersionName=function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),!(1===t[0]&&t[1]<5))return 1===t[0]&&t[1]<6?"Cupcake":1===t[0]&&t[1]>=6?"Donut":2===t[0]&&t[1]<2?"Eclair":2===t[0]&&2===t[1]?"Froyo":2===t[0]&&t[1]>2?"Gingerbread":3===t[0]?"Honeycomb":4===t[0]&&t[1]<1?"Ice Cream Sandwich":4===t[0]&&t[1]<4?"Jelly Bean":4===t[0]&&t[1]>=4?"KitKat":5===t[0]?"Lollipop":6===t[0]?"Marshmallow":7===t[0]?"Nougat":8===t[0]?"Oreo":9===t[0]?"Pie":void 0},e.getVersionPrecision=function(e){return e.split(".").length},e.compareVersions=function(t,r,i){void 0===i&&(i=!1);var n=e.getVersionPrecision(t),a=e.getVersionPrecision(r),o=Math.max(n,a),s=0,u=e.map([t,r],(function(t){var r=o-e.getVersionPrecision(t),i=t+new Array(r+1).join(".0");return e.map(i.split("."),(function(e){return new Array(20-e.length).join("0")+e})).reverse()}));for(i&&(s=o-Math.min(n,a)),o-=1;o>=s;){if(u[0][o]>u[1][o])return 1;if(u[0][o]===u[1][o]){if(o===s)return 0;o-=1;}else if(u[0][o]<u[1][o])return -1}},e.map=function(e,t){var r,i=[];if(Array.prototype.map)return Array.prototype.map.call(e,t);for(r=0;r<e.length;r+=1)i.push(t(e[r]));return i},e.find=function(e,t){var r,i;if(Array.prototype.find)return Array.prototype.find.call(e,t);for(r=0,i=e.length;r<i;r+=1){var n=e[r];if(t(n,r))return n}},e.assign=function(e){for(var t,r,i=e,n=arguments.length,a=new Array(n>1?n-1:0),o=1;o<n;o++)a[o-1]=arguments[o];if(Object.assign)return Object.assign.apply(Object,[e].concat(a));var s=function(){var e=a[t];"object"==typeof e&&null!==e&&Object.keys(e).forEach((function(t){i[t]=e[t];}));};for(t=0,r=a.length;t<r;t+=1)s();return e},e.getBrowserAlias=function(e){return i.BROWSER_ALIASES_MAP[e]},e.getBrowserTypeByAlias=function(e){return i.BROWSER_MAP[e]||""},e}();t.default=n,e.exports=t.default;},18:function(e,t,r){t.__esModule=!0,t.ENGINE_MAP=t.OS_MAP=t.PLATFORMS_MAP=t.BROWSER_MAP=t.BROWSER_ALIASES_MAP=void 0;t.BROWSER_ALIASES_MAP={AmazonBot:"amazonbot","Amazon Silk":"amazon_silk","Android Browser":"android",BaiduSpider:"baiduspider",Bada:"bada",BingCrawler:"bingcrawler",BlackBerry:"blackberry","ChatGPT-User":"chatgpt_user",Chrome:"chrome",ClaudeBot:"claudebot",Chromium:"chromium",Diffbot:"diffbot",DuckDuckBot:"duckduckbot",Electron:"electron",Epiphany:"epiphany",FacebookExternalHit:"facebookexternalhit",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot",GPTBot:"gptbot","Internet Explorer":"ie",InternetArchiveCrawler:"internetarchivecrawler","K-Meleon":"k_meleon",LibreWolf:"librewolf",Maxthon:"maxthon","Meta-ExternalAds":"meta_externalads","Meta-ExternalAgent":"meta_externalagent","Meta-ExternalFetcher":"meta_externalfetcher","Meta-WebIndexer":"meta_webindexer","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver","OAI-SearchBot":"oai_searchbot",Omgilibot:"omgilibot",Opera:"opera","Opera Coast":"opera_coast","Pale Moon":"pale_moon",PerplexityBot:"perplexitybot","Perplexity-User":"perplexity_user",PhantomJS:"phantomjs",PingdomBot:"pingdombot",Puffin:"puffin",QQ:"qq",QQLite:"qqlite",QupZilla:"qupzilla",Roku:"roku",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir","Sogou Browser":"sogou",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat",YahooSlurp:"yahooslurp","Yandex Browser":"yandex",YandexBot:"yandexbot",YouBot:"youbot"};t.BROWSER_MAP={amazonbot:"AmazonBot",amazon_silk:"Amazon Silk",android:"Android Browser",baiduspider:"BaiduSpider",bada:"Bada",bingcrawler:"BingCrawler",blackberry:"BlackBerry",chatgpt_user:"ChatGPT-User",chrome:"Chrome",claudebot:"ClaudeBot",chromium:"Chromium",diffbot:"Diffbot",duckduckbot:"DuckDuckBot",edge:"Microsoft Edge",electron:"Electron",epiphany:"Epiphany",facebookexternalhit:"FacebookExternalHit",firefox:"Firefox",focus:"Focus",generic:"Generic",google_search:"Google Search",googlebot:"Googlebot",gptbot:"GPTBot",ie:"Internet Explorer",internetarchivecrawler:"InternetArchiveCrawler",k_meleon:"K-Meleon",librewolf:"LibreWolf",maxthon:"Maxthon",meta_externalads:"Meta-ExternalAds",meta_externalagent:"Meta-ExternalAgent",meta_externalfetcher:"Meta-ExternalFetcher",meta_webindexer:"Meta-WebIndexer",mz:"MZ Browser",naver:"NAVER Whale Browser",oai_searchbot:"OAI-SearchBot",omgilibot:"Omgilibot",opera:"Opera",opera_coast:"Opera Coast",pale_moon:"Pale Moon",perplexitybot:"PerplexityBot",perplexity_user:"Perplexity-User",phantomjs:"PhantomJS",pingdombot:"PingdomBot",puffin:"Puffin",qq:"QQ Browser",qqlite:"QQ Browser Lite",qupzilla:"QupZilla",roku:"Roku",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",sogou:"Sogou Browser",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yahooslurp:"YahooSlurp",yandex:"Yandex Browser",yandexbot:"YandexBot",youbot:"YouBot"};t.PLATFORMS_MAP={bot:"bot",desktop:"desktop",mobile:"mobile",tablet:"tablet",tv:"tv"};t.OS_MAP={Android:"Android",Bada:"Bada",BlackBerry:"BlackBerry",ChromeOS:"Chrome OS",HarmonyOS:"HarmonyOS",iOS:"iOS",Linux:"Linux",MacOS:"macOS",PlayStation4:"PlayStation 4",Roku:"Roku",Tizen:"Tizen",WebOS:"WebOS",Windows:"Windows",WindowsPhone:"Windows Phone"};t.ENGINE_MAP={Blink:"Blink",EdgeHTML:"EdgeHTML",Gecko:"Gecko",Presto:"Presto",Trident:"Trident",WebKit:"WebKit"};},90:function(e,t,r){t.__esModule=!0,t.default=void 0;var i,n=(i=r(91))&&i.__esModule?i:{default:i},a=r(18);function o(e,t){for(var r=0;r<t.length;r++){var i=t[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i);}}var s=function(){function e(){}var t,r,i;return e.getParser=function(e,t){if(void 0===t&&(t=!1),"string"!=typeof e)throw new Error("UserAgent should be a string");return new n.default(e,t)},e.parse=function(e){return new n.default(e).getResult()},t=e,i=[{key:"BROWSER_MAP",get:function(){return a.BROWSER_MAP}},{key:"ENGINE_MAP",get:function(){return a.ENGINE_MAP}},{key:"OS_MAP",get:function(){return a.OS_MAP}},{key:"PLATFORMS_MAP",get:function(){return a.PLATFORMS_MAP}}],(r=null)&&o(t.prototype,r),i&&o(t,i),e}();t.default=s,e.exports=t.default;},91:function(e,t,r){t.__esModule=!0,t.default=void 0;var i=u(r(92)),n=u(r(93)),a=u(r(94)),o=u(r(95)),s=u(r(17));function u(e){return e&&e.__esModule?e:{default:e}}var d=function(){function e(e,t){if(void 0===t&&(t=!1),null==e||""===e)throw new Error("UserAgent parameter can't be empty");this._ua=e,this.parsedResult={},!0!==t&&this.parse();}var t=e.prototype;return t.getUA=function(){return this._ua},t.test=function(e){return e.test(this._ua)},t.parseBrowser=function(){var e=this;this.parsedResult.browser={};var t=s.default.find(i.default,(function(t){if("function"==typeof t.test)return t.test(e);if(Array.isArray(t.test))return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.browser=t.describe(this.getUA())),this.parsedResult.browser},t.getBrowser=function(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()},t.getBrowserName=function(e){return e?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""},t.getBrowserVersion=function(){return this.getBrowser().version},t.getOS=function(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()},t.parseOS=function(){var e=this;this.parsedResult.os={};var t=s.default.find(n.default,(function(t){if("function"==typeof t.test)return t.test(e);if(Array.isArray(t.test))return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.os=t.describe(this.getUA())),this.parsedResult.os},t.getOSName=function(e){var t=this.getOS().name;return e?String(t).toLowerCase()||"":t||""},t.getOSVersion=function(){return this.getOS().version},t.getPlatform=function(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()},t.getPlatformType=function(e){void 0===e&&(e=!1);var t=this.getPlatform().type;return e?String(t).toLowerCase()||"":t||""},t.parsePlatform=function(){var e=this;this.parsedResult.platform={};var t=s.default.find(a.default,(function(t){if("function"==typeof t.test)return t.test(e);if(Array.isArray(t.test))return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.platform=t.describe(this.getUA())),this.parsedResult.platform},t.getEngine=function(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()},t.getEngineName=function(e){return e?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""},t.parseEngine=function(){var e=this;this.parsedResult.engine={};var t=s.default.find(o.default,(function(t){if("function"==typeof t.test)return t.test(e);if(Array.isArray(t.test))return t.test.some((function(t){return e.test(t)}));throw new Error("Browser's test function is not valid")}));return t&&(this.parsedResult.engine=t.describe(this.getUA())),this.parsedResult.engine},t.parse=function(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this},t.getResult=function(){return s.default.assign({},this.parsedResult)},t.satisfies=function(e){var t=this,r={},i=0,n={},a=0;if(Object.keys(e).forEach((function(t){var o=e[t];"string"==typeof o?(n[t]=o,a+=1):"object"==typeof o&&(r[t]=o,i+=1);})),i>0){var o=Object.keys(r),u=s.default.find(o,(function(e){return t.isOS(e)}));if(u){var d=this.satisfies(r[u]);if(void 0!==d)return d}var c=s.default.find(o,(function(e){return t.isPlatform(e)}));if(c){var f=this.satisfies(r[c]);if(void 0!==f)return f}}if(a>0){var l=Object.keys(n),b=s.default.find(l,(function(e){return t.isBrowser(e,!0)}));if(void 0!==b)return this.compareVersion(n[b])}},t.isBrowser=function(e,t){void 0===t&&(t=!1);var r=this.getBrowserName().toLowerCase(),i=e.toLowerCase(),n=s.default.getBrowserTypeByAlias(i);return t&&n&&(i=n.toLowerCase()),i===r},t.compareVersion=function(e){var t=[0],r=e,i=!1,n=this.getBrowserVersion();if("string"==typeof n)return ">"===e[0]||"<"===e[0]?(r=e.substr(1),"="===e[1]?(i=!0,r=e.substr(2)):t=[],">"===e[0]?t.push(1):t.push(-1)):"="===e[0]?r=e.substr(1):"~"===e[0]&&(i=!0,r=e.substr(1)),t.indexOf(s.default.compareVersions(n,r,i))>-1},t.isOS=function(e){return this.getOSName(!0)===String(e).toLowerCase()},t.isPlatform=function(e){return this.getPlatformType(!0)===String(e).toLowerCase()},t.isEngine=function(e){return this.getEngineName(!0)===String(e).toLowerCase()},t.is=function(e,t){return void 0===t&&(t=!1),this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)},t.some=function(e){var t=this;return void 0===e&&(e=[]),e.some((function(e){return t.is(e)}))},e}();t.default=d,e.exports=t.default;},92:function(e,t,r){t.__esModule=!0,t.default=void 0;var i,n=(i=r(17))&&i.__esModule?i:{default:i};var a=/version\/(\d+(\.?_?\d+)+)/i,o=[{test:[/gptbot/i],describe:function(e){var t={name:"GPTBot"},r=n.default.getFirstMatch(/gptbot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/chatgpt-user/i],describe:function(e){var t={name:"ChatGPT-User"},r=n.default.getFirstMatch(/chatgpt-user\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/oai-searchbot/i],describe:function(e){var t={name:"OAI-SearchBot"},r=n.default.getFirstMatch(/oai-searchbot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/claudebot/i,/claude-web/i,/claude-user/i,/claude-searchbot/i],describe:function(e){var t={name:"ClaudeBot"},r=n.default.getFirstMatch(/(?:claudebot|claude-web|claude-user|claude-searchbot)\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/omgilibot/i,/webzio-extended/i],describe:function(e){var t={name:"Omgilibot"},r=n.default.getFirstMatch(/(?:omgilibot|webzio-extended)\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/diffbot/i],describe:function(e){var t={name:"Diffbot"},r=n.default.getFirstMatch(/diffbot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/perplexitybot/i],describe:function(e){var t={name:"PerplexityBot"},r=n.default.getFirstMatch(/perplexitybot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/perplexity-user/i],describe:function(e){var t={name:"Perplexity-User"},r=n.default.getFirstMatch(/perplexity-user\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/youbot/i],describe:function(e){var t={name:"YouBot"},r=n.default.getFirstMatch(/youbot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/meta-webindexer/i],describe:function(e){var t={name:"Meta-WebIndexer"},r=n.default.getFirstMatch(/meta-webindexer\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/meta-externalads/i],describe:function(e){var t={name:"Meta-ExternalAds"},r=n.default.getFirstMatch(/meta-externalads\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/meta-externalagent/i],describe:function(e){var t={name:"Meta-ExternalAgent"},r=n.default.getFirstMatch(/meta-externalagent\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/meta-externalfetcher/i],describe:function(e){var t={name:"Meta-ExternalFetcher"},r=n.default.getFirstMatch(/meta-externalfetcher\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/googlebot/i],describe:function(e){var t={name:"Googlebot"},r=n.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/amazonbot/i],describe:function(e){var t={name:"AmazonBot"},r=n.default.getFirstMatch(/amazonbot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/bingbot/i],describe:function(e){var t={name:"BingCrawler"},r=n.default.getFirstMatch(/bingbot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/baiduspider/i],describe:function(e){var t={name:"BaiduSpider"},r=n.default.getFirstMatch(/baiduspider\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/duckduckbot/i],describe:function(e){var t={name:"DuckDuckBot"},r=n.default.getFirstMatch(/duckduckbot\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/ia_archiver/i],describe:function(e){var t={name:"InternetArchiveCrawler"},r=n.default.getFirstMatch(/ia_archiver\/(\d+(\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/facebookexternalhit/i,/facebookcatalog/i],describe:function(){return {name:"FacebookExternalHit"}}},{test:[/yahoo!?[\s/]*slurp/i],describe:function(){return {name:"YahooSlurp"}}},{test:[/yandexbot/i,/yandexmobilebot/i],describe:function(){return {name:"YandexBot"}}},{test:[/pingdom/i],describe:function(){return {name:"PingdomBot"}}},{test:[/opera/i],describe:function(e){var t={name:"Opera"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opr\/|opios/i],describe:function(e){var t={name:"Opera"},r=n.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:"Samsung Internet for Android"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Whale/i],describe:function(e){var t={name:"NAVER Whale Browser"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/PaleMoon/i],describe:function(e){var t={name:"Pale Moon"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:PaleMoon)[\s/](\d+(?:\.\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MZBrowser/i],describe:function(e){var t={name:"MZ Browser"},r=n.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/focus/i],describe:function(e){var t={name:"Focus"},r=n.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/swing/i],describe:function(e){var t={name:"Swing"},r=n.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/coast/i],describe:function(e){var t={name:"Opera Coast"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe:function(e){var t={name:"Opera Touch"},r=n.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/yabrowser/i],describe:function(e){var t={name:"Yandex Browser"},r=n.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:"UC Browser"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Maxthon|mxios/i],describe:function(e){var t={name:"Maxthon"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/epiphany/i],describe:function(e){var t={name:"Epiphany"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/puffin/i],describe:function(e){var t={name:"Puffin"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sleipnir/i],describe:function(e){var t={name:"Sleipnir"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/k-meleon/i],describe:function(e){var t={name:"K-Meleon"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/micromessenger/i],describe:function(e){var t={name:"WeChat"},r=n.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/qqbrowser/i],describe:function(e){var t={name:/qqbrowserlite/i.test(e)?"QQ Browser Lite":"QQ Browser"},r=n.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/msie|trident/i],describe:function(e){var t={name:"Internet Explorer"},r=n.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/\sedg\//i],describe:function(e){var t={name:"Microsoft Edge"},r=n.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/edg([ea]|ios)/i],describe:function(e){var t={name:"Microsoft Edge"},r=n.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/vivaldi/i],describe:function(e){var t={name:"Vivaldi"},r=n.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/seamonkey/i],describe:function(e){var t={name:"SeaMonkey"},r=n.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sailfish/i],describe:function(e){var t={name:"Sailfish"},r=n.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,e);return r&&(t.version=r),t}},{test:[/silk/i],describe:function(e){var t={name:"Amazon Silk"},r=n.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/phantom/i],describe:function(e){var t={name:"PhantomJS"},r=n.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/slimerjs/i],describe:function(e){var t={name:"SlimerJS"},r=n.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t={name:"BlackBerry"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t={name:"WebOS Browser"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/bada/i],describe:function(e){var t={name:"Bada"},r=n.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/tizen/i],describe:function(e){var t={name:"Tizen"},r=n.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/qupzilla/i],describe:function(e){var t={name:"QupZilla"},r=n.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/librewolf/i],describe:function(e){var t={name:"LibreWolf"},r=n.default.getFirstMatch(/(?:librewolf)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:"Firefox"},r=n.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/electron/i],describe:function(e){var t={name:"Electron"},r=n.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sogoumobilebrowser/i,/metasr/i,/se 2\.[x]/i],describe:function(e){var t={name:"Sogou Browser"},r=n.default.getFirstMatch(/(?:sogoumobilebrowser)[\s/](\d+(\.?_?\d+)+)/i,e),i=n.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,e),a=n.default.getFirstMatch(/se ([\d.]+)x/i,e),o=r||i||a;return o&&(t.version=o),t}},{test:[/MiuiBrowser/i],describe:function(e){var t={name:"Miui"},r=n.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/chromium/i],describe:function(e){var t={name:"Chromium"},r=n.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:"Chrome"},r=n.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/GSA/i],describe:function(e){var t={name:"Google Search"},r=n.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t={name:"Android Browser"},r=n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/playstation 4/i],describe:function(e){var t={name:"PlayStation 4"},r=n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:"Safari"},r=n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search("\\(")?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return {name:n.default.getFirstMatch(t,e),version:n.default.getSecondMatch(t,e)}}}];t.default=o,e.exports=t.default;},93:function(e,t,r){t.__esModule=!0,t.default=void 0;var i,n=(i=r(17))&&i.__esModule?i:{default:i},a=r(18);var o=[{test:[/Roku\/DVP/],describe:function(e){var t=n.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,e);return {name:a.OS_MAP.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=n.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,e);return {name:a.OS_MAP.WindowsPhone,version:t}}},{test:[/windows /i],describe:function(e){var t=n.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,e),r=n.default.getWindowsVersionName(t);return {name:a.OS_MAP.Windows,version:t,versionName:r}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(e){var t={name:a.OS_MAP.iOS},r=n.default.getSecondMatch(/(Version\/)(\d[\d.]+)/,e);return r&&(t.version=r),t}},{test:[/macintosh/i],describe:function(e){var t=n.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,e).replace(/[_\s]/g,"."),r=n.default.getMacOSVersionName(t),i={name:a.OS_MAP.MacOS,version:t};return r&&(i.versionName=r),i}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=n.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,e).replace(/[_\s]/g,".");return {name:a.OS_MAP.iOS,version:t}}},{test:[/OpenHarmony/i],describe:function(e){var t=n.default.getFirstMatch(/OpenHarmony\s+(\d+(\.\d+)*)/i,e);return {name:a.OS_MAP.HarmonyOS,version:t}}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t=n.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,e),r=n.default.getAndroidVersionName(t),i={name:a.OS_MAP.Android,version:t};return r&&(i.versionName=r),i}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=n.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,e),r={name:a.OS_MAP.WebOS};return t&&t.length&&(r.version=t),r}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(e){var t=n.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,e)||n.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,e)||n.default.getFirstMatch(/\bbb(\d+)/i,e);return {name:a.OS_MAP.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=n.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,e);return {name:a.OS_MAP.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=n.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,e);return {name:a.OS_MAP.Tizen,version:t}}},{test:[/linux/i],describe:function(){return {name:a.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return {name:a.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=n.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,e);return {name:a.OS_MAP.PlayStation4,version:t}}}];t.default=o,e.exports=t.default;},94:function(e,t,r){t.__esModule=!0,t.default=void 0;var i,n=(i=r(17))&&i.__esModule?i:{default:i},a=r(18);var o=[{test:[/googlebot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Google"}}},{test:[/amazonbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Amazon"}}},{test:[/gptbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"OpenAI"}}},{test:[/chatgpt-user/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"OpenAI"}}},{test:[/oai-searchbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"OpenAI"}}},{test:[/baiduspider/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Baidu"}}},{test:[/bingbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Bing"}}},{test:[/duckduckbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"DuckDuckGo"}}},{test:[/claudebot/i,/claude-web/i,/claude-user/i,/claude-searchbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Anthropic"}}},{test:[/omgilibot/i,/webzio-extended/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Webz.io"}}},{test:[/diffbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Diffbot"}}},{test:[/perplexitybot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Perplexity AI"}}},{test:[/perplexity-user/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Perplexity AI"}}},{test:[/youbot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"You.com"}}},{test:[/ia_archiver/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Internet Archive"}}},{test:[/meta-webindexer/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/meta-externalads/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/meta-externalagent/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/meta-externalfetcher/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/facebookexternalhit/i,/facebookcatalog/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/yahoo/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Yahoo"}}},{test:[/yandexbot/i,/yandexmobilebot/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Yandex"}}},{test:[/pingdom/i],describe:function(){return {type:a.PLATFORMS_MAP.bot,vendor:"Pingdom"}}},{test:[/huawei/i],describe:function(e){var t=n.default.getFirstMatch(/(can-l01)/i,e)&&"Nova",r={type:a.PLATFORMS_MAP.mobile,vendor:"Huawei"};return t&&(r.model=t),r}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return {type:a.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return {type:a.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return {type:a.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return {type:a.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return {type:a.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return {type:a.PLATFORMS_MAP.tablet}}},{test:function(e){var t=e.test(/ipod|iphone/i),r=e.test(/like (ipod|iphone)/i);return t&&!r},describe:function(e){var t=n.default.getFirstMatch(/(ipod|iphone)/i,e);return {type:a.PLATFORMS_MAP.mobile,vendor:"Apple",model:t}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return {type:a.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/Nokia/i],describe:function(e){var t=n.default.getFirstMatch(/Nokia\s+([0-9]+(\.[0-9]+)?)/i,e),r={type:a.PLATFORMS_MAP.mobile,vendor:"Nokia"};return t&&(r.model=t),r}},{test:[/[^-]mobi/i],describe:function(){return {type:a.PLATFORMS_MAP.mobile}}},{test:function(e){return "blackberry"===e.getBrowserName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(e){return "bada"===e.getBrowserName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.mobile}}},{test:function(e){return "windows phone"===e.getBrowserName()},describe:function(){return {type:a.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(e){var t=Number(String(e.getOSVersion()).split(".")[0]);return "android"===e.getOSName(!0)&&t>=3},describe:function(){return {type:a.PLATFORMS_MAP.tablet}}},{test:function(e){return "android"===e.getOSName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.mobile}}},{test:function(e){return "macos"===e.getOSName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(e){return "windows"===e.getOSName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.desktop}}},{test:function(e){return "linux"===e.getOSName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.desktop}}},{test:function(e){return "playstation 4"===e.getOSName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.tv}}},{test:function(e){return "roku"===e.getOSName(!0)},describe:function(){return {type:a.PLATFORMS_MAP.tv}}}];t.default=o,e.exports=t.default;},95:function(e,t,r){t.__esModule=!0,t.default=void 0;var i,n=(i=r(17))&&i.__esModule?i:{default:i},a=r(18);var o=[{test:function(e){return "microsoft edge"===e.getBrowserName(!0)},describe:function(e){if(/\sedg\//i.test(e))return {name:a.ENGINE_MAP.Blink};var t=n.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,e);return {name:a.ENGINE_MAP.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:a.ENGINE_MAP.Trident},r=n.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){return e.test(/presto/i)},describe:function(e){var t={name:a.ENGINE_MAP.Presto},r=n.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=e.test(/gecko/i),r=e.test(/like gecko/i);return t&&!r},describe:function(e){var t={name:a.ENGINE_MAP.Gecko},r=n.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return {name:a.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:a.ENGINE_MAP.WebKit},r=n.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,e);return r&&(t.version=r),t}}];t.default=o,e.exports=t.default;}})}));
|
|
50
|
+
} (es5));
|
|
51
|
+
|
|
52
|
+
var es5Exports = es5.exports;
|
|
53
|
+
var Bowser = /*@__PURE__*/getDefaultExportFromCjs(es5Exports);
|
|
54
|
+
|
|
55
|
+
function getBrowserNameVersion() {
|
|
56
|
+
const { browser, os, platform } = Bowser.parse(window.navigator.userAgent);
|
|
57
|
+
return {
|
|
58
|
+
browser,
|
|
59
|
+
os,
|
|
60
|
+
platform,
|
|
61
|
+
ratio: getRatio(),
|
|
62
|
+
wh: getWH()
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function getRatio() {
|
|
66
|
+
let ratio = 0;
|
|
67
|
+
const screen = window.screen;
|
|
68
|
+
const ua = navigator.userAgent.toLowerCase();
|
|
69
|
+
if (window.devicePixelRatio !== void 0) {
|
|
70
|
+
ratio = window.devicePixelRatio;
|
|
71
|
+
} else if (~ua.indexOf("msie")) {
|
|
72
|
+
if (screen.deviceXDPI && screen.logicalXDPI) {
|
|
73
|
+
ratio = screen.deviceXDPI / screen.logicalXDPI;
|
|
74
|
+
}
|
|
75
|
+
} else if (window.outerWidth !== void 0 && window.innerWidth !== void 0) {
|
|
76
|
+
ratio = window.outerWidth / window.innerWidth;
|
|
77
|
+
}
|
|
78
|
+
if (ratio) {
|
|
79
|
+
ratio = Math.round(ratio * 100);
|
|
80
|
+
}
|
|
81
|
+
return ratio;
|
|
82
|
+
}
|
|
83
|
+
function getWH() {
|
|
84
|
+
return {
|
|
85
|
+
width: window.screen.width,
|
|
86
|
+
height: window.screen.height
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const nextTime = window.requestIdleCallback || window.requestAnimationFrame || ((callback) => window.setTimeout(callback, 1e3 / 60));
|
|
90
|
+
const beforeUnload = (callback) => {
|
|
91
|
+
window.addEventListener("beforeunload", () => {
|
|
92
|
+
callback();
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
function throttle(fn, delay) {
|
|
97
|
+
let lastTime = 0;
|
|
98
|
+
return function(...args) {
|
|
99
|
+
const now = Date.now();
|
|
100
|
+
if (now - lastTime >= delay) {
|
|
101
|
+
fn.apply(this, args);
|
|
102
|
+
lastTime = now;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const MAX_CACHE_LEN = 5;
|
|
108
|
+
const MAX_WAITING_TIME = 3e4;
|
|
109
|
+
const UUID = "track_uuid";
|
|
110
|
+
const DEFAULT_LONG_TASK_THRESHOLD = 100;
|
|
111
|
+
const DEFAULT_RESOURCE_THRESHOLD = 1e3;
|
|
112
|
+
const DEFAULT_INP_THRESHOLD = 200;
|
|
113
|
+
|
|
114
|
+
var __defProp$3 = Object.defineProperty;
|
|
115
|
+
var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
116
|
+
var __publicField$3 = (obj, key, value) => {
|
|
117
|
+
__defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
118
|
+
return value;
|
|
119
|
+
};
|
|
120
|
+
class DeviceInfo {
|
|
121
|
+
constructor(uuidKey = UUID) {
|
|
122
|
+
__publicField$3(this, "device");
|
|
123
|
+
__publicField$3(this, "uuid", "");
|
|
124
|
+
this.device = getBrowserNameVersion();
|
|
125
|
+
this.getUUid(uuidKey);
|
|
126
|
+
}
|
|
127
|
+
getUUid(key) {
|
|
128
|
+
try {
|
|
129
|
+
const uuid = localStorage.getItem(key);
|
|
130
|
+
if (uuid) {
|
|
131
|
+
this.uuid = uuid;
|
|
132
|
+
} else {
|
|
133
|
+
this.uuid = nanoid();
|
|
134
|
+
localStorage.setItem(key, this.uuid);
|
|
135
|
+
}
|
|
136
|
+
} catch (e) {
|
|
137
|
+
this.uuid = nanoid();
|
|
138
|
+
console.warn("[CWJ Monitor] localStorage access failed, UUID will not be persisted:", e);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
var __defProp$2 = Object.defineProperty;
|
|
144
|
+
var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
145
|
+
var __publicField$2 = (obj, key, value) => {
|
|
146
|
+
__defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
147
|
+
return value;
|
|
148
|
+
};
|
|
149
|
+
class EventTrack {
|
|
150
|
+
constructor(options, reporter) {
|
|
151
|
+
__publicField$2(this, "deviceInfo");
|
|
152
|
+
__publicField$2(this, "reporter");
|
|
153
|
+
__publicField$2(this, "data");
|
|
154
|
+
this.deviceInfo = new DeviceInfo(options.uuidKey);
|
|
155
|
+
this.reporter = reporter;
|
|
156
|
+
this.data = options.data;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 格式化事件数据用于传输
|
|
160
|
+
*/
|
|
161
|
+
formatter(type, data) {
|
|
162
|
+
const timestamp = Date.now();
|
|
163
|
+
return {
|
|
164
|
+
device: this.deviceInfo.device,
|
|
165
|
+
uuid: this.deviceInfo.uuid,
|
|
166
|
+
type,
|
|
167
|
+
data,
|
|
168
|
+
date: getDate(timestamp),
|
|
169
|
+
userData: this.data
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* 公共方法:发送事件
|
|
174
|
+
* 将事件格式化后交给 reporter 处理
|
|
175
|
+
*/
|
|
176
|
+
emit(type, data) {
|
|
177
|
+
const payload = this.formatter(type, data);
|
|
178
|
+
this.reporter.send(payload);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* 获取上报器实例 (供 Core 使用)
|
|
182
|
+
*/
|
|
183
|
+
getReporter() {
|
|
184
|
+
return this.reporter;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
var __defProp$1 = Object.defineProperty;
|
|
189
|
+
var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
190
|
+
var __publicField$1 = (obj, key, value) => {
|
|
191
|
+
__defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
192
|
+
return value;
|
|
193
|
+
};
|
|
194
|
+
class Reporter {
|
|
195
|
+
constructor(url, config) {
|
|
196
|
+
__publicField$1(this, "url");
|
|
197
|
+
__publicField$1(this, "transportConfig");
|
|
198
|
+
__publicField$1(this, "events", []);
|
|
199
|
+
__publicField$1(this, "isSending", false);
|
|
200
|
+
__publicField$1(this, "timer", null);
|
|
201
|
+
this.url = url;
|
|
202
|
+
this.transportConfig = {
|
|
203
|
+
maxBatchSize: config?.maxBatchSize ?? MAX_CACHE_LEN,
|
|
204
|
+
maxWaitTime: config?.maxWaitTime ?? MAX_WAITING_TIME
|
|
205
|
+
};
|
|
206
|
+
beforeUnload(() => this.flush());
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* 将事件加入队列
|
|
210
|
+
*/
|
|
211
|
+
send(payload) {
|
|
212
|
+
this.events.push(payload);
|
|
213
|
+
if (this.events.length >= this.transportConfig.maxBatchSize) {
|
|
214
|
+
this.clearTimer();
|
|
215
|
+
this.triggerSend();
|
|
216
|
+
} else if (!this.timer) {
|
|
217
|
+
this.timer = setTimeout(() => {
|
|
218
|
+
this.timer = null;
|
|
219
|
+
this.triggerSend();
|
|
220
|
+
}, this.transportConfig.maxWaitTime);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* 立即刷新所有待发送事件
|
|
225
|
+
*/
|
|
226
|
+
flush() {
|
|
227
|
+
return this.triggerSend(true);
|
|
228
|
+
}
|
|
229
|
+
clearTimer() {
|
|
230
|
+
if (this.timer) {
|
|
231
|
+
clearTimeout(this.timer);
|
|
232
|
+
this.timer = null;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* 触发发送逻辑
|
|
237
|
+
*/
|
|
238
|
+
async triggerSend(isFlush = false) {
|
|
239
|
+
if (this.isSending || !this.events.length)
|
|
240
|
+
return;
|
|
241
|
+
this.isSending = true;
|
|
242
|
+
try {
|
|
243
|
+
const maxLen = isFlush ? this.events.length : this.transportConfig.maxBatchSize;
|
|
244
|
+
const sendEvents = this.events.slice(0, maxLen);
|
|
245
|
+
this.events = this.events.slice(maxLen);
|
|
246
|
+
await this.safeSend(sendEvents);
|
|
247
|
+
if (this.events.length) {
|
|
248
|
+
nextTime(() => this.triggerSend());
|
|
249
|
+
}
|
|
250
|
+
} catch (error) {
|
|
251
|
+
} finally {
|
|
252
|
+
this.isSending = false;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* 使用 navigator.sendBeacon 或 XMLHttpRequest 安全发送事件
|
|
257
|
+
*/
|
|
258
|
+
safeSend(events) {
|
|
259
|
+
return new Promise((resolve, reject) => {
|
|
260
|
+
if (!events.length) {
|
|
261
|
+
resolve();
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const data = JSON.stringify(events);
|
|
265
|
+
if (typeof navigator.sendBeacon === "function") {
|
|
266
|
+
const blob = new Blob([data], { type: "application/json" });
|
|
267
|
+
const success = navigator.sendBeacon(this.url, blob);
|
|
268
|
+
if (success) {
|
|
269
|
+
resolve();
|
|
270
|
+
} else {
|
|
271
|
+
this.sendViaXHR(data, resolve, reject);
|
|
272
|
+
}
|
|
273
|
+
} else {
|
|
274
|
+
this.sendViaXHR(data, resolve, reject);
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* 通过 XMLHttpRequest 发送
|
|
280
|
+
*/
|
|
281
|
+
sendViaXHR(data, resolve, reject) {
|
|
282
|
+
const xhr = new XMLHttpRequest();
|
|
283
|
+
xhr.open("POST", this.url, true);
|
|
284
|
+
xhr.setRequestHeader("Content-Type", "application/json");
|
|
285
|
+
xhr.onload = () => {
|
|
286
|
+
if (xhr.status >= 200 && xhr.status < 300) {
|
|
287
|
+
resolve();
|
|
288
|
+
} else {
|
|
289
|
+
reject(new Error(`HTTP ${xhr.status}: ${xhr.statusText}`));
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
xhr.onerror = () => reject(new Error("Network error"));
|
|
293
|
+
xhr.ontimeout = () => reject(new Error("Request timeout"));
|
|
294
|
+
xhr.timeout = 1e4;
|
|
295
|
+
xhr.send(data);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
var TYPES = /* @__PURE__ */ ((TYPES2) => {
|
|
300
|
+
TYPES2["ERROR"] = "error";
|
|
301
|
+
TYPES2["CLICK"] = "click";
|
|
302
|
+
TYPES2["PERFORMANCE"] = "performance";
|
|
303
|
+
TYPES2["ROUTER"] = "router";
|
|
304
|
+
TYPES2["XHR"] = "xhr";
|
|
305
|
+
TYPES2["FETCH"] = "fetch";
|
|
306
|
+
return TYPES2;
|
|
307
|
+
})(TYPES || {});
|
|
308
|
+
var EMIT_TYPE = /* @__PURE__ */ ((EMIT_TYPE2) => {
|
|
309
|
+
EMIT_TYPE2["ERROR"] = "error";
|
|
310
|
+
EMIT_TYPE2["BEHAVIOR_CLICK"] = "click";
|
|
311
|
+
EMIT_TYPE2["ROUTE_CHANGE"] = "route_change";
|
|
312
|
+
EMIT_TYPE2["PERFORMANCE_FP"] = "performance_fp";
|
|
313
|
+
EMIT_TYPE2["PERFORMANCE_FCP"] = "performance_fcp";
|
|
314
|
+
EMIT_TYPE2["PERFORMANCE_LCP"] = "performance_lcp";
|
|
315
|
+
EMIT_TYPE2["PERFORMANCE_INP"] = "performance_inp";
|
|
316
|
+
EMIT_TYPE2["PERFORMANCE_LONGTASK"] = "performance_longtask";
|
|
317
|
+
EMIT_TYPE2["PERFORMANCE_RESOURCE"] = "performance_resource";
|
|
318
|
+
EMIT_TYPE2["XHR"] = "xhr";
|
|
319
|
+
EMIT_TYPE2["FETCH"] = "fetch";
|
|
320
|
+
EMIT_TYPE2["CUSTOM"] = "custom";
|
|
321
|
+
return EMIT_TYPE2;
|
|
322
|
+
})(EMIT_TYPE || {});
|
|
323
|
+
|
|
324
|
+
var __defProp = Object.defineProperty;
|
|
325
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
326
|
+
var __publicField = (obj, key, value) => {
|
|
327
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
328
|
+
return value;
|
|
329
|
+
};
|
|
330
|
+
class Core extends EventTrack {
|
|
331
|
+
constructor(options) {
|
|
332
|
+
const reporter = new Reporter(options.url, options.transport);
|
|
333
|
+
super(options, reporter);
|
|
334
|
+
__publicField(this, "pluginMap", /* @__PURE__ */ new Map());
|
|
335
|
+
__publicField(this, "options");
|
|
336
|
+
this.options = options;
|
|
337
|
+
}
|
|
338
|
+
use(plugin) {
|
|
339
|
+
if (!this.pluginMap.has(plugin.name)) {
|
|
340
|
+
this.pluginMap.set(plugin.name, plugin);
|
|
341
|
+
}
|
|
342
|
+
return this;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* 自定义事件上报
|
|
346
|
+
* @param data 上报的数据
|
|
347
|
+
* @param type 事件类型,默认为 'custom'
|
|
348
|
+
*/
|
|
349
|
+
log(data, type = EMIT_TYPE.CUSTOM) {
|
|
350
|
+
this.emit(type, data);
|
|
351
|
+
}
|
|
352
|
+
// 启动插件
|
|
353
|
+
run() {
|
|
354
|
+
const context = {
|
|
355
|
+
emit: this.emit.bind(this),
|
|
356
|
+
url: this.options.url
|
|
357
|
+
};
|
|
358
|
+
this.pluginMap.forEach((plugin) => {
|
|
359
|
+
plugin.install(context);
|
|
360
|
+
});
|
|
361
|
+
this.mount();
|
|
362
|
+
}
|
|
363
|
+
// 停止并卸载所有插件
|
|
364
|
+
stop() {
|
|
365
|
+
this.pluginMap.forEach((plugin) => {
|
|
366
|
+
plugin.uninstall?.();
|
|
367
|
+
});
|
|
368
|
+
this.pluginMap.clear();
|
|
369
|
+
this.unmount();
|
|
370
|
+
}
|
|
371
|
+
mount() {
|
|
372
|
+
const { globalKey = "$track" } = this.options;
|
|
373
|
+
if (typeof window !== "undefined") {
|
|
374
|
+
window[globalKey] = this;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
unmount() {
|
|
378
|
+
const { globalKey = "$track" } = this.options;
|
|
379
|
+
if (typeof window !== "undefined" && window[globalKey] === this) {
|
|
380
|
+
delete window[globalKey];
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
function createMonitor(options) {
|
|
385
|
+
return new Core(options);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
const ErrorPlugin = (options = {}) => {
|
|
389
|
+
let originalConsoleError;
|
|
390
|
+
let context;
|
|
391
|
+
const overrideConsoleError = () => {
|
|
392
|
+
originalConsoleError = console.error;
|
|
393
|
+
console.error = (...args) => {
|
|
394
|
+
originalConsoleError?.apply(console, args);
|
|
395
|
+
const errorData = {
|
|
396
|
+
type: "console",
|
|
397
|
+
message: args.map((arg) => String(arg)).join(" "),
|
|
398
|
+
stack: new Error().stack
|
|
399
|
+
};
|
|
400
|
+
if (options.filter && !options.filter(errorData)) {
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
context?.emit(EMIT_TYPE.ERROR, errorData);
|
|
404
|
+
};
|
|
405
|
+
};
|
|
406
|
+
const restoreConsoleError = () => {
|
|
407
|
+
if (originalConsoleError) {
|
|
408
|
+
console.error = originalConsoleError;
|
|
409
|
+
}
|
|
410
|
+
};
|
|
411
|
+
const cleanStack = (stack) => {
|
|
412
|
+
if (!stack)
|
|
413
|
+
return void 0;
|
|
414
|
+
const lines = stack.split("\n").slice(0, 11);
|
|
415
|
+
return lines.join("\n");
|
|
416
|
+
};
|
|
417
|
+
const simpleHash = (str) => {
|
|
418
|
+
let hash = 0;
|
|
419
|
+
for (let i = 0; i < str.length; i++) {
|
|
420
|
+
const char = str.charCodeAt(i);
|
|
421
|
+
hash = (hash << 5) - hash + char;
|
|
422
|
+
hash = hash & hash;
|
|
423
|
+
}
|
|
424
|
+
return Math.abs(hash).toString(36);
|
|
425
|
+
};
|
|
426
|
+
const generateFingerprint = (...parts) => {
|
|
427
|
+
const combined = parts.filter(Boolean).join("|");
|
|
428
|
+
return simpleHash(combined);
|
|
429
|
+
};
|
|
430
|
+
const isResourceError = (target) => {
|
|
431
|
+
const resourceTags = ["LINK", "SCRIPT", "IMG", "AUDIO", "VIDEO", "IFRAME"];
|
|
432
|
+
return target && resourceTags.includes(target.tagName);
|
|
433
|
+
};
|
|
434
|
+
const getPromiseErrorDetails = (e) => {
|
|
435
|
+
if (e.reason instanceof Error) {
|
|
436
|
+
return {
|
|
437
|
+
errorType: "promise",
|
|
438
|
+
message: e.reason.message,
|
|
439
|
+
stack: cleanStack(e.reason.stack),
|
|
440
|
+
name: e.reason.name,
|
|
441
|
+
fingerprint: generateFingerprint(e.reason.message, e.reason.stack)
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
return {
|
|
445
|
+
errorType: "promise",
|
|
446
|
+
message: String(e.reason)
|
|
447
|
+
};
|
|
448
|
+
};
|
|
449
|
+
const getErrorDetails = (e) => {
|
|
450
|
+
const { error, target, filename, message } = e;
|
|
451
|
+
if (error instanceof Error) {
|
|
452
|
+
return {
|
|
453
|
+
errorType: "js",
|
|
454
|
+
name: error.name,
|
|
455
|
+
message: error.message,
|
|
456
|
+
stack: cleanStack(error.stack),
|
|
457
|
+
filename,
|
|
458
|
+
colno: e.colno,
|
|
459
|
+
lineno: e.lineno,
|
|
460
|
+
fingerprint: generateFingerprint(error.message, error.stack)
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
if (isResourceError(target)) {
|
|
464
|
+
const element = target;
|
|
465
|
+
const url = "src" in element ? element.src : element.href;
|
|
466
|
+
return {
|
|
467
|
+
errorType: "resource",
|
|
468
|
+
message: `Resource load failed: ${url}`,
|
|
469
|
+
url,
|
|
470
|
+
tagName: element.tagName,
|
|
471
|
+
fingerprint: generateFingerprint(`resource:${url}`)
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
return {
|
|
475
|
+
errorType: "unknown",
|
|
476
|
+
message,
|
|
477
|
+
filename
|
|
478
|
+
};
|
|
479
|
+
};
|
|
480
|
+
const errorHandler = (e) => {
|
|
481
|
+
const errorData = { type: "sync", ...getErrorDetails(e) };
|
|
482
|
+
if (options.filter && !options.filter(errorData))
|
|
483
|
+
return;
|
|
484
|
+
context?.emit(EMIT_TYPE.ERROR, errorData);
|
|
485
|
+
};
|
|
486
|
+
const rejectionHandler = (e) => {
|
|
487
|
+
const errorData = { type: "async", ...getPromiseErrorDetails(e) };
|
|
488
|
+
if (options.filter && !options.filter(errorData))
|
|
489
|
+
return;
|
|
490
|
+
context?.emit(EMIT_TYPE.ERROR, errorData);
|
|
491
|
+
};
|
|
492
|
+
return {
|
|
493
|
+
name: TYPES.ERROR,
|
|
494
|
+
install: (ctx) => {
|
|
495
|
+
context = ctx;
|
|
496
|
+
overrideConsoleError();
|
|
497
|
+
window.addEventListener("error", errorHandler, true);
|
|
498
|
+
window.addEventListener("unhandledrejection", rejectionHandler, true);
|
|
499
|
+
},
|
|
500
|
+
uninstall: () => {
|
|
501
|
+
restoreConsoleError();
|
|
502
|
+
window.removeEventListener("error", errorHandler, true);
|
|
503
|
+
window.removeEventListener("unhandledrejection", rejectionHandler, true);
|
|
504
|
+
}
|
|
505
|
+
};
|
|
506
|
+
};
|
|
507
|
+
|
|
508
|
+
const PVPlugin = (options = {}) => {
|
|
509
|
+
let lastRouteTime = Date.now();
|
|
510
|
+
let context;
|
|
511
|
+
let originPushState;
|
|
512
|
+
let originReplaceState;
|
|
513
|
+
const emitRouteChange = (type) => {
|
|
514
|
+
const now = Date.now();
|
|
515
|
+
const to = window.location.href;
|
|
516
|
+
const from = document.referrer;
|
|
517
|
+
if (options.filter && !options.filter(to, from)) {
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
context?.emit(EMIT_TYPE.ROUTE_CHANGE, {
|
|
521
|
+
from,
|
|
522
|
+
to,
|
|
523
|
+
type,
|
|
524
|
+
duration: getSeconds(now, lastRouteTime)
|
|
525
|
+
});
|
|
526
|
+
lastRouteTime = now;
|
|
527
|
+
};
|
|
528
|
+
const handleHashChange = () => emitRouteChange("hashchange");
|
|
529
|
+
const handlePopState = () => emitRouteChange("popstate");
|
|
530
|
+
const setupHistoryListener = () => {
|
|
531
|
+
originPushState = window.history.pushState;
|
|
532
|
+
originReplaceState = window.history.replaceState;
|
|
533
|
+
window.history.pushState = (...args) => {
|
|
534
|
+
originPushState.apply(window.history, args);
|
|
535
|
+
emitRouteChange("pushState");
|
|
536
|
+
};
|
|
537
|
+
window.history.replaceState = (...args) => {
|
|
538
|
+
originReplaceState.apply(window.history, args);
|
|
539
|
+
emitRouteChange("replaceState");
|
|
540
|
+
};
|
|
541
|
+
};
|
|
542
|
+
const restoreHistoryListener = () => {
|
|
543
|
+
if (originPushState)
|
|
544
|
+
window.history.pushState = originPushState;
|
|
545
|
+
if (originReplaceState)
|
|
546
|
+
window.history.replaceState = originReplaceState;
|
|
547
|
+
};
|
|
548
|
+
return {
|
|
549
|
+
name: TYPES.ROUTER,
|
|
550
|
+
install: (ctx) => {
|
|
551
|
+
context = ctx;
|
|
552
|
+
lastRouteTime = Date.now();
|
|
553
|
+
window.addEventListener("hashchange", handleHashChange);
|
|
554
|
+
window.addEventListener("popstate", handlePopState);
|
|
555
|
+
setupHistoryListener();
|
|
556
|
+
},
|
|
557
|
+
uninstall: () => {
|
|
558
|
+
window.removeEventListener("hashchange", handleHashChange);
|
|
559
|
+
window.removeEventListener("popstate", handlePopState);
|
|
560
|
+
restoreHistoryListener();
|
|
561
|
+
}
|
|
562
|
+
};
|
|
563
|
+
};
|
|
564
|
+
|
|
565
|
+
const BehaviorPlugin = (options = {}) => {
|
|
566
|
+
const { throttleDelay = 500 } = options;
|
|
567
|
+
let context;
|
|
568
|
+
const getElementXPath = (element) => {
|
|
569
|
+
if (!element || element.nodeType !== 1)
|
|
570
|
+
return "";
|
|
571
|
+
if (element.id)
|
|
572
|
+
return `//*[@id="${element.id}"]`;
|
|
573
|
+
const sameTagSiblings = Array.from(element.parentNode?.children || []).filter(
|
|
574
|
+
(el) => el.tagName === element.tagName
|
|
575
|
+
);
|
|
576
|
+
const idx = sameTagSiblings.indexOf(element) + 1;
|
|
577
|
+
return `${getElementXPath(element.parentNode)}/${element.tagName.toLowerCase()}[${idx}]`;
|
|
578
|
+
};
|
|
579
|
+
const handleClick = throttle((e) => {
|
|
580
|
+
const target = e.target;
|
|
581
|
+
if (!target)
|
|
582
|
+
return;
|
|
583
|
+
if (options.filter && !options.filter(target)) {
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
const clickData = {
|
|
587
|
+
tagName: target.tagName,
|
|
588
|
+
id: target.id,
|
|
589
|
+
className: target.className,
|
|
590
|
+
text: target.textContent?.trim(),
|
|
591
|
+
xPath: getElementXPath(target)
|
|
592
|
+
};
|
|
593
|
+
context?.emit(EMIT_TYPE.BEHAVIOR_CLICK, clickData);
|
|
594
|
+
}, throttleDelay);
|
|
595
|
+
return {
|
|
596
|
+
name: TYPES.CLICK,
|
|
597
|
+
install: (ctx) => {
|
|
598
|
+
context = ctx;
|
|
599
|
+
document.addEventListener(EMIT_TYPE.BEHAVIOR_CLICK, handleClick, true);
|
|
600
|
+
},
|
|
601
|
+
uninstall: () => {
|
|
602
|
+
document.removeEventListener(EMIT_TYPE.BEHAVIOR_CLICK, handleClick, true);
|
|
603
|
+
}
|
|
604
|
+
};
|
|
605
|
+
};
|
|
606
|
+
|
|
607
|
+
const PerformancePlugin = (options = {}) => {
|
|
608
|
+
let context;
|
|
609
|
+
let paintObserver = null;
|
|
610
|
+
let lcpObserver = null;
|
|
611
|
+
let inpObserver = null;
|
|
612
|
+
let longTaskObserver = null;
|
|
613
|
+
let resourceObserver = null;
|
|
614
|
+
const interactionMap = /* @__PURE__ */ new Map();
|
|
615
|
+
const monitorPaintMetrics = () => {
|
|
616
|
+
const entryHandler = (list) => {
|
|
617
|
+
for (const entry of list.getEntries()) {
|
|
618
|
+
if (entry.name === "first-paint") {
|
|
619
|
+
if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_FP, entry.startTime)) {
|
|
620
|
+
continue;
|
|
621
|
+
}
|
|
622
|
+
context?.emit(EMIT_TYPE.PERFORMANCE_FP, entry.startTime);
|
|
623
|
+
} else if (entry.name === "first-contentful-paint") {
|
|
624
|
+
if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_FCP, entry.startTime)) {
|
|
625
|
+
continue;
|
|
626
|
+
}
|
|
627
|
+
context?.emit(EMIT_TYPE.PERFORMANCE_FCP, entry.startTime);
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
paintObserver?.disconnect();
|
|
631
|
+
};
|
|
632
|
+
try {
|
|
633
|
+
paintObserver = new PerformanceObserver(entryHandler);
|
|
634
|
+
paintObserver.observe({ type: "paint", buffered: true });
|
|
635
|
+
} catch (e) {
|
|
636
|
+
console.warn("[CWJ Monitor] Paint observation not supported:", e);
|
|
637
|
+
}
|
|
638
|
+
};
|
|
639
|
+
const monitorLCP = () => {
|
|
640
|
+
const entryHandler = (list) => {
|
|
641
|
+
if (lcpObserver) {
|
|
642
|
+
lcpObserver.disconnect();
|
|
643
|
+
}
|
|
644
|
+
for (const entry of list.getEntries()) {
|
|
645
|
+
if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_LCP, entry.startTime)) {
|
|
646
|
+
continue;
|
|
647
|
+
}
|
|
648
|
+
context?.emit(EMIT_TYPE.PERFORMANCE_LCP, entry.startTime);
|
|
649
|
+
}
|
|
650
|
+
};
|
|
651
|
+
try {
|
|
652
|
+
lcpObserver = new PerformanceObserver(entryHandler);
|
|
653
|
+
lcpObserver.observe({ type: "largest-contentful-paint", buffered: true });
|
|
654
|
+
} catch (e) {
|
|
655
|
+
console.warn("[CWJ Monitor] LCP observation not supported:", e);
|
|
656
|
+
}
|
|
657
|
+
};
|
|
658
|
+
const monitorINP = () => {
|
|
659
|
+
const entryHandler = (list) => {
|
|
660
|
+
for (const entry of list.getEntries()) {
|
|
661
|
+
if (!entry.interactionId)
|
|
662
|
+
continue;
|
|
663
|
+
const existing = interactionMap.get(entry.interactionId);
|
|
664
|
+
if (existing) {
|
|
665
|
+
clearTimeout(existing.timeoutId);
|
|
666
|
+
}
|
|
667
|
+
const maxEntry = existing && existing.entry.duration > entry.duration ? existing.entry : entry;
|
|
668
|
+
const timeoutId = setTimeout(() => {
|
|
669
|
+
interactionMap.delete(maxEntry.interactionId);
|
|
670
|
+
if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_INP, maxEntry)) {
|
|
671
|
+
return;
|
|
672
|
+
}
|
|
673
|
+
const threshold = options.inpThreshold ?? DEFAULT_INP_THRESHOLD;
|
|
674
|
+
if (maxEntry.duration > threshold) {
|
|
675
|
+
context?.emit(EMIT_TYPE.PERFORMANCE_INP, {
|
|
676
|
+
value: maxEntry.duration,
|
|
677
|
+
startTime: maxEntry.startTime,
|
|
678
|
+
name: maxEntry.name,
|
|
679
|
+
interactionId: maxEntry.interactionId
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
}, 200);
|
|
683
|
+
interactionMap.set(entry.interactionId, { entry: maxEntry, timeoutId });
|
|
684
|
+
}
|
|
685
|
+
};
|
|
686
|
+
try {
|
|
687
|
+
inpObserver = new PerformanceObserver(entryHandler);
|
|
688
|
+
inpObserver.observe({ type: "event", buffered: true });
|
|
689
|
+
} catch (e) {
|
|
690
|
+
console.warn("[CWJ Monitor] INP observation not supported:", e);
|
|
691
|
+
}
|
|
692
|
+
};
|
|
693
|
+
const monitorLongTask = () => {
|
|
694
|
+
const entryHandler = (list) => {
|
|
695
|
+
for (const entry of list.getEntries()) {
|
|
696
|
+
if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_LONGTASK, entry)) {
|
|
697
|
+
continue;
|
|
698
|
+
}
|
|
699
|
+
const threshold = options.longTaskThreshold ?? DEFAULT_LONG_TASK_THRESHOLD;
|
|
700
|
+
if (entry.duration > threshold) {
|
|
701
|
+
context?.emit(EMIT_TYPE.PERFORMANCE_LONGTASK, {
|
|
702
|
+
startTime: entry.startTime,
|
|
703
|
+
duration: entry.duration,
|
|
704
|
+
name: entry.name,
|
|
705
|
+
attribution: entry.attribution
|
|
706
|
+
});
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
};
|
|
710
|
+
try {
|
|
711
|
+
longTaskObserver = new PerformanceObserver(entryHandler);
|
|
712
|
+
longTaskObserver.observe({ type: "longtask", buffered: true });
|
|
713
|
+
} catch (e) {
|
|
714
|
+
console.warn("[CWJ Monitor] Long Task observation not supported:", e);
|
|
715
|
+
}
|
|
716
|
+
};
|
|
717
|
+
const monitorResource = () => {
|
|
718
|
+
const entryHandler = (list) => {
|
|
719
|
+
for (const entry of list.getEntries()) {
|
|
720
|
+
if (entry.initiatorType !== "fetch" && entry.initiatorType !== "xmlhttprequest") {
|
|
721
|
+
continue;
|
|
722
|
+
}
|
|
723
|
+
if (options.filter && !options.filter(EMIT_TYPE.PERFORMANCE_RESOURCE, entry)) {
|
|
724
|
+
continue;
|
|
725
|
+
}
|
|
726
|
+
const threshold = options.resourceThreshold ?? DEFAULT_RESOURCE_THRESHOLD;
|
|
727
|
+
if (entry.duration > threshold) {
|
|
728
|
+
context?.emit(EMIT_TYPE.PERFORMANCE_RESOURCE, {
|
|
729
|
+
name: entry.name,
|
|
730
|
+
// 资源 URL
|
|
731
|
+
initiatorType: entry.initiatorType,
|
|
732
|
+
duration: entry.duration,
|
|
733
|
+
startTime: entry.startTime,
|
|
734
|
+
transferSize: entry.transferSize,
|
|
735
|
+
encodedBodySize: entry.encodedBodySize,
|
|
736
|
+
decodedBodySize: entry.decodedBodySize
|
|
737
|
+
});
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
};
|
|
741
|
+
try {
|
|
742
|
+
resourceObserver = new PerformanceObserver(entryHandler);
|
|
743
|
+
resourceObserver.observe({ type: "resource", buffered: true });
|
|
744
|
+
} catch (e) {
|
|
745
|
+
console.warn("[CWJ Monitor] Resource observation not supported:", e);
|
|
746
|
+
}
|
|
747
|
+
};
|
|
748
|
+
return {
|
|
749
|
+
name: TYPES.PERFORMANCE,
|
|
750
|
+
install: (ctx) => {
|
|
751
|
+
context = ctx;
|
|
752
|
+
monitorPaintMetrics();
|
|
753
|
+
monitorLCP();
|
|
754
|
+
monitorINP();
|
|
755
|
+
monitorLongTask();
|
|
756
|
+
monitorResource();
|
|
757
|
+
},
|
|
758
|
+
uninstall: () => {
|
|
759
|
+
paintObserver?.disconnect();
|
|
760
|
+
lcpObserver?.disconnect();
|
|
761
|
+
inpObserver?.disconnect();
|
|
762
|
+
longTaskObserver?.disconnect();
|
|
763
|
+
resourceObserver?.disconnect();
|
|
764
|
+
interactionMap.forEach((value) => clearTimeout(value.timeoutId));
|
|
765
|
+
interactionMap.clear();
|
|
766
|
+
}
|
|
767
|
+
};
|
|
768
|
+
};
|
|
769
|
+
|
|
770
|
+
const XHRPlugin = (options = {}) => {
|
|
771
|
+
let context;
|
|
772
|
+
let originOpen;
|
|
773
|
+
let originSend;
|
|
774
|
+
const setupXHRListeners = () => {
|
|
775
|
+
const originXhr = window.XMLHttpRequest;
|
|
776
|
+
if (!originXhr)
|
|
777
|
+
return;
|
|
778
|
+
originOpen = originXhr.prototype.open;
|
|
779
|
+
originSend = originXhr.prototype.send;
|
|
780
|
+
originXhr.prototype.open = function(...args) {
|
|
781
|
+
this._xhr_info = {
|
|
782
|
+
method: args[0].toUpperCase(),
|
|
783
|
+
url: String(args[1]),
|
|
784
|
+
startTime: 0
|
|
785
|
+
};
|
|
786
|
+
return originOpen.apply(this, args);
|
|
787
|
+
};
|
|
788
|
+
originXhr.prototype.send = function(...args) {
|
|
789
|
+
if (this._xhr_info) {
|
|
790
|
+
this._xhr_info.startTime = Date.now();
|
|
791
|
+
}
|
|
792
|
+
const onLoadend = () => {
|
|
793
|
+
if (this._xhr_info) {
|
|
794
|
+
const trackerUrl = context?.url;
|
|
795
|
+
const { url, method, startTime } = this._xhr_info;
|
|
796
|
+
if (trackerUrl && url.includes(trackerUrl)) {
|
|
797
|
+
return;
|
|
798
|
+
}
|
|
799
|
+
if (options.filter && !options.filter(method, url)) {
|
|
800
|
+
return;
|
|
801
|
+
}
|
|
802
|
+
const duration = Date.now() - startTime;
|
|
803
|
+
const status = this.status;
|
|
804
|
+
if (!(status >= 200 && status < 300)) {
|
|
805
|
+
const data = {
|
|
806
|
+
method,
|
|
807
|
+
url,
|
|
808
|
+
status,
|
|
809
|
+
duration,
|
|
810
|
+
// 限制响应体大小,避免数据过大
|
|
811
|
+
response: this.response ? String(this.response).slice(0, 200) : ""
|
|
812
|
+
};
|
|
813
|
+
context?.emit(EMIT_TYPE.XHR, data);
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
};
|
|
817
|
+
this.addEventListener("loadend", onLoadend);
|
|
818
|
+
return originSend.apply(this, args);
|
|
819
|
+
};
|
|
820
|
+
};
|
|
821
|
+
const restoreXHR = () => {
|
|
822
|
+
const originXhr = window.XMLHttpRequest;
|
|
823
|
+
if (!originXhr)
|
|
824
|
+
return;
|
|
825
|
+
if (originOpen)
|
|
826
|
+
originXhr.prototype.open = originOpen;
|
|
827
|
+
if (originSend)
|
|
828
|
+
originXhr.prototype.send = originSend;
|
|
829
|
+
};
|
|
830
|
+
return {
|
|
831
|
+
name: TYPES.XHR,
|
|
832
|
+
install: (ctx) => {
|
|
833
|
+
context = ctx;
|
|
834
|
+
setupXHRListeners();
|
|
835
|
+
},
|
|
836
|
+
uninstall: () => {
|
|
837
|
+
restoreXHR();
|
|
838
|
+
}
|
|
839
|
+
};
|
|
840
|
+
};
|
|
841
|
+
|
|
842
|
+
const FetchPlugin = (options = {}) => {
|
|
843
|
+
let context;
|
|
844
|
+
let originFetch;
|
|
845
|
+
const setupFetchListeners = () => {
|
|
846
|
+
originFetch = window.fetch;
|
|
847
|
+
if (!originFetch)
|
|
848
|
+
return;
|
|
849
|
+
window.fetch = function(input, init) {
|
|
850
|
+
const startTime = Date.now();
|
|
851
|
+
const method = (init?.method || "GET").toUpperCase();
|
|
852
|
+
const url = input instanceof Request ? input.url : String(input);
|
|
853
|
+
return originFetch.apply(this, [input, init]).then(
|
|
854
|
+
(response) => {
|
|
855
|
+
const trackerUrl = context?.url;
|
|
856
|
+
if (trackerUrl && url.includes(trackerUrl)) {
|
|
857
|
+
return response;
|
|
858
|
+
}
|
|
859
|
+
if (options.filter && !options.filter(method, url)) {
|
|
860
|
+
return response;
|
|
861
|
+
}
|
|
862
|
+
if (!response.ok) {
|
|
863
|
+
const duration = Date.now() - startTime;
|
|
864
|
+
const data = {
|
|
865
|
+
method,
|
|
866
|
+
url,
|
|
867
|
+
status: response.status,
|
|
868
|
+
duration,
|
|
869
|
+
success: false
|
|
870
|
+
};
|
|
871
|
+
context?.emit(EMIT_TYPE.FETCH, data);
|
|
872
|
+
}
|
|
873
|
+
return response;
|
|
874
|
+
},
|
|
875
|
+
(error) => {
|
|
876
|
+
const trackerUrl = context?.url;
|
|
877
|
+
if (trackerUrl && url.includes(trackerUrl)) {
|
|
878
|
+
throw error;
|
|
879
|
+
}
|
|
880
|
+
if (options.filter && !options.filter(method, url)) {
|
|
881
|
+
throw error;
|
|
882
|
+
}
|
|
883
|
+
const duration = Date.now() - startTime;
|
|
884
|
+
const data = {
|
|
885
|
+
method,
|
|
886
|
+
url,
|
|
887
|
+
status: 0,
|
|
888
|
+
duration,
|
|
889
|
+
success: false,
|
|
890
|
+
message: error.message
|
|
891
|
+
};
|
|
892
|
+
context?.emit(EMIT_TYPE.FETCH, data);
|
|
893
|
+
throw error;
|
|
894
|
+
}
|
|
895
|
+
);
|
|
896
|
+
};
|
|
897
|
+
};
|
|
898
|
+
const restoreFetch = () => {
|
|
899
|
+
if (originFetch)
|
|
900
|
+
window.fetch = originFetch;
|
|
901
|
+
};
|
|
902
|
+
return {
|
|
903
|
+
name: TYPES.FETCH,
|
|
904
|
+
install: (ctx) => {
|
|
905
|
+
context = ctx;
|
|
906
|
+
setupFetchListeners();
|
|
907
|
+
},
|
|
908
|
+
uninstall: () => {
|
|
909
|
+
restoreFetch();
|
|
910
|
+
}
|
|
911
|
+
};
|
|
912
|
+
};
|
|
913
|
+
|
|
914
|
+
export { BehaviorPlugin, Core, EMIT_TYPE, ErrorPlugin, FetchPlugin, PVPlugin, PerformancePlugin, XHRPlugin, createMonitor };
|
|
915
|
+
//# sourceMappingURL=index.js.map
|