uniapp-app/utils/im/uniapp.js
2025-09-16 16:19:29 +08:00

1809 lines
50 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import EventEmitter from 'eventemitter3'
import axios from 'axios'
var request$1 = function (_a) {
var _b = _a.method,
method = _b === void 0 ? 'POST' : _b,
url = _a.url,
data = _a.data,
headers = _a.headers
return new Promise(function (resolve, reject) {
uni.request({
url: url,
method: method,
data: data,
header: headers,
success: function (res) {
var data = res.data
if (data.code !== 200) {
return reject(data.msg)
}
resolve(data)
},
fail: function (err) {
reject(err)
},
})
})
}
var uniappRequestHelper = request$1
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global Reflect, Promise, SuppressedError, Symbol */
var extendStatics = function (d, b) {
extendStatics =
Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array &&
function (d, b) {
d.__proto__ = b
}) ||
function (d, b) {
for (var p in b)
if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]
}
return extendStatics(d, b)
}
function __extends(d, b) {
if (typeof b !== 'function' && b !== null)
throw new TypeError(
'Class extends value ' + String(b) + ' is not a constructor or null'
)
extendStatics(d, b)
function __() {
this.constructor = d
}
d.prototype =
b === null ? Object.create(b) : ((__.prototype = b.prototype), new __())
}
var __assign = function () {
__assign =
Object.assign ||
function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i]
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]
}
return t
}
return __assign.apply(this, arguments)
}
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) {
return value instanceof P
? value
: new P(function (resolve) {
resolve(value)
})
}
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value))
} catch (e) {
reject(e)
}
}
function rejected(value) {
try {
step(generator['throw'](value))
} catch (e) {
reject(e)
}
}
function step(result) {
result.done
? resolve(result.value)
: adopt(result.value).then(fulfilled, rejected)
}
step((generator = generator.apply(thisArg, _arguments || [])).next())
})
}
function __generator(thisArg, body) {
var _ = {
label: 0,
sent: function () {
if (t[0] & 1) throw t[1]
return t[1]
},
trys: [],
ops: [],
},
f,
y,
t,
g
return (
(g = { next: verb(0), throw: verb(1), return: verb(2) }),
typeof Symbol === 'function' &&
(g[Symbol.iterator] = function () {
return this
}),
g
)
function verb(n) {
return function (v) {
return step([n, v])
}
}
function step(op) {
if (f) throw new TypeError('Generator is already executing.')
while ((g && ((g = 0), op[0] && (_ = 0)), _))
try {
if (
((f = 1),
y &&
(t =
op[0] & 2
? y['return']
: op[0]
? y['throw'] || ((t = y['return']) && t.call(y), 0)
: y.next) &&
!(t = t.call(y, op[1])).done)
)
return t
if (((y = 0), t)) op = [op[0] & 2, t.value]
switch (op[0]) {
case 0:
case 1:
t = op
break
case 4:
_.label++
return { value: op[1], done: false }
case 5:
_.label++
y = op[1]
op = [0]
continue
case 7:
op = _.ops.pop()
_.trys.pop()
continue
default:
if (
!((t = _.trys), (t = t.length > 0 && t[t.length - 1])) &&
(op[0] === 6 || op[0] === 2)
) {
_ = 0
continue
}
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
_.label = op[1]
break
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1]
t = op
break
}
if (t && _.label < t[2]) {
_.label = t[2]
_.ops.push(op)
break
}
if (t[2]) _.ops.pop()
_.trys.pop()
continue
}
op = body.call(thisArg, _)
} catch (e) {
op = [6, e]
y = 0
} finally {
f = t = 0
}
if (op[0] & 5) throw op[1]
return { value: op[0] ? op[1] : void 0, done: true }
}
}
function __values(o) {
var s = typeof Symbol === 'function' && Symbol.iterator,
m = s && o[s],
i = 0
if (m) return m.call(o)
if (o && typeof o.length === 'number')
return {
next: function () {
if (o && i >= o.length) o = void 0
return { value: o && o[i++], done: !o }
},
}
throw new TypeError(
s ? 'Object is not iterable.' : 'Symbol.iterator is not defined.'
)
}
function __read(o, n) {
var m = typeof Symbol === 'function' && o[Symbol.iterator]
if (!m) return o
var i = m.call(o),
r,
ar = [],
e
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value)
} catch (error) {
e = { error: error }
} finally {
try {
if (r && !r.done && (m = i['return'])) m.call(i)
} finally {
if (e) throw e.error
}
}
return ar
}
function __spreadArray(to, from, pack) {
if (pack || arguments.length === 2)
for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i)
ar[i] = from[i]
}
}
return to.concat(ar || Array.prototype.slice.call(from))
}
typeof SuppressedError === 'function'
? SuppressedError
: function (error, suppressed, message) {
var e = new Error(message)
return (
(e.name = 'SuppressedError'),
(e.error = error),
(e.suppressed = suppressed),
e
)
}
var request = uniappRequestHelper
var Storage = /** @class */ (function () {
function Storage(type, salt) {
this.store = new Map()
this.type = 'memory'
this.salt = '__salt__'
type && (this.type = type)
salt && (this.salt = salt)
}
Storage.prototype.get = function (key) {
var value
switch (this.type) {
case 'memory':
return this.store.get(key)
case 'localStorage':
case 'sessionStorage':
value = uni.getStorageSync(''.concat(this.salt).concat(key))
return value
}
}
Storage.prototype.set = function (key, value) {
switch (this.type) {
case 'memory':
this.store.set(key, value)
break
case 'localStorage':
case 'sessionStorage':
uni.setStorageSync(''.concat(this.salt).concat(key), value)
break
}
}
Storage.prototype.remove = function (key) {
switch (this.type) {
case 'memory':
this.store.delete(key)
break
case 'localStorage':
case 'sessionStorage':
uni.removeStorageSync(''.concat(this.salt).concat(key))
break
}
}
return Storage
})()
var uniappStorage = Storage
var index = uniappStorage
var url$1 = 'https://statistic.live.126.net/statics/report/xkit/action'
var EventTracking = /** @class */ (function () {
function EventTracking(_a) {
var appKey = _a.appKey,
version = _a.version,
component = _a.component,
nertcVersion = _a.nertcVersion,
imVersion = _a.imVersion,
_b = _a.os,
os = _b === void 0 ? '' : _b,
_c = _a.framework,
framework = _c === void 0 ? '' : _c,
_d = _a.language,
language = _d === void 0 ? '' : _d,
_e = _a.container,
container = _e === void 0 ? '' : _e,
_f = _a.platform,
platform = _f === void 0 ? 'Web' : _f,
_g = _a.channel,
channel = _g === void 0 ? 'netease' : _g
this.platform = platform
this.appKey = appKey
this.version = version
this.component = component
this.nertcVersion = nertcVersion
this.imVersion = imVersion
this.channel = channel
this.os = os
this.framework = framework
this.language = language
this.container = container
}
EventTracking.prototype.track = function (reportType, data) {
return __awaiter(this, void 0, void 0, function () {
var _a,
appKey,
version,
component,
nertcVersion,
imVersion,
platform,
channel,
os,
framework,
language,
container,
timeStamp
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
;(_a = this),
(appKey = _a.appKey),
(version = _a.version),
(component = _a.component),
(nertcVersion = _a.nertcVersion),
(imVersion = _a.imVersion),
(platform = _a.platform),
(channel = _a.channel),
(os = _a.os),
(framework = _a.framework),
(language = _a.language),
(container = _a.container)
timeStamp = Date.now()
_c.label = 1
case 1:
_c.trys.push([1, 3, , 4])
return [
4 /*yield*/,
request({
method: 'POST',
url: url$1,
data: {
appKey: appKey,
version: version,
component: component,
timeStamp: timeStamp,
nertcVersion: nertcVersion,
imVersion: imVersion,
platform: platform,
reportType: reportType,
data: data,
channel: channel,
os: os,
framework: framework,
language: language,
container: container,
},
}),
]
case 2:
_c.sent()
return [3 /*break*/, 4]
case 3:
_c.sent()
return [3 /*break*/, 4]
case 4:
return [2 /*return*/]
}
})
})
}
return EventTracking
})()
var EventTracking$1 = EventTracking
/**
* 判断元素是否可见
* 融合了 IntersectionObserver 与 visibilityChange 事件
*/
var VisibilityObserver = /** @class */ (function (_super) {
__extends(VisibilityObserver, _super)
// 入参说明参考https://developer.mozilla.org/zh-CN/docs/Web/API/Intersection_Observer_API
function VisibilityObserver(options) {
var _this = _super.call(this) || this
_this.visibilityState = document.visibilityState
_this.entries = []
_this._visibilitychange = function () {
_this.visibilityState = document.visibilityState
_this._trigger()
}
_this.intersectionObserver = new IntersectionObserver(
_this._intersectionObserverHandler.bind(_this),
options
)
document.addEventListener('visibilitychange', _this._visibilitychange)
return _this
}
VisibilityObserver.prototype.observe = function (target) {
return this.intersectionObserver.observe(target)
}
VisibilityObserver.prototype.unobserve = function (target) {
return this.intersectionObserver.unobserve(target)
}
VisibilityObserver.prototype.destroy = function () {
this.intersectionObserver.disconnect()
document.removeEventListener('visibilitychange', this._visibilitychange)
this.entries = []
}
VisibilityObserver.prototype._intersectionObserverHandler = function (
entries
) {
this.entries = entries
this._trigger()
}
VisibilityObserver.prototype._trigger = function () {
var _this = this
this.entries.forEach(function (item) {
if (_this.visibilityState !== 'visible' || item.intersectionRatio <= 0) {
_this.emit('visibleChange', {
visible: false,
target: item.target,
})
return
}
_this.emit('visibleChange', {
visible: true,
target: item.target,
})
})
}
return VisibilityObserver
})(EventEmitter)
var VisibilityObserver$1 = VisibilityObserver
var commonjsGlobal =
typeof globalThis !== 'undefined'
? globalThis
: typeof window !== 'undefined'
? window
: typeof global !== 'undefined'
? global
: typeof self !== 'undefined'
? self
: {}
function createCommonjsModule(fn, module) {
return (module = { exports: {} }), fn(module, module.exports), module.exports
}
var loglevel = createCommonjsModule(function (module) {
/*
* loglevel - https://github.com/pimterry/loglevel
*
* Copyright (c) 2013 Tim Perry
* Licensed under the MIT license.
*/
;(function (root, definition) {
if (module.exports) {
module.exports = definition()
} else {
root.log = definition()
}
})(commonjsGlobal, function () {
// Slightly dubious tricks to cut down minimized file size
var noop = function () {}
var undefinedType = 'undefined'
var isIE =
typeof window !== undefinedType &&
typeof window.navigator !== undefinedType &&
/Trident\/|MSIE /.test(window.navigator.userAgent)
var logMethods = ['trace', 'debug', 'info', 'warn', 'error']
var _loggersByName = {}
var defaultLogger = null
// Cross-browser bind equivalent that works at least back to IE6
function bindMethod(obj, methodName) {
var method = obj[methodName]
if (typeof method.bind === 'function') {
return method.bind(obj)
} else {
try {
return Function.prototype.bind.call(method, obj)
} catch (e) {
// Missing bind shim or IE8 + Modernizr, fallback to wrapping
return function () {
return Function.prototype.apply.apply(method, [obj, arguments])
}
}
}
}
// Trace() doesn't print the message in IE, so for that case we need to wrap it
function traceForIE() {
if (console.log) {
if (console.log.apply) {
console.log.apply(console, arguments)
} else {
// In old IE, native console methods themselves don't have apply().
Function.prototype.apply.apply(console.log, [console, arguments])
}
}
if (console.trace) console.trace()
}
// Build the best logging method possible for this env
// Wherever possible we want to bind, not wrap, to preserve stack traces
function realMethod(methodName) {
if (methodName === 'debug') {
methodName = 'log'
}
if (typeof console === undefinedType) {
return false // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives
} else if (methodName === 'trace' && isIE) {
return traceForIE
} else if (console[methodName] !== undefined) {
return bindMethod(console, methodName)
} else if (console.log !== undefined) {
return bindMethod(console, 'log')
} else {
return noop
}
}
// These private functions always need `this` to be set properly
function replaceLoggingMethods() {
/*jshint validthis:true */
var level = this.getLevel()
// Replace the actual methods.
for (var i = 0; i < logMethods.length; i++) {
var methodName = logMethods[i]
this[methodName] =
i < level ? noop : this.methodFactory(methodName, level, this.name)
}
// Define log.log as an alias for log.debug
this.log = this.debug
// Return any important warnings.
if (typeof console === undefinedType && level < this.levels.SILENT) {
return 'No console available for logging'
}
}
// In old IE versions, the console isn't present until you first open it.
// We build realMethod() replacements here that regenerate logging methods
function enableLoggingWhenConsoleArrives(methodName) {
return function () {
if (typeof console !== undefinedType) {
replaceLoggingMethods.call(this)
this[methodName].apply(this, arguments)
}
}
}
// By default, we use closely bound real methods wherever possible, and
// otherwise we wait for a console to appear, and then try again.
function defaultMethodFactory(methodName, _level, _loggerName) {
/*jshint validthis:true */
return (
realMethod(methodName) ||
enableLoggingWhenConsoleArrives.apply(this, arguments)
)
}
function Logger(name, factory) {
// Private instance variables.
var self = this
/**
* The level inherited from a parent logger (or a global default). We
* cache this here rather than delegating to the parent so that it stays
* in sync with the actual logging methods that we have installed (the
* parent could change levels but we might not have rebuilt the loggers
* in this child yet).
* @type {number}
*/
var inheritedLevel
/**
* The default level for this logger, if any. If set, this overrides
* `inheritedLevel`.
* @type {number|null}
*/
var defaultLevel
/**
* A user-specific level for this logger. If set, this overrides
* `defaultLevel`.
* @type {number|null}
*/
var userLevel
var storageKey = 'loglevel'
if (typeof name === 'string') {
storageKey += ':' + name
} else if (typeof name === 'symbol') {
storageKey = undefined
}
function persistLevelIfPossible(levelNum) {
var levelName = (logMethods[levelNum] || 'silent').toUpperCase()
if (typeof window === undefinedType || !storageKey) return
// Use localStorage if available
try {
window.localStorage[storageKey] = levelName
return
} catch (ignore) {}
// Use session cookie as fallback
try {
window.document.cookie =
encodeURIComponent(storageKey) + '=' + levelName + ';'
} catch (ignore) {}
}
function getPersistedLevel() {
var storedLevel
if (typeof window === undefinedType || !storageKey) return
try {
storedLevel = window.localStorage[storageKey]
} catch (ignore) {}
// Fallback to cookies if local storage gives us nothing
if (typeof storedLevel === undefinedType) {
try {
var cookie = window.document.cookie
var cookieName = encodeURIComponent(storageKey)
var location = cookie.indexOf(cookieName + '=')
if (location !== -1) {
storedLevel = /^([^;]+)/.exec(
cookie.slice(location + cookieName.length + 1)
)[1]
}
} catch (ignore) {}
}
// If the stored level is not valid, treat it as if nothing was stored.
if (self.levels[storedLevel] === undefined) {
storedLevel = undefined
}
return storedLevel
}
function clearPersistedLevel() {
if (typeof window === undefinedType || !storageKey) return
// Use localStorage if available
try {
window.localStorage.removeItem(storageKey)
} catch (ignore) {}
// Use session cookie as fallback
try {
window.document.cookie =
encodeURIComponent(storageKey) +
'=; expires=Thu, 01 Jan 1970 00:00:00 UTC'
} catch (ignore) {}
}
function normalizeLevel(input) {
var level = input
if (
typeof level === 'string' &&
self.levels[level.toUpperCase()] !== undefined
) {
level = self.levels[level.toUpperCase()]
}
if (
typeof level === 'number' &&
level >= 0 &&
level <= self.levels.SILENT
) {
return level
} else {
throw new TypeError(
'log.setLevel() called with invalid level: ' + input
)
}
}
/*
*
* Public logger API - see https://github.com/pimterry/loglevel for details
*
*/
self.name = name
self.levels = {
TRACE: 0,
DEBUG: 1,
INFO: 2,
WARN: 3,
ERROR: 4,
SILENT: 5,
}
self.methodFactory = factory || defaultMethodFactory
self.getLevel = function () {
if (userLevel != null) {
return userLevel
} else if (defaultLevel != null) {
return defaultLevel
} else {
return inheritedLevel
}
}
self.setLevel = function (level, persist) {
userLevel = normalizeLevel(level)
if (persist !== false) {
// defaults to true
persistLevelIfPossible(userLevel)
}
// NOTE: in v2, this should call rebuild(), which updates children.
return replaceLoggingMethods.call(self)
}
self.setDefaultLevel = function (level) {
defaultLevel = normalizeLevel(level)
if (!getPersistedLevel()) {
self.setLevel(level, false)
}
}
self.resetLevel = function () {
userLevel = null
clearPersistedLevel()
replaceLoggingMethods.call(self)
}
self.enableAll = function (persist) {
self.setLevel(self.levels.TRACE, persist)
}
self.disableAll = function (persist) {
self.setLevel(self.levels.SILENT, persist)
}
self.rebuild = function () {
if (defaultLogger !== self) {
inheritedLevel = normalizeLevel(defaultLogger.getLevel())
}
replaceLoggingMethods.call(self)
if (defaultLogger === self) {
for (var childName in _loggersByName) {
_loggersByName[childName].rebuild()
}
}
}
// Initialize all the internal levels.
inheritedLevel = normalizeLevel(
defaultLogger ? defaultLogger.getLevel() : 'WARN'
)
var initialLevel = getPersistedLevel()
if (initialLevel != null) {
userLevel = normalizeLevel(initialLevel)
}
replaceLoggingMethods.call(self)
}
/*
*
* Top-level API
*
*/
defaultLogger = new Logger()
defaultLogger.getLogger = function getLogger(name) {
if (
(typeof name !== 'symbol' && typeof name !== 'string') ||
name === ''
) {
throw new TypeError('You must supply a name when creating a logger.')
}
var logger = _loggersByName[name]
if (!logger) {
logger = _loggersByName[name] = new Logger(
name,
defaultLogger.methodFactory
)
}
return logger
}
// Grab the current global log variable in case of overwrite
var _log = typeof window !== undefinedType ? window.log : undefined
defaultLogger.noConflict = function () {
if (typeof window !== undefinedType && window.log === defaultLogger) {
window.log = _log
}
return defaultLogger
}
defaultLogger.getLoggers = function getLoggers() {
return _loggersByName
}
// ES6 default export, for compatibility
defaultLogger['default'] = defaultLogger
return defaultLogger
})
})
var log = loglevel
function createLoggerDecorator(MODULE_NAME, logger) {
return function (__, propKey, descriptor) {
var method = descriptor.value
descriptor.value = function () {
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
return __awaiter(this, void 0, void 0, function () {
var methodName, res, err_1
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!logger) {
// @ts-ignore
logger = this.logger
}
if (
['log', 'error'].some(function (item) {
return !logger[item]
})
) {
console.warn(
'loggerDecorator warning: your logger is not complete'
)
}
methodName = method.name || propKey || ''
_a.label = 1
case 1:
_a.trys.push([1, 3, , 4])
logger === null || logger === void 0
? void 0
: logger.log.apply(
logger,
__spreadArray(
[MODULE_NAME, methodName],
__read(args),
false
)
)
return [4 /*yield*/, method.apply(this, args)]
case 2:
res = _a.sent()
logger === null || logger === void 0
? void 0
: logger.log(
MODULE_NAME,
''.concat(methodName, ' success: '),
res
)
return [2 /*return*/, res]
case 3:
err_1 = _a.sent()
logger === null || logger === void 0
? void 0
: logger.error(
MODULE_NAME,
''.concat(methodName, ' failed: '),
err_1
)
throw err_1
case 4:
return [2 /*return*/]
}
})
})
}
}
}
function sensitiveInfoFilter(content) {
var regexs = [
'scene/apps/[a-z0-9]{32}/',
'"rtcKey":"[a-z0-9]{32}"',
'"imKey":"[a-z0-9]{32}"',
'"appkey":"[a-z0-9]{32}"',
'"appkey": "[a-z0-9]{32}"',
'appkey:"[a-z0-9]{32}"',
'appkey: "[a-z0-9]{32}"',
'"appkey":[a-z0-9]{32}',
'"appkey": [a-z0-9]{32}',
'appkey:[a-z0-9]{32}',
'appkey: [a-z0-9]{32}',
]
var templates = [
'scene/apps/***/',
'"rtcKey":"***"',
'"imKey":"***"',
'"appkey":"***"',
'"appkey": "***"',
'appkey:"***"',
'appkey: "***"',
'"appkey":***',
'"appkey": ***',
'appkey:***',
'appkey: ***',
]
regexs.forEach(function (regex, index) {
var reg = new RegExp(regex, 'gi')
content = content.replace(reg, templates[index])
})
return content
}
var logDebug = function (_a) {
var _b =
_a === void 0
? {
appName: '',
version: '',
storeWindow: false,
needStringify: true,
}
: _a,
level = _b.level,
_c = _b.appName,
appName = _c === void 0 ? '' : _c,
_d = _b.storeWindow,
storeWindow = _d === void 0 ? false : _d,
_e = _b.needStringify,
needStringify = _e === void 0 ? true : _e
var genTime = function () {
var now = new Date()
var year = now.getFullYear()
var month = now.getMonth() + 1
var day = now.getDate()
var hour = now.getHours() < 10 ? '0'.concat(now.getHours()) : now.getHours()
var min =
now.getMinutes() < 10 ? '0'.concat(now.getMinutes()) : now.getMinutes()
var s =
now.getSeconds() < 10 ? '0'.concat(now.getSeconds()) : now.getSeconds()
var nowString = ''
.concat(year, '-')
.concat(month, '-')
.concat(day, ' ')
.concat(hour, ':')
.concat(min, ':')
.concat(s)
return nowString
}
var genUserAgent = function () {
try {
var ua = navigator.userAgent.toLocaleLowerCase()
var re = /(msie|firefox|chrome|opera|version).*?([\d.]+)/
var m = ua.match(re) || []
var browser = m[1].replace(/version/, 'safari')
var ver = m[2]
return {
browser: browser,
ver: ver,
}
} catch (error) {
return null
}
}
var proxyLog = function () {
var _log = new Proxy(log, {
get: function (target, prop) {
var _a, _b
if (!(prop in target)) {
return
}
var func = target[prop]
if (
!['log', 'info', 'warn', 'error', 'trace', 'debug'].includes(prop)
) {
return func
}
var prefix = genTime()
if (genUserAgent()) {
prefix += '['
.concat(
(_a = genUserAgent()) === null || _a === void 0
? void 0
: _a.browser,
' '
)
.concat(
(_b = genUserAgent()) === null || _b === void 0 ? void 0 : _b.ver,
']'
)
}
prefix +=
'['.concat(
{
log: 'L',
info: 'I',
warn: 'W',
error: 'E',
trace: 'E',
debug: 'D',
}[prop],
']'
) +
'['.concat(appName, ']') +
':'
// eslint-disable-next-line @typescript-eslint/no-this-alias
var that = this
return function () {
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
if (needStringify) {
for (var i = 0; i < args.length; i++) {
if (typeof args[i] === 'object') {
try {
args[i] = JSON.stringify(args[i])
} catch (_a) {
console.warn('[日志打印对象无法序列化]', args[i])
}
}
if (typeof args[i] === 'string') {
args[i] = sensitiveInfoFilter(args[i])
}
}
}
return func.apply(that, __spreadArray([prefix], __read(args), false))
}
},
})
return _log
}
var logger = proxyLog()
if (level) {
logger.setLevel(level)
}
if (storeWindow) {
// @ts-ignore
window.__LOGGER__ = logger
}
return logger
}
var logDebug$1 = logDebug
var EventPriority
;(function (EventPriority) {
EventPriority[(EventPriority['LOW'] = 0)] = 'LOW'
EventPriority[(EventPriority['NORMAL'] = 1)] = 'NORMAL'
EventPriority[(EventPriority['HIGH'] = 2)] = 'HIGH'
})(EventPriority || (EventPriority = {}))
var ReportEvent = /** @class */ (function () {
// private _report: XKitReporter
function ReportEvent(options) {
// static appInfo: AppInfo
this.appKey = ''
this.component = ''
this.data = {}
this.framework = ''
this.version = ''
this.startTime = 0
this.endTime = 0
this.duration = 0
this.data.startTime = new Date().getTime()
this.data.timeStamp = this.data.startTime
this.eventId = options.eventId
this.priority = options.priority
}
ReportEvent.prototype.end = function () {
// 如果已经end过 不再end
if (this.data.endTime && this.data.duration) {
return
}
this.data.endTime = this.data.endTime || new Date().getTime()
this.data.duration =
this.data.duration || this.data.endTime - this.data.startTime
}
ReportEvent.prototype.setAppInfo = function (appInfo) {
this.appKey = appInfo.appKey
this.component = appInfo.component
this.version = appInfo.version
if (appInfo.framework) {
this.framework = appInfo.framework
}
}
ReportEvent.prototype.endWith = function (data) {
var code = data.code,
msg = data.msg,
requestId = data.requestId,
serverCost = data.serverCost
// 过滤code非number类型
if (typeof code != 'number') {
this.data.code = -2
} else {
this.data.code = code
}
this.data.message = msg
this.data.requestId = requestId
this.data.serverCost = serverCost
this.end()
}
ReportEvent.prototype.endWithSuccess = function (data) {
if (data) {
var requestId = data.requestId,
serverCost = data.serverCost
this.data.requestId = requestId
this.data.serverCost = serverCost
}
this.data.code = 0
this.data.message = 'success'
this.end()
}
ReportEvent.prototype.endWithFailure = function (data) {
if (data) {
var requestId = data.requestId,
serverCost = data.serverCost
this.data.requestId = requestId
this.data.serverCost = serverCost
}
this.data.code = -1
this.data.message = 'failure'
this.end()
}
ReportEvent.prototype.setParams = function (params) {
this.data.params = __assign({}, params)
return this
}
ReportEvent.prototype.addParams = function (params) {
this.data.params = __assign(__assign({}, this.data.params), params)
return this
}
ReportEvent.prototype.setData = function (data) {
this.data = __assign(__assign({}, this.data), data)
}
ReportEvent.prototype.setUserId = function (userId) {
this.data.userId = userId
}
return ReportEvent
})()
var EventStep = /** @class */ (function (_super) {
__extends(EventStep, _super)
function EventStep(options) {
return _super.call(this, options) || this
}
return EventStep
})(ReportEvent)
var IntervalEvent = /** @class */ (function (_super) {
__extends(IntervalEvent, _super)
function IntervalEvent(options) {
var _this = _super.call(this, options) || this
_this._stepMap = new Map()
return _this
}
IntervalEvent.prototype.beginStep = function (name) {
if (this._stepMap.has(name)) {
return this._stepMap[name]
}
var step = new EventStep({ eventId: name, priority: this.priority })
step.setData({ step: name })
this._stepMap.set(name, step)
return step
}
IntervalEvent.prototype.addStep = function (data) {
this._stepMap.set(data.eventId, data)
}
IntervalEvent.prototype.removeStep = function (eventId) {
this._stepMap.delete(eventId)
}
IntervalEvent.prototype.endWith = function (data) {
_super.prototype.endWith.call(this, data)
this.end()
}
IntervalEvent.prototype.endWithSuccess = function (data) {
_super.prototype.endWithSuccess.call(this, data)
this.end()
}
IntervalEvent.prototype.endWithFailure = function (data) {
_super.prototype.endWithFailure.call(this, data)
this.end()
}
IntervalEvent.prototype.end = function () {
var e_1, _a
var steps = []
_super.prototype.end.call(this)
try {
for (
var _b = __values(this._stepMap.values()), _c = _b.next();
!_c.done;
_c = _b.next()
) {
var step = _c.value
// step.end()
step.data.index = steps.length
steps.push(step.data)
}
} catch (e_1_1) {
e_1 = { error: e_1_1 }
} finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b)
} finally {
if (e_1) throw e_1.error
}
}
if (steps.length > 0) {
this.data.steps = steps
}
}
return IntervalEvent
})(EventStep)
/**
* 异步频率控制
* 一段时间内只请求一次,多余的用这一次执行的结果做为结果
* @param fn
* @param delay
*/
var frequencyControl = function (fn, delay) {
var queue = []
var last = 0
var timer
return function () {
var _this = this
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
return new Promise(function (resolve, reject) {
queue.push({ resolve: resolve, reject: reject })
var cur = Date.now()
var consumer = function (success, res) {
while (queue.length) {
var _a = queue.shift(),
resolve_1 = _a.resolve,
reject_1 = _a.reject
success ? resolve_1(res) : reject_1(res)
}
}
var excute = function () {
last = cur
if (!queue.length) return
// @ts-ignore
fn.apply(_this, args).then(
function (res) {
consumer(true, res)
},
function (err) {
consumer(false, err)
}
)
}
if (cur - last > delay) {
excute()
} else {
clearTimeout(timer)
timer = setTimeout(function () {
excute()
}, delay)
}
})
}
}
function getFileType(filename) {
var fileMap = {
img: /(png|gif|jpg)/i,
pdf: /pdf$/i,
word: /(doc|docx)$/i,
excel: /(xls|xlsx)$/i,
ppt: /(ppt|pptx)$/i,
zip: /(zip|rar|7z)$/i,
audio: /(mp3|wav|wmv)$/i,
video: /(mp4|mkv|rmvb|wmv|avi|flv|mov)$/i,
}
return (
Object.keys(fileMap).find(function (type) {
return fileMap[type].test(filename)
}) || ''
)
}
/**
* 解析输入的文件大小
* @param size 文件大小单位b
* @param level 递归等级对应fileSizeMap
*/
var parseFileSize = function (size, level) {
if (level === void 0) {
level = 0
}
var fileSizeMap = {
0: 'B',
1: 'KB',
2: 'MB',
3: 'GB',
4: 'TB',
}
var handler = function (size, level) {
if (level >= Object.keys(fileSizeMap).length) {
return 'the file is too big'
}
if (size < 1024) {
return ''.concat(size).concat(fileSizeMap[level])
}
return handler(Math.round(size / 1024), level + 1)
}
return handler(size, level)
}
var addUrlSearch = function (url, search) {
var urlObj = new URL(url)
urlObj.search += (urlObj.search.startsWith('?') ? '&' : '?') + search
return urlObj.href
}
function debounce(fn, wait) {
var timer = null
return function () {
var _this = this
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
if (timer) {
clearTimeout(timer)
timer = null
}
timer = setTimeout(function () {
// @ts-ignore
fn.apply(_this, args)
}, wait)
}
}
function getOperatingSystem() {
try {
var userAgent = navigator.userAgent
if (userAgent.includes('Windows')) {
return 'Windows'
} else if (userAgent.includes('Mac OS')) {
return 'Mac OS'
} else if (userAgent.includes('Linux')) {
return 'Linux'
} else if (userAgent.includes('Android')) {
return 'Android'
} else if (userAgent.includes('iOS')) {
return 'iOS'
} else {
return 'Unknown'
}
} catch (_a) {
return 'Unknown'
}
}
function getBrowserInfo() {
var browserName = 'Unknown'
var browserVersion = ''
try {
var userAgent = navigator.userAgent
// 判断是否为Chrome浏览器
if (userAgent.indexOf('Chrome') !== -1) {
browserName = 'Chrome'
var start = userAgent.indexOf('Chrome') + 7
var end = userAgent.indexOf(' ', start)
browserVersion = userAgent.substring(start, end)
}
// 判断是否为Firefox浏览器
else if (userAgent.indexOf('Firefox') !== -1) {
browserName = 'Firefox'
var start = userAgent.indexOf('Firefox') + 8
browserVersion = userAgent.substring(start)
}
// 判断是否为Safari浏览器
else if (userAgent.indexOf('Safari') !== -1) {
browserName = 'Safari'
var start = userAgent.indexOf('Version') + 8
var end = userAgent.indexOf(' ', start)
browserVersion = userAgent.substring(start, end)
}
// 判断是否为Edge浏览器
else if (userAgent.indexOf('Edg') !== -1) {
browserName = 'Edge'
var start = userAgent.indexOf('Edg') + 4
browserVersion = userAgent.substring(start)
}
// 判断是否为IE浏览器IE11及以下版本
else if (userAgent.indexOf('MSIE') !== -1) {
browserName = 'Internet Explorer'
var start = userAgent.indexOf('MSIE') + 5
var end = userAgent.indexOf(';', start)
browserVersion = userAgent.substring(start, end)
}
} catch (error) {
console.error('getBrowserInfo error:', error)
}
return {
name: browserName,
version: browserVersion,
}
}
var url = 'https://statistic.live.126.net/statics/report/common/form'
var HEADER_VALUE_SDK_TYPE = 'NEXKitStatistics'
var HEADER_VALUE_REPORTER_VERSION = '1.0.0'
var HEADER_VALUE_CONTENT_TYPE = 'application/json;charset=utf-8'
var EVENT_REPORT_INTERVAL = 5000
var MAX_EVENT_CACHE_SIZE = 100
var LOW_PRIORITY_RETRY = 0
var NORMAL_PRIORITY_RETRY = 2
var HIGH_PRIORITY_RETRY = 5
var MAX_RETRY_COUNT = 3
var XKitReporter = /** @class */ (function () {
function XKitReporter(options) {
this._eventsCache = []
this._noReport = false // 是否上报数据
this._configMap = new Map()
this._retryCount = 0
var browserInfo = getBrowserInfo()
var appInfo = window.__XKitReporter__
var userAgent = ''
try {
userAgent = navigator.userAgent
} catch (_a) {
console.log('navigator is not defined')
}
this.common = {
imVersion: options.imVersion,
nertcVersion: options.nertcVersion,
platform: 'Web',
osVer: browserInfo.version,
userAgent: userAgent,
manufacturer: '',
model: browserInfo.name,
packageId:
(appInfo === null || appInfo === void 0 ? void 0 : appInfo.packageId) ||
'',
appVer:
(appInfo === null || appInfo === void 0 ? void 0 : appInfo.appVer) ||
'',
appName:
(appInfo === null || appInfo === void 0 ? void 0 : appInfo.appName) ||
'',
deviceId: options.deviceId,
}
this._logger = logDebug$1({
level: 'debug',
appName: 'XKitReporter',
version: '2.0.0',
})
}
XKitReporter.prototype.getConfig = function (appKey) {
return __awaiter(this, void 0, void 0, function () {
var _this = this
return __generator(this, function (_a) {
return [
2 /*return*/,
axios({
method: 'GET',
url: 'https://yiyong.netease.im/report_conf',
headers: {
platform: 'web',
appKey: appKey,
},
})
.then(function (res) {
_this._configMap.set(appKey, res.data)
})
.catch(function () {
_this._retryCount += 1
if (_this._retryCount > MAX_RETRY_COUNT) {
_this._retryCount = 0
return
}
_this.getConfig(appKey)
}),
]
})
})
}
XKitReporter.prototype.setNoReport = function (noReport) {
this._noReport = noReport
}
XKitReporter.prototype.reportEvent = function (event, options) {
// 如果禁止上包则返回
if (this._noReport) {
return
}
if (this._eventsCache.length >= MAX_EVENT_CACHE_SIZE) {
this._evictEvent(event)
} else {
this._eventsCache.push(event)
}
this._scheduleReportEventsTask(
options === null || options === void 0 ? void 0 : options.immediate
)
}
XKitReporter.prototype._evictEvent = function (event) {
var index = this._eventsCache.findIndex(function (item) {
return item.priority < event.priority
})
this._eventsCache.push(event)
if (index !== -1) {
this._evictEvent(this._eventsCache[index])
} else {
this._logger.debug('Full event cache, evict event:', event)
this._eventsCache = this._eventsCache.filter(function (item) {
return item !== event
})
}
}
XKitReporter.prototype._scheduleReportEventsTask = function (immediate) {
var _this = this
if (immediate === void 0) {
immediate = false
}
var execute = function () {
return __awaiter(_this, void 0, void 0, function () {
var groupByAppKey, _a, _b, _i, appKey, config
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
groupByAppKey = this._eventsCache.reduce(function (acc, obj) {
var key = obj.appKey
if (!acc[key]) {
acc[key] = []
}
acc[key].push(obj)
return acc
}, {})
_a = []
for (_b in groupByAppKey) _a.push(_b)
_i = 0
_c.label = 1
case 1:
if (!(_i < _a.length)) return [3 /*break*/, 5]
appKey = _a[_i]
if (!!this._configMap.has(appKey)) return [3 /*break*/, 3]
return [4 /*yield*/, this.getConfig(appKey)]
case 2:
_c.sent()
_c.label = 3
case 3:
if (this._configMap.has(appKey)) {
config = this._configMap.get(appKey)
if (
!(config === null || config === void 0
? void 0
: config.enabled)
) {
return [2 /*return*/]
}
}
this._reportEventsToServer(appKey, groupByAppKey[appKey])
_c.label = 4
case 4:
_i++
return [3 /*break*/, 1]
case 5:
this._eventsCache = []
return [2 /*return*/]
}
})
})
}
if (immediate) {
execute()
}
if (this._queueTimer) {
return
}
this._queueTimer = setInterval(function () {
if (_this._eventsCache.length === 0) {
_this._queueTimer && clearInterval(_this._queueTimer)
_this._queueTimer = undefined
return
}
execute()
}, EVENT_REPORT_INTERVAL)
}
XKitReporter.prototype._determineMaxRetry = function (events) {
var e_1, _a
var retry = LOW_PRIORITY_RETRY
try {
for (
var events_1 = __values(events), events_1_1 = events_1.next();
!events_1_1.done;
events_1_1 = events_1.next()
) {
var event_1 = events_1_1.value
if (event_1.priority === EventPriority.HIGH) {
retry = HIGH_PRIORITY_RETRY
break
}
if (event_1.priority === EventPriority.NORMAL) {
retry = NORMAL_PRIORITY_RETRY
}
}
} catch (e_1_1) {
e_1 = { error: e_1_1 }
} finally {
try {
if (events_1_1 && !events_1_1.done && (_a = events_1.return))
_a.call(events_1)
} finally {
if (e_1) throw e_1.error
}
}
return retry
}
XKitReporter.prototype._reportEventsToServer = function (appKey, events) {
return __awaiter(this, void 0, void 0, function () {
var config, groupByEventId, maxRetry, retry, data, networkRequest
var _this = this
return __generator(this, function (_a) {
if (!this._configMap.has(appKey)) {
return [2 /*return*/]
}
config = this._configMap.get(appKey)
groupByEventId = events.reduce(function (acc, obj) {
var _a, _b, _c, _d
if (
((_a =
config === null || config === void 0
? void 0
: config.blacklist) === null || _a === void 0
? void 0
: _a.length) > 0 &&
((_b =
config === null || config === void 0
? void 0
: config.blacklist) === null || _b === void 0
? void 0
: _b.includes(obj.component))
) {
return acc
}
//blacklist 不包含Awhitelist 为空 允许 A 上报
if (
((_c =
config === null || config === void 0
? void 0
: config.whitelist) === null || _c === void 0
? void 0
: _c.length) > 0 &&
!((_d =
config === null || config === void 0
? void 0
: config.whitelist) === null || _d === void 0
? void 0
: _d.includes(obj.component))
) {
return acc
}
var key = obj.eventId
if (!acc[key]) {
acc[key] = []
}
acc[key].push(
__assign(__assign({}, obj.data), {
appKey: obj.appKey,
component: obj.component,
version: obj.version,
framework: obj.framework,
})
)
return acc
}, {})
maxRetry = this._determineMaxRetry(events)
retry = 0
data = {
common: this.common,
event: groupByEventId,
}
networkRequest = function () {
request({
method: 'POST',
url: url,
headers: {
appkey: appKey,
sdktype: HEADER_VALUE_SDK_TYPE,
ver: HEADER_VALUE_REPORTER_VERSION,
'Content-Type': HEADER_VALUE_CONTENT_TYPE,
},
data: data,
}).catch(function () {
if (retry <= maxRetry) {
setTimeout(networkRequest, 2000 * retry)
} else {
_this._logger.debug(
'Failed to report events to server after '.concat(
retry,
' retries.'
),
data
)
}
retry++
})
}
networkRequest()
return [2 /*return*/]
})
})
}
XKitReporter.setAppInfo = function (info) {
window.__XKitReporter__ = {
packageId: info === null || info === void 0 ? void 0 : info.packageId,
appName: info === null || info === void 0 ? void 0 : info.appName,
appVer: info === null || info === void 0 ? void 0 : info.appVer,
}
}
XKitReporter.getInstance = function (options) {
if (!options) {
if (!this.instance) {
throw new Error('XKitReporter not initialized')
}
return this.instance
}
if (!this.instance) {
this.instance = new XKitReporter(options)
}
return this.instance
}
return XKitReporter
})()
var XKitReporter$1 = XKitReporter
export {
EventPriority,
EventStep,
EventTracking$1 as EventTracking,
IntervalEvent,
ReportEvent,
index as Storage,
VisibilityObserver$1 as VisibilityObserver,
XKitReporter$1 as XKitReporter,
addUrlSearch,
createLoggerDecorator,
debounce,
frequencyControl,
getBrowserInfo,
getFileType,
getOperatingSystem,
logDebug$1 as logDebug,
parseFileSize,
request,
}