@kt-web-tracing/vue3
Version:
基于 JS 跨平台插件,为前端项目提供【 埋点、行为、性能、异常、请求、资源、路由、曝光、录屏 】监控手段 - vue3版本
1,635 lines (1,617 loc) • 579 kB
JavaScript
(function (exports) {
'use strict';
function isType(type) {
return function(value) {
return Object.prototype.toString.call(value) === `[object ${type}]`;
};
}
const isRegExp$1 = isType("RegExp");
const isNumber = isType("Number");
const isString = isType("String");
const isBoolean = isType("Boolean");
const isFunction = isType("Function");
const isArray = isType("Array");
const isWindow = isType("Window");
const isFlase = (val) => {
return isBoolean(val) && String(val) === "false";
};
function isEmpty(wat) {
return isString(wat) && wat.trim() === "" || wat === void 0 || wat === null;
}
const isBrowserEnv = isWindow(typeof window !== "undefined" ? window : 0);
const isElectronEnv = !!window?.process?.versions?.electron;
const isTestEnv = typeof navigator !== "undefined" && navigator.userAgent.includes("jsdom") || // @ts-expect-error: jsdom
typeof window !== "undefined" && window.jsdom;
function getGlobal() {
if (isBrowserEnv || isElectronEnv || isTestEnv)
return window;
return {};
}
function getGlobalSupport() {
_global.__webTracing__ = _global.__webTracing__ || {};
return _global.__webTracing__;
}
function isInit() {
return !!_global.__webTracingInit__;
}
const _global = getGlobal();
const _support = getGlobalSupport();
class Dep {
// set结构可以自动去重,因为不可避免有些依赖会被重复添加
// 例如有两个计算属性是依赖于dataA,第一遍计算出那两个计算属性时,dataA的dep是收集了他俩的watcher
// 但是当其中一个计算属性重新计算时(比如另外一个依赖项改动了会影响此计算属性重新计算),会再次调取dataA
// 的get拦截,也就是会再次触发 dep.addSub(),如果不加重复过滤这样的场景会一直递增下去,然后当dataA发生
// 更改时遍历其subs,届时有太多不需要遍历的watcher,很大概率卡死
subs = /* @__PURE__ */ new Set();
static target;
// 全局唯一收集容器
addSub() {
if (Dep.target)
this.subs.add(Dep.target);
}
notify(...params) {
this.subs.forEach(function(watcher) {
watcher.proxy.dirty = true;
watcher.update(...params);
});
}
}
const OBSERVERSIGNBOARD = "__webtracingobserver__";
function isRegExp(value) {
return Object.prototype.toString.call(value) === `[object RegExp]`;
}
class Observer {
target;
constructor(target) {
this.target = target;
}
defineReactive() {
const dep = new Dep();
const handlers = getHandlers(
() => {
dep.addSub();
},
(oldValue) => {
dep.notify(oldValue);
}
);
return new Proxy(this.target, handlers);
}
}
function getHandlers(getCallBack, setCallBack) {
const proxyCache = /* @__PURE__ */ new WeakMap();
const handlers = {
get(target, key, receiver) {
const value = Reflect.get(target, key, receiver);
getCallBack && getCallBack();
if (typeof value === "object" && value !== null && !isRegExp(value)) {
let proxy = proxyCache.get(value);
if (!proxy) {
proxy = new Proxy(value, handlers);
proxyCache.set(value, proxy);
}
return proxy;
}
return value;
},
set(target, key, value, receiver) {
const oldValue = Reflect.get(target, key, receiver);
if (oldValue === value)
return oldValue;
const beforeTarget = JSON.parse(JSON.stringify(target));
const result = Reflect.set(target, key, value, receiver);
setCallBack && setCallBack(beforeTarget);
return result;
}
};
return handlers;
}
const refMap = /* @__PURE__ */ new WeakMap();
function ref$1(target) {
const newObj = { value: target };
newObj[OBSERVERSIGNBOARD] = true;
const ob = new Observer(newObj);
const proxy = ob.defineReactive();
refMap.set(ob, proxy);
return proxy;
}
function isRef(ref2) {
return !!ref2[OBSERVERSIGNBOARD];
}
const targetStack = [];
function pushTarget(_target) {
if (Dep.target)
targetStack.push(Dep.target);
Dep.target = _target;
}
function popTarget() {
Dep.target = targetStack.pop();
}
class Watcher {
vm;
computed;
watch;
proxy;
dep;
getter;
callback;
constructor(vm, options, getter) {
const { computed, watch, callback } = options;
this.getter = getter;
this.computed = computed || false;
this.watch = watch || false;
this.callback = callback;
this.proxy = {
value: "",
// 存储这个属性的值,在不需要更新的时候会直接取这个值
dirty: true
// 表示这个属性是否脏了(脏了代表需要重新运算更新这个值)
};
this.vm = vm;
if (computed) {
this.dep = new Dep();
} else if (watch) {
this.watchGet();
} else {
this.get();
}
}
update(oldValue) {
if (this.computed) {
this.dep.notify();
} else if (this.watch) {
if (oldValue !== this.proxy.value) {
this.callback && this.callback(this.proxy.value, oldValue);
}
} else {
this.get();
}
}
get() {
pushTarget(this);
const value = this.computed ? computedMap.get(this.vm).call(this.vm) : "";
if (value !== this.proxy.value) {
this.proxy.dirty = false;
this.proxy.value = value;
}
popTarget();
return value;
}
/**
* 监听属性专用 - 拿到最新值并添加依赖
*/
watchGet() {
pushTarget(this);
this.proxy.dirty = false;
if (this.getter) {
this.proxy.value = this.getter();
}
popTarget();
}
/**
* 计算属性专用 - 添加依赖
* 其他值用到了这个计算属性就会被记录添加到依赖中
*/
depend() {
this.dep.addSub();
}
}
class Computed {
target;
constructor(target) {
this.target = target;
}
defineReactive() {
const computedWatcher = new Watcher(this, { computed: true });
const handlers = {
get() {
if (computedWatcher.proxy.dirty) {
computedWatcher.depend();
return computedWatcher.get();
} else {
computedWatcher.depend();
return computedWatcher.proxy.value;
}
}
};
return new Proxy(this.target, handlers);
}
}
const computedMap = /* @__PURE__ */ new WeakMap();
function computed$1(fun) {
const target = { value: 0 };
target[OBSERVERSIGNBOARD] = true;
const ob = new Computed(target);
const proxy = ob.defineReactive();
computedMap.set(ob, fun);
return proxy;
}
function watchInit(callback, getter) {
new Watcher("", { watch: true, callback }, getter);
}
function watch$1(target, fun) {
if (!isRef(target))
return;
watchInit(
(newValue, oldValue) => {
fun(newValue, oldValue);
},
function() {
return target.value;
}
);
}
function hasProxy() {
return !!window.Proxy;
}
function ref(target) {
return hasProxy() ? ref$1(target) : { value: target };
}
function computed(fun) {
return hasProxy() ? computed$1(fun) : { value: fun() };
}
function watch(target, fun) {
return hasProxy() ? watch$1(target, fun) : () => ({});
}
class Options {
dsn = "";
// 上报地址
appName = "";
// 应用名称
appCode = "";
// 应用code
appVersion = "";
// 应用版本
userUuid = "";
// 用户id(外部填充进来的id)
username = "";
// 用户名
sysId = "";
// 系统id
sysName = "";
// 系统名称
sdkUserUuid = "";
// 用户id(sdk内部生成的id)
debug = false;
// 是否开启调试模式(控制台会输出sdk动作)
pv = {
core: false
// 页面跳转-是否自动发送页面跳转相关数据
};
performance = {
core: false,
// 性能数据-是否采集静态资源、接口的相关数据
firstResource: false,
// 性能数据-是否采集首次进入页面的数据(ps: tcp连接耗时,HTML加载完成时间,首次可交互时间)
server: false
// 接口请求-是否采集接口请求(成功的才会采集)
};
error = {
core: false,
// 是否采集异常数据(ps: 资源引入错误,promise错误,控制台输出错误)
server: false
// 接口请求-是否采集报错接口数据
};
event = {
core: false,
// 页面点击-是否采集点击事件
input: false
// 页面输入-是否采集输入事件
};
recordScreen = true;
// 是否启动录屏
ext = {};
// 自定义全局附加参数(放在baseInfo中)
tracesSampleRate = 1;
// 抽样发送
cacheMaxLength = 5;
// 上报数据最大缓存数
cacheWatingTime = 5e3;
// 上报数据最大等待时间
ignoreInput = [];
// 输入框类型过滤
ignoreErrors = [];
// 错误类型事件过滤
ignoreRequest = [];
// 请求类型事件过滤
scopeError = false;
// 当某个时间段报错时,会将此类错误转为特殊错误类型,会新增错误持续时间范围
localization = false;
// 是否本地化:sdk不再主动发送事件,事件都存储在本地,由用户手动调用方法发送
sendTypeByXmlBody = false;
// 是否强制指定发送形式为xml,body请求方式
// whiteScreen = false // 开启白屏检测
// 添加到行为列表前的 hook (在这里面可以给出错误类型,然后就能达到用户想拿到是何种事件类型的触发)
beforePushEventList = [];
// 数据上报前的 hook
beforeSendData = [];
// 数据上报后的 hook
afterSendData = [];
// 本地化存储溢出后的回调
localizationOverFlow = () => {
};
constructor(initOptions2) {
const _options = this.transitionOptions(initOptions2);
_options.ignoreRequest.push(new RegExp(_options.dsn));
deepAssign(this, _options);
}
/**
* 对入参配置项进行转换
*/
transitionOptions(options2) {
const _options = deepAssign({}, this, options2);
const { beforePushEventList, beforeSendData, afterSendData } = options2;
if (beforePushEventList) {
_options.beforePushEventList = [beforePushEventList];
}
if (beforeSendData) {
_options.beforeSendData = [beforeSendData];
}
if (afterSendData) {
_options.afterSendData = [afterSendData];
}
return _options;
}
}
function _validateInitOption(options2) {
const {
dsn,
appName,
appCode,
appVersion,
userUuid,
username,
sysId,
sysName,
debug,
recordScreen,
pv,
performance,
error,
event,
ext,
tracesSampleRate,
cacheMaxLength,
cacheWatingTime,
ignoreErrors,
ignoreRequest,
ignoreInput,
scopeError,
localization,
sendTypeByXmlBody,
// whiteScreen,
beforePushEventList,
beforeSendData
} = options2;
const validateFunList = [];
if (pv && typeof pv === "object") {
validateFunList.push(validateOption(pv.core, "pv.core", "boolean"));
} else {
validateFunList.push(validateOption(pv, "pv", "boolean"));
}
if (performance && typeof performance === "object") {
validateFunList.push(
validateOption(performance.core, "performance.core", "boolean"),
validateOption(
performance.firstResource,
"performance.firstResource",
"boolean"
),
validateOption(performance.server, "performance.server", "boolean")
);
} else {
validateFunList.push(validateOption(performance, "performance", "boolean"));
}
if (error && typeof error === "object") {
validateFunList.push(
validateOption(error.core, "error.core", "boolean"),
validateOption(error.server, "error.server", "boolean")
);
} else {
validateFunList.push(validateOption(error, "error", "boolean"));
}
if (event && typeof event === "object") {
validateFunList.push(validateOption(event.core, "event.core", "boolean"));
} else {
validateFunList.push(validateOption(event, "event", "boolean"));
}
const validateList = [
validateOption(dsn, "dsn", "string"),
validateOption(appName, "appName", "string"),
validateOption(appCode, "appCode", "string"),
validateOption(appVersion, "appVersion", "string"),
validateOption(userUuid, "userUuid", "string"),
validateOption(username, "username", "string"),
validateOption(sysId, "sysId", "string"),
validateOption(sysName, "sysName", "string"),
validateOption(debug, "debug", "boolean"),
validateOption(recordScreen, "recordScreen", "boolean"),
validateOption(ext, "ext", "object"),
validateOption(tracesSampleRate, "tracesSampleRate", "number"),
validateOption(cacheMaxLength, "cacheMaxLength", "number"),
validateOption(cacheWatingTime, "cacheWatingTime", "number"),
validateOption(ignoreInput, "ignoreInput", "array"),
validateOption(ignoreErrors, "ignoreErrors", "array"),
validateOptionArray(ignoreErrors, "ignoreErrors", ["string", "regexp"]),
validateOption(ignoreRequest, "ignoreRequest", "array"),
validateOptionArray(ignoreRequest, "ignoreRequest", ["string", "regexp"]),
validateOption(scopeError, "scopeError", "boolean"),
validateOption(localization, "localization", "boolean"),
validateOption(sendTypeByXmlBody, "sendTypeByXmlBody", "boolean"),
// validateOption(whiteScreen, 'whiteScreen', 'boolean'),
validateOption(beforePushEventList, "beforePushEventList", "function"),
validateOption(beforeSendData, "beforeSendData", "function")
];
return validateList.every((res) => !!res);
}
function _validateMustFill(options2) {
const validateList = [
validateOptionMustFill(options2.appName, "appName"),
validateOptionMustFill(options2.dsn, "dsn")
];
return validateList.every((res) => !!res);
}
function validateOptionMustFill(target, targetName) {
if (isEmpty(target)) {
logError(`\u3010${targetName}\u3011\u53C2\u6570\u5FC5\u586B`);
return false;
}
return true;
}
function validateOption(target, targetName, expectType) {
if (!target || typeofAny(target) === expectType)
return true;
logError(
`TypeError:\u3010${targetName}\u3011\u671F\u671B\u4F20\u5165${expectType}\u7C7B\u578B\uFF0C\u76EE\u524D\u662F${typeofAny(
target
)}\u7C7B\u578B`
);
return false;
}
function validateOptionArray(target, targetName, expectTypes) {
if (!target)
return true;
let pass = true;
target.forEach((item) => {
if (!expectTypes.includes(typeofAny(item))) {
logError(
`TypeError:\u3010${targetName}\u3011\u6570\u7EC4\u5185\u7684\u503C\u671F\u671B\u4F20\u5165${expectTypes.join(
"|"
)}\u7C7B\u578B\uFF0C\u76EE\u524D\u503C${item}\u662F${typeofAny(item)}\u7C7B\u578B`
);
pass = false;
}
});
return pass;
}
exports.options = void 0;
function initOptions(initOptions2) {
if (!_validateMustFill(initOptions2) || !_validateInitOption(initOptions2))
return false;
exports.options = ref(new Options(initOptions2));
_support.options = exports.options;
return true;
}
function debug(...args) {
if (exports.options.value.debug)
console.log("@web-tracing: ", ...args);
}
function logError(...args) {
console.error("@web-tracing: ", ...args);
}
function on$1(target, eventName, handler, opitons = false) {
target.addEventListener(eventName, handler, opitons);
}
function replaceAop(source, name, replacement, isForced = false) {
if (source === void 0)
return;
if (name in source || isForced) {
const original = source[name];
const wrapped = replacement(original);
if (isFunction(wrapped)) {
source[name] = wrapped;
}
}
}
function normalizeObj(source) {
Object.keys(source).forEach((p) => {
const v = source[p];
if (isNumber(v)) {
source[p] = v === 0 ? void 0 : parseFloat(v.toFixed(2));
}
});
return source;
}
function getLocationHref() {
if (typeof document === "undefined" || document.location == null)
return "";
return document.location.href;
}
function getTimestamp() {
return Date.now();
}
function throttle$1(func, wait, runFirst = false) {
let timer = null;
let lastArgs;
return function(...args) {
lastArgs = args;
if (timer === null) {
if (runFirst) {
func.apply(this, lastArgs);
}
timer = setTimeout(() => {
timer = null;
func.apply(this, lastArgs);
}, wait);
}
};
}
function debounce(func, wait, runFirst = false) {
let timer = null;
return function(...arg) {
if (runFirst) {
func.call(this, ...arg);
runFirst = false;
}
if (timer)
clearTimeout(timer);
timer = setTimeout(() => {
func.call(this, ...arg);
}, wait);
};
}
function groupArray(arr, ...keys) {
const groups = /* @__PURE__ */ new Map();
for (const obj of arr) {
const key = keys.filter((k) => obj[k]).map((k) => obj[k]).join(":");
if (!groups.has(key)) {
groups.set(key, []);
}
groups.get(key).push(obj);
}
return Array.from(groups.values());
}
function deepAssign(target, ...sources) {
sources.forEach((source) => {
for (const key in source) {
if (source[key] !== null && isRegExp$1(source[key])) {
target[key] = source[key];
} else if (source[key] !== null && typeof source[key] === "object") {
target[key] = deepAssign(
target[key] || (isArray(source[key]) ? [] : {}),
source[key]
);
} else {
target[key] = source[key];
}
}
});
return target;
}
function validateMethods(methodsName) {
if (!isInit()) {
logError(`${methodsName} \u9700\u8981\u5728SDK\u521D\u59CB\u5316\u4E4B\u540E\u4F7F\u7528`);
return false;
}
return true;
}
function typeofAny(target) {
return Object.prototype.toString.call(target).slice(8, -1).toLowerCase();
}
function isValidKey(key, object) {
return key in object;
}
function randomBoolean(randow) {
return Math.random() <= randow;
}
function pad(num, len, placeholder = "0") {
const str = String(num);
if (str.length < len) {
let result = str;
for (let i = 0; i < len - str.length; i += 1) {
result = placeholder + result;
}
return result;
}
return str;
}
function uuid() {
const date = /* @__PURE__ */ new Date();
const hexDate = parseInt(
`${date.getFullYear()}${pad(date.getMonth() + 1, 2)}${pad(
date.getDate(),
2
)}`,
10
).toString(16);
const hexTime = parseInt(
`${pad(date.getHours(), 2)}${pad(date.getMinutes(), 2)}${pad(
date.getSeconds(),
2
)}${pad(date.getMilliseconds(), 3)}`,
10
).toString(16);
let guid = hexDate + hexTime.length + hexTime;
while (guid.length < 32) {
guid += Math.floor(Math.random() * 16).toString(16);
}
return `${guid.slice(0, 8)}-${guid.slice(8, 16)}-${guid.slice(16)}`;
}
function getCookieByName(name) {
const result = document.cookie.match(new RegExp(`${name}=([^;]+)(;|$)`));
return result ? result[1] : void 0;
}
function sendByBeacon(url, data) {
return navigator.sendBeacon(url, JSON.stringify(data));
}
const sendReaconImageList = [];
function sendByImage(url, data) {
return new Promise((resolve) => {
const beacon = new Image();
beacon.src = `${url}?v=${encodeURIComponent(JSON.stringify(data))}`;
sendReaconImageList.push(beacon);
beacon.onload = () => {
resolve();
};
beacon.onerror = function() {
resolve();
};
});
}
function sendByXML(url, data) {
return new Promise((resolve) => {
const xhr = new XMLHttpRequest();
xhr.open("post", url);
xhr.setRequestHeader("content-type", "application/json");
xhr.send(JSON.stringify(data));
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
resolve();
}
};
});
}
function executeFunctions(funList, through, args) {
if (funList.length === 0)
return args;
let result = void 0;
for (let i = 0; i < funList.length; i++) {
const func = funList[i];
if (i === 0 || through) {
result = func(args);
} else {
result = func(result);
}
}
return result;
}
function unKnowToArray(target) {
return isArray(target) ? target : [target];
}
const arrayMap = Array.prototype.map || function polyfillMap(fn) {
const result = [];
for (let i = 0; i < this.length; i += 1) {
result.push(fn(this[i], i, this));
}
return result;
};
function map(arr, fn) {
return arrayMap.call(arr, fn);
}
const arrayFilter = Array.prototype.filter || function filterPolyfill(fn) {
const result = [];
for (let i = 0; i < this.length; i += 1) {
if (fn(this[i], i, this)) {
result.push(this[i]);
}
}
return result;
};
function filter(arr, fn) {
return arrayFilter.call(arr, fn);
}
const nextTime = window.requestIdleCallback || window.requestAnimationFrame || ((callback) => setTimeout(callback, 17));
function isObjectOverSizeLimit(object, limitInKB) {
const serializedObject = JSON.stringify(object);
const sizeInBytes = new TextEncoder().encode(serializedObject).length;
const sizeInKB = sizeInBytes / 1024;
return sizeInKB > limitInKB;
}
function parseGetParams(url) {
const params = {};
const query = url.split("?")[1];
if (query) {
const pairs = query.split("&");
for (const pair of pairs) {
const [key, value] = pair.split("=");
params[decodeURIComponent(key)] = decodeURIComponent(value);
}
}
return params;
}
function deepCopy(target, map2 = /* @__PURE__ */ new Map()) {
if (target !== null && typeof target === "object") {
let res = map2.get(target);
if (res)
return res;
if (target instanceof Array) {
res = [];
map2.set(target, res);
target.forEach((item, index) => {
res[index] = deepCopy(item, map2);
});
} else {
res = {};
map2.set(target, res);
Object.keys(target).forEach((key) => {
if (isValidKey(key, target)) {
res[key] = deepCopy(target[key], map2);
}
});
}
return res;
}
return target;
}
var version$1 = "1.0.22";
const DEVICE_KEY = "_webtracing_device_id";
const SESSION_KEY = "_webtracing_session_id";
const SURVIVIE_MILLI_SECONDS = 18e5;
const SDK_LOCAL_KEY = "_webtracing_localization_key";
const SDK_VERSION = version$1;
var EVENTTYPES = /* @__PURE__ */ ((EVENTTYPES2) => {
EVENTTYPES2["ERROR"] = "error";
EVENTTYPES2["CONSOLEERROR"] = "consoleError";
EVENTTYPES2["UNHANDLEDREJECTION"] = "unhandledrejection";
EVENTTYPES2["CLICK"] = "click";
EVENTTYPES2["INPUT"] = "input";
EVENTTYPES2["LOAD"] = "load";
EVENTTYPES2["BEFOREUNLOAD"] = "beforeunload";
EVENTTYPES2["FETCH"] = "fetch";
EVENTTYPES2["XHROPEN"] = "xhr-open";
EVENTTYPES2["XHRSEND"] = "xhr-send";
EVENTTYPES2["HASHCHANGE"] = "hashchange";
EVENTTYPES2["HISTORYPUSHSTATE"] = "history-pushState";
EVENTTYPES2["HISTORYREPLACESTATE"] = "history-replaceState";
EVENTTYPES2["POPSTATE"] = "popstate";
EVENTTYPES2["READYSTATECHANGE"] = "readystatechange";
EVENTTYPES2["ONLINE"] = "online";
EVENTTYPES2["OFFLINE"] = "offline";
return EVENTTYPES2;
})(EVENTTYPES || {});
var SEDNEVENTTYPES = /* @__PURE__ */ ((SEDNEVENTTYPES2) => {
SEDNEVENTTYPES2["PV"] = "pv";
SEDNEVENTTYPES2["PVDURATION"] = "pv-duration";
SEDNEVENTTYPES2["ERROR"] = "error";
SEDNEVENTTYPES2["PERFORMANCE"] = "performance";
SEDNEVENTTYPES2["CLICK"] = "click";
SEDNEVENTTYPES2["INPUT"] = "input";
SEDNEVENTTYPES2["DWELL"] = "dwell";
SEDNEVENTTYPES2["CUSTOM"] = "custom";
SEDNEVENTTYPES2["INTERSECTION"] = "intersection";
return SEDNEVENTTYPES2;
})(SEDNEVENTTYPES || {});
var SENDID = /* @__PURE__ */ ((SENDID2) => {
SENDID2["PAGE"] = "page";
SENDID2["RESOURCE"] = "resource";
SENDID2["SERVER"] = "server";
SENDID2["CODE"] = "code";
SENDID2["REJECT"] = "reject";
SENDID2["CONSOLEERROR"] = "console.error";
return SENDID2;
})(SENDID || {});
const WEBPAGELOAD = {
0: "navigate",
// 网页通过点击链接,地址栏输入,表单提交,脚本操作等方式加载
1: "reload",
// 网页通过“重新加载”按钮或者location.reload()方法加载
2: "back_forward",
// 网页通过“前进”或“后退”按钮加载
255: "reserved"
// 任何其他来源的加载
};
class EventBus {
handlers;
constructor() {
this.handlers = {};
}
/**
* 为目标类型事件添加回调
* @param handler 需要被添加的类型以及回调函数
*/
addEvent(handler) {
!this.handlers[handler.type] && (this.handlers[handler.type] = []);
const funIndex = this._getCallbackIndex(handler);
if (funIndex === -1) {
this.handlers[handler.type]?.push(handler.callback);
}
}
/**
* 为目标类型事件删除回调
* @param handler 需要被删除的类型以及回调函数
*/
delEvent(handler) {
const funIndex = this._getCallbackIndex(handler);
if (funIndex !== -1) {
this.handlers[handler.type]?.splice(funIndex, 1);
}
}
/**
* 为目标类型事件更改回调
* @param handler 需要被更改的类型以及回调函数
* @param newCallback 新的回调函数
*/
changeEvent(handler, newCallback) {
const funIndex = this._getCallbackIndex(handler);
if (funIndex !== -1) {
this.handlers[handler.type]?.splice(funIndex, 1, newCallback);
}
}
/**
* 获取目标类型事件所有的回调
* @param type 事件类型
*/
getEvent(type) {
return this.handlers[type] || [];
}
/**
* 执行目标类型事件所有的回调
* @param type 事件类型
* @param args 额外参数
*/
runEvent(type, ...args) {
const allEvent = this.getEvent(type);
allEvent.forEach((fun) => {
fun(...args);
});
}
/**
* 获取函数在 callback 列表中的位置
*/
_getCallbackIndex(handler) {
if (this.handlers[handler.type]) {
const callbackList = this.handlers[handler.type];
if (callbackList) {
return callbackList.findIndex((fun) => fun === handler.callback);
} else {
return -1;
}
} else {
return -1;
}
}
}
const eventBus = _support.eventBus || (_support.eventBus = new EventBus());
function initReplace() {
for (const key in EVENTTYPES) {
if (isValidKey(key, EVENTTYPES)) {
replace(key);
}
}
}
function replace(type) {
if (!isValidKey(type, EVENTTYPES))
return;
const value = EVENTTYPES[type];
switch (value) {
case EVENTTYPES.ERROR:
listenError(EVENTTYPES.ERROR);
break;
case EVENTTYPES.UNHANDLEDREJECTION:
listenUnhandledrejection(EVENTTYPES.UNHANDLEDREJECTION);
break;
case EVENTTYPES.CONSOLEERROR:
replaceConsoleError(EVENTTYPES.CONSOLEERROR);
break;
case EVENTTYPES.CLICK:
listenClick(EVENTTYPES.CLICK);
break;
case EVENTTYPES.INPUT:
listenInput(EVENTTYPES.INPUT);
break;
case EVENTTYPES.LOAD:
listenLoad(EVENTTYPES.LOAD);
break;
case EVENTTYPES.BEFOREUNLOAD:
listenBeforeunload(EVENTTYPES.BEFOREUNLOAD);
break;
case EVENTTYPES.XHROPEN:
replaceXHROpen(EVENTTYPES.XHROPEN);
break;
case EVENTTYPES.XHRSEND:
replaceXHRSend(EVENTTYPES.XHRSEND);
break;
case EVENTTYPES.FETCH:
replaceFetch(EVENTTYPES.FETCH);
break;
case EVENTTYPES.HASHCHANGE:
listenHashchange(EVENTTYPES.HASHCHANGE);
break;
case EVENTTYPES.HISTORYPUSHSTATE:
replaceHistoryPushState(EVENTTYPES.HISTORYPUSHSTATE);
break;
case EVENTTYPES.HISTORYREPLACESTATE:
replaceHistoryReplaceState(EVENTTYPES.HISTORYREPLACESTATE);
break;
case EVENTTYPES.POPSTATE:
listenPopState(EVENTTYPES.POPSTATE);
break;
case EVENTTYPES.OFFLINE:
listenOffline(EVENTTYPES.OFFLINE);
break;
case EVENTTYPES.ONLINE:
listenOnline(EVENTTYPES.ONLINE);
break;
}
}
function listenError(type) {
on$1(
_global,
"error",
function(e) {
eventBus.runEvent(type, e);
},
true
);
}
function listenUnhandledrejection(type) {
on$1(_global, "unhandledrejection", function(ev) {
eventBus.runEvent(type, ev);
});
}
function replaceConsoleError(type) {
replaceAop(console, "error", (originalError) => {
return function(...args) {
if (!(args[0] && args[0].slice && args[0].slice(0, 12) === "@web-tracing")) {
eventBus.runEvent(type, args);
}
originalError.apply(this, args);
};
});
}
function listenClick(type) {
if (!("document" in _global))
return;
const clickThrottle = throttle$1(eventBus.runEvent, 100, true);
on$1(
_global.document,
"click",
function(e) {
clickThrottle.call(eventBus, type, e);
},
true
);
}
function listenInput(type) {
if (!("document" in _global))
return;
const inputThrottle = debounce(eventBus.runEvent, 500, false);
on$1(
_global.document,
"input",
function(e) {
inputThrottle.call(eventBus, type, e);
},
true
);
}
function listenLoad(type) {
on$1(
_global,
"load",
function(e) {
eventBus.runEvent(type, e);
},
true
);
}
function listenBeforeunload(type) {
on$1(
_global,
"beforeunload",
function(e) {
eventBus.runEvent(type, e);
},
false
);
}
function replaceXHROpen(type) {
if (!("XMLHttpRequest" in _global))
return;
replaceAop(XMLHttpRequest.prototype, "open", (originalOpen) => {
return function(...args) {
eventBus.runEvent(type, ...args);
originalOpen.apply(this, args);
};
});
}
function replaceXHRSend(type) {
if (!("XMLHttpRequest" in _global))
return;
replaceAop(XMLHttpRequest.prototype, "send", (originalSend) => {
return function(...args) {
eventBus.runEvent(type, this, ...args);
originalSend.apply(this, args);
};
});
}
function replaceFetch(type) {
if (!("fetch" in _global))
return;
replaceAop(_global, "fetch", (originalFetch) => {
return function(...args) {
const fetchStart = getTimestamp();
let requestInfo;
let requestInit;
if (args[0] instanceof Request) {
requestInfo = args[0].clone();
} else {
requestInfo = args[0];
requestInit = { ...args[1] };
}
const requestData = {
url: requestInfo instanceof Request ? requestInfo.url : requestInfo,
method: requestInfo instanceof Request ? requestInfo.method : requestInit?.method || "GET",
headers: extractHeaders(requestInfo, requestInit)
};
if (!requestInit && typeof requestInfo === "string") {
requestInit = { method: "GET" };
}
return originalFetch.apply(_global, [requestInfo, requestInit]).then((res) => {
eventBus.runEvent(type, requestData.url, requestData, res, fetchStart);
return res;
}).catch((error) => {
throw error;
});
};
});
}
function extractHeaders(info, init) {
if (info instanceof Request) {
return Object.fromEntries(info.headers.entries());
}
const headers = init?.headers || {};
if (headers instanceof Headers) {
return Object.fromEntries(headers.entries());
}
if (Array.isArray(headers)) {
return Object.fromEntries(headers);
}
return { ...headers };
}
function listenHashchange(type) {
on$1(_global, "hashchange", function(e) {
eventBus.runEvent(type, e);
});
}
function replaceHistoryReplaceState(type) {
if (!("history" in _global))
return;
if (!("pushState" in _global.history))
return;
replaceAop(_global.history, "replaceState", (originalSend) => {
return function(...args) {
eventBus.runEvent(type, ...args);
originalSend.apply(this, args);
};
});
}
function replaceHistoryPushState(type) {
if (!("history" in _global))
return;
if (!("pushState" in _global.history))
return;
replaceAop(_global.history, "pushState", (originalSend) => {
return function(...args) {
eventBus.runEvent(type, ...args);
originalSend.apply(this, args);
};
});
}
function listenPopState(type) {
on$1(_global, "popstate", function(e) {
eventBus.runEvent(type, e);
});
}
function listenOffline(type) {
on$1(
_global,
"offline",
function(e) {
eventBus.runEvent(type, e);
},
true
);
}
function listenOnline(type) {
on$1(
_global,
"online",
function(e) {
eventBus.runEvent(type, e);
},
true
);
}
let e = function() {
return e = Object.assign || function(e2) {
for (var n2, t2 = 1, r2 = arguments.length; t2 < r2; t2++)
for (const o2 in n2 = arguments[t2])
Object.prototype.hasOwnProperty.call(n2, o2) && (e2[o2] = n2[o2]);
return e2;
}, e.apply(this, arguments);
};
function n(e2, n2, t2, r2) {
return new (t2 || (t2 = Promise))(function(o2, a2) {
function i2(e3) {
try {
u2(r2.next(e3));
} catch (n3) {
a2(n3);
}
}
function c2(e3) {
try {
u2(r2.throw(e3));
} catch (n3) {
a2(n3);
}
}
function u2(e3) {
let n3;
e3.done ? o2(e3.value) : (n3 = e3.value, n3 instanceof t2 ? n3 : new t2(function(e4) {
e4(n3);
})).then(i2, c2);
}
u2((r2 = r2.apply(e2, n2 || [])).next());
});
}
function t(e2, n2) {
let t2, r2, o2, a2, i2 = {
label: 0,
sent: function() {
if (1 & o2[0])
throw o2[1];
return o2[1];
},
trys: [],
ops: []
};
return a2 = { next: c2(0), throw: c2(1), return: c2(2) }, "function" == typeof Symbol && (a2[Symbol.iterator] = function() {
return this;
}), a2;
function c2(c3) {
return function(u2) {
return function(c4) {
if (t2)
throw new TypeError("Generator is already executing.");
for (; a2 && (a2 = 0, c4[0] && (i2 = 0)), i2; )
try {
if (t2 = 1, r2 && (o2 = 2 & c4[0] ? r2.return : c4[0] ? r2.throw || ((o2 = r2.return) && o2.call(r2), 0) : r2.next) && !(o2 = o2.call(r2, c4[1])).done)
return o2;
switch (r2 = 0, o2 && (c4 = [2 & c4[0], o2.value]), c4[0]) {
case 0:
case 1:
o2 = c4;
break;
case 4:
return i2.label++, { value: c4[1], done: false };
case 5:
i2.label++, r2 = c4[1], c4 = [0];
continue;
case 7:
;
c4 = i2.ops.pop(), i2.trys.pop();
continue;
default:
if (!(o2 = i2.trys, (o2 = o2.length > 0 && o2[o2.length - 1]) || 6 !== c4[0] && 2 !== c4[0])) {
i2 = 0;
continue;
}
if (3 === c4[0] && (!o2 || c4[1] > o2[0] && c4[1] < o2[3])) {
i2.label = c4[1];
break;
}
if (6 === c4[0] && i2.label < o2[1]) {
;
i2.label = o2[1], o2 = c4;
break;
}
if (o2 && i2.label < o2[2]) {
;
i2.label = o2[2], i2.ops.push(c4);
break;
}
o2[2] && i2.ops.pop(), i2.trys.pop();
continue;
}
c4 = n2.call(e2, i2);
} catch (u3) {
c4 = [6, u3], r2 = 0;
} finally {
t2 = o2 = 0;
}
if (5 & c4[0])
throw c4[1];
return { value: c4[0] ? c4[1] : void 0, done: true };
}([c3, u2]);
};
}
}
function r(e2, n2, t2) {
if (t2 || 2 === arguments.length)
for (var r2, o2 = 0, a2 = n2.length; o2 < a2; o2++)
!r2 && o2 in n2 || (r2 || (r2 = Array.prototype.slice.call(n2, 0, o2)), r2[o2] = n2[o2]);
return e2.concat(r2 || Array.prototype.slice.call(n2));
}
function o(e2, n2) {
return new Promise(function(t2) {
return setTimeout(t2, e2, n2);
});
}
function a(e2) {
return !!e2 && "function" == typeof e2.then;
}
function i$1(e2, n2) {
try {
const t2 = e2();
a(t2) ? t2.then(
function(e3) {
return n2(true, e3);
},
function(e3) {
return n2(false, e3);
}
) : n2(true, t2);
} catch (r2) {
n2(false, r2);
}
}
function c(e2, r2, a2) {
return void 0 === a2 && (a2 = 16), n(this, void 0, void 0, function() {
let n2, i2, c2;
return t(this, function(t2) {
switch (t2.label) {
case 0:
n2 = Date.now(), i2 = 0, t2.label = 1;
case 1:
return i2 < e2.length ? (r2(e2[i2], i2), (c2 = Date.now()) >= n2 + a2 ? (n2 = c2, [4, o(0)]) : [3, 3]) : [3, 4];
case 2:
t2.sent(), t2.label = 3;
case 3:
return ++i2, [3, 1];
case 4:
return [2];
}
});
});
}
function u(e2) {
e2.then(void 0, function() {
});
}
function l(e2, n2) {
e2 = [e2[0] >>> 16, 65535 & e2[0], e2[1] >>> 16, 65535 & e2[1]], n2 = [n2[0] >>> 16, 65535 & n2[0], n2[1] >>> 16, 65535 & n2[1]];
const t2 = [0, 0, 0, 0];
return t2[3] += e2[3] + n2[3], t2[2] += t2[3] >>> 16, t2[3] &= 65535, t2[2] += e2[2] + n2[2], t2[1] += t2[2] >>> 16, t2[2] &= 65535, t2[1] += e2[1] + n2[1], t2[0] += t2[1] >>> 16, t2[1] &= 65535, t2[0] += e2[0] + n2[0], t2[0] &= 65535, [t2[0] << 16 | t2[1], t2[2] << 16 | t2[3]];
}
function s(e2, n2) {
e2 = [e2[0] >>> 16, 65535 & e2[0], e2[1] >>> 16, 65535 & e2[1]], n2 = [n2[0] >>> 16, 65535 & n2[0], n2[1] >>> 16, 65535 & n2[1]];
const t2 = [0, 0, 0, 0];
return t2[3] += e2[3] * n2[3], t2[2] += t2[3] >>> 16, t2[3] &= 65535, t2[2] += e2[2] * n2[3], t2[1] += t2[2] >>> 16, t2[2] &= 65535, t2[2] += e2[3] * n2[2], t2[1] += t2[2] >>> 16, t2[2] &= 65535, t2[1] += e2[1] * n2[3], t2[0] += t2[1] >>> 16, t2[1] &= 65535, t2[1] += e2[2] * n2[2], t2[0] += t2[1] >>> 16, t2[1] &= 65535, t2[1] += e2[3] * n2[1], t2[0] += t2[1] >>> 16, t2[1] &= 65535, t2[0] += e2[0] * n2[3] + e2[1] * n2[2] + e2[2] * n2[1] + e2[3] * n2[0], t2[0] &= 65535, [t2[0] << 16 | t2[1], t2[2] << 16 | t2[3]];
}
function d(e2, n2) {
return 32 === (n2 %= 64) ? [e2[1], e2[0]] : n2 < 32 ? [e2[0] << n2 | e2[1] >>> 32 - n2, e2[1] << n2 | e2[0] >>> 32 - n2] : (n2 -= 32, [e2[1] << n2 | e2[0] >>> 32 - n2, e2[0] << n2 | e2[1] >>> 32 - n2]);
}
function m(e2, n2) {
return 0 === (n2 %= 64) ? e2 : n2 < 32 ? [e2[0] << n2 | e2[1] >>> 32 - n2, e2[1] << n2] : [e2[1] << n2 - 32, 0];
}
function f(e2, n2) {
return [e2[0] ^ n2[0], e2[1] ^ n2[1]];
}
function v(e2) {
return e2 = f(e2, [0, e2[0] >>> 1]), e2 = f(e2 = s(e2, [4283543511, 3981806797]), [0, e2[0] >>> 1]), e2 = f(e2 = s(e2, [3301882366, 444984403]), [0, e2[0] >>> 1]);
}
function h(e2, n2) {
n2 = n2 || 0;
let t2, r2 = (e2 = e2 || "").length % 16, o2 = e2.length - r2, a2 = [0, n2], i2 = [0, n2], c2 = [0, 0], u2 = [0, 0], h2 = [2277735313, 289559509], b2 = [1291169091, 658871167];
for (t2 = 0; t2 < o2; t2 += 16)
c2 = [
255 & e2.charCodeAt(t2 + 4) | (255 & e2.charCodeAt(t2 + 5)) << 8 | (255 & e2.charCodeAt(t2 + 6)) << 16 | (255 & e2.charCodeAt(t2 + 7)) << 24,
255 & e2.charCodeAt(t2) | (255 & e2.charCodeAt(t2 + 1)) << 8 | (255 & e2.charCodeAt(t2 + 2)) << 16 | (255 & e2.charCodeAt(t2 + 3)) << 24
], u2 = [
255 & e2.charCodeAt(t2 + 12) | (255 & e2.charCodeAt(t2 + 13)) << 8 | (255 & e2.charCodeAt(t2 + 14)) << 16 | (255 & e2.charCodeAt(t2 + 15)) << 24,
255 & e2.charCodeAt(t2 + 8) | (255 & e2.charCodeAt(t2 + 9)) << 8 | (255 & e2.charCodeAt(t2 + 10)) << 16 | (255 & e2.charCodeAt(t2 + 11)) << 24
], c2 = d(c2 = s(c2, h2), 31), a2 = l(a2 = d(a2 = f(a2, c2 = s(c2, b2)), 27), i2), a2 = l(s(a2, [0, 5]), [0, 1390208809]), u2 = d(u2 = s(u2, b2), 33), i2 = l(i2 = d(i2 = f(i2, u2 = s(u2, h2)), 31), a2), i2 = l(s(i2, [0, 5]), [0, 944331445]);
switch (c2 = [0, 0], u2 = [0, 0], r2) {
case 15:
u2 = f(u2, m([0, e2.charCodeAt(t2 + 14)], 48));
case 14:
u2 = f(u2, m([0, e2.charCodeAt(t2 + 13)], 40));
case 13:
u2 = f(u2, m([0, e2.charCodeAt(t2 + 12)], 32));
case 12:
u2 = f(u2, m([0, e2.charCodeAt(t2 + 11)], 24));
case 11:
u2 = f(u2, m([0, e2.charCodeAt(t2 + 10)], 16));
case 10:
u2 = f(u2, m([0, e2.charCodeAt(t2 + 9)], 8));
case 9:
u2 = s(u2 = f(u2, [0, e2.charCodeAt(t2 + 8)]), b2), i2 = f(i2, u2 = s(u2 = d(u2, 33), h2));
case 8:
c2 = f(c2, m([0, e2.charCodeAt(t2 + 7)], 56));
case 7:
c2 = f(c2, m([0, e2.charCodeAt(t2 + 6)], 48));
case 6:
c2 = f(c2, m([0, e2.charCodeAt(t2 + 5)], 40));
case 5:
c2 = f(c2, m([0, e2.charCodeAt(t2 + 4)], 32));
case 4:
c2 = f(c2, m([0, e2.charCodeAt(t2 + 3)], 24));
case 3:
c2 = f(c2, m([0, e2.charCodeAt(t2 + 2)], 16));
case 2:
c2 = f(c2, m([0, e2.charCodeAt(t2 + 1)], 8));
case 1:
c2 = s(c2 = f(c2, [0, e2.charCodeAt(t2)]), h2), a2 = f(a2, c2 = s(c2 = d(c2, 31), b2));
}
return a2 = l(a2 = f(a2, [0, e2.length]), i2 = f(i2, [0, e2.length])), i2 = l(i2, a2), a2 = l(a2 = v(a2), i2 = v(i2)), i2 = l(i2, a2), ("00000000" + (a2[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (a2[1] >>> 0).toString(16)).slice(-8) + ("00000000" + (i2[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (i2[1] >>> 0).toString(16)).slice(-8);
}
function b(e2) {
return parseInt(e2);
}
function p(e2) {
return parseFloat(e2);
}
function y(e2, n2) {
return "number" == typeof e2 && isNaN(e2) ? n2 : e2;
}
function g(e2) {
return e2.reduce(function(e3, n2) {
return e3 + (n2 ? 1 : 0);
}, 0);
}
function w(e2, n2) {
if (void 0 === n2 && (n2 = 1), Math.abs(n2) >= 1)
return Math.round(e2 / n2) * n2;
const t2 = 1 / n2;
return Math.round(e2 * t2) / t2;
}
function L(e2) {
return e2 && "object" == typeof e2 && "message" in e2 ? e2 : { message: e2 };
}
function k(e2) {
return "function" != typeof e2;
}
function V(e2, r2, a2) {
const l2 = Object.keys(e2).filter(function(e3) {
return !function(e4, n2) {
for (let t2 = 0, r3 = e4.length; t2 < r3; ++t2)
if (e4[t2] === n2)
return true;
return false;
}(a2, e3);
}), s2 = Array(l2.length);
return c(l2, function(n2, t2) {
s2[t2] = function(e3, n3) {
const t3 = new Promise(function(t4) {
const r3 = Date.now();
i$1(e3.bind(null, n3), function() {
for (var e4 = [], n4 = 0; n4 < arguments.length; n4++)
e4[n4] = arguments[n4];
const o2 = Date.now() - r3;
if (!e4[0])
return t4(function() {
return { error: L(e4[1]), duration: o2 };
});
const a3 = e4[1];
if (k(a3))
return t4(function() {
return { value: a3, duration: o2 };
});
t4(function() {
return new Promise(function(e5) {
const n5 = Date.now();
i$1(a3, function() {
for (var t5 = [], r4 = 0; r4 < arguments.length; r4++)
t5[r4] = arguments[r4];
const a4 = o2 + Date.now() - n5;
if (!t5[0])
return e5({ error: L(t5[1]), duration: a4 });
e5({ value: t5[1], duration: a4 });
});
});
});
});
});
return u(t3), function() {
return t3.then(function(e4) {
return e4();
});
};
}(e2[n2], r2);
}), function() {
return n(this, void 0, void 0, function() {
let e3, n2, r3, a3, i2, d2;
return t(this, function(m2) {
switch (m2.label) {
case 0:
for (e3 = {}, n2 = 0, r3 = l2; n2 < r3.length; n2++)
a3 = r3[n2], e3[a3] = void 0;
i2 = Array(l2.length), d2 = function() {
let n3;
return t(this, function(t2) {
switch (t2.label) {
case 0:
return n3 = true, [
4,
c(l2, function(t3, r4) {
if (!i2[r4])
if (s2[r4]) {
const o2 = s2[r4]().then(function(n4) {
return e3[t3] = n4;
});
u(o2), i2[r4] = o2;
} else
n3 = false;
})
];
case 1:
return t2.sent(), n3 ? [2, "break"] : [4, o(1)];
case 2:
return t2.sent(), [2];
}
});
}, m2.label = 1;
case 1:
return [5, d2()];
case 2:
if ("break" === m2.sent())
return [3, 4];
m2.label = 3;
case 3:
return [3, 1];
case 4:
return [4, Promise.all(i2)];
case 5:
return m2.sent(), [2, e3];
}
});
});
};
}
function Z() {
const e2 = window, n2 = navigator;
return g([
"MSCSSMatrix" in e2,
"msSetImmediate" in e2,
"msIndexedDB" in e2,
"msMaxTouchPoints" in n2,
"msPointerEnabled" in n2
]) >= 4;
}
function S() {
const e2 = window, n2 = navigator;
return g([
"msWriteProfilerMark" in e2,
"MSStream" in e2,
"msLaunchUri" in n2,
"msSaveBlob" in n2
]) >= 3 && !Z();
}
function X() {
const e2 = window, n2 = navigator;
return g([
"webkitPersistentStorage" in n2,
"webkitTemporaryStorage" in n2,
0 === n2.vendor.indexOf("Google"),
"webkitResolveLocalFileSystemURL" in e2,
"BatteryManager" in e2,
"webkitMediaStream" in e2,
"webkitSpeechGrammar" in e2
]) >= 5;
}
function x() {
const e2 = window, n2 = navigator;
return g([
"ApplePayError" in e2,
"CSSPrimitiveValue" in e2,
"Counter" in e2,
0 === n2.vendor.indexOf("Apple"),
"getStorageUpdates" in n2,
"WebKitMediaKeys" in e2
]) >= 4;
}
function F() {
const e2 = window;
return g([
"safari" in e2,
!("DeviceMotionEvent" in e2),
!("ongestureend" in e2),
!("standalone" in navigator)
]) >= 3;
}
function Y() {
let e2, n2, t2 = window;
return g([
"buildID" in navigator,
"MozAppearance" in (null !== (n2 = null === (e2 = document.documentElement) || void 0 === e2 ? void 0 : e2.style) && void 0 !== n2 ? n2 : {}),
"onmozfullscreenchange" in t2,
"mozInnerScreenX" in t2,
"CSSMozDocumentRule" in t2,
"CanvasCaptureMediaStream" in t2
]) >= 4;
}
function C() {
const e2 = document;
return e2.fullscreenElement || e2.msFullscreenElement || e2.mozFullScreenElement || e2.webkitFullscreenElement || null;
}
function R() {
const e2 = X(), n2 = Y();
if (!e2 && !n2)
return false;
const t2 = window;
return g([
"onorientationchange" in t2,
"orientation" in t2,
e2 && !("SharedWorker" in t2),
n2 && /android/i.test(navigator.appVersion)
]) >= 2;
}
function G(e2) {
const n2 = new Error(e2);
return n2.name = e2, n2;
}
function M(e2, r2, a2) {
let i2, c2, u2;
return void 0 === a2 && (a2 = 50), n(this, void 0, void 0, function() {
let n2, l2;
return t(this, function(t2) {
switch (t2.label) {
case 0:
n2 = document, t2.label = 1;
case 1:
return n2.body ? [3, 3] : [4, o(a2)];
case 2:
return t2.sent(), [3, 1];
case 3:
l2 = n2.createElement("iframe"), t2.label = 4;
case 4:
return t2.trys.push([4, , 10, 11]), [
4,
new Promise(function(e3, t3) {
let o2 = false, a3 = function() {
o2 = true, e3();
};
l2.onload = a3, l2.onerror = function(e4) {
o2 = true, t3(e4);
};
const i3 = l2.style;
i3.setProperty("display", "block", "important"), i3.position = "absolute", i3.top = "0", i3.left = "0", i3.visibility = "hidden", r2 && "srcdoc" in l2 ? l2.srcdoc = r2 : l2.src = "about:blank", n2.body.appendChild(l2);
const c3 = function() {
let e4, n3;
o2 || ("complete" === (null === (n3 = null === (e4 = l2.contentWindow) || void 0 === e4 ? void 0 : e4.document) || void 0 === n3 ? void 0 : n3.readyState) ? a3() : setTimeout(c3, 10));
};
c3();
})
];
case 5:
t2.sent(), t2.label = 6;
case 6:
return (null === (c2 = null === (i2 = l2.contentWindow) || void 0 === i2 ? void 0 : i2.document) || void 0 === c2 ? void 0 : c2.body) ? [3, 8] : [4, o(a2)];
case 7:
return t2.sent(), [3, 6];
case 8:
return [4, e2(l2, l2.contentWindow)];
case 9:
return [2, t2.sent()];
case 10:
return null === (u2 = l2.parentNode) || void 0 === u2 || u2.removeChild(l2), [7];
case 11:
return [2];
}
});
});
}
function I(e2) {
for (var n2 = functio