@hyext/utils
Version:
A tools lib for huya miniapp business development
1,069 lines (1,046 loc) • 47.9 kB
JavaScript
/*!
* @hyext/utils
* (c) 2020-2025 Alex
* Released under the MIT License.
*/
;
Object.defineProperty(exports, '__esModule', { value: true });
var safeStringify = require('fast-safe-stringify');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var safeStringify__default = /*#__PURE__*/_interopDefaultLegacy(safeStringify);
/*! *****************************************************************************
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.
***************************************************************************** */
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 __rest(s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
}
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 (_) 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 __spreadArrays() {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
}
var GLOBAL_CALL_ID = 0;
var createPromisfyFnWithCatch = function (options) {
var executePromiseFn = options.executePromiseFn, onResolve = options.onResolve, onReject = options.onReject, onPending = options.onPending;
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var localCallId = GLOBAL_CALL_ID++;
return new Promise(function (resolve, reject) {
onPending && onPending(args, localCallId);
var toResolve = function (res) {
onResolve && onResolve(res, localCallId);
resolve(res);
};
var toReject = function (err) {
var error = onReject && onReject(err, localCallId);
if (error instanceof Error) {
reject(error);
}
else {
resolve(false);
}
};
try {
var result = executePromiseFn.apply(null, args);
if (typeof result === "object" &&
result !== null &&
typeof result.then === "function") {
result
.then(function (res) {
toResolve(res);
})
.catch(function (err) {
toReject(err);
});
}
else {
// executePromiseFn 是一个普通函数
toResolve(result);
}
}
catch (error) {
toReject(error);
}
});
};
};
var once = function (fn) {
var result = void 0;
var callCount = 0;
return function onceImpl() {
var arg = [];
for (var _i = 0; _i < arguments.length; _i++) {
arg[_i] = arguments[_i];
}
if (callCount !== 0) {
return result;
}
callCount += 1;
return (result = fn.apply(null, arg));
};
};
var throttle = function (delay, fn) {
var timer;
return function throttleImpl() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
timer && clearTimeout(timer);
timer = setTimeout(function () {
fn.apply(null, args);
}, delay);
};
};
var createPolling = function (options) {
var _a = options.intervalTime, intervalTime = _a === void 0 ? 0 : _a, fn = options.fn, _b = options.immediately, immediately = _b === void 0 ? true : _b, onEnd = options.onEnd;
return function pollingImpl() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var timer;
var next = false;
function clear(e) {
timer && clearTimeout(timer);
onEnd && onEnd(e);
}
function run() {
return __awaiter(this, void 0, void 0, function () {
var error_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, fn.apply(null, args)];
case 1:
next = _a.sent();
if (next) {
delayRun();
}
else {
clear();
}
return [3 /*break*/, 3];
case 2:
error_1 = _a.sent();
clear(error_1);
return [3 /*break*/, 3];
case 3: return [2 /*return*/];
}
});
});
}
function delayRun() {
timer = setTimeout(run, intervalTime);
}
if (immediately) {
run();
}
else {
delayRun();
}
return function () {
clear();
};
};
};
/**
* memory - 返回一个缓存每次调用的结果并输出的函数
* @param fn 计算纯函数,入参成员必须是 number | string
* @returns 返回一个缓存入参映射结果的函数
*/
var memory = function (fn) {
var memoryPool = {};
return function memoryImpl() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var id = args.join("|") || "___default___";
return memoryPool[id] || (memoryPool[id] = fn.apply(null, args));
};
};
var _toString = Object.prototype.toString;
function isUndef(v) {
return v === undefined || v === null;
}
function isDef(v) {
return v !== undefined && v !== null;
}
function isTrue(v) {
return v === true;
}
function isFalse(v) {
return v === false;
}
var isObject = function (v) {
return typeof v === 'object'
&& !Array.isArray(v)
&& v !== null;
};
var isFunction = function (v) {
return typeof v === 'function';
};
var isArray = function (v) {
return Array.isArray(v);
};
function isPlainObject(obj) {
return _toString.call(obj) === '[object Object]';
}
function isRegExp(v) {
return _toString.call(v) === '[object RegExp]';
}
var capitalize = memory(function (str) {
return str.charAt(0).toUpperCase() + str.slice(1);
});
var camelizeRE = /-(\w)/g;
var camelize = memory(function (str) {
return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; });
});
var hyphenateRE = /\B([A-Z])/g;
var hyphenate = memory(function (str) {
return str.replace(hyphenateRE, '-$1').toLowerCase();
});
/**
* Convert an input value to a number for persistence.
* If the conversion fails, return original string.
*/
function toNumber(val) {
var n = parseFloat(val);
return isNaN(n) ? val : n;
}
/**
* Convert a value to a string
*/
function toString(val) {
return val == null
? ''
: Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)
? JSON.stringify(val, null, 2)
: String(val);
}
var patchNumber = function (v) {
return String(v).length === 1 ? "0" + v : v;
};
var getTime = function (date) {
if (date === void 0) { date = new Date(); }
return patchNumber(date.getHours()) + ":" + patchNumber(date.getMinutes()) + ":" + patchNumber(date.getSeconds());
};
var delay = function (duration) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve();
}, duration);
});
};
var second2Minute = function (seconds) {
var date = new Date(seconds * 1000);
var m = date.getMinutes();
var s = date.getSeconds();
return patchNumber(m) + ":" + patchNumber(s);
};
function limit(v) {
var num = Number(v);
return num === 0 || num > 99 ? '99+' : num;
}
var LOGGER_SERVER_PATH = '/ext-logger';
var socket;
var buffer = [];
var init = function (url) {
socket = new WebSocket(url);
socket.addEventListener('open', function () {
buffer.forEach(function (xs) { return socket === null || socket === void 0 ? void 0 : socket.send(xs); });
buffer.length = 0;
});
return socket;
};
var getWsUrl = (function () {
// string 合法值, undefined: 未定义, null: 无效值
var wsUrl;
return function () {
var _a, _b, _c, _d;
// 包裹在trycatch中, 防止外部调用时报错
try {
if (typeof document === 'undefined') {
throw new Error('not browser env');
}
if (wsUrl === undefined) {
if (((_a = document.querySelector('meta[name="ext-build-env"]')) === null || _a === void 0 ? void 0 : _a.getAttribute('content')) !== 'dev') {
throw new Error('not dev env');
}
var protocol = (_b = window === null || window === void 0 ? void 0 : window.location) === null || _b === void 0 ? void 0 : _b.protocol;
var host = (_c = window === null || window === void 0 ? void 0 : window.location) === null || _c === void 0 ? void 0 : _c.host;
if (!protocol || !host) {
throw new Error('no protocol or host');
}
var wsProtocol = protocol === 'https:' ? 'wss:' : 'ws:';
wsUrl = wsProtocol + "//" + host + LOGGER_SERVER_PATH;
}
return wsUrl;
}
catch (err) {
(_d = hyExt === null || hyExt === void 0 ? void 0 : hyExt.logger) === null || _d === void 0 ? void 0 : _d.info("getWsUrl error: " + (err === null || err === void 0 ? void 0 : err.message));
wsUrl = null;
return wsUrl;
}
};
})();
var formatTime = function (date) {
if (date === void 0) { date = new Date(); }
return ['getHours', 'getMinutes', 'getSeconds'].map(function (xs) { return date[xs]().toString().padStart(2, '0'); }).join(':') + '.' + date.getMilliseconds().toString().padStart(3, '0');
};
var sendDevLog = function (message, level, loggerUrl) {
var _a, _b, _c;
// 包裹在trycatch中, 防止外部调用时报错
try {
if (typeof document === 'undefined') {
return;
}
if (socket === null)
return;
if (socket === undefined) {
var url = loggerUrl || getWsUrl();
if (url) {
socket = init(url);
}
else {
socket = null;
throw new Error('no loggerUrl');
}
}
var encodedMessage = JSON.stringify({
extType: (_a = document.querySelector('meta[name="ext-type"]')) === null || _a === void 0 ? void 0 : _a.getAttribute('content'),
// @ts-ignore
platform: (window === null || window === void 0 ? void 0 : window.__os) || ((_b = document.querySelector('meta[name="ext-platform"]')) === null || _b === void 0 ? void 0 : _b.getAttribute('content')),
meta: [formatTime()],
level: level,
message: message,
});
if (socket.readyState === WebSocket.OPEN) {
socket.send(encodedMessage);
}
else {
buffer.push(encodedMessage);
}
}
catch (err) {
// @ts-ignore
(_c = hyExt === null || hyExt === void 0 ? void 0 : hyExt.logger) === null || _c === void 0 ? void 0 : _c.info("loggerClient error: " + (err === null || err === void 0 ? void 0 : err.message));
}
};
var localLevel2RemoteLevel = function (level) {
switch (level) {
case 'log':
return 'info';
case 'info':
return 'success';
case 'warn':
return 'warn';
case 'error':
return 'error';
default:
return 'info';
}
};
var createLogger = function (options) {
var onBefore = options.onBefore, onAfter = options.onAfter, prefix = options.prefix, logColor = options.logColor, _a = options.enableLog, enableLog = _a === void 0 ? true : _a, _b = options.remoteLoggerUrl, remoteLoggerUrl = _b === void 0 ? getWsUrl() : _b;
var defaultLogColor = {
info: 'blue',
warn: 'orange',
error: 'red',
log: 'green'
};
var mergredLogColor = Object.assign(defaultLogColor, logColor);
function log() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var color = args[0], msg = args[1], data = args[2], level = args[3];
var prefix = getPrefix();
var logInfo = {
prefix: prefix,
msg: msg,
data: data,
desc: prefix + msg
};
onBefore && onBefore(logInfo);
var shouldLog = typeof enableLog === 'function' ? enableLog(logInfo) : enableLog;
var loggerUrl = typeof remoteLoggerUrl === 'function' ? remoteLoggerUrl(LOGGER_SERVER_PATH) : remoteLoggerUrl;
if (shouldLog)
console.log("%c " + logInfo.desc, "color: " + color + ";", logInfo.data);
if (loggerUrl) {
sendDevLog(logInfo.desc + safeStringify__default['default'](logInfo.data), localLevel2RemoteLevel(level), loggerUrl);
}
onAfter && onAfter(logInfo);
}
function getPrefix() {
return typeof prefix === 'function' ? prefix() : (prefix || '');
}
return {
log: function (msg, data) {
log(mergredLogColor.log, msg, data, 'log');
},
info: function (msg, data) {
log(mergredLogColor.info, msg, data, 'info');
},
warn: function (msg, data) {
log(mergredLogColor.warn, msg, data, 'warn');
},
error: function (msg, data) {
log(mergredLogColor.error, msg, data, 'error');
}
};
};
var getTerminalKey = function (path) {
var pathArray = path.split('.');
return pathArray[pathArray.length - 1];
};
var getStack = function (SDK, path) {
var pathArray = path.split('.');
var stack = SDK;
var i = 0;
var pathName;
if (!stack)
return;
while (i < pathArray.length) {
pathName = pathArray[i];
stack = stack[pathName];
if (!stack)
return;
i++;
}
return stack;
};
var resolveSDKErrorMsg = function (e) {
var sdkErrMsg = e.message;
var msg = '';
try {
var errObj = JSON.parse(sdkErrMsg);
msg = errObj.msg;
}
catch (error) {
msg = sdkErrMsg;
}
return msg;
};
var createSDKPolyfill = function (options) {
var paths = options.paths, SDK = options.SDK, onError = options.onError, onCall = options.onCall, onSuccess = options.onSuccess, onPolyfill = options.onPolyfill;
var polyfillSDK = {};
if (!SDK || !paths)
throw new Error('options.SDK和options.paths都必须存在有效值');
if (paths.length === 0)
return polyfillSDK;
paths.forEach(function (path) {
var api = getStack(SDK, path);
if (api !== void 0) {
var key_1 = getTerminalKey(path);
polyfillSDK[key_1] = api;
onPolyfill && onPolyfill(polyfillSDK, key_1, api);
polyfillSDK[key_1] = createPromisfyFnWithCatch({
executePromiseFn: polyfillSDK[key_1],
onPending: function (args, callId) {
onCall && onCall(args, key_1, path, callId);
},
onResolve: function (res, callId) {
onSuccess && onSuccess(res, key_1, path, callId);
},
onReject: function (err, callId) {
var errMsg = resolveSDKErrorMsg(err);
return onError && onError(errMsg, key_1, path, callId, err);
}
});
}
});
return polyfillSDK;
};
var promiseTimeout = function (ms, promise) {
var id;
// Create a promise that rejects in <ms> milliseconds
var timeout = new Promise(function (resolve, reject) {
id = setTimeout(function () {
reject(new Error('Timed out in ' + ms + 'ms.'));
}, ms);
});
// Returns a race between our timeout and the passed in promise
return new Promise(function (resolve, reject) {
Promise.race([
promise,
timeout
]).then(function (res) {
clearTimeout(id);
resolve(res);
}).catch(reject);
});
};
var promiseRetry = function (maxExeCount, interval, cb) {
var timer;
var count = 0;
function clearTimer() { timer && clearTimeout(timer); }
return new Promise(function (resolve, reject) {
function run() {
return __awaiter(this, void 0, void 0, function () {
var res, error_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
++count;
if (!(count > maxExeCount)) return [3 /*break*/, 1];
clearTimer();
reject(new Error('The current call count more than maxExeCount'));
return [3 /*break*/, 5];
case 1:
res = void 0;
_a.label = 2;
case 2:
_a.trys.push([2, 4, , 5]);
return [4 /*yield*/, cb(count)];
case 3:
res = _a.sent();
if (res.isDone) {
clearTimer();
resolve(res.payload);
}
else {
next();
}
return [3 /*break*/, 5];
case 4:
error_1 = _a.sent();
clearTimer();
reject(error_1);
return [3 /*break*/, 5];
case 5: return [2 /*return*/];
}
});
});
}
function next() {
var _this = this;
timer = setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, run()];
case 1:
_a.sent();
return [2 /*return*/];
}
});
}); }, interval);
}
run();
});
};
var Emitter = /** @class */ (function () {
function Emitter(logger) {
this.listenerMap = new Map();
this.logger = logger.bind(this);
}
Emitter.prototype.log = function (message) {
this.logger("==> [Emitter] " + message);
};
Emitter.prototype.on = function (event, callback) {
var _this = this;
var _a;
var listeners = (_a = this.listenerMap.get(event)) !== null && _a !== void 0 ? _a : [];
this.listenerMap.set(event, __spreadArrays(listeners, [callback]));
return function () { return _this.off(event, callback); };
};
Emitter.prototype.off = function (event, callback) {
var _a;
var listeners = (_a = this.listenerMap.get(event)) !== null && _a !== void 0 ? _a : [];
this.listenerMap.set(event, listeners.filter(function (listener) { return listener !== callback; }));
};
/**
* 因为 setMode 会在 onShow 之前执行,所以需要缓存 onShow 事件
* 否则当 onShow 开始监听时, 事件可能已经触发过了, 导致无法监听到事件
*/
Emitter.prototype.emit = function (event) {
var _a;
var payload = [];
for (var _i = 1; _i < arguments.length; _i++) {
payload[_i - 1] = arguments[_i];
}
var listeners = (_a = this.listenerMap.get(event)) !== null && _a !== void 0 ? _a : [];
this.log("emit " + event + ": " + JSON.stringify(payload));
if (listeners.length === 0) {
this.log("\u4E8B\u4EF6\u89E6\u53D1\u65F6\u6CA1\u6709\u8BA2\u9605\u8005, @hyext/utils\u53EF\u80FD\u6709\u6F5C\u5728\u7684bug");
}
listeners.forEach(function (fn) { return fn.apply(void 0, payload); });
};
Emitter.prototype.cleanup = function () {
this.log("\u6E05\u7A7A\u5DF2\u6709\u76D1\u542C");
this.listenerMap = new Map();
};
return Emitter;
}());
var _promise = Promise.resolve();
var _resolvePromise;
function acquire() {
return __awaiter(this, void 0, void 0, function () {
var prevLock;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
prevLock = _promise;
_promise = prevLock.then(function () { return new Promise(function (resolve) { return _resolvePromise = resolve; }); });
return [4 /*yield*/, prevLock];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
}
function release() {
if (_resolvePromise)
_resolvePromise();
}
var lock = {
acquire: acquire,
release: release,
};
function lockPromise(fn, log) {
return (function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return __awaiter(this, void 0, void 0, function () {
var data, err_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 3, 4, 5]);
return [4 /*yield*/, lock.acquire()];
case 1:
_a.sent();
log === null || log === void 0 ? void 0 : log('lock acquired.');
return [4 /*yield*/, Promise.resolve().then(function () { return fn.apply(null, args); })];
case 2:
data = _a.sent();
return [2 /*return*/, data];
case 3:
err_1 = _a.sent();
throw err_1;
case 4:
lock.release();
log === null || log === void 0 ? void 0 : log('lock released.');
return [7 /*endfinally*/];
case 5: return [2 /*return*/];
}
});
});
});
}
var LOGGER_LABEL = '=setModeWithQueue=';
var noop = function (msg) { };
// setModeWithQueue 的运行id
var processId = 0;
// 保存最近使用的 liveroomPopupKey, 用于reset mode 为 NORMAL
var prevPopupKey;
var prevMode;
var delay$1 = function (ms) { return new Promise(function (resolve) { return setTimeout(resolve, ms); }); };
var parseParams = function (args) {
//export function getSetModeWithQueueFn(logger: (msg: string) => void, env: 'production' | 'test', getReporter: GetReporterFn): SetModeWithQueueFn;
if (args.length >= 3 && typeof args[0] === 'function') {
return {
logger: function (msg) { return args[0].call(null, LOGGER_LABEL + " " + msg); },
env: args[1],
getReporter: args[2],
};
}
// export function getSetModeWithQueueFn(polyfillSDK: any, logger: (msg: string) => void): SetModeWithQueueFn;
if (args.length === 2 && typeof args[0] === 'object' && typeof args[1] === 'function') {
return {
logger: function (msg) { return args[1].call(null, LOGGER_LABEL + " " + msg); },
};
}
//export function getSetModeWithQueueFn(logger: (msg: string) => void): SetModeWithQueueFn;
if (args.length === 1 && typeof args[0] === 'function') {
return {
logger: function (msg) { return args[0].call(null, LOGGER_LABEL + " " + msg); },
};
}
// export function getSetModeWithQueueFn(polyfillSDK: any): SetModeWithQueueFn;
if (args.length === 1 && typeof args[0] === 'object') {
return { logger: noop };
}
//export function getSetModeWithQueueFn(): SetModeWithQueueFn;
if (args.length === 0) {
return { logger: noop };
}
return { logger: noop };
};
function getSetModeWithQueueFn() {
var _this = this;
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var _a = parseParams(args), logger = _a.logger, env = _a.env, getReporter = _a.getReporter;
var emitter = new Emitter(logger);
var SHOW_EVENT = 'onNoticeShow';
var TIMEOUT_EVENT = 'onNoticeHide';
var noticeLoggerTimer;
var listenToShowError = null;
var listenToTimeoutError = null;
var setupGlobalNoticeListener = function () { return __awaiter(_this, void 0, void 0, function () {
var listenToShow, listenToTimeout;
var _this = this;
return __generator(this, function (_a) {
listenToShow = function () { return __awaiter(_this, void 0, void 0, function () {
var _a, _b, _c, _d, _e;
return __generator(this, function (_f) {
switch (_f.label) {
case 0: return [4 /*yield*/, ((_c = (_b = (_a = global.hyExt.popup) === null || _a === void 0 ? void 0 : _a.offNoticeShow) === null || _b === void 0 ? void 0 : _b.call(_a)) === null || _c === void 0 ? void 0 : _c.catch(function (err) {
logger("offNoticeShow \u76D1\u542C\u5931\u8D25: " + (err === null || err === void 0 ? void 0 : err.message));
}))];
case 1:
_f.sent();
return [4 /*yield*/, ((_e = (_d = global.hyExt.popup) === null || _d === void 0 ? void 0 : _d.onNoticeShow) === null || _e === void 0 ? void 0 : _e.call(_d, {
callback: function (info) {
logger("hyExt.popup.onNoticeShow: \u56DE\u8C03\u89E6\u53D1, info: " + JSON.stringify(info || '{}'));
return setTimeout(function () {
emitter.emit(SHOW_EVENT, info);
}, 0);
}
}))];
case 2:
_f.sent();
if (!global.hyExt.popup.offNoticeShow || !global.hyExt.popup.onNoticeShow)
throw new Error('no onNoticeShow/offNoticeShow function');
return [2 /*return*/];
}
});
}); };
listenToTimeout = function () { return __awaiter(_this, void 0, void 0, function () {
var _a, _b, _c, _d, _e;
return __generator(this, function (_f) {
switch (_f.label) {
case 0: return [4 /*yield*/, ((_c = (_b = (_a = global.hyExt.popup).offNoticeHide) === null || _b === void 0 ? void 0 : _b.call(_a)) === null || _c === void 0 ? void 0 : _c.catch(function (err) {
logger("offNoticeHide \u76D1\u542C\u5931\u8D25: " + (err === null || err === void 0 ? void 0 : err.message));
}))];
case 1:
_f.sent();
return [4 /*yield*/, ((_e = (_d = global.hyExt.popup).onNoticeHide) === null || _e === void 0 ? void 0 : _e.call(_d, {
callback: function (info) {
logger("hyExt.popup.onNoticeHide: \u56DE\u8C03\u89E6\u53D1, info: " + JSON.stringify(info || '{}'));
return setTimeout(function () {
emitter.emit(TIMEOUT_EVENT, info);
}, 0);
}
}))];
case 2:
_f.sent();
if (!global.hyExt.popup.offNoticeHide || !global.hyExt.popup.onNoticeHide)
throw new Error('no onNoticeHide/offNoticeHide function');
return [2 /*return*/];
}
});
}); };
return [2 /*return*/, Promise.all([
listenToTimeout()
.then(function () { listenToTimeoutError = null; })
.catch(function (err) {
logger("\u76D1\u542C/\u53D6\u6D88\u76D1\u542C\u5931\u8D25: " + (err === null || err === void 0 ? void 0 : err.message));
listenToTimeoutError = err;
}),
listenToShow()
.then(function () { listenToShowError = null; })
.catch(function (err) {
logger("\u76D1\u542C/\u53D6\u6D88\u76D1\u542C\u5931\u8D25: " + (err === null || err === void 0 ? void 0 : err.message));
listenToShowError = err;
}),
])];
});
}); };
var setupGlobalNoticeListenerPromise = setupGlobalNoticeListener();
/**
* setModeWithQueue 函数是对setMode的封装, 用于支持 notice 排队
* setModeWithQueue resolve 表示setMode成功, 但是由于终端的排队机制, 当mode为NOTICE时, 并不表示notice已经展示
* 因此对比setMode, 添加两个额外的参数:
* - onShow: 如果当前mode是NOTICE, 那么当收到终端的展示事件时, 会调用这个函数. 如果当前mode不是NOTICE, 则在 setMode resolve 后调用这个函数
* - onNoticeHide: 当notice超时被终端隐藏, 或者调用了setMode 切换到非NOTICE模式时 , 会调用这个函数.
* */
var setModeWithQueue = function (params) { return __awaiter(_this, void 0, void 0, function () {
var localId, loggerWithId, mode, onShow, onNoticeHide, showTime, liveroomPopupKey, _a, waitAfterResetNormal, _b, skipResetNormal, _c, shouldSkipPrevEvents, extra, _d, reporter, resetMode, args, setModeRsp, setupCurrentNoticeListener;
var _this = this;
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
clearTimeout(noticeLoggerTimer);
localId = processId++;
loggerWithId = function (msg) { return logger("[set_" + localId + "] " + msg); };
mode = params.mode, onShow = params.onShow, onNoticeHide = params.onNoticeHide, showTime = params.showTime, liveroomPopupKey = params.liveroomPopupKey, _a = params.waitAfterResetNormal, waitAfterResetNormal = _a === void 0 ? 800 : _a, _b = params.skipResetNormal, skipResetNormal = _b === void 0 ? false : _b, _c = params.shouldSkipPrevEvents, shouldSkipPrevEvents = _c === void 0 ? false : _c, extra = __rest(params, ["mode", "onShow", "onNoticeHide", "showTime", "liveroomPopupKey", "waitAfterResetNormal", "skipResetNormal", "shouldSkipPrevEvents"]);
return [4 /*yield*/, setupGlobalNoticeListenerPromise];
case 1:
_e.sent();
if (!(typeof shouldSkipPrevEvents === 'function')) return [3 /*break*/, 3];
return [4 /*yield*/, shouldSkipPrevEvents({ prevPopupKey: prevPopupKey, prevMode: prevMode, mode: mode, liveroomPopupKey: liveroomPopupKey })];
case 2:
_d = _e.sent();
return [3 /*break*/, 4];
case 3:
_d = shouldSkipPrevEvents;
_e.label = 4;
case 4:
if (_d) {
loggerWithId("shouldSkipPrevEvents => \u5FFD\u7565\u5DF2\u6709\u7684\u76D1\u542C\u7684\u4E8B\u4EF6");
emitter.cleanup();
}
reporter = getReporter === null || getReporter === void 0 ? void 0 : getReporter({ liveroomPopupKey: liveroomPopupKey || '', logger: logger, env: env });
resetMode = function () { return __awaiter(_this, void 0, void 0, function () {
var payload;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
payload = { mode: 'NORMAL', liveroomPopupKey: prevPopupKey };
loggerWithId("\u91CD\u7F6EMode\u4E3ANORMAL: " + JSON.stringify(payload));
// @ts-ignore SDK 协议没更新
return [4 /*yield*/, global.hyExt.popup.setMode(payload)
.then(function () {
loggerWithId("\u91CD\u7F6EMode\u4E3ANORMAL\u6210\u529F");
return delay$1(waitAfterResetNormal);
})
.catch(function (err) { return loggerWithId("\u91CD\u7F6EMode\u4E3ANORMAL\u5931\u8D25: " + (err === null || err === void 0 ? void 0 : err.message)); })];
case 1:
// @ts-ignore SDK 协议没更新
_a.sent();
return [2 /*return*/];
}
});
}); };
if (!(mode !== 'NORMAL' && !skipResetNormal)) return [3 /*break*/, 6];
return [4 /*yield*/, resetMode()];
case 5:
_e.sent();
_e.label = 6;
case 6:
args = __assign({ mode: mode,
showTime: showTime, liveroomPopupKey: mode === 'NORMAL' ? prevPopupKey : liveroomPopupKey }, extra);
loggerWithId("setMode req <= " + JSON.stringify(args));
if (mode === 'NOTICE')
reporter === null || reporter === void 0 ? void 0 : reporter.on_set();
return [4 /*yield*/, global.hyExt.popup.setMode(args)];
case 7:
setModeRsp = _e.sent();
prevPopupKey = mode === 'NOTICE' ? liveroomPopupKey : undefined;
prevMode = mode;
loggerWithId("setMode rsp => " + JSON.stringify(setModeRsp));
/* 排队机制只支持 mode === 'NOTICE' */
/* 没有 noticeKey 表明不支持 notice 排队. 这个时候不需要理会到底有没有监听成功 */
if (mode !== 'NOTICE') {
loggerWithId("\u975ENOTICE\u6A21\u5F0F, \u76F4\u63A5\u89E6\u53D1onShow\u56DE\u8C03");
setTimeout(function () { onShow === null || onShow === void 0 ? void 0 : onShow(); }, 0);
return [2 /*return*/, setModeRsp];
}
else {
// 兼容古早版本的app
if (!(setModeRsp === null || setModeRsp === void 0 ? void 0 : setModeRsp.noticeKey)) {
loggerWithId("App\u65E0noticeKey\u8FD4\u56DE, \u76F4\u63A5\u89E6\u53D1 onShow \u56DE\u8C03");
reporter === null || reporter === void 0 ? void 0 : reporter.on_show();
setTimeout(function () { onShow === null || onShow === void 0 ? void 0 : onShow(); }, 0);
return [2 /*return*/, setModeRsp];
}
/* 虽然是NOTICE, 但是调用者并不关心什么时候展示/隐藏 */
// if (!onShow && !onNoticeHide) {
// loggerWithId(`支持notice排队, 业务不关心onShow/onHide`)
// return setModeRsp
// }
/* 关心 onShow 但是监听失败, 则抛出异常. 但是这个时候其实已经调用了 setMode 了*/
if (listenToShowError && onShow) {
loggerWithId("\u652F\u6301notice\u6392\u961F, \u4E1A\u52A1\u5173\u5FC3onShow, \u4F46\u662F\u5E95\u5C42\u76D1\u542C\u5931\u8D25");
throw listenToShowError;
}
/* 关心 onTimeout 但是监听失败, 则抛出异常. 但是这个时候其实已经调用了 setMode 了*/
if (listenToTimeoutError && onNoticeHide) {
loggerWithId("\u652F\u6301notice\u6392\u961F, \u4E1A\u52A1\u5173\u5FC3onHide, \u4F46\u662F\u5E95\u5C42\u76D1\u542C\u5931\u8D25");
throw listenToTimeoutError;
}
noticeLoggerTimer = setTimeout(function () {
loggerWithId("\u8BF7\u6C42 setMode 30s\u540E\u4EFB\u672A\u89E6\u53D1" + SHOW_EVENT + "\u4E8B\u4EF6");
reporter === null || reporter === void 0 ? void 0 : reporter.on_timeout();
}, 30000);
setupCurrentNoticeListener = function (setModeRsp) {
/* 在添加新的事件监听函数前, 清空已有的监听.
* 因为每次setMode都会生成一个新的noticeKey,
* 之前旧的setMode永远也不会等来它的回调, 保留只是占内存 */
loggerWithId("\u6E05\u7A7A\u5DF2\u6709\u76D1\u542C");
emitter.cleanup();
var eventConfig = [
{
enable: !!onShow,
eventName: SHOW_EVENT,
callback: function (info) {
clearTimeout(noticeLoggerTimer);
reporter === null || reporter === void 0 ? void 0 : reporter.on_show();
onShow === null || onShow === void 0 ? void 0 : onShow(info);
},
},
{
enable: !!onNoticeHide,
eventName: TIMEOUT_EVENT,
callback: function (info) {
reporter === null || reporter === void 0 ? void 0 : reporter.on_hide();
onNoticeHide === null || onNoticeHide === void 0 ? void 0 : onNoticeHide(info);
},
},
];
eventConfig.forEach(function (_a) {
var enable = _a.enable, eventName = _a.eventName, callback = _a.callback;
if (!enable)
return;
loggerWithId("\u6DFB\u52A0" + eventName + "\u4E8B\u4EF6\u76D1\u542C, " + JSON.stringify(setModeRsp));
emitter.on(eventName, function (info) {
if ((info === null || info === void 0 ? void 0 : info.noticeKey) !== setModeRsp.noticeKey) {
loggerWithId("\u8FC7\u6EE4\u5176\u4ED6" + eventName + "\u4E8B\u4EF6, event noticeKey: " + (info === null || info === void 0 ? void 0 : info.noticeKey) + ", target noticeKey: " + setModeRsp.noticeKey);
return;
}
loggerWithId(eventName + "\u89E6\u53D1. payload: " + JSON.stringify(info) + ", setModeRsp: " + JSON.stringify(setModeRsp));
callback(info);
});
});
};
setupCurrentNoticeListener(setModeRsp);
return [2 /*return*/, setModeRsp];
}
}
});
}); };
return lockPromise(setModeWithQueue, logger);
}
// @ts-ignore
var customContainerWidth = global && global.__customContainerWidth;
var inWebView = typeof customContainerWidth !== "undefined";
function isWebViewEnv() {
return inWebView;
}
function tryThrowNotWebViewEnvError() {
if (!inWebView) {
throw new Error('请在webview环境下使用');
}
}
function isIOSOnWeb() {
tryThrowNotWebViewEnvError();
var userAgent = navigator.userAgent.toLowerCase();
return /iphone|ipad|ipod/.test(userAgent);
}
function isAndroidOnWeb() {
tryThrowNotWebViewEnvError();
var userAgent = navigator.userAgent.toLowerCase();
return userAgent.indexOf("android") > -1;
}
function scalePxOnWebView(px, base) {
if (base === void 0) { base = 750; }
tryThrowNotWebViewEnvError();
return Math.ceil((px * customContainerWidth) / base);
}
function isWebviewProxyEnv() {
// @ts-expect-error
return global.__ext_env && global.__ext_env === 'webview-proxy';
}
exports.camelize = camelize;
exports.capitalize = capitalize;
exports.createLogger = createLogger;
exports.createPolling = createPolling;
exports.createPromisfyFnWithCatch = createPromisfyFnWithCatch;
exports.createSDKPolyfill = createSDKPolyfill;
exports.delay = delay;
exports.getSetModeWithQueueFn = getSetModeWithQueueFn;
exports.getTime = getTime;
exports.hyphenate = hyphenate;
exports.isAndroidOnWeb = isAndroidOnWeb;
exports.isArray = isArray;
exports.isDef = isDef;
exports.isFalse = isFalse;
exports.isFunction = isFunction;
exports.isIOSOnWeb = isIOSOnWeb;
exports.isObject = isObject;
exports.isPlainObject = isPlainObject;
exports.isRegExp = isRegExp;
exports.isTrue = isTrue;
exports.isUndef = isUndef;
exports.isWebViewEnv = isWebViewEnv;
exports.isWebviewProxyEnv = isWebviewProxyEnv;
exports.limit = limit;
exports.memory = memory;
exports.once = once;
exports.patchNumber = patchNumber;
exports.promiseRetry = promiseRetry;
exports.promiseTimeout = promiseTimeout;
exports.scalePxOnWebView = scalePxOnWebView;
exports.second2Minute = second2Minute;
exports.sendDevLog = sendDevLog;
exports.throttle = throttle;
exports.toNumber = toNumber;
exports.toString = toString;