UNPKG

@tencentcloud/call-uikit-wx-uniapp

Version:

An Open-source Voice & Video Calling UI Component Based on Tencent Cloud Service.

2,676 lines 126 kB
(function(){"use strict";try{if(typeof document!="undefined"){var e=document.createElement("style");e.appendChild(document.createTextNode(".ai-subtitle[data-v-f7f2cf31]{position:absolute;z-index:100;bottom:110px;left:50%;padding:10px 12px;color:#fff;background-color:#4f586bb3;border-radius:8px;transform:translate(-50%);width:260px;max-height:280px;overflow-y:auto;overflow-x:hidden}.sender-name[data-v-f7f2cf31]{color:#ff0}")),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}})();
import { TUICallEvent as C, TUICallEngine as Pe } from "@tencentcloud/call-engine-wx";
import { TUICore as ie, TUIConstants as R, TUILogin as It } from "@tencentcloud/tui-core";
import ve from "@tencentcloud/chat";
import ut from "vue";
import "@vue/composition-api";
var r = /* @__PURE__ */ ((s) => (s.CALL = "call", s.CUSTOM = "custom", s))(r || {}), _ = /* @__PURE__ */ ((s) => (s[s.UNKNOWN = 0] = "UNKNOWN", s[s.AUDIO = 1] = "AUDIO", s[s.VIDEO = 2] = "VIDEO", s))(_ || {}), G = /* @__PURE__ */ ((s) => (s.UNKNOWN = "unknown", s.CALLEE = "callee", s.CALLER = "caller", s))(G || {}), g = /* @__PURE__ */ ((s) => (s.IDLE = "idle", s.CALLING = "calling", s.CONNECTED = "connected", s))(g || {}), le = /* @__PURE__ */ ((s) => (s.CONTAIN = "contain", s.COVER = "cover", s.FILL = "fill", s))(le || {}), ce = /* @__PURE__ */ ((s) => (s.RESOLUTION_480P = "480p", s.RESOLUTION_720P = "720p", s.RESOLUTION_1080P = "1080p", s))(ce || {});
const M = {
  IDLE: "idle",
  BE_INVITED: "be-invited",
  DIALING_C2C: "dialing-c2c",
  DIALING_GROUP: "dialing-group",
  CALLING_C2C_AUDIO: "calling-c2c-audio",
  CALLING_C2C_VIDEO: "calling-c2c-video",
  CALLING_GROUP_AUDIO: "calling-group-audio",
  CALLING_GROUP_VIDEO: "calling-group-video"
}, Et = {
  unknown: 0,
  audio: 1,
  video: 2
  /* VIDEO */
};
var w = /* @__PURE__ */ ((s) => (s.EAR = "ear", s.SPEAKER = "speaker", s))(w || {}), b = /* @__PURE__ */ ((s) => (s[s.FRONT = 0] = "FRONT", s[s.BACK = 1] = "BACK", s))(b || {}), Y = /* @__PURE__ */ ((s) => (s.Camera = "camera", s.Microphone = "microphone", s.SwitchCamera = "switchCamera", s.InviteUser = "inviteUser", s))(Y || {}), X = /* @__PURE__ */ ((s) => (s.Open = "open", s.Close = "close", s))(X || {}), je = /* @__PURE__ */ ((s) => (s.LocalInLargeView = "local", s.RemoteInLargeView = "remote", s))(je || {}), J = /* @__PURE__ */ ((s) => (s[s.INVITE = 1] = "INVITE", s[s.CANCEL_INVITE = 2] = "CANCEL_INVITE", s[s.ACCEPT_INVITE = 3] = "ACCEPT_INVITE", s[s.REJECT_INVITE = 4] = "REJECT_INVITE", s[s.INVITE_TIMEOUT = 5] = "INVITE_TIMEOUT", s))(J || {});
const Qe = {
  SWITCH_TO_AUDIO_CALL_FAILED: 60001,
  SWITCH_TO_VIDEO_CALL_FAILED: 60002,
  MICROPHONE_UNAVAILABLE: 60003,
  CAMERA_UNAVAILABLE: 60004,
  BAN_DEVICE: 60005,
  NOT_SUPPORTED_WEBRTC: 60006,
  ERROR_BLACKLIST: 20007
}, Ve = {
  SWITCH_TO_AUDIO_CALL_FAILED: "switchToAudioCall-call-failed",
  SWITCH_TO_VIDEO_CALL_FAILED: "switchToVideoCall-call-failed",
  MICROPHONE_UNAVAILABLE: "microphone-unavailable",
  CAMERA_UNAVAILABLE: "camera-unavailable",
  BAN_DEVICE: "ban-device",
  NOT_SUPPORTED_WEBRTC: "not-supported-webrtc",
  ERROR_BLACKLIST: "blacklist-user-tips"
};
var Ze = /* @__PURE__ */ ((s) => (s[s.NORMAL = 0] = "NORMAL", s[s.RELEASE = 1] = "RELEASE", s[s.WARNING = 2] = "WARNING", s[s.ERROR = 3] = "ERROR", s[s.NONE = 4] = "NONE", s))(Ze || {});
const Le = {
  CALL_STATUS: "callStatus",
  CALL_ROLE: "callRole",
  CALL_MEDIA_TYPE: "callMediaType",
  LOCAL_USER_INFO: "localUserInfo",
  LOCAL_USER_INFO_EXCLUDE_VOLUMN: "localUserInfoExcludeVolume",
  REMOTE_USER_INFO_LIST: "remoteUserInfoList",
  REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST: "remoteUserInfoExcludeVolumeList",
  CALLER_USER_INFO: "callerUserInfo",
  IS_GROUP: "isGroup",
  CALL_DURATION: "callDuration",
  CALL_TIPS: "callTips",
  TOAST_INFO: "toastInfo",
  IS_MINIMIZED: "isMinimized",
  ENABLE_FLOAT_WINDOW: "enableFloatWindow",
  BIG_SCREEN_USER_ID: "bigScreenUserId",
  LANGUAGE: "language",
  IS_CLICKABLE: "isClickable",
  DISPLAY_MODE: "displayMode",
  VIDEO_RESOLUTION: "videoResolution",
  PUSHER: "pusher",
  PLAYER: "player",
  IS_EAR_PHONE: "isEarPhone",
  IS_MUTE_SPEAKER: "isMuteSpeaker",
  SHOW_PERMISSION_TIP: "SHOW_PERMISSION_TIP",
  NETWORK_STATUS: "NetWorkStatus",
  CALL_ID: "callID",
  GROUP_ID: "groupID",
  ROOM_ID: "roomID",
  ROOM_ID_TYPE: "roomIdType",
  SHOW_SELECT_USER: "showSelectUser",
  IS_SHOW_ENABLE_VIRTUAL_BACKGROUND: "isShowEnableVirtualBackground",
  ENABLE_VIRTUAL_BACKGROUND: "enableVirtualBackground",
  GROUP_CALL_MEMBERS: "groupCallMembers",
  PUSHER_ID: "pusherId",
  IS_FORCE_USE_V2_API: "isForceUseV2API"
}, Ct = {
  INNER_ATTR_KIT_INFO: "inner_attr_kit_info"
}, Lt = {
  INITIAL_PUSHER: "initialPusher",
  NEW_PUSHER: "newPusher"
}, a = {
  PREFIX: "【CallService】",
  AUDIO: "audio",
  VIDEO: "video",
  LOCAL_VIDEO: "localVideo",
  ERROR: "error",
  TIMEOUT: "timeout",
  RAF: "raf",
  INTERVAL: "interval",
  DEFAULT: "default",
  BOOLEAN: "boolean",
  STRING: "string",
  NUMBER: "number",
  OBJECT: "object",
  ARRAY: "array",
  FUNCTION: "function",
  UNDEFINED: "undefined",
  UNKNOWN: "unknown",
  ALL: "all",
  MYSELF: "myself",
  DEVICE_LIST: "deviceList",
  CAMERA_POSITION: "cameraPosition",
  CUSTOM_UI_CONFIG: "customUIConfig",
  TRANSLATE: "translate",
  ...Lt,
  ...Le,
  ...Ct
}, ht = "https://web.sdk.qcloud.com/component/TUIKit/assets/call.png", gt = "https://web.sdk.qcloud.com/component/TUIKit/assets/call-video-reverse.svg", Ke = 2147483647, be = 4;
var we = /* @__PURE__ */ ((s) => (s[s.TUI_CALL_KIT = 14] = "TUI_CALL_KIT", s[s.TIM_CALL_KIT = 15] = "TIM_CALL_KIT", s))(we || {}), Te = /* @__PURE__ */ ((s) => (s[s.NUMBER_ROOM_ID = 1] = "NUMBER_ROOM_ID", s[s.STRING_ROOM_ID = 2] = "STRING_ROOM_ID", s))(Te || {});
function dt() {
  wx.hideKeyboard && wx.hideKeyboard({
    complete: () => {
    }
  });
}
function _t() {
  wx.getSystemInfoSync().platform === "devtools" && wx.showModal({
    icon: "none",
    title: "运行环境提醒",
    content: "微信开发者工具不支持原生推拉流组件(即 <live-pusher> 和 <live-player> 标签),请使用真机调试或者扫码预览。",
    showCancel: !1
  });
}
function $e() {
  dt(), _t();
}
async function ft(s, e) {
  try {
    $e();
    const t = {
      microphone: !0,
      camera: s === _.VIDEO
    };
    return await e._tuiCallEngine.deviceCheck(t) ? g.CALLING : g.IDLE;
  } catch (t) {
    return console.debug(t), g.IDLE;
  }
}
function St(s) {
  (s == null ? void 0 : s.code) === -1002 && wx.showModal({
    icon: "none",
    title: "error",
    content: (s == null ? void 0 : s.message) || "",
    showCancel: !1
  });
}
function Dt() {
  wx.showModal({
    icon: "none",
    title: "权限提示",
    content: "当前小程序 appid 不具备 <live-pusher> 和 <live-player> 的使用权限,您将无法正常使用实时通话能力,请使用企业小程序账号申请权限后再进行开发体验",
    showCancel: !1
  });
}
const Ut = {
  // 按钮文案
  hangup: "挂断",
  reject: "拒绝",
  accept: "接受",
  camera: "摄像头",
  microphone: "麦克风",
  speaker: "扬声器",
  "open camera": "打开摄像头",
  "close camera": "关闭摄像头",
  "open microphone": "打开麦克风",
  "close microphone": "关闭麦克风",
  "video-to-audio": "转语音通话",
  "virtual-background": "模糊背景",
  // 通话结果
  "other side reject call": "对方已拒绝",
  "reject call": "{{ userList }} 拒绝通话",
  cancel: "取消通话",
  "other side line busy": "对方忙线",
  "in busy": "{{ userList }} 正在忙",
  "call timeout": "呼叫超时",
  "end call": "{{ userList }} 结束通话",
  // 通话提示语
  "caller calling message": "等待对方接受邀请",
  "callee calling video message": "邀请你视频通话",
  "callee calling audio message": "邀请你语音通话",
  "no microphone access": "没有麦克风权限",
  "no camera access": "没有摄像头权限",
  "invite member": "邀请成员",
  "Invited group call": "邀请你加入多人通话",
  "Those involved": "参与通话的有:",
  waiting: "等待接听...",
  me: "(我)",
  // 弹出层文案
  "browser-authorization": "浏览器授权",
  "mac-privacy": "系统偏好设置 -> 安全与隐私 -> 隐私",
  "win-privacy": "设置 -> 隐私和安全性 -> 应用权限",
  "mac-preferences": "打开系统偏好设置",
  "win-preferences": "打开系统设置",
  "Please enter userID": "请输入 userID",
  "View more": "查看更多",
  "people selected": "人已选中",
  "Select all": "全选",
  Cancel: "取消",
  Done: "完成",
  "exist group call": "当前群组中已经存在群组通话",
  // UI3.0 新增
  "camera enabled": "摄像头已开",
  "camera disabled": "摄像头已关",
  "microphone enabled": "麦克风已开",
  "microphone disabled": "麦克风已关",
  "speaker enabled": "扬声器已开",
  "speaker disabled": "扬声器已关",
  "open speaker": "开启扬声器",
  "close speaker": "关闭扬声器",
  "wait to be called": "等待接听",
  answered: "已接通",
  "people in the call": "人参与通话",
  "failed to obtain speakers": "无法获取扬声器",
  "you have a new call": "您有一个新的通话",
  "switch camera": "翻转",
  join: "加入",
  "people on the call": "人正在通话",
  "Supports a maximum of 9 people for simultaneous calls": "最多支持9人同时通话",
  you: "(你)",
  "The network is poor during your current call": "当前通话你的网络不佳",
  "The other user network is poor during the current call": "当前通话对方网络不佳",
  "TUICallKit init is not complete": "TUICallKit 初始化登录未完成,需要在 init 完成后使用此 API",
  // combine chat
  "Video call": "发起视频通话",
  "Voice call": "发起语音通话",
  "Call End": "通话结束",
  "Switch voice call": "切换语音通话",
  "Switch video call": "切换视频通话",
  "Call duration": "通话时长",
  "Call Cancel": "已取消",
  "Other Side Cancel": "对方已取消",
  Decline: "已拒绝",
  "Other Side Decline": "对方已拒绝",
  "No answer": "超时无应答",
  "Other Side No Answer": "对方无应答",
  Answered: "已接听",
  "Other Side Line Busy": "对方忙线中",
  "Line Busy": "忙线无应答",
  // 待废弃文案
  timeout: "{{ userList }} 超时",
  "kick out": "被踢",
  call: "通话",
  "video-call": "视频通话",
  "audio-call": "音频通话",
  search: "搜索",
  "search-result": "搜索结果",
  "Wechat scan right QR code": "微信扫右二维码",
  "Use-phone-and-computer": "用手机与电脑互打体验视频通话",
  "Scan the QR code above": "扫描上方二维码",
  "no-user": "未搜索到用户",
  "member-not-added": "未添加成员",
  "not-login": "未登录",
  "login-status-expire": "登录状态已失效,请刷新网页重试",
  "experience-multi-call": "体验多人通话请下载全功能demo:",
  "not-support-multi-call": "多人通话接口未开放",
  "input-phone-userID": "请输入手机号/用户ID",
  userID: "用户ID",
  "already-enter": "已经进入当前通话",
  "image-resolution": "分辨率",
  "default-image-resolution": "默认分辨率",
  "invited-person": "添加成员",
  "be-rejected": "对方已拒绝,",
  "be-no-response": "对方无应答,",
  "be-line-busy": "对方忙线中,",
  "be-canceled": "对方已取消",
  "voice-call-end": "语音通话结束",
  "video-call-end": "视频通话结束",
  "method-call-failed": "同步操作失败",
  "failed-to-obtain-permission": "权限获取失败",
  "environment-detection-failed": "环境检测失败",
  "switchToAudioCall-call-failed": "切语音调用失败",
  "switchToVideoCall-call-failed": "切视频调用失败",
  "microphone-unavailable": "没有可用的麦克风设备",
  "camera-unavailable": "没有可用的摄像头设备",
  "ban-device": "用户禁止使用设备",
  "not-supported-webrtc": "当前环境不支持 WebRTC",
  "blacklist-user-tips": "发起通话失败,被对方拉入黑名单,禁止发起!",
  "is-already-calling": "TUICallKit 已在通话状态",
  "need-init": "TUICallKit 发起通话前需保证 TUICallKitServer.init() 方法执行成功",
  "can't call yourself": "不能呼叫自己",
  // eslint-disable-line
  "accept-error": "接通失败",
  "accept-device-error": "接通失败,通话设备获取失败",
  "call-error": "发起通话失败"
}, ge = typeof wx < "u" && typeof wx.getSystemInfoSync == "function" && !!wx.getSystemInfoSync().fontSizeSetting, et = typeof uni < "u" && typeof uni > "u", ke = ge || et, tt = typeof uni < "u", it = function() {
  return (typeof uni < "u" || typeof window < "u") && !ke;
}(), Ot = function() {
  return ge ? wx : tt ? uni : window;
}(), K = it && window && window.navigator && window.navigator.userAgent || "", Bt = /Android/i.test(K), Rt = /(?:Windows Phone)/.test(K), Nt = /(?:SymbianOS)/.test(K), Tt = /iPad/i.test(K) || /iPhone/i.test(K) || /iPod/i.test(K), at = Bt || Rt || Nt || Tt, Ge = it && !at, pt = Ge && K.includes("Windows NT"), wt = Ge && K.includes("Mac");
let nt = class se {
  constructor() {
    this.global = Ot, this.isPC = !1, this.isH5 = !1, this.isWeChat = !1, this.isApp = !1, this.isUniPlatform = !1, this.isOfficial = !1, this.isWIN = !1, this.isMAC = !1, this.initEnv();
  }
  /**
   * 获取 TUIGlobal 实例
   * @returns {TUIGlobal}
  */
  static getInstance() {
    return se.instance || (se.instance = new se()), se.instance;
  }
  initEnv() {
    this.isPC = Ge, this.isH5 = at, this.isWeChat = ge, this.isApp = et && !ge, this.isUniPlatform = tt, this.isWIN = pt, this.isMAC = wt;
  }
  initOfficial(e) {
    this.isOfficial = e === 1400187352 || e === 1400188366;
  }
};
const Se = function(s) {
  return typeof s === a.UNDEFINED;
}, Fe = function(s) {
  if (typeof s !== a.OBJECT || s === null)
    return !1;
  const e = Object.getPrototypeOf(s);
  if (e === null)
    return !0;
  let t = e;
  for (; Object.getPrototypeOf(t) !== null; )
    t = Object.getPrototypeOf(t);
  return e === t;
}, st = function(s) {
  return typeof Array.isArray === a.FUNCTION ? Array.isArray(s) : Object.prototype.toString.call(s).match(/^\[object (.*)\]$/)[1].toLowerCase() === a.ARRAY;
}, de = function(s) {
  return typeof s === a.STRING;
}, Gt = function(s) {
  return typeof s === a.BOOLEAN;
}, rt = function(s) {
  return (
    // eslint-disable-next-line
    s !== null && (typeof s === a.NUMBER && !isNaN(s - 0) || typeof s === a.OBJECT && s.constructor === Number)
  );
};
function ot(s) {
  const e = Math.floor(s / 3600), t = Math.floor(s % 3600 / 60), i = Math.floor(s % 60);
  let n = e > 9 ? `${e}` : `0${e}`;
  return n += t > 9 ? `:${t}` : `:0${t}`, n += i > 9 ? `:${i}` : `:0${i}`, n;
}
function Ft(s) {
  if (typeof s === a.STRING)
    try {
      return !!JSON.parse(s);
    } catch (e) {
      return console.debug(e), !1;
    }
  return !1;
}
const ue = function(s) {
  return !s || !Ft(s) ? s : JSON.parse(s);
};
function Ye(s) {
  return (s == null ? void 0 : s.message.indexOf("is ongoing, please avoid repeated calls")) !== -1;
}
function Mt(s) {
  const { message: e } = s;
  return e.indexOf("NotAllowedError: Permission denied") !== -1;
}
function Ue() {
  return Date.now();
}
const he = function(s) {
  return typeof s === a.FUNCTION;
}, yt = () => {
  if (nt.getInstance().isWeChat)
    return "zh-cn";
  const s = ((navigator == null ? void 0 : navigator.language) || (navigator == null ? void 0 : navigator.userLanguage) || "").substr(0, 2);
  let e = "en";
  switch (s) {
    case "zh":
      e = "zh-cn";
      break;
    case "ja":
      e = "ja_JP";
      break;
    default:
      e = "en";
  }
  return e;
}, mt = function(s) {
  return Object.prototype.toString.call(s).match(/^\[object (.*)\]$/)[1].toLowerCase();
};
function Pt(s, e, t) {
  if (!s.hasOwnProperty(e))
    return s;
  const i = {};
  return Object.keys(s).forEach((n) => {
    n === e ? i[t] = s[n] : i[n] = s[n];
  }), i;
}
function vt(s, e) {
  return s.replace(/{{\s*(\w+)(\s*,\s*[^}]+)?\s*}}/g, (t, i) => {
    const n = i.trim();
    return e[n] !== void 0 ? String(e[n]) : t;
  });
}
const p = {
  OTHER_SIDE: "other side",
  CANCEL: "cancel",
  OTHER_SIDE_REJECT_CALL: "other side reject call",
  REJECT_CALL: "reject call",
  OTHER_SIDE_LINE_BUSY: "other side line busy",
  IN_BUSY: "in busy",
  CALL_TIMEOUT: "call timeout",
  END_CALL: "end call",
  TIMEOUT: "timeout",
  KICK_OUT: "kick out",
  CALLER_CALLING_MSG: "caller calling message",
  CALLER_GROUP_CALLING_MSG: "wait to be called",
  CALLEE_CALLING_VIDEO_MSG: "callee calling video message",
  CALLEE_CALLING_AUDIO_MSG: "callee calling audio message",
  NO_MICROPHONE_DEVICE_PERMISSION: "no microphone access",
  NO_CAMERA_DEVICE_PERMISSION: "no camera access",
  EXIST_GROUP_CALL: "exist group call",
  LOCAL_NETWORK_IS_POOR: "The network is poor during your current call",
  REMOTE_NETWORK_IS_POOR: "The other user network is poor during the current call"
}, x = {
  "zh-cn": Ut
};
function j(s) {
  var i, n;
  const e = c.getData(r.CALL, a.LANGUAGE);
  let t = "";
  if (de(s))
    t = ((i = x == null ? void 0 : x[e]) == null ? void 0 : i[s]) || "";
  else if (Fe(s)) {
    const { key: o, options: A } = s;
    t = ((n = x == null ? void 0 : x[e]) == null ? void 0 : n[o]) || "", t = vt(t, A);
  }
  return t;
}
const Qt = "data:audio/mpeg;base64,SUQzAwAAAAAAGFRYWFgAAAAOAAAAVFhYWABpc29taXNvMv/zNGQAAqwAvnihCAADQAF4CUAQAFYAg3Lh8u+XUD5///wx//wQOAhKAgb/////xOoH4g8Hz4Pq8RoAbdTgMsMt9hcb990EP//zNGQQBPDjEgDItAAFWcIoAYoQAN9P/03QQ//umn//91SXL5uXP+pf8WYTvzgJPAQ+p/7f///1//6f///WH///F4BtJhNFkP/zNGQGA/jjNADHiAAEQDJcAYkQAGWrn6vw6ljfPtj/////////9Pv9sL/mL/QezSepgwrimv07//////y3u602OiyhOYb+LP/zNGQIBKTBKADoCACDoCZMAckAAKHKCUIAFsqGZXtSZ/////////Sn/Vy3nVUOJBqSX2UAkQxBddzv//////yq3lcgaTmTQ//zNGQHA9SrJgA8AliD4C5IAApYAKh3FKlMunKHm8H/2//77vkdqB2xfsXaHiDKBGtFKqONF3/////Z9VXClT5ND+syHkjBq//zNGQLBITJIAA8AmQEiDI4AAjSAGa1Vffm3ff/1/0//11tvZpAaIw3dBiIrjJgHQrGVWmdBU1f/////oDqEKrV1OpBUTjQtv/zNGQHAsjDKAAwAl4D0Co8AAmCBHIQNtld6fm0+/VigZzuMnGZlkAMLMJFv/////33UIWeFQkKsaceBsangecHzYXKI//////zNGQUA4QjKAA3CAID8CpEABMCBPfuStx4FQVHYMgKcO6jIJh//////9uIlspQkGQ2YyZscAV83Bv/////ncL6BEiWHyA2K//zNEQbAogfJgAx5hAEwDJcCAsEBtICgF3/////WJaIuuqMCCVGucgkrtwiwBO//////pW4YFRWQhaRRhZZnVwGhf////+ocv/zNEQmApgVJAANjwAFkC5YCApeAolD4kQb+EQJYNKwLWGmc6sqMBwJvf////6tDEOWDgFJk1VywKMGoM2f////+N1JmgJuPv/zNGQuA4AbJAAl5hIDwC48AAIGBEho7wTL5b6kSO7IUAA5uDABYNNjGDBSJEN//////xtQsszVy27IcWBbQkLgzv7YmZYW///zNGQ2AqzFNAgcA1+D8CZIAAhMAP/3/rozCAsBjIqCY/DBWMfQZp1f/////0F6phXSNisgAJjo6icT2vpvM/Vf9v///97eu//z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", He = "data:audio/mpeg;base64,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//BP/+hwIa///Nf///wqXf/1IwFkb//wi3/1Pf/7FEQGAABjEVkFKKAADSOrIKOcAAKAUWQYooAAUpGswwRwAF//QA7//6iH/7//E1CP66uDpoqjowL/6/GGwzFQx/T3Vp/9XC73/yvuUKYdmmN6evmjf5L5ZKr/8hlL/f/7FGQCgAB5FF2GBKAADYOrUMEIAAGod2YcVoAANI6rg4pQAEZrqH8GxT/UqjT/+aDlf/6dvj/r/4+rR//UH//+wTMuo///86//9QGR//+wCCxv//+MCD//BP//oAIP///7FGQFAABgEdsNFKAAC2I68KOcAAMggWoYVQAAP46tAwQgAMzq//QwCv//4WM/+a0//YWHBbCL/5Hi/IAIkheLBSvsvr6F98kyv/4Zg7A3/0+pcfN//8bL5ar/+8wV/v/7FGQCgACDFF0GFKAADkQLYMCIAAGod2occoAANg7rw4pQAKbXi7oTBez1IPl9X/4G2b//1b7/r6/a/Gy//6HAX//+gDAv///nHf/xoBf//hF////ILP0V//lQuP//qP/7FGQDj/BVHVmBQC2QC6O6wDQHsgGEd2gUI4AAMA7sAopQAE8l+F//2DK3//y4f+Bj5j/+oX//8FpP///x0n//GAf//8Kf///xIcrp/ZHCA4SBM2nH8U7C55TDl+3X6P/7FGQKAADZI1uGFOAAEoRrMMKUAAGQd24cUQAANQ7sQ44gAHOZwyYabiX/9COkKb/T6rj9/09fUt+LGTgn/8YALf/+g43///kFf/zgX///UK////hxPTX/+4Sz//+sR//7FGQEA7BbHdmBoC2QDSEL3gADCQGgAXyUIQAAMw7rwpRwAK/hAeAAAAdAAAAAHQz///6wB/xxxyrjsayv6H/+r/+aBD//+Nm///8QulX+1VhmOIUu/+2UD0jR2CVfp//7FGQIgADVI1uGCOACD+RrYMCIAAGcd2ocE4AAMw7sQ4RQAGP+f8eIEjMMke//iRoP//tvp+v/Unyv4pqf/5n//84CQx///0FRv/+K///C3///6gKLdKr//EJ//9QHx//7FGQED/BSHdkBQBWQC4PKwCgHsgFYR2wUI4AANA7sAopQAD5hv/6Br//+SDvyge2n/+gP//8ISf/w9t//oDv//8K///8ggL6a+nTBTVf043E0UOgZIIdw1v/9FHfE3//7FGQLAADO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";
class Vt {
  constructor() {
    this._bellContext = null, this._isMuteBell = !1, this._calleeBellFilePath = He, this._callRole = G.UNKNOWN, this._callStatus = g.IDLE, this._handleAudioInterruptionBegin = async () => {
      await this.stop();
    }, this._handleAudioInterruptionEnd = async () => {
      this._callStatus !== g.CALLING ? await this.stop() : await this.play();
    }, this._bellContext = wx.createInnerAudioContext(), this._addListenBellContextEvent(), this._bellContext.loop = !0;
  }
  setBellSrc() {
    const e = wx.getFileSystemManager();
    try {
      let t = Qt;
      this._callRole === G.CALLEE && (t = this._calleeBellFilePath || He), e.readFileSync(t, "utf8", 0), this._bellContext.src = t;
    } catch (t) {
      console.warn(`${a.PREFIX}Failed to setBellSrc, ${t}`);
    }
  }
  setBellProperties(e) {
    this._callRole = e.callRole || this._callRole, this._callStatus = e.callStatus || this._callStatus, this._calleeBellFilePath = e.calleeBellFilePath || this._calleeBellFilePath, this._isMuteBell = Se(e.isMuteBell) ? this._isMuteBell : e.isMuteBell;
  }
  async play() {
    try {
      if (this._callStatus !== g.CALLING)
        return;
      this.setBellSrc(), this._callRole === G.CALLEE && !this._isMuteBell && await this._bellContext.play(), this._callRole === G.CALLER && await this._bellContext.play();
    } catch (e) {
      console.warn(`${a.PREFIX}Failed to play audio file, ${e}`);
    }
  }
  async stop() {
    try {
      this._bellContext.stop();
    } catch (e) {
      console.warn(`${a.PREFIX}Failed to stop audio file, ${e}`);
    }
  }
  async setBellMute(e) {
    this._callStatus !== g.CALLING && this._callRole !== G.CALLEE || (e ? await this.stop() : await this.play());
  }
  destroy() {
    try {
      this._isMuteBell = !1, this._calleeBellFilePath = "", this._callRole = G.UNKNOWN, this._callStatus = g.IDLE, this == null || this._removeListenBellContextEvent(), this._bellContext.destroy(), this._bellContext = null;
    } catch (e) {
      console.warn(`${a.PREFIX}Failed to destroy, ${e}`);
    }
  }
  _addListenBellContextEvent() {
    wx.onAudioInterruptionBegin(this._handleAudioInterruptionBegin), wx.onAudioInterruptionEnd(this._handleAudioInterruptionEnd);
  }
  _removeListenBellContextEvent() {
    wx.offAudioInterruptionBegin(this._handleAudioInterruptionBegin), wx.offAudioInterruptionEnd(this._handleAudioInterruptionEnd);
  }
}
function N() {
  return function(s, e, t) {
    const i = t.value, n = /* @__PURE__ */ new Set();
    return t.value = async function(...o) {
      var A, I;
      if (n.has(this)) {
        console.warn(`${a.PREFIX}previous ${e}() is ongoing, please avoid repeated calls`), (I = (A = this == null ? void 0 : this.getTUICallEngineInstance()) == null ? void 0 : A.reportLog) == null || I.call(A, {
          name: "TUICallKit.avoidRepeatedCall.fail",
          data: { name: e },
          error: `previous ${e}() is ongoing`
        });
        return;
      }
      try {
        n.add(this);
        const l = await i.apply(this, o);
        return n.delete(this), l;
      } catch (l) {
        throw n.delete(this), l;
      }
    }, t.value.clearCallState = function(o) {
      n.delete(o);
    }, t;
  };
}
const ae = a.PREFIX + "API";
function y(s) {
  return function(e, t, i) {
    let n = i.value;
    return i.value = function(...o) {
      return Kt.call(this, s, o, t), n.apply(this, o);
    }, i;
  };
}
function Kt(s, e, t) {
  try {
    if (e[0].SDKAppID || (s = Pt(s, "SDKAppID", "sdkAppID")), st(s))
      for (let i = 0; i < s.length; i++)
        xe.call(this, {
          ...s[i],
          value: e[i],
          name: t
        });
    else
      for (const i in s)
        s.hasOwnProperty(i) && xe.call(this, {
          ...s[i],
          value: e[0][i],
          name: t,
          key: i
        });
  } catch (i) {
    throw console.error(i), i;
  }
}
function xe({ required: s, rules: e, range: t, value: i, allowEmpty: n, name: o, key: A }) {
  if (Se(i)) {
    if (s)
      throw new Error(`${ae}<${o}>: ${A} is required.`);
    return;
  }
  const I = e.some((E) => E === mt(i));
  let l = "";
  if (!I) {
    for (let E = 0; E < e.length; E++) {
      let u = e[E];
      u = u.replace(u[0], u[0].toUpperCase()), l += `${u}/`;
    }
    throw l = l.substring(0, l.length - 1), new Error(`${ae}<${o}>: ${A} must be ${l}, current ${A} is ${typeof i}.`);
  }
  if (n === !1 && de(i) && i.trim() === "")
    throw new Error(`${ae}<${o}>: ${A} is blank.`);
  if (st(t) && t && t.indexOf(i) === -1)
    throw new Error(`${ae}<${o}>: ${A} error, only be ${t}, current ${A} is ${i}.`);
  if (de(t) && t.indexOf("~") !== -1) {
    const E = t.split("~");
    if (i < +E[0] || i > +E[1] || rt(i) && Number.isNaN(i))
      throw new Error(`${ae}<${o}>: ${A} error, only be ${t}, current ${A} is ${i}.`);
  }
}
const m = {
  init: {
    SDKAppID: {
      required: !0,
      rules: [a.NUMBER],
      allowEmpty: !1
    },
    userID: {
      required: !0,
      rules: [a.STRING],
      allowEmpty: !1
    },
    userSig: {
      required: !0,
      rules: [a.STRING],
      allowEmpty: !1
    },
    tim: {
      required: !1,
      rules: [a.OBJECT]
    }
  },
  call: {
    userID: {
      required: !0,
      rules: [a.STRING],
      allowEmpty: !1
    },
    type: {
      required: !0,
      rules: [a.NUMBER],
      range: [1, 2],
      allowEmpty: !1
    },
    roomID: {
      required: !1,
      rules: [a.NUMBER],
      // 仅支持数字房间号, 后续会支持字符串房间号
      range: `0~${Ke}`,
      allowEmpty: !1
    },
    strRoomID: {
      required: !1,
      rules: [a.STRING],
      allowEmpty: !0
    },
    userData: {
      required: !1,
      rules: [a.STRING],
      allowEmpty: !1
    },
    timeout: {
      required: !1,
      rules: [a.NUMBER],
      allowEmpty: !1
    }
  },
  groupCall: {
    userIDList: {
      required: !0,
      rules: [a.ARRAY],
      allowEmpty: !1
    },
    type: {
      required: !0,
      rules: [a.NUMBER],
      range: [1, 2],
      allowEmpty: !1
    },
    groupID: {
      required: !0,
      rules: [a.STRING],
      allowEmpty: !1
    },
    roomID: {
      required: !1,
      rules: [a.NUMBER],
      // 仅支持数字房间号, 后续会支持字符串房间号
      range: `0~${Ke}`,
      allowEmpty: !1
    },
    strRoomID: {
      required: !1,
      rules: [a.STRING],
      allowEmpty: !0
    },
    timeout: {
      required: !1,
      rules: [a.NUMBER],
      allowEmpty: !1
    },
    userData: {
      required: !1,
      rules: [a.STRING],
      allowEmpty: !1
    },
    offlinePushInfo: {
      required: !1,
      rules: [a.OBJECT],
      allowEmpty: !1
    }
  },
  joinInGroupCall: {
    type: {
      required: !0,
      rules: [a.NUMBER],
      range: [1, 2],
      allowEmpty: !1
    },
    groupID: {
      required: !0,
      rules: [a.STRING],
      allowEmpty: !1
    },
    roomID: {
      required: !0,
      rules: [a.NUMBER],
      allowEmpty: !1
    },
    strRoomID: {
      required: !1,
      rules: [a.STRING],
      allowEmpty: !0
    }
  },
  inviteUser: {
    userIDList: {
      required: !0,
      rules: [a.ARRAY],
      allowEmpty: !1
    }
  },
  setSelfInfo: {
    nickName: {
      required: !1,
      rules: [a.STRING],
      allowEmpty: !1
    },
    avatar: {
      required: !1,
      rules: [a.STRING],
      allowEmpty: !1
    }
  },
  enableFloatWindow: [
    {
      key: "enable",
      required: !1,
      rules: [a.BOOLEAN],
      allowEmpty: !1
    }
  ],
  enableAIVoice: [
    {
      key: "enable",
      required: !0,
      rules: [a.BOOLEAN],
      allowEmpty: !1
    }
  ],
  enableMuteMode: [
    {
      key: "enable",
      required: !0,
      rules: [a.BOOLEAN],
      allowEmpty: !1
    }
  ],
  setCallingBell: [
    {
      key: "filePath",
      required: !1,
      rules: [a.STRING],
      allowEmpty: !0
    }
  ],
  setLanguage: [
    {
      key: "language",
      required: !0,
      rules: [a.STRING],
      allowEmpty: !1
    }
  ],
  setVideoDisplayMode: [
    {
      key: "displayMode",
      required: !0,
      rules: [a.STRING],
      range: [le.CONTAIN, le.COVER, le.FILL],
      allowEmpty: !1
    }
  ],
  setVideoResolution: [
    {
      key: "resolution",
      required: !0,
      rules: [a.STRING],
      range: [ce.RESOLUTION_1080P, ce.RESOLUTION_480P, ce.RESOLUTION_720P],
      allowEmpty: !1
    }
  ]
};
function Z(s) {
  return function(e, t, i) {
    let n = i.value;
    return i.value = function(...o) {
      return bt.call(this, s, o, t), n.apply(this, o);
    }, i;
  };
}
function bt(s) {
  if (s != null && s.engineInstance && !this._tuiCallEngine) {
    const e = `${a.PREFIX} ${j("TUICallKit init is not complete")}`;
    throw console.error(e), e;
  }
}
function _e(s) {
  if (typeof s != "object" || s === null)
    return s;
  let e = Array.isArray(s) ? [] : {};
  for (let t in s)
    s.hasOwnProperty(t) && (e[t] = _e(s[t]));
  return e;
}
class kt {
  constructor() {
    this.defaultStore = {
      callStatus: g.IDLE,
      callRole: G.UNKNOWN,
      callMediaType: _.UNKNOWN,
      localUserInfo: { userId: "" },
      localUserInfoExcludeVolume: { userId: "" },
      remoteUserInfoList: [],
      remoteUserInfoExcludeVolumeList: [],
      callerUserInfo: { userId: "" },
      isGroup: !1,
      callDuration: "00:00:00",
      // 通话时长
      callTips: "",
      // 通话提示的信息. 例如: '等待谁接听', 'xxx 拒绝通话', 'xxx 挂断通话'
      toastInfo: { text: "" },
      // 远端用户挂断、拒绝、超时、忙线等的 toast 提示信息
      isMinimized: !1,
      // 用来记录当前是否悬浮窗模式
      enableFloatWindow: !1,
      // 开启/关闭悬浮窗功能,设置为false,通话界面左上角的悬浮窗按钮会隐藏
      bigScreenUserId: "",
      // 当前大屏幕显示的 userID 用户
      language: yt(),
      // en, zh-cn
      isClickable: !1,
      // 是否可点击, 用于按钮增加 loading 效果,不可点击
      deviceList: { cameraList: [], microphoneList: [], currentCamera: {}, currentMicrophone: {} },
      showPermissionTip: !1,
      netWorkQualityList: [],
      // 显示网络状态差的提示
      isMuteSpeaker: !1,
      callID: "",
      // callEngine 3.1 support
      groupID: "",
      roomID: 0,
      roomIdType: 0,
      cameraPosition: b.FRONT,
      // 前置或后置,值为front, back
      groupCallMembers: [],
      // chat 群会话在的通话中的成员
      // TUICallKit 组件上的属性
      displayMode: le.COVER,
      // 设置预览远端的画面显示模式
      videoResolution: ce.RESOLUTION_720P,
      showSelectUser: !1,
      // 小程序相关属性
      pusher: {},
      player: [],
      isEarPhone: !1,
      // 是否是听筒, 默认: false
      pusherId: a.INITIAL_PUSHER,
      // 重新渲染 live-Pusher 的标识位
      // 是否开启虚拟背景, 目前仅 web 支持
      isShowEnableVirtualBackground: !1,
      // 是否显示虚拟背景图标, 默认: false
      enableVirtualBackground: !1,
      // 是否开启虚拟背景, 默认: false
      // customUIConfig
      customUIConfig: {
        button: {},
        viewBackground: {},
        layoutMode: je.RemoteInLargeView
      },
      // translate function
      translate: j,
      isForceUseV2API: !1
    }, this.store = _e(this.defaultStore), this.prevStore = _e(this.defaultStore);
  }
  update(e, t) {
    switch (e) {
      case a.CALL_TIPS:
        const i = this.getData(e);
        this.prevStore[e] = i;
      default:
        this.store[e] = t;
    }
  }
  getPrevData(e) {
    return e ? this.prevStore[e] : this.prevStore;
  }
  getData(e) {
    return e ? this.store[e] : this.store;
  }
  // reset call store
  reset(e = []) {
    e.length === 0 && (e = Object.keys(this.store));
    const t = e.reduce((i, n) => ({ ...i, [n]: this.defaultStore[n] }), {});
    this.store = {
      ...this.defaultStore,
      ...this.store,
      ...t
    };
  }
}
let De = class re {
  constructor() {
    this.timerId = -1, this.storeMap = {
      [r.CALL]: new kt()
    }, this.task = {};
  }
  /**
   * 获取 TUIStore 实例
   * @returns {TUIStore}
  */
  static getInstance() {
    return re.instance || (re.instance = new re()), re.instance;
  }
  /**
   * UI 组件注册监听回调
   * @param {StoreName} storeName store 名称
   * @param {IOptions} options 监听信息
   * @param {Object} params 扩展参数
   * @param {String} params.notifyRangeWhenWatch 注册时监听时的通知范围, 'all' - 通知所有注册该 key 的监听; 'myself' - 通知本次注册该 key 的监听; 默认不通知
  */
  watch(e, t, i) {
    this.task[e] || (this.task[e] = {});
    const n = this.task[e];
    Object.keys(t).forEach((o) => {
      const A = t[o];
      n[o] || (n[o] = /* @__PURE__ */ new Map()), n[o].set(A, 1);
      const { notifyRangeWhenWatch: I } = i || {};
      if (I === a.ALL && this.notify(e, o), I === a.MYSELF) {
        const l = this.getData(e, o);
        A.call(this, l);
      }
    });
  }
  /**
   * UI 取消组件监听回调
   * @param {StoreName} storeName store 名称
   * @param {IOptions} options 监听信息,包含需要取消的回掉等
   */
  unwatch(e, t) {
    if (!this.task[e])
      return;
    const i = this.task[e];
    Object.keys(t).forEach((n) => {
      i[n].delete(t[n]);
    });
  }
  /**
   * 通用 store 数据更新,messageList 的变更需要单独处理
   * @param {StoreName} storeName store 名称
   * @param {string} key 变更的 key
   * @param {unknown} data 变更的数据
  */
  update(e, t, i) {
    var n;
    (de(i) || rt(i) || Gt(i)) && this.storeMap[e].store[t] === i || ((n = this.storeMap[e]) == null || n.update(t, i), this.notify(e, t));
  }
  /**
   * 获取 Store 的上一个状态值
   * @param {StoreName} storeName store 名称
   * @param {string} key 待获取的 key
   * @returns {Any}
  */
  getPrevData(e, t) {
    var i;
    return (i = this.storeMap[e]) == null ? void 0 : i.getPrevData(t);
  }
  /**
   * 获取 Store 数据
   * @param {StoreName} storeName store 名称
   * @param {string} key 待获取的 key
   * @returns {Any}
  */
  getData(e, t) {
    var i;
    return (i = this.storeMap[e]) == null ? void 0 : i.getData(t);
  }
  /**
   * UI 组件注册监听回调
   * @param {StoreName} storeName store 名称
   * @param {string} key 变更的 key
  */
  notify(e, t) {
    if (!this.task[e])
      return;
    const i = this.task[e];
    if (i[t]) {
      const n = i[t], o = this.getData(e, t);
      for (const [A] of n.entries())
        A.call(this, o);
    }
  }
  reset(e, t = [], i = !1) {
    if (e in this.storeMap) {
      const n = this.storeMap[e];
      t.length === 0 && (t = Object.keys(n == null ? void 0 : n.store)), n.reset(t), i && t.forEach((o) => {
        this.notify(e, o);
      });
    }
  }
  // 批量修改多个 key-value
  updateStore(e, t) {
    const i = t || r.CALL;
    Object.keys(e).forEach((n) => {
      this.update(i, n, e[n]);
    });
  }
};
const O = De.getInstance();
function pe(s, e) {
  const t = {
    userId: s,
    nick: "",
    avatar: "",
    remark: "",
    displayUserInfo: "",
    isAudioAvailable: !1,
    isVideoAvailable: !1,
    isEnter: !1,
    domId: e || s
  };
  return e ? t : { ...t, isEnter: !1 };
}
async function Yt(s, e) {
  var i, n, o, A, I;
  let t = pe(s, a.LOCAL_VIDEO);
  try {
    if (!e)
      return t;
    const l = await e.getMyProfile(), E = O == null ? void 0 : O.getData(r.CALL, a.LOCAL_USER_INFO);
    return (l == null ? void 0 : l.code) === 0 && (t = {
      ...t,
      ...E,
      userId: (i = l == null ? void 0 : l.data) == null ? void 0 : i.userID,
      nick: (n = l == null ? void 0 : l.data) == null ? void 0 : n.nick,
      avatar: (o = l == null ? void 0 : l.data) == null ? void 0 : o.avatar,
      displayUserInfo: ((A = l == null ? void 0 : l.data) == null ? void 0 : A.nick) || ((I = l == null ? void 0 : l.data) == null ? void 0 : I.userID)
    }), t;
  } catch (l) {
    return console.error(`${a.PREFIX}getMyProfile failed, error: ${l}.`), t;
  }
}
async function q(s, e) {
  let t = s.map((i) => pe(i));
  try {
    if (!e)
      return t;
    const i = await e.getFriendProfile({ userIDList: s });
    if (i.code === 0) {
      const { friendList: n = [], failureUserIDList: o = [] } = i.data;
      let A = o.map((u) => u.userID);
      if (o.length > 0) {
        const u = await e.getUserProfile({ userIDList: o.map((h) => h.userID) });
        (u == null ? void 0 : u.code) === 0 && (A = (u == null ? void 0 : u.data) || []);
      }
      const I = O == null ? void 0 : O.getData(r.CALL, a.REMOTE_USER_INFO_LIST), l = n.map((u) => u.userID), E = A.map((u) => u.userID);
      t = s.map((u) => {
        var $, ee, te, H, Me, ye, me;
        const h = pe(u), d = l.indexOf(u), S = E.indexOf(u);
        let U = "", T = "", P = "", B = "";
        d !== -1 && (U = (($ = n[d]) == null ? void 0 : $.remark) || "", T = ((te = (ee = n[d]) == null ? void 0 : ee.profile) == null ? void 0 : te.nick) || "", P = U || T || h.userId || "", B = ((Me = (H = n[d]) == null ? void 0 : H.profile) == null ? void 0 : Me.avatar) || ""), S !== -1 && (T = ((ye = A[S]) == null ? void 0 : ye.nick) || "", P = T || h.userId || "", B = ((me = A[S]) == null ? void 0 : me.avatar) || "");
        const Ie = I.find((ct) => ct.userId === u) || {};
        return { ...h, ...Ie, remark: U, nick: T, displayUserInfo: P, avatar: B };
      });
    }
    return t;
  } catch (i) {
    return console.error(`${a.PREFIX}getRemoteUserProfile failed, error: ${i}.`), t;
  }
}
function Ee() {
  const s = O.getData(r.CALL, a.CALL_STATUS);
  if (s === g.IDLE)
    return M.IDLE;
  const e = O.getData(r.CALL, a.IS_GROUP);
  if (s === g.CALLING)
    return e ? M.DIALING_GROUP : M.DIALING_C2C;
  const t = O.getData(r.CALL, a.CALL_MEDIA_TYPE);
  return e ? t === _.AUDIO ? M.CALLING_GROUP_AUDIO : M.CALLING_GROUP_VIDEO : t === _.AUDIO ? M.CALLING_C2C_AUDIO : M.CALLING_C2C_VIDEO;
}
async function Ht(s, e, t, i) {
  let n = [];
  try {
    const o = await e.getGroupMemberList({ groupID: s, count: t, offset: i });
    if (o.code === 0)
      return o.data.memberList || n;
  } catch (o) {
    return console.error(`${a.PREFIX}getGroupMember failed, error: ${o}.`), n;
  }
}
async function xt(s, e) {
  let t = {};
  try {
    return (await e.getGroupProfile({ groupID: s })).data.group || t;
  } catch (i) {
    return console.warn(`${a.PREFIX}getGroupProfile failed, error: ${i}.`), t;
  }
}
function At(s, e) {
  s === 0 && e ? (O.update(r.CALL, a.ROOM_ID, e), O.update(r.CALL, a.ROOM_ID_TYPE, Te.STRING_ROOM_ID)) : (O.update(r.CALL, a.ROOM_ID, s), O.update(r.CALL, a.ROOM_ID_TYPE, Te.NUMBER_ROOM_ID));
}
function F(s) {
  return s || {};
}
function Oe(s) {
  if (s.length === 0)
    return;
  let e = O.getData(r.CALL, a.REMOTE_USER_INFO_LIST);
  s.forEach((t) => {
    e = e.filter((i) => i.userId !== t);
  }), O.update(r.CALL, a.REMOTE_USER_INFO_LIST, e), O.update(r.CALL, a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, e);
}
function Be(s, e, t) {
  let i = "";
  Mt(s) && (e === _.AUDIO && (i = p.NO_MICROPHONE_DEVICE_PERMISSION), e === _.VIDEO && (i = p.NO_CAMERA_DEVICE_PERMISSION), i && O.update(r.CALL, a.TOAST_INFO, { content: i, type: a.ERROR }), console.error(`${a.PREFIX}call failed, error: ${s.message}.`));
}
function Q(s, e) {
  let t = O.getData(r.CALL, a.LOCAL_USER_INFO);
  e === a.AUDIO && (t = { ...t, isAudioAvailable: s }), e === a.VIDEO && (t = { ...t, isVideoAvailable: s }), O.update(r.CALL, a.LOCAL_USER_INFO, t), O.update(r.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, t);
}
class fe {
  static generateTaskID() {
    return this.currentTaskID++;
  }
  /**
   *
   * @param {string} taskName 'interval' 'timeout'
   * @param {function} callback
   * @param {object} options include:
   * @param {number} options.delay millisecond
   * @param {number} options.count 定时器回调执行次数,0 无限次 or n次
   * @param {boolean} options.backgroundTask 在页面静默后是否继续执行定时器
   */
  static run(e = a.TIMEOUT, t, i) {
    e === a.INTERVAL ? i = { delay: 2e3, count: 0, backgroundTask: !0, ...i } : i = { delay: 2e3, count: 0, backgroundTask: !0, ...i }, Fe(t) && (i = { ...i, ...t }), he(e) && (t = e, e = a.TIMEOUT);
    const n = {
      taskID: this.generateTaskID(),
      loopCount: 0,
      intervalID: null,
      timeoutID: null,
      taskName: e,
      callback: t,
      ...i
    };
    return this.taskMap.set(n.taskID, n), e === a.INTERNAL ? this.interval(n) : this.timeout(n), n.taskID;
  }
  /**
   * 定时循环执行回调函数
   * 可以指定循环的时间间隔
   * 可以指定循环次数
   * @param {object} taskItem
   * @param {function} callback
   * @param {*} delay
   * @param {*} count
   * @returns ID
   */
  static interval(e) {
    const t = () => {
      e.callback(), e.loopCount += 1, this.isBreakLoop(e);
    };
    return e.intervalID = setInterval(t, e.delay);
  }
  /**
   * 延迟执行回调
   * count = 0,循环
   * count = n, 执行n次
   * @param {object} taskItem
   *
   */
  static timeout(e) {
    const t = () => {
      if (e.callback(), e.loopCount += 1, !this.isBreakLoop(e))
        return e.timeoutID = setTimeout(t, e.delay);
    };
    return e.timeoutID = setTimeout(t, e.delay);
  }
  static hasTask(e) {
    return this.taskMap.has(e);
  }
  static clearTask(e) {
    if (!this.taskMap.has(e))
      return !0;
    const { intervalID: t, timeoutID: i, onVisibilitychange: n } = this.taskMap.get(e);
    return t && clearInterval(t), i && clearTimeout(i), n && document.removeEventListener("visibilitychange", n), this.taskMap.delete(e), !0;
  }
  /**
   * 1. 如果已移除出定时队列,退出当前任务
   * 2. 如果当前任务已满足次数限制,则退出当前任务
   * @param {object} taskItem
   * @returns
   */
  static isBreakLoop(e) {
    return this.taskMap.has(e.taskID) ? e.count !== 0 && e.loopCount >= e.count ? (this.clearTask(e.taskID), !0) : !1 : !0;
  }
}
fe.taskMap = /* @__PURE__ */ new Map();
fe.currentTaskID = 1;
const Jt = function(s) {
  if (s === null || typeof s > "u")
    return !0;
  if (typeof s == "boolean")
    return !1;
  if (typeof s == "number")
    return s === 0;
  if (typeof s == "string" || typeof s == "function" || Array.isArray(s))
    return s.length === 0;
  if (s instanceof Error)
    return s.message === "";
  if (Fe(s)) {
    for (const e in s)
      if (Object.prototype.hasOwnProperty.call(s, e))
        return !1;
    return !0;
  }
  return !1;
}, Re = "_local_user_id";
class k {
  constructor() {
    this._viewConfig = {
      viewBackground: {
        local: {},
        remote: {}
      }
    }, this._isSetViewBackgroundConfig = { remote: !1, local: !1 }, this._tuiCallEngine = null, this._tuiStore = null;
  }
  static getInstance() {
    return k.instance || (k.instance = new k()), k.instance;
  }
  _updateViewBackground() {
    var i, n, o;
    const e = (i = this._tuiStore) == null ? void 0 : i.getData(r.CALL, a.CUSTOM_UI_CONFIG), { userId: t } = (n = this._tuiStore) == null ? void 0 : n.getData(r.CALL, a.LOCAL_USER_INFO);
    Object.keys(this._viewConfig.viewBackground.remote).includes(t) && delete this._viewConfig.viewBackground.remote[t], (o = this._tuiStore) == null || o.update(
      r.CALL,
      a.CUSTOM_UI_CONFIG,
      {
        ...e,
        viewBackground: {
          ...this._viewConfig.viewBackground.remote,
          ...this._viewConfig.viewBackground.local
        }
      }
    );
  }
  setEngineInstance(e) {
    this._tuiCallEngine = e;
  }
  setTUIStore(e) {
    this._tuiStore = e;
  }
  updateViewBackgroundUserId(e) {
    var t, i;
    if (e === "local") {
      const { userId: n } = (t = this._tuiStore) == null ? void 0 : t.getData(r.CALL, a.LOCAL_USER_INFO);
      if (Object.keys(this._viewConfig.viewBackground.remote).includes(n) && (delete this._viewConfig.viewBackground.remote[n], this._updateViewBackground()), !this._isSetViewBackgroundConfig.local)
        return;
      const o = this._viewConfig.viewBackground.local, A = o[n] || o[Re];
      o[n] = o[Re], this._viewConfig.viewBackground.local = { [n]: A }, this._updateViewBackground();
    } else {
      let n = this._viewConfig.viewBackground.remote;
      this._isSetViewBackgroundConfig.remote && Object.keys(n).includes("*") && (((i = this._tuiStore) == null ? void 0 : i.getData(r.CALL, a.REMOTE_USER_INFO_LIST)).map((I) => I.userId).forEach((I) => {
        Object.keys(n).includes(I) || (n[I] = n["*"]);
      }), this._viewConfig.viewBackground.remote = n, this._updateViewBackground());
    }
  }
  hideFeatureButton(e) {
    var i, n, o, A, I;
    (n = (i = this._tuiCallEngine) == null ? void 0 : i.reportLog) == null || n.call(i, {
      name: "TUICallKit.hideFeatureButton.start",
      data: { buttonName: e }
    });
    const t = (o = this._tuiStore) == null ? void 0 : o.getData(r.CALL, a.CUSTOM_UI_CONFIG);
    (I = this._tuiStore) == null || I.update(
      r.CALL,
      a.CUSTOM_UI_CONFIG,
      {
        ...t,
        button: {
          ...t.button,
          [e]: { ...((A = t.button) == null ? void 0 : A[e]) || {}, show: !1 }
        }
      }
    );
  }
  setLocalViewBackgroundImage(e) {
    var i, n, o;
    (n = (i = this._tuiCallEngine) == null ? void 0 : i.reportLog) == null || n.call(i, {
      name: "TUICallKit.setLocalViewBackgroundImage.start",
      data: { url: e }
    }), this._isSetViewBackgroundConfig.local = !0;
    let { userId: t } = (o = this._tuiStore) == null ? void 0 : o.getData(r.CALL, a.LOCAL_USER_INFO);
    Jt(t) && (t = Re), this._viewConfig.viewBackground.local = { [t]: e }, this._updateViewBackground();
  }
  setRemoteViewBackgroundImage(e, t) {
    var i, n;
    (n = (i = this._tuiCallEngine) == null ? void 0 : i.reportLog) == null || n.call(i, {
      name: "TUICallKit.setRemoteViewBackgroundImage.start",
      data: { userId: e, url: t }
    }), this._isSetViewBackgroundConfig.remote = !0, e === "*" && (this._viewConfig.viewBackground.remote = {}), this._viewConfig.viewBackground.remote[e] = t, this._updateViewBackground();
  }
  setLayoutMode(e) {
    var i, n;
    (n = (i = this._tuiCallEngine) == null ? void 0 : i.reportLog) == null || n.call(i, {
      name: "TUICallKit.setLayoutMode.start",
      data: { layoutMode: e }
    });
    const t = this._tuiStore.getData(r.CALL, a.CUSTOM_UI_CONFIG);
    this._tuiStore.update(
      r.CALL,
      a.CUSTOM_UI_CONFIG,
      {
        ...t,
        layoutMode: e
      }
    );
  }
  setCameraDefaultState(e) {
    var i, n;
    (n = (i = this._tuiCallEngine) == null ? void 0 : i.reportLog) == null || n.call(i, {
      name: "TUICallKit.setCameraDefaultState.start",
      data: { isOpen: e }
    });
    const t = _e(this._tuiStore.getData(r.CALL, a.CUSTOM_UI_CONFIG));
    Object.keys(t.button).includes(Y.Camera) || (t.button[Y.Camera] = {}), t.button[Y.Camera].state = e ? X.Open : X.Close, this._tuiStore.update(r.CALL, a.CUSTOM_UI_CONFIG, t);
  }
}
const ne = De.getInstance(), v = {
  audioCall: () => "Voice call",
  videoCall: () => "Video call",
  switchToAudio: () => "Switch audio call",
  switchToVideo: () => "Switch video call",
  hangup: ({ callDuration: s }) => `${j("Call duration")}:${s}`
};
class W {
  constructor(e) {
    var t, i, n;
    this._callService = e.callService, ie.registerEvent(R.TUILogin.EVENT.LOGIN_STATE_CHANGED, R.TUILogin.EVENT_SUB_KEY.USER_LOGIN_SUCCESS, this), (t = R.TUIChat) != null && t.EVENT && ie.registerEvent((i = R.TUIChat.EVENT) == null ? void 0 : i.CHAT_STATE_CHANGED, (n = R.TUIChat.EVENT_SUB_KEY) == null ? void 0 : n.CHAT_OPENED, this), ie.registerService(R.TUICalling.SERVICE.NAME, this), ie.registerExtension(R.TUIChat.EXTENSION.INPUT_MORE.EXT_ID, this);
  }
  static getInstance(e) {
    return W.instance || (W.instance = new W(e)), W.instance;
  }
  // ================ 【】 ================
  /**
   * message on screen
   * @param {Any} params Parameters for message up-screening
   */
  callTUIService(e) {
    const { message: t } = e || {};
    ie.callService({
      serviceName: R.TUIChat.SERVICE.NAME,
      method: R.TUIChat.SERVICE.METHOD.UPDATE_MESSAGE_LIST,
      params: { message: t }
    });
  }
  /**
   * tuicore getExtension
   * @param {String} extensionID extension id
   * @param {Any} params tuicore pass parameters
   * @returns {Any[]} return extension
   */
  onGetExtension(e, t) {
    var i, n;
    if (e === R.TUIChat.EXTENSION.INPUT_MORE.EXT_ID) {
      if ((n = (i = this._callService.getTUICallEngineInstance()) == null ? void 0 : i.reportLog) == null || n.call(i, { name: "TUICallKit.onGetExtension", data: { extensionID: e, params: t } }), Se(t))
        return [];
      if ([R.TUIChat.TYPE.ROOM, R.TUIChat.TYPE.CUSTOMER_SERVICE].includes(t.chatType))
        return [];
      let o = [];
      const A = {
        weight: 1e3,
        text: "语音通话",
        icon: ht,
        data: {
          name: "voiceCall"
        },
        listener: {
          onClicked: async (l) => await this._handleTUICoreOnClick(l, l.type || _.AUDIO)
        }
      }, I = {
        weight: 900,
        text: "视频通话",
        icon: gt,
        data: {
          name: "videoCall"
        },
        listener: {
          onClicked: async (l) => await this._handleTUICoreOnClick(l, l.type || _.VIDEO)
        }
      };
      return t != null && t.chatType ? o = [A, I] : (!(t != null && t.filterVoice) && o.push(A), !(t != null && t.filterVideo) && o.push(I)), o;
    }
  }
  async onCall(e, t) {
    e === R.TUICalling.SERVICE.METHOD.START_CALL && await this._handleTUICoreOnClick(t, t.type);
  }
  /**
   * tuicore notify event manager
   * @param {String} eventName event name
   * @param {String} subKey sub key
   * @param {Any} options tuicore event parameters
   */
  async onNotifyEvent(e, t, i) {
    var n, o, A, I, l, E, u, h;
    try {
      if (e === R.TUILogin.EVENT.LOGIN_STATE_CHANGED)
        if (t === R.TUILogin.EVENT_SUB_KEY.USER_LOGIN_SUCCESS) {
          const { chat: d, userID: S, userSig: U, SDKAppID: T } = It.getContext();
          await ((n = this._callService) == null ? void 0 : n.init({ tim: d, userID: S, userSig: U, sdkAppID: T, isFromChat: !0, component: we.TIM_CALL_KIT })), (o = this._callService) == null || o.setIsFromChat(!0), (A = this._callService) == null || A.setLogLevel(Ze.NORMAL), this._addListenChatEvent();
        } else
          t === R.TUILogin.EVENT_SUB_KEY.USER_LOGOUT_SUCCESS && (this._removeListenChatEvent(), await ((I = this._callService) == null ? void 0 : I.destroyed()));
      if ((l = R.TUIChat) != null && l.EVENT && e === R.TUIChat.EVENT.CHAT_STATE_CHANGED && t === R.TUIChat.EVENT_SUB_KEY.CHAT_OPENED) {
        if ((E = this._callService) == null || E.setCurrentGroupId((i == null ? void 0 : i.groupID) || ""), ne.getData(r.CALL, a.CALL_STATUS) !== g.IDLE)
          return;
        const d = (u = this._callService) == null ? void 0 : u.getCurrentGroupId(), S = d ? await this.getGroupAttributes((h = this._callService) == null ? void 0 : h.getTim(), d) : {};
        await this.updateStoreBasedOnGroupAttributes(S);
      }
    } catch (d) {
      console.error(`${a.PREFIX}TUICore onNotifyEvent failed, error: ${d}.`);
    }
  }
  // Handling the chat+call scenario, data required for the joinInGroupCall API: update store / clear relevant store data
  async updateStoreBasedOnGroupAttributes(e) {
    var t, i, n, o;
    (n = (i = (t = this._callService) == null ? void 0 : t.getTUICallEngineInstance()) == null ? void 0 : i.reportLog) == null || n.call(i, {
      name: "TUICallKit.getJoinGroupCallInfo.success",
      data: { groupAttributes: e }
    });
    try {
      const {
        call_id: A = "",
        // callEngine v3.1 support
        group_id: I = "",
        room_id: l = 0,
        room_id_type: E = 0,
        call_media_type: u = a.UNKNOWN,
        // @ts-ignore
        user_list: h
        // The default value of the user list returned by the background is null
      } = e[a.INNER_ATTR_KIT_INFO] ? JSON.parse(e[a.INNER_ATTR_KIT_INFO]) : {};
      let d = (h || []).map((U) => U.userid);
      d.length > 0 && (d = await q(d, (o = this._callService) == null ? void 0 : o.getTim()));
      const S = {
        [a.CALL_ID]: A,
        [a.GROUP_ID]: I,
        [a.GROUP_CALL_MEMBERS]: d,
        [a.ROOM_ID]: l,
        [a.CALL_MEDIA_TYPE]: Et[u],
        [a.ROOM_ID_TYPE]: E
      };
      ne.updateStore(S, r.CALL);
    } catch (A) {
      console.warn(`${a.PREFIX}updateStoreBasedOnGroupAttributes fail, error: ${A}`);
    }
  }
  // Get group attribute
  async getGroupAttributes(e, t) {
    if (!t)
      return {};
    try {
      const { data: i } = await e.getGroupAttributes({
        groupID: t,
        keyList: []
      });
      return (i == null ? void 0 : i.groupAttributes) || {};
    } catch (i) {
      return console.warn(`${a.PREFIX}getGroupAttributes fail: ${i}`), {};
    }
  }
  isLineBusy(e) {
    var n;
    const t = ue(e.payload.data), i = ue(t == null ? void 0 : t.data);
    return (i == null ? void 0 : i.line_busy) === "line_busy" || (i == null ? void 0 : i.line_busy) === "" || ((n = i == null ? void 0 : i.data) == null ? void 0 : n.message) === "lineBusy";
  }
  async getCallKitMessage(e, t) {
    var d, S, U, T;
    const i = ue(e.payload.data);
    if ((i == null ? void 0 : i.businessID) !== 1)
      return {};
    let n = "";
    const o = ue(i == null ? void 0 : i.data), A = o.call_type, I = i.inviteeList, l = (d = o == null ? void 0 : o.data) == null ? void 0 : d.inviter, E = ne.getData(r.CALL, a.LOCAL_USER_INFO).userId, u = l === E, h = (S = o == null ? void 0 : o.data) == null ? void 0 : S.cmd;
    switch (i == null ? void 0 : i.actionType) {
      case J.INVITE: {
        n = v[h]({ callDuration: ot(o == null ? void 0 : o.call_end) });
        break;
      }
      case J.CANCEL_INVITE:
        n = u ? "Call Cancel" : "Other Side Cancel";
        break;
      case J.ACCEPT_INVITE:
        ["switchToAudio", "switchToVideo"].includes(h) ? n = (U = v == null ? void 0 : v[h]) == null ? void 0 : U.call(v) : n = j("Answered");
        break;
      case J.REJECT_INVITE:
        this.isLineBusy(e) ? n = u ? "Line Busy" : "Other Side Line Busy" : n = u ? "Other Side Decline" : "Decline";
        break;
      case J.INVITE_TIMEOUT:
        ["switchToAudio", "switchToVideo"].includes(h) ? n = (T = v == null ? void 0 : v[h]) == null ? void 0 : T.call(v) : n = u ? "Other Side No Answer" : "No answer";
        break;
    }
    return { messageCardContent: n, callMediaType: A, inviteeList: I };
  }
  // =========================【chat: event listening】=========================
  _addListenChatEvent() {
    var e, t;
    if (!((e = this._callService) != null && e.getTim())) {
      console.warn(`${a.PREFIX}add tim event listener failed, tim is empty.`);
      return;
    }
    (t = this._callService) == null || t.getTim().on(ve.EVENT.GROUP_ATTRIBUTES_UPDATED, this._handleGroupAttributesUpdated, this);
  }
  _removeListenChatEvent() {
    var e, t;
    if (!((e = this._callService) != null && e.getTim())) {
      console.warn(`${a.PREFIX}remove tim event listener failed, tim is empty.`);
      return;
    }
    (t = this._callService) == null || t.getTim().off(ve.EVENT.GROUP_ATTRIBUTES_UPDATED, this._handleGroupAttributesUpdated, this);
  }
  /**
   * chat start audio/video call via click
   * @param {Any} options Parameters passed in when clicking on an audio/video call from chat
   * @param {CallMediaType} type call media type. 0 - audio; 1 - video.
   * 
   * priority: isForceUseV2API > version
   */
  async _handleTUICoreOnClick(e, t) {
    var i;
    try {
      const n = ne.getData(r.CALL, a.IS_FORCE_USE_V2_API), { groupID: o, userIDList: A = [], version: I = "", ...l } = e;
      if (n) {
        await this._useV2API({ ...e, type: t });
        return;
      }
      if (I === "v3") {
        await ((i = this._callService) == null ? void 0 : i.calls({ chatGroupID: o, userIDList: A, type: t, ...l }));
        return;
      }
      await this._useV2API({ ...e, type: t });
    } catch (n) {
      console.debug(n);
    }
  }
  async _useV2API(e) {
    var A, I;
    const { groupID: t, userIDList: i = [], type: n, ...o } = e || {};
    t ? await ((A = this._callService) == null ? void 0 : A.groupCall({ groupID: t, userIDList: i, type: n, ...o })) : i.length === 1 && await ((I = this._callService) == null ? void 0 : I.call({ userID: i[0], type: n, ...o }));
  }
  async _handleGroupAttributesUpdated(e) {
    var o;
    if (ne.getData(r.CALL, a.CALL_STATUS) !== g.IDLE)
      return;
    const t = (e == null ? void 0 : e.data) || {}, { groupID: i = "", groupAttributes: n = {} } = t;
    i === ((o = this._callService) == null ? void 0 : o.getCurrentGroupId()) && await this.updateStoreBasedOnGroupAttributes(n);
  }
}
function Wt(s) {
  return s = s || /* @__PURE__ */ new Map(), {
    all: s,
    on(e, t) {
      const i = s.get(e);
      i ? i.push(t) : s.set(e, [t]);
    },
    off(e, t) {
      const i = s.get(e);
      i && (t ? i.splice(i.indexOf(t) >>> 0, 1) : s.set(e, []));
    },
    emit(e, t) {
      let i = s.get(e);
      i && i.slice().map((n) => {
        n(t);
      }), i = s.get("*"), i && i.slice().map((n) => {
        n(e, t);
      });
    }
  };
}
const Je = {
  TRANSCRIPTION: "transcription"
}, Ce = {
  ON_RECV_CUSTOM_CMD_MESSAGE: "onRecvCustomCmdMsg",
  CUSTOM_MESSAGE_ASR_ID: 1,
  USER_SPEAK: 1e4
};
let zt = class {
  constructor() {
    this.translationInfoList = [], this.emitter = Wt(), this.trtcCloudInstance = null;
  }
  initASR(e) {
    const { trtcCloudInstance: t, getNickName: i } = e;
    this.getNickName = i, this.trtcCloudInstance = t, this.trtcCloudInstance.on(Ce.ON_RECV_CUSTOM_CMD_MESSAGE, this.handleCustomMessage, this);
  }
  on(e, t) {
    this.emitter.on(e, t);
  }
  emit(e, t) {
    this.emitter.emit(e, t);
  }
  off(e, t) {
    this.emitter.off(e, t);
  }
  destroyASR() {
    this.trtcCloudInstance.off(Ce.ON_RECV_CUSTOM_CMD_MESSAGE, this.handleCustomMessage, this), this.translationInfoList = [], this.trtcCloudInstance = null;
  }
  handleAIMessage(e) {
    if ((e == null ? void 0 : e.type) !== Ce.USER_SPEAK)
      return;
    const { sender: t = "", payload: i } = e, { text: n = "", translation_text: o = "", end: A, roundid: I, translation_language: l = "" } = i;
    if (!I)
      return;
    const E = this.translationInfoList.find((u) => u.roundId === I);
    if (E) {
      E.text = n || E.text, E.end = A;
      const u = (E.translation || []).find((h) => h.language === l);
      u ? u.content = o : l && E.translation.push({ language: l, content: o });
    } else {
      const h = {
        roundId: I,
        sender: t,
        text: n,
        end: A,
        translation: l ? [{ language: l, content: o }] : []
      };
      this.translationInfoList.push(h);
      for (let d = 0; d < this.translationInfoList.length; d++)
        this.translationInfoList[d].nick || this.getNickName(t).then((S) => {
          this.translationInfoList[d].nick = (S == null ? void 0 : S.nick) || "";
        });
    }
    if (this.emit(Je.TRANSCRIPTION, { subtitleInfoList: this.translationInfoList }), A) {
      const u = I;
      setTimeout(() => {
        var h;
        ((h = this == null ? void 0 : this.translationInfoList) == null ? void 0 : h.length) > 0 && (this.translationInfoList = this.translationInfoList.filter((d) => d.roundId === u), this.emit(Je.TRANSCRIPTION, { subtitleInfoList: this.translationInfoList }));
      }, 8e3);
    }
  }
  handleCustomMessage(e, t, i, n) {
    if (t === Ce.CUSTOM_MESSAGE_ASR_ID) {
      const o = new TextDecoder().decode(n), A = JSON.parse(o || "");
      this.handleAIMessage(A);
    }
  }
};
ut.version;
const We = new zt();
class z {
  constructor() {
    this._tuiCallEngine = null, this._imInstance = null;
  }
  static getInstance() {
    return z.instance || (z.instance = new z()), z.instance;
  }
  enableAISubtitle(e) {
    var n, o;
    (o = (n = this._tuiCallEngine) == null ? void 0 : n.reportLog) == null || o.call(n, {
      name: "TUICallKit.enableAISubtitle.start",
      data: { enable: e }
    });
    const t = this._tuiCallEngine.getTRTCCloudInstance(), i = async (A) => {
      const I = await q([A], this._imInstance);
      return I.length ? I[0] : [];
    };
    e ? We.initASR({
      trtcCloudInstance: t,
      // @ts-ignore
      getNickName: i
    }) : We.destroyASR();
  }
  setEngineInstance(e) {
    this._tuiCallEngine = e;
  }
  setImInstance(e) {
    this._imInstance = e;
  }
}
const Xt = 0, qt = 1, ze = 2;
function jt({ retryFunction: s, settings: e, onError: t, onRetrying: i, onRetryFailed: n, context: o }) {
  return function(...A) {
    const I = e.retries || 5;
    let l = 0, E = -1, u = Xt;
    const h = async (d, S) => {
      const U = o || this;
      try {
        const T = await s.apply(U, A);
        l = 0, d(T);
      } catch (T) {
        const P = () => {
          clearTimeout(E), l = 0, u = ze, S(T);
        }, B = () => {
          u !== ze && l < I ? (l++, u = qt, he(i) && i.call(U, l, P), E = setTimeout(
            () => {
              E = -1, h(d, S);
            },
            Se(e.timeout) ? 1e3 : e.timeout
          )) : (P(), he(n) && n.call(U, T));
        };
        he(t) ? t.call(U, T, B, S, A) : B();
      }
    };
    return new Promise(h);
  };
}
function Zt(s) {
  return function(e, t, i) {
    const { retries: n = 5, timeout: o = 2e3, onError: A, onRetrying: I, onRetryFailed: l } = s, E = jt({
      retryFunction: i.value,
      settings: { retries: n, timeout: o },
      onError: A,
      onRetrying: I,
      onRetryFailed: l,
      context: null
    });
    return i.value = function(...u) {
      return E.apply(this, u);
    }, i;
  };
}
var $t = Object.defineProperty, ei = Object.getOwnPropertyDescriptor, ti = (s, e, t, i) => {
  for (var n = i > 1 ? void 0 : i ? ei(e, t) : e, o = s.length - 1, A; o >= 0; o--)
    (A = s[o]) && (n = (i ? A(e, t, n) : A(n)) || n);
  return i && n && $t(e, t, n), n;
};
const L = De.getInstance(), ii = k.getInstance(), lt = class oe {
  constructor(e) {
    this._callService = e.callService;
  }
  static getInstance(e) {
    return oe.instance || (oe.instance = new oe(e)), oe.instance;
  }
  addListenTuiCallEngineEvent() {
    var t, i;
    const e = (t = this._callService) == null ? void 0 : t.getTUICallEngineInstance();
    if (!e) {
      console.warn(`${a.PREFIX}add engine event listener failed, engine is empty.`);
      return;
    }
    e.on(C.ERROR, this._handleError, this), e.on(C.ON_CALL_RECEIVED, this._handleNewInvitationReceived, this), (i = C) != null && i.ON_CALL_BEGIN && e.on(C.ON_CALL_BEGIN, this._handleOnCallBegin, this), e.on(C.USER_ENTER, this._handleUserEnter, this), e.on(C.USER_LEAVE, this._handleUserLeave, this), e.on(C.REJECT, this._handleInviteeReject, this), e.on(C.NO_RESP, this._handleNoResponse, this), e.on(C.LINE_BUSY, this._handleLineBusy, this), e.on(C.ON_CALL_NOT_CONNECTED, this._handleCallNotConnected, this), e.on(C.ON_USER_INVITING, this._handleOnUserInviting, this), e.on(C.SDK_READY, this._handleSDKReady, this), e.on(C.KICKED_OUT, this._handleKickedOut, this), e.on(C.MESSAGE_SENT_BY_ME, this._messageSentByMe, this), C.CALL_MESSAGE && e.on(C.CALL_MESSAGE, this._handleCallMessage, this), C.ON_USER_NETWORK_QUALITY_CHANGED && e.on(C.ON_USER_NETWORK_QUALITY_CHANGED, this._handleNetworkQuality, this), e.on(C.USER_VIDEO_AVAILABLE, this._handleUserVideoAvailable, this), e.on(C.USER_AUDIO_AVAILABLE, this._handleUserAudioAvailable, this), e.on(C.CALL_END, this._handleCallingEnd, this), e.on(C.CALL_MODE, this._handleCallTypeChange, this), e.on(C.USER_UPDATE, this._handleUserUpdate, this);
  }
  removeListenTuiCallEngineEvent() {
    var t, i;
    const e = (t = this._callService) == null ? void 0 : t.getTUICallEngineInstance();
    e.off(C.ERROR, this._handleError, this), e.off(C.ON_CALL_RECEIVED, this._handleNewInvitationReceived, this), (i = C) != null && i.ON_CALL_BEGIN && e.off(C.ON_CALL_BEGIN, this._handleOnCallBegin, this), e.off(C.USER_ENTER, this._handleUserEnter, this), e.off(C.USER_LEAVE, this._handleUserLeave, this), e.off(C.REJECT, this._handleInviteeReject, this), e.off(C.NO_RESP, this._handleNoResponse, this), e.off(C.LINE_BUSY, this._handleLineBusy, this), e.off(C.ON_CALL_NOT_CONNECTED, this._handleCallNotConnected, this), e.off(C.ON_USER_INVITING, this._handleOnUserInviting, this), e.off(C.SDK_READY, this._handleSDKReady, this), e.off(C.KICKED_OUT, this._handleKickedOut, this), e.off(C.MESSAGE_SENT_BY_ME, this._messageSentByMe, this), C.ON_USER_NETWORK_QUALITY_CHANGED && e.off(C.ON_USER_NETWORK_QUALITY_CHANGED, this._handleNetworkQuality, this), e.off(C.USER_VIDEO_AVAILABLE, this._handleUserVideoAvailable, this), e.off(C.USER_AUDIO_AVAILABLE, this._handleUserAudioAvailable, this), e.off(C.CALL_END, this._handleCallingEnd, this), e.off(C.CALL_MODE, this._handleCallTypeChange, this), e.off(C.USER_UPDATE, this._handleUserUpdate, this);
  }
  _callerChangeToConnected() {
    var i;
    const e = L.getData(r.CALL, a.CALL_ROLE);
    L.getData(r.CALL, a.CALL_STATUS) === g.CALLING && e === G.CALLER && (L.update(r.CALL, a.CALL_STATUS, g.CONNECTED), (i = this._callService) == null || i.startTimer());
  }
  _unNormalEventsManager(e, t) {
    var o, A;
    console.log(`${a.PREFIX}${t} event data: ${JSON.stringify(e)}.`);
    const i = L.getData(r.CALL, a.IS_GROUP), n = L.getData(r.CALL, a.REMOTE_USER_INFO_LIST);
    switch (t) {
      case C.REJECT:
      case C.LINE_BUSY: {
        const { userID: I } = F(e);
        let l = t === C.REJECT ? p.OTHER_SIDE_REJECT_CALL : p.OTHER_SIDE_LINE_BUSY, E = "";
        i && (E = (n.find((u) => u.userId === I) || {}).displayUserInfo || I, l = t === C.REJECT ? p.REJECT_CALL : p.IN_BUSY), L.update(r.CALL, a.TOAST_INFO, { content: { key: l, options: { userList: E } } }), I && Oe([I]), L.getData(r.CALL, a.REMOTE_USER_INFO_LIST).length === 0 && ((o = this._callService) == null || o._resetCallStore());
        break;
      }
      case C.NO_RESP: {
        const { userIDList: I = [] } = F(e), l = i ? p.TIMEOUT : p.CALL_TIMEOUT, E = I.map((u) => (n.find((d) => d.userId === u) || {}).displayUserInfo || u);
        L.update(r.CALL, a.TOAST_INFO, { content: { key: l, options: { userList: E.join() } } }), I.length > 0 && Oe(I);
        break;
      }
      case C.ON_CALL_NOT_CONNECTED: {
        (A = this._callService) == null || A._resetCallStore();
        break;
      }
    }
  }
  _handleError(e) {
    var A;
    const { code: t, message: i } = e || {}, n = Object.values(Qe).indexOf(t);
    let o = "";
    if (n !== -1) {
      const I = Object.keys(Qe)[n];
      o = j(Ve[I]), o && L.update(r.CALL, a.TOAST_INFO, { content: Ve[I], type: a.ERROR });
    }
    (A = this._callService) == null || A.executeExternalAfterCalling(), console.error(`${a.PREFIX}_handleError, errorCode: ${t}; errorMessage: ${o || i}.`);
  }
  async _handleNewInvitationReceived(e) {
    var Ie, $, ee, te;
    console.log(`${a.PREFIX}onCallReceived event data: ${JSON.stringify(e)}.`);
    const { callerId: t = "", callMediaType: i, inviteData: n = {}, calleeIdList: o = [], chatGroupID: A = "", roomID: I, strRoomID: l } = F(e), E = L.getData(r.CALL, a.LOCAL_USER_INFO), u = [t, ...o.filter((H) => H !== E.userId)], h = i || n.callType, d = h === _.AUDIO ? p.CALLEE_CALLING_AUDIO_MSG : p.CALLEE_CALLING_VIDEO_MSG;
    let S = {
      [a.CALL_ROLE]: G.CALLEE,
      [a.IS_GROUP]: !!A || o.length > 1,
      [a.CALL_STATUS]: g.CALLING,
      [a.CALL_MEDIA_TYPE]: h,
      [a.CALL_TIPS]: d,
      [a.CALLER_USER_INFO]: { userId: t },
      [a.GROUP_ID]: A
    };
    $e();
    const U = { enableCamera: h === _.VIDEO, enableMic: !0 };
    S = { ...S, [a.PUSHER]: U }, this._callService.openCamera(h === _.VIDEO), this._callService.openMicrophone();
    const T = {
      microphone: !0,
      camera: h === _.VIDEO
    };
    this._callService._preDevicePermission = await this._callService._tuiCallEngine.deviceCheck(T), At(I, l), L.updateStore(S, r.CALL), (Ie = this._callService) == null || Ie.executeExternalBeforeCalling(), ($ = this._callService) != null && $.statusChanged && ((ee = this._callService) == null || ee.statusChanged({ oldStatus: M.IDLE, newStatus: M.BE_INVITED }));
    const P = await q(u, (te = this._callService) == null ? void 0 : te.getTim()), [B] = P.filter((H) => H.userId === t);
    P.length > 0 && L.updateStore({
      [a.REMOTE_USER_INFO_LIST]: P,
      [a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST]: P,
      [a.CALLER_USER_INFO]: {
        userId: t,
        nick: (B == null ? void 0 : B.nick) || "",
        avatar: (B == null ? void 0 : B.avatar) || "",
        displayUserInfo: (B == null ? void 0 : B.remark) || (B == null ? void 0 : B.nick) || t
      }
    }, r.CALL);
  }
  async _handleOnCallBegin(e) {
    this._callerChangeToConnected(), L.update(r.CALL, a.CALL_TIPS, { text: "answered", duration: 2e3 }), await this._callService.openMicrophone(), console.log(`${a.PREFIX}accept event data: ${JSON.stringify(e)}.`);
  }
  async _handleUserEnter(e) {
    this._callerChangeToConnected();
    const { userID: t, data: i } = F(e);
    i != null && i.playerList && L.update(r.CALL, a.PLAYER, i.playerList), await this._addUserToRemoteUserInfoList(t);
    let n = L.getData(r.CALL, a.REMOTE_USER_INFO_LIST);
    n = n.map((o) => (o.userId === t && (o.isEnter = !0), o)), n.length > 0 && (L.update(r.CALL, a.REMOTE_USER_INFO_LIST, n), L.update(r.CALL, a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, n), ii.updateViewBackgroundUserId("remote")), console.log(`${a.PREFIX}userEnter event data: ${JSON.stringify(e)}.`);
  }
  _handleUserLeave(e) {
    console.log(`${a.PREFIX}userLeave event data: ${JSON.stringify(e)}.`);
    const { data: t, userID: i } = F(e);
    if (t != null && t.playerList && L.update(r.CALL, a.PLAYER, t.playerList), L.getData(r.CALL, a.IS_GROUP)) {
      const o = (L.getData(r.CALL, a.REMOTE_USER_INFO_LIST).find((A) => A.userId === i) || {}).displayUserInfo || i;
      L.update(r.CALL, a.TOAST_INFO, { content: { key: p.END_CALL, options: { userList: o } } });
    }
    i && Oe([i]);
  }
  _handleInviteeReject(e) {
    this._unNormalEventsManager(e, C.REJECT);
  }
  _handleNoResponse(e) {
    this._unNormalEventsManager(e, C.NO_RESP);
  }
  _handleLineBusy(e) {
    this._unNormalEventsManager(e, C.LINE_BUSY);
  }
  _handleCallNotConnected(e) {
    var t, i, n;
    (i = (t = this == null ? void 0 : this._callService) == null ? void 0 : t._cleanupAvoidRepeatCallState) == null || i.call(t), (n = this._callService) == null || n.executeExternalAfterCalling(), this._unNormalEventsManager(e, C.ON_CALL_NOT_CONNECTED);
  }
  async _handleOnUserInviting(e) {
    const { userID: t } = F(e);
    t && (L.update(r.CALL, a.IS_GROUP, !0), t !== L.getData(r.CALL, a.LOCAL_USER_INFO).userId && await this._addUserToRemoteUserInfoList(t));
  }
  _handleCallingEnd(e) {
    var t, i;
    console.log(`${a.PREFIX}callEnd event data: ${JSON.stringify(e)}.`), (t = this._callService) == null || t.executeExternalAfterCalling(), (i = this._callService) == null || i._resetCallStore();
  }
  // SDK_READY 后才能调用 tim 接口, 否则登录后立刻获取导致调用接口失败. v2.27.4+、v3 接口 login 后会抛出 SDK_READY
  async _handleSDKReady(e) {
    var i;
    let t = L.getData(r.CALL, a.LOCAL_USER_INFO);
    t = await Yt(t.userId, (i = this._callService) == null ? void 0 : i.getTim()), L.update(r.CALL, a.LOCAL_USER_INFO, t), L.update(r.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, t);
  }
  _handleKickedOut(e) {
    var t, i, n;
    console.log(`${a.PREFIX}kickOut event data: ${JSON.stringify(e)}.`), (t = this._callService) != null && t.kickedOut && ((i = this._callService) == null || i.kickedOut(e)), L.update(r.CALL, a.CALL_TIPS, p.KICK_OUT), (n = this._callService) == null || n._resetCallStore();
  }
  _messageSentByMe(e) {
    var i, n;
    const t = e == null ? void 0 : e.data;
    (i = this._callService) != null && i.onMessageSentByMe && ((n = this._callService) == null || n.onMessageSentByMe(t));
  }
  _handleCallMessage(e) {
    const t = F(e);
    this._callService._chatCombine.callTUIService({ message: t });
  }
  _handleCallTypeChange(e) {
    var n;
    const { newCallType: t, type: i } = F(e);
    L.update(r.CALL, a.CALL_MEDIA_TYPE, t || i), (n = this._callService) == null || n.setSoundMode(w.EAR);
  }
  _handleNetworkQuality(e) {
    const { networkQualityList: t = [] } = F(e);
    L.update(r.CALL, a.NETWORK_STATUS, t);
    const i = L.getData(r.CALL, a.IS_GROUP), n = L.getData(r.CALL, a.LOCAL_USER_INFO), o = L.getData(r.CALL, a.REMOTE_USER_INFO_LIST);
    if (!i) {
      if (t.find((l) => {
        var E;
        return ((E = o[0]) == null ? void 0 : E.userId) === (l == null ? void 0 : l.userId) && (l == null ? void 0 : l.quality) >= be;
      })) {
        L.update(r.CALL, a.CALL_TIPS, p.REMOTE_NETWORK_IS_POOR);
        return;
      }
      if (t.find((l) => (n == null ? void 0 : n.userId) === (l == null ? void 0 : l.userId) && (l == null ? void 0 : l.quality) >= be)) {
        L.update(r.CALL, a.CALL_TIPS, p.LOCAL_NETWORK_IS_POOR);
        return;
      }
    }
  }
  async _startRemoteView(e) {
    var t;
    if (!e) {
      console.warn(`${a.PREFIX}_startRemoteView userID is empty`);
      return;
    }
    try {
      const i = L.getData(r.CALL, a.DISPLAY_MODE);
      await ((t = this._callService) == null ? void 0 : t.getTUICallEngineInstance().startRemoteView({ userID: e, videoViewDomID: `${e}_0`, options: { objectFit: i } }));
    } catch (i) {
      return console.error(`${a.PREFIX}_startRemoteView error: ${i}.`), Promise.reject(i);
    }
  }
  _setRemoteUserInfoAudioVideoAvailable(e, t, i) {
    let n = L.getData(r.CALL, a.REMOTE_USER_INFO_LIST);
    n = n.map((o) => {
      if (o.userId === i) {
        if (t === a.AUDIO)
          return { ...o, isAudioAvailable: e };
        if (t === a.VIDEO)
          return { ...o, isVideoAvailable: e };
      }
      return o;
    }), n.length > 0 && (L.update(r.CALL, a.REMOTE_USER_INFO_LIST, n), L.update(r.CALL, a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, n));
  }
  async _handleUserVideoAvailable(e) {
    const { userID: t, isVideoAvailable: i } = F(e);
    console.log(`${a.PREFIX}_handleUserVideoAvailable event data: ${JSON.stringify(e)}.`), this._setRemoteUserInfoAudioVideoAvailable(i, a.VIDEO, t);
    try {
      i && await this._startRemoteView(t);
    } catch (n) {
      console.error(`${a.PREFIX}_startRemoteView failed, error: ${n}.`);
    }
  }
  _handleUserAudioAvailable(e) {
    const { userID: t, isAudioAvailable: i } = F(e);
    console.log(`${a.PREFIX}_handleUserAudioAvailable event data: ${JSON.stringify(e)}.`), this._setRemoteUserInfoAudioVideoAvailable(i, a.AUDIO, t);
  }
  _handleUserVoiceVolume(e) {
    try {
      const { volumeMap: t } = F(e);
      if ((t || []).length === 0)
        return;
      const i = L.getData(r.CALL, a.LOCAL_USER_INFO);
      let n = L.getData(r.CALL, a.REMOTE_USER_INFO_LIST);
      const [o] = t.filter((l) => l.userId === i.userId), A = t.reduce((l, E) => E.userId !== i.userId ? { ...l, [E.userId]: E.audioVolume } : l, {});
      i.volume = o.audioVolume, n = n.map((l) => ({ ...l, volume: A[l.userId] }));
      const I = {
        [a.LOCAL_USER_INFO]: i,
        [a.REMOTE_USER_INFO_LIST]: n
      };
      L.updateStore(I, r.CALL);
    } catch (t) {
      console.debug(t);
    }
  }
  _handleDeviceUpdate(e) {
    const { cameraList: t, microphoneList: i, speakerList: n, currentCamera: o, currentMicrophone: A, currentSpeaker: I } = e;
    L.update(r.CALL, a.DEVICE_LIST, { cameraList: t, microphoneList: i, speakerList: n, currentCamera: o, currentMicrophone: A, currentSpeaker: I });
  }
  // ==========================【 miniProgram 私有事件】==========================
  _handleUserUpdate(e) {
    const t = F(e);
    t != null && t.pusher && L.update(r.CALL, a.PUSHER, t.pusher), t != null && t.playerList && L.update(r.CALL, a.PLAYER, t.playerList);
  }
  async _addUserToRemoteUserInfoList(e) {
    var n;
    let t = L.getData(r.CALL, a.REMOTE_USER_INFO_LIST);
    if (!t.find((o) => (o == null ? void 0 : o.userId) === e)) {
      t.push({ userId: e }), L.update(r.CALL, a.REMOTE_USER_INFO_LIST, t), L.update(r.CALL, a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, t);
      const [o] = await q([e], (n = this._callService) == null ? void 0 : n.getTim());
      t = L.getData(r.CALL, a.REMOTE_USER_INFO_LIST), t.forEach((A) => {
        (A == null ? void 0 : A.userId) === e && (A = Object.assign(A, o));
      }), L.update(r.CALL, a.REMOTE_USER_INFO_LIST, t), L.update(r.CALL, a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, t);
    }
  }
};
ti([
  Zt({
    retries: 5,
    timeout: 200,
    onRetrying(s) {
      console.warn(`${a.PREFIX}_startRemoteView, retrying [${s}]`);
    }
  })
], lt.prototype, "_startRemoteView", 1);
let ai = lt;
var ni = Object.defineProperty, si = Object.getOwnPropertyDescriptor, D = (s, e, t, i) => {
  for (var n = i > 1 ? void 0 : i ? si(e, t) : e, o = s.length - 1, A; o >= 0; o--)
    (A = s[o]) && (n = (i ? A(e, t, n) : A(n)) || n);
  return i && n && ni(e, t, n), n;
};
const Xe = nt.getInstance(), c = De.getInstance(), V = k.getInstance();
V.setTUIStore(c);
const Ne = z.getInstance(), qe = "4.0.12", f = class Ae {
  constructor() {
    this._tim = null, this._TUICore = null, this._timerId = -1, this._startTimeStamp = Ue(), this._bellContext = null, this._isFromChat = !1, this._currentGroupId = "", this._preDevicePermission = !1, this._offlinePushInfo = null, this._permissionCheckTimer = null, this._chatCombine = null, this._engineEventHandler = null, this._isInitialized = !1, this._handleCallStatusChange = async (e) => {
      var t, i;
      try {
        const n = {
          callRole: c.getData(r.CALL, a.CALL_ROLE),
          callStatus: c.getData(r.CALL, a.CALL_STATUS)
        };
        if (this._bellContext.setBellProperties(n), e === g.CALLING)
          await ((t = this == null ? void 0 : this._bellContext) == null ? void 0 : t.play());
        else {
          if (e === g.CONNECTED) {
            const o = c.getData(r.CALL, a.IS_GROUP), A = c.getData(r.CALL, a.CALL_MEDIA_TYPE), I = c.getData(r.CALL, a.REMOTE_USER_INFO_LIST), l = o ? M.DIALING_GROUP : M.DIALING_C2C;
            c.update(r.CALL, a.CALL_TIPS, ""), this.statusChanged && this.statusChanged({ oldStatus: l, newStatus: Ee() }), !o && A === _.VIDEO && this.switchScreen(I[0].domId);
          }
          await ((i = this == null ? void 0 : this._bellContext) == null ? void 0 : i.stop());
        }
      } catch (n) {
        console.warn(`${a.PREFIX}handleCallStatusChange, ${n}.`);
      }
    }, console.log(`${a.PREFIX}version: ${qe}`), this._wasmReadyPromise = new Promise((e) => {
      this._wasmReadyResolve = e;
    }), this._loadWasm(), this._watchTUIStore(), this._engineEventHandler = ai.getInstance({ callService: this }), this._chatCombine = W.getInstance({ callService: this });
  }
  static getInstance() {
    return Ae.instance || (Ae.instance = new Ae()), Ae.instance;
  }
  _loadWasm() {
    Pe.once("ready", () => this._wasmReadyResolve());
  }
  async init(e) {
    if (this._isInitialized) {
      console.warn("TUICallKit has already been initialized.");
      return;
    }
    await this._wasmReadyPromise, this._isInitialized || (this._doInit(e), this._isInitialized = !0);
  }
  async _doInit(e) {
    var t, i;
    try {
      if (this._tuiCallEngine)
        return;
      let { userID: n, tim: o, userSig: A, sdkAppID: I, SDKAppID: l, isFromChat: E, component: u = we.TUI_CALL_KIT } = e;
      this._TUICore && (I = this._TUICore.SDKAppID, o = this._TUICore.tim), this._tim = o, console.log(`${a.PREFIX}init sdkAppId: ${I || l}, userId: ${n}`), this._tuiCallEngine = Pe.createInstance({
        tim: o,
        // @ts-ignore
        sdkAppID: I || l,
        // 兼容传入 SDKAppID 的问题
        callkitVersion: qe,
        isFromChat: E || !1,
        component: u
      }), V.setEngineInstance(this._tuiCallEngine), this._addListenTuiCallEngineEvent(), this._bellContext = new Vt(), c.update(r.CALL, a.LOCAL_USER_INFO, { userId: n }), c.update(r.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, { userId: n }), V.updateViewBackgroundUserId("local"), Ne.setEngineInstance(this._tuiCallEngine), Ne.setImInstance(this.getTim()), this.enableAISubtitle(!0), await this._tuiCallEngine.login({ userID: n, userSig: A, assetsPath: "" });
      const h = c.getData(r.CALL, a.CUSTOM_UI_CONFIG);
      (i = (t = this._tuiCallEngine) == null ? void 0 : t.reportLog) == null || i.call(t, {
        name: "TUICallkit.init",
        data: {
          uiConfig: h
        }
      });
    } catch (n) {
      throw console.error(`${a.PREFIX}init failed, error: ${n}.`), n;
    }
  }
  // component destroy
  async destroyed() {
    var e;
    try {
      this._isInitialized = !1;
      const t = c.getData(r.CALL, a.CALL_STATUS);
      if (t !== g.IDLE)
        throw new Error(`please destroyed when status is idle, current status: ${t}`);
      this._tuiCallEngine && (this._removeListenTuiCallEngineEvent(), await this._tuiCallEngine.destroyInstance(), this._tuiCallEngine = null), (e = this._bellContext) == null || e.destroy(), this._bellContext = null;
    } catch (t) {
      throw console.error(`${a.PREFIX}destroyed failed, error: ${t}.`), t;
    }
  }
  async call(e) {
    if (c.getData(r.CALL, a.CALL_STATUS) === g.IDLE)
      try {
        const { type: t, userID: i, offlinePushInfo: n } = e;
        if (c.getData(r.CALL, a.CALL_STATUS) !== g.IDLE)
          return;
        await this._updateCallStoreBeforeCall(t, [{ userId: i }]), this.executeExternalBeforeCalling(), e.offlinePushInfo = { ...this.getDefaultOfflinePushInfo(), ...n };
        const o = await this._tuiCallEngine.call(e);
        await this._updateCallStoreAfterCall([i], o);
      } catch (t) {
        this._handleCallError(t, "call");
      }
  }
  async groupCall(e) {
    if (c.getData(r.CALL, a.CALL_STATUS) === g.IDLE)
      try {
        const { userIDList: t, type: i, groupID: n, offlinePushInfo: o } = e;
        if (c.getData(r.CALL, a.CALL_STATUS) !== g.IDLE)
          return;
        const A = t.map((l) => ({ userId: l }));
        await this._updateCallStoreBeforeCall(i, A, n), this.executeExternalBeforeCalling(), e.offlinePushInfo = { ...this.getDefaultOfflinePushInfo(), ...o };
        const I = await this._tuiCallEngine.groupCall(e);
        await this._updateCallStoreAfterCall(t, I);
      } catch (t) {
        this._handleCallError(t, "groupCall");
      }
  }
  async inviteUser(e) {
    if (c.getData(r.CALL, a.CALL_STATUS) !== g.IDLE)
      try {
        const { userIDList: t } = e;
        let i = await q(t, this.getTim());
        const n = c.getData(r.CALL, a.REMOTE_USER_INFO_LIST);
        if (t.filter((A) => !n.some((I) => I.userId === A)).length === 0)
          return;
        c.update(r.CALL, a.REMOTE_USER_INFO_LIST, [...n, ...i]), c.update(r.CALL, a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, [...n, ...i]), this._tuiCallEngine && await this._tuiCallEngine.inviteUser(e);
      } catch (t) {
        console.error(`${a.PREFIX}inviteUser failed, error: ${t}.`);
      }
  }
  async joinInGroupCall(e) {
    if (c.getData(r.CALL, a.CALL_STATUS) !== g.CONNECTED)
      try {
        const t = {
          [a.CALL_ROLE]: G.CALLEE,
          [a.IS_GROUP]: !0,
          [a.CALL_STATUS]: g.CONNECTED,
          [a.CALL_MEDIA_TYPE]: e.type,
          [a.GROUP_ID]: e.groupID,
          [a.ROOM_ID]: e.roomID
        };
        c.updateStore(t, r.CALL);
        const i = await this._tuiCallEngine.joinInGroupCall(e), n = this._getFeatureButtonDefaultState(Y.Camera) === X.Close;
        e.type === _.VIDEO && !n && await this.openCamera(a.LOCAL_VIDEO), c.update(r.CALL, a.IS_CLICKABLE, !0), this.startTimer(), c.update(r.CALL, a.PUSHER, i), this.setSoundMode(e.type === _.AUDIO ? w.EAR : w.SPEAKER);
        const o = c.getData(r.CALL, a.LOCAL_USER_INFO);
        c.update(r.CALL, a.LOCAL_USER_INFO, { ...o, isEnter: !0 }), c.update(r.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, { ...o, isEnter: !0 }), Q(!0, a.AUDIO);
      } catch (t) {
        this._handleCallError(t, "joinInGroupCall");
      }
  }
  async calls(e) {
    if (c.getData(r.CALL, a.CALL_STATUS) === g.IDLE)
      try {
        const { userIDList: t, type: i, chatGroupID: n, offlinePushInfo: o } = e;
        if (c.getData(r.CALL, a.CALL_STATUS) !== g.IDLE)
          return;
        const A = t.map((l) => ({ userId: l }));
        await this._updateCallStoreBeforeCall(i, A, n), this.executeExternalBeforeCalling(), e.offlinePushInfo = { ...this.getDefaultOfflinePushInfo(), ...o };
        const I = await this._tuiCallEngine.calls(e);
        await this._updateCallStoreAfterCall(t, I);
      } catch (t) {
        this._handleCallError(t, "calls");
      }
  }
  async join(e) {
    if (c.getData(r.CALL, a.CALL_STATUS) !== g.CONNECTED)
      try {
        const t = await this._tuiCallEngine.join(e);
        c.update(r.CALL, a.IS_CLICKABLE, !0), this.startTimer();
        const i = {
          [a.CALL_ROLE]: G.CALLEE,
          [a.IS_GROUP]: !0,
          [a.CALL_STATUS]: g.CONNECTED,
          [a.CALL_MEDIA_TYPE]: c.getData(r.CALL, a.CALL_MEDIA_TYPE) || _.AUDIO
          // default audio callMediaType
        };
        c.updateStore(i, r.CALL), c.update(r.CALL, a.PUSHER, t), this.setSoundMode(e.type === _.AUDIO ? w.EAR : w.SPEAKER);
        const n = c.getData(r.CALL, a.LOCAL_USER_INFO);
        c.update(r.CALL, a.LOCAL_USER_INFO, { ...n, isEnter: !0 }), c.update(r.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, { ...n, isEnter: !0 }), await this.openMicrophone(), Q(!0, a.AUDIO);
      } catch (t) {
        this._handleCallError(t, "join");
      }
  }
  // ===============================【其它对外接口】===============================
  getTUICallEngineInstance() {
    return (this == null ? void 0 : this._tuiCallEngine) || null;
  }
  setLogLevel(e) {
    var t;
    (t = this == null ? void 0 : this._tuiCallEngine) == null || t.setLogLevel(e);
  }
  setLanguage(e) {
    console.warn(`${a.PREFIX}The miniProgram does not support setLanguage`);
  }
  enableFloatWindow(e) {
    c.update(r.CALL, a.ENABLE_FLOAT_WINDOW, e);
  }
  async setSelfInfo(e) {
    const { nickName: t, avatar: i } = e;
    try {
      await this._tuiCallEngine.setSelfInfo(t, i);
    } catch (n) {
      console.error(`${a.PREFIX}setSelfInfo failed, error: ${n}.`);
    }
  }
  async enableVirtualBackground(e) {
    c.update(r.CALL, a.IS_SHOW_ENABLE_VIRTUAL_BACKGROUND, e);
  }
  async setCallingBell(e) {
    const t = { calleeBellFilePath: e };
    this._bellContext.setBellProperties(t);
  }
  async enableMuteMode(e) {
    try {
      const t = { isMuteBell: e };
      this._bellContext.setBellProperties(t), await this._bellContext.setBellMute(e);
    } catch (t) {
      console.warn(`${a.PREFIX}enableMuteMode failed, error: ${t}.`);
    }
  }
  hideFeatureButton(e) {
    V.hideFeatureButton(e);
  }
  setLocalViewBackgroundImage(e) {
    V.setLocalViewBackgroundImage(e);
  }
  setRemoteViewBackgroundImage(e, t) {
    V.setRemoteViewBackgroundImage(e, t);
  }
  setLayoutMode(e) {
    V.setLayoutMode(e);
  }
  setCameraDefaultState(e) {
    V.setCameraDefaultState(e);
  }
  enableAISubtitle(e) {
    Ne.enableAISubtitle(e);
  }
  // =============================【实验性接口】=============================
  callExperimentalAPI(e) {
    var o, A;
    const t = JSON.parse(e);
    if (t === e)
      return;
    const { api: i, params: n } = t;
    if (!(!i || !n))
      try {
        switch (i) {
          case "forceUseV2API":
            const { enable: I } = n;
            c.update(r.CALL, a.IS_FORCE_USE_V2_API, !!I);
            break;
          default:
            break;
        }
      } catch (I) {
        (A = (o = this._tuiCallEngine) == null ? void 0 : o.reportLog) == null || A.call(o, { name: "TUICallKit.callExperimentalAPI.fail", data: { error: I } });
      }
  }
  async accept() {
    var t, i, n, o, A, I;
    const e = c.getData(r.CALL, a.CALL_STATUS);
    if ((i = (t = this._tuiCallEngine) == null ? void 0 : t.reportLog) == null || i.call(t, {
      name: "TUICallKit.accept.start",
      data: { callStatus: e }
    }), e !== g.CONNECTED)
      try {
        const E = {
          microphone: !0,
          camera: c.getData(r.CALL, a.CALL_MEDIA_TYPE) === _.VIDEO
        }, u = await this._tuiCallEngine.deviceCheck(E);
        u && !this._preDevicePermission && (c.update(r.CALL, a.PUSHER_ID, a.NEW_PUSHER), this._preDevicePermission = u), c.update(r.CALL, a.CALL_STATUS, g.CONNECTED);
        const h = await this._tuiCallEngine.accept();
        if (h) {
          (o = this._chatCombine) == null || o.callTUIService({ message: (n = h == null ? void 0 : h.data) == null ? void 0 : n.message }), c.update(r.CALL, a.IS_CLICKABLE, !0), this.startTimer();
          const d = c.getData(r.CALL, a.CALL_MEDIA_TYPE), S = this._getFeatureButtonDefaultState(Y.Camera) === X.Close;
          d === _.VIDEO && !S && await this.openCamera(a.LOCAL_VIDEO), h.pusher && c.update(r.CALL, a.PUSHER, h.pusher), this.setSoundMode(d === _.AUDIO ? w.EAR : w.SPEAKER);
          const U = c.getData(r.CALL, a.LOCAL_USER_INFO);
          c.update(r.CALL, a.LOCAL_USER_INFO, { ...U, isEnter: !0 }), c.update(r.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, { ...U, isEnter: !0 }), Q(!0, a.AUDIO);
        }
      } catch (l) {
        if ((I = (A = this._tuiCallEngine) == null ? void 0 : A.reportLog) == null || I.call(A, {
          name: "TUICallKit.accept.fail",
          level: "error",
          error: l
        }), Ye(l))
          return;
        Be(l, _.AUDIO, this._tuiCallEngine), this._resetCallStore();
      }
  }
  async hangup() {
    if (c.getData(r.CALL, a.CALL_STATUS) !== g.IDLE) {
      try {
        const e = await this._tuiCallEngine.hangup();
        e == null || e.forEach((t) => {
          var i, n;
          (t == null ? void 0 : t.code) === 0 && ((n = this._chatCombine) == null || n.callTUIService({ message: (i = t == null ? void 0 : t.data) == null ? void 0 : i.message }));
        });
      } catch (e) {
        console.debug(e);
      }
      this._resetCallStore();
    }
  }
  async reject() {
    var e, t;
    if (c.getData(r.CALL, a.CALL_STATUS) !== g.IDLE) {
      try {
        const i = await this._tuiCallEngine.reject();
        (i == null ? void 0 : i.code) === 0 && ((t = this._chatCombine) == null || t.callTUIService({ message: (e = i == null ? void 0 : i.data) == null ? void 0 : e.message }));
      } catch (i) {
        console.debug(i);
      }
      this._resetCallStore();
    }
  }
  async openCamera(e) {
    try {
      if (Xe.isH5 || Xe.isWeChat) {
        const i = c.getData(r.CALL, a.CAMERA_POSITION) === b.FRONT;
        this._tuiCallEngine.openCamera(e, i);
      } else
        await this._tuiCallEngine.openCamera(e);
      Q(!0, a.VIDEO);
    } catch (t) {
      Be(t, _.VIDEO, this._tuiCallEngine), console.error(`${a.PREFIX}openCamera error: ${t}.`);
    }
  }
  async closeCamera() {
    try {
      await this._tuiCallEngine.closeCamera(), Q(!1, a.VIDEO);
    } catch (e) {
      console.error(`${a.PREFIX}closeCamera error: ${e}.`);
    }
  }
  async openMicrophone() {
    try {
      await this._tuiCallEngine.openMicrophone(), Q(!0, a.AUDIO);
    } catch (e) {
      console.error(`${a.PREFIX}openMicrophone failed, error: ${e}.`);
    }
  }
  async closeMicrophone() {
    try {
      await this._tuiCallEngine.closeMicrophone(), Q(!1, a.AUDIO);
    } catch (e) {
      console.error(`${a.PREFIX}closeMicrophone failed, error: ${e}.`);
    }
  }
  switchScreen(e) {
    e && c.update(r.CALL, a.BIG_SCREEN_USER_ID, e);
  }
  async switchCallMediaType() {
    var e, t;
    try {
      const i = c.getData(r.CALL, a.CALL_MEDIA_TYPE);
      if (i === _.AUDIO) {
        console.warn(`${a.PREFIX}switchCallMediaType failed, ${i} not support.`);
        return;
      }
      const n = await this._tuiCallEngine.switchCallMediaType(_.AUDIO);
      (n == null ? void 0 : n.code) === 0 && ((t = this._chatCombine) == null || t.callTUIService({ message: (e = n == null ? void 0 : n.data) == null ? void 0 : e.message })), c.update(r.CALL, a.CALL_MEDIA_TYPE, _.AUDIO);
      const A = c.getData(r.CALL, a.IS_GROUP) ? M.CALLING_GROUP_VIDEO : M.CALLING_C2C_VIDEO, I = Ee();
      this.statusChanged && this.statusChanged({ oldStatus: A, newStatus: I }), this.setSoundMode(w.EAR);
    } catch (i) {
      console.error(`${a.PREFIX}switchCallMediaType failed, error: ${i}.`);
    }
  }
  async switchCamera() {
    const t = c.getData(r.CALL, a.CAMERA_POSITION) === b.BACK ? b.FRONT : b.BACK;
    try {
      await this._tuiCallEngine.switchCamera(t), c.update(r.CALL, a.CAMERA_POSITION, t);
    } catch (i) {
      console.error(`${a.PREFIX}_switchCamera failed, error: ${i}.`);
    }
  }
  setSoundMode(e) {
    var t;
    try {
      let i = c.getData(r.CALL, a.IS_EAR_PHONE);
      const n = e || (i ? w.SPEAKER : w.EAR);
      (t = this._tuiCallEngine) == null || t.selectAudioPlaybackDevice(n), e ? i = e === w.EAR : i = !i, c.update(r.CALL, a.IS_EAR_PHONE, i);
    } catch (i) {
      console.error(`${a.PREFIX}setSoundMode failed, error: ${i}.`);
    }
  }
  async setBlurBackground(e) {
    try {
      c.update(r.CALL, a.ENABLE_VIRTUAL_BACKGROUND, e);
    } catch (t) {
      console.error(`${a.PREFIX}_setBlurBackground failed, error: ${t}.`);
    }
  }
  // ==========================【TUICallEngine 事件处理】==========================
  _addListenTuiCallEngineEvent() {
    this._engineEventHandler.addListenTuiCallEngineEvent();
  }
  _removeListenTuiCallEngineEvent() {
    this._engineEventHandler.removeListenTuiCallEngineEvent();
  }
  setCallback(e) {
    const { beforeCalling: t, afterCalling: i, onMinimized: n, onMessageSentByMe: o, kickedOut: A, statusChanged: I } = e;
    t && (this.beforeCalling = t), i && (this.afterCalling = i), n && (this.onMinimized = n), o && (this.onMessageSentByMe = o), A && (this.kickedOut = A), I && (this.statusChanged = I);
  }
  toggleMinimize() {
    const e = c.getData(r.CALL, a.IS_MINIMIZED);
    c.update(r.CALL, a.IS_MINIMIZED, !e), console.log(`${a.PREFIX}toggleMinimize: ${e} -> ${!e}.`), this.onMinimized && this.onMinimized(e, !e);
  }
  executeExternalBeforeCalling() {
    this.beforeCalling && this.beforeCalling();
  }
  executeExternalAfterCalling() {
    this.afterCalling && this.afterCalling();
  }
  // 处理用户异常退出的情况, 小程序 ”右滑“、"左上角退出"; web 页面关闭浏览器或关闭 tab 页面
  async handleExceptionExit(e) {
    var t, i;
    try {
      const n = c.getData(r.CALL, a.CALL_STATUS), o = c.getData(r.CALL, a.CALL_ROLE);
      if ((i = (t = this._tuiCallEngine) == null ? void 0 : t.reportLog) == null || i.call(t, { name: "TUICallkit.handleExceptionExit", data: { callStatus: n, callRole: o } }), n === g.IDLE)
        return;
      n === g.CALLING && (o === G.CALLER ? await (this == null ? void 0 : this.hangup()) : await (this == null ? void 0 : this.reject())), n === g.CONNECTED && await (this == null ? void 0 : this.hangup()), this == null || this._resetCallStore();
    } catch (n) {
      console.error(`${a.PREFIX} handleExceptionExit failed, error: ${n}.`);
    }
    e && (e.returnValue = "");
  }
  // 处理 pusher 内部错误,没有 live-pusher 能力时做出弹窗提示。
  handlePusherError(e) {
    var t;
    ((t = e == null ? void 0 : e.detail) == null ? void 0 : t.errMsg) === "fail:access denied" && Dt();
  }
  setVideoDisplayMode(e) {
    c.update(r.CALL, a.DISPLAY_MODE, e);
  }
  async setVideoResolution(e) {
    var t;
    try {
      if (!e)
        return;
      c.update(r.CALL, a.VIDEO_RESOLUTION, e), await ((t = this._tuiCallEngine) == null ? void 0 : t.setVideoQuality(e));
    } catch (i) {
      console.warn(`${a.PREFIX}setVideoResolution failed, error: ${i}.`);
    }
  }
  // 通话时长更新
  startTimer() {
    this._timerId === -1 && (this._startTimeStamp = Ue(), this._timerId = fe.run(a.TIMEOUT, this._updateCallDuration.bind(this), { delay: 1e3 }));
  }
  // =========================【private methods for service use】=========================
  // 处理 “呼叫” 抛出的异常
  _handleCallError(e, t) {
    if (this._permissionCheckTimer && clearInterval(this._permissionCheckTimer), !Ye(e))
      throw St(e), Be(e, _.AUDIO, this._tuiCallEngine), console.error(`${a.PREFIX}${t} failed, error: ${e}.`), this._resetCallStore(), e;
  }
  async _updateCallStoreBeforeCall(e, t, i) {
    let n = p.CALLER_CALLING_MSG;
    (i || c.getData(r.CALL, a.IS_MINIMIZED) || t.length > 1) && (n = p.CALLER_GROUP_CALLING_MSG);
    let o = {
      [a.CALL_MEDIA_TYPE]: e,
      [a.CALL_ROLE]: G.CALLER,
      [a.REMOTE_USER_INFO_LIST]: t,
      [a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST]: t,
      [a.IS_GROUP]: !!i || t.length > 1,
      [a.CALL_TIPS]: n,
      [a.GROUP_ID]: i
    };
    const A = { enableCamera: e === _.VIDEO, enableMic: !0 };
    o = { ...o, [a.PUSHER]: A }, c.updateStore(o, r.CALL);
    const I = await ft(e, this);
    console.log(`${a.PREFIX}mini beforeCall return callStatus: ${I}.`), c.update(r.CALL, a.CALL_STATUS, I);
    const l = await q(t.map((h) => h.userId), this.getTim());
    l.length > 0 && (c.update(r.CALL, a.REMOTE_USER_INFO_LIST, l), c.update(r.CALL, a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, l));
    const E = {
      microphone: !0,
      camera: e === _.VIDEO
    };
    let u = await this._tuiCallEngine.deviceCheck(E);
    u || (this._permissionCheckTimer && clearInterval(this._permissionCheckTimer), this._permissionCheckTimer = setInterval(async () => {
      u = await this._tuiCallEngine.deviceCheck(E), u && this._permissionCheckTimer && (clearInterval(this._permissionCheckTimer), c.update(r.CALL, a.CALL_STATUS, g.CALLING));
    }, 500));
  }
  async _updateCallStoreAfterCall(e, t) {
    var i, n;
    if (t) {
      c.update(r.CALL, a.IS_CLICKABLE, !0), At(t == null ? void 0 : t.roomID, t == null ? void 0 : t.strRoomID);
      const o = c.getData(r.CALL, a.CALL_MEDIA_TYPE);
      (n = this._chatCombine) == null || n.callTUIService({ message: (i = t == null ? void 0 : t.data) == null ? void 0 : i.message }), t.pusher && c.update(r.CALL, a.PUSHER, t.pusher), this.setSoundMode(o === _.AUDIO ? w.EAR : w.SPEAKER), c.update(r.CALL, a.CALL_STATUS, g.CALLING);
      const A = this._getFeatureButtonDefaultState(Y.Camera) === X.Close;
      o === _.VIDEO && !A && await this.openCamera(a.LOCAL_VIDEO);
      const I = c.getData(r.CALL, a.LOCAL_USER_INFO);
      c.update(r.CALL, a.LOCAL_USER_INFO, { ...I, isEnter: !0 }), c.update(r.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, { ...I, isEnter: !0 }), Q(!0, a.AUDIO);
    } else
      this._permissionCheckTimer && clearInterval(this._permissionCheckTimer), this._permissionCheckTimer = null, this._resetCallStore();
  }
  _getFeatureButtonDefaultState(e) {
    var i;
    const { button: t } = c.getData(r.CALL, a.CUSTOM_UI_CONFIG);
    return (i = t == null ? void 0 : t[e]) == null ? void 0 : i.state;
  }
  _updateCallDuration() {
    const e = Math.round((Ue() - this._startTimeStamp) / 1e3), t = ot(e);
    c.update(r.CALL, a.CALL_DURATION, t);
  }
  _stopTimer() {
    this._timerId !== -1 && (fe.clearTask(this._timerId), this._timerId = -1);
  }
  // clear all use avoidRepeatCall decorator state
  _cleanupAllAvoidRepeatCallState() {
    var t, i;
    (i = (t = this._tuiCallEngine) == null ? void 0 : t.reportLog) == null || i.call(t, { name: "TUICallkit._cleanupAllAvoidRepeatCallState", data: {} }), [
      this.call,
      this.groupCall,
      this.calls,
      this.accept,
      this.hangup,
      this.reject
    ].forEach((n) => {
      var o;
      (o = n == null ? void 0 : n.clearCallState) == null || o.call(n, this);
    });
  }
  _resetCallStore() {
    this._cleanupAllAvoidRepeatCallState();
    const e = Ee();
    this._stopTimer();
    let t = Object.keys(Le).filter((o) => {
      switch (Le[o]) {
        case a.CALL_STATUS:
        case a.LANGUAGE:
        case a.IS_GROUP:
        case a.DISPLAY_MODE:
        case a.VIDEO_RESOLUTION:
        case a.ENABLE_FLOAT_WINDOW:
        case a.LOCAL_USER_INFO:
        case a.IS_SHOW_ENABLE_VIRTUAL_BACKGROUND:
        case a.IS_FORCE_USE_V2_API:
        case a.LOCAL_USER_INFO_EXCLUDE_VOLUMN:
          return !1;
        default:
          return !0;
      }
    });
    t = t.map((o) => Le[o]), c.reset(r.CALL, t), c.getData(r.CALL, a.CALL_STATUS) !== g.IDLE && c.reset(r.CALL, [a.CALL_STATUS], !0), c.reset(r.CALL, [a.IS_MINIMIZED], !0), c.reset(r.CALL, [a.IS_EAR_PHONE], !0), c.reset(r.CALL, [a.ENABLE_VIRTUAL_BACKGROUND], !0), c.reset(r.CALL, [a.IS_MUTE_SPEAKER], !0), c.update(r.CALL, a.LOCAL_USER_INFO, {
      ...c.getData(r.CALL, a.LOCAL_USER_INFO),
      isVideoAvailable: !1,
      isAudioAvailable: !1
    }), c.update(r.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, {
      ...c.getData(r.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN),
      isVideoAvailable: !1,
      isAudioAvailable: !1
    }), c.update(r.CALL, a.REMOTE_USER_INFO_LIST, []), c.update(r.CALL, a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, []), c.update(r.CALL, a.CAMERA_POSITION, b.FRONT);
    const n = Ee();
    e !== n && this.statusChanged && this.statusChanged({ oldStatus: e, newStatus: n });
  }
  // =========================【Calling the Chat SDK APi】=========================
  // 获取群成员
  async getGroupMemberList(e, t) {
    const i = c.getData(r.CALL, a.GROUP_ID);
    return await Ht(i, this.getTim(), e, t);
  }
  // 获取群信息
  async getGroupProfile() {
    const e = c.getData(r.CALL, a.GROUP_ID);
    return await xt(e, this.getTim());
  }
  _watchTUIStore() {
    c == null || c.watch(r.CALL, {
      [a.CALL_STATUS]: this._handleCallStatusChange
    });
  }
  _unwatchTUIStore() {
    c == null || c.unwatch(r.CALL, {
      [a.CALL_STATUS]: this._handleCallStatusChange
    });
  }
  // =========================【融合 chat 】=========================
  bindTUICore(e) {
    this._TUICore = e;
  }
  // =========================【set、get methods】=========================
  getTim() {
    var e, t;
    return this._tim ? this._tim : this._tuiCallEngine ? ((e = this._tuiCallEngine) == null ? void 0 : e.tim) || ((t = this._tuiCallEngine) == null ? void 0 : t.getTim()) : (console.warn(`${a.PREFIX}getTim warning: _tuiCallEngine Instance is not available.`), null);
  }
  setIsFromChat(e) {
    this._isFromChat = e;
  }
  setCurrentGroupId(e) {
    this._currentGroupId = e;
  }
  getCurrentGroupId() {
    return this._currentGroupId;
  }
  setDefaultOfflinePushInfo(e) {
    this._offlinePushInfo = e;
  }
  getDefaultOfflinePushInfo() {
    const e = c.getData(r.CALL, a.LOCAL_USER_INFO);
    return this._offlinePushInfo ? this._offlinePushInfo : {
      title: (e == null ? void 0 : e.displayUserInfo) || "",
      description: j("you have a new call")
    };
  }
  async getCallMessage(e) {
    return await this._chatCombine.getCallKitMessage(e, this.getTim());
  }
};
D([
  N(),
  y(m.init)
], f.prototype, "init", 1);
D([
  N(),
  y(m.call),
  Z({ engineInstance: !0 })
], f.prototype, "call", 1);
D([
  N(),
  y(m.groupCall),
  Z({ engineInstance: !0 })
], f.prototype, "groupCall", 1);
D([
  N(),
  y(m.inviteUser),
  Z({ engineInstance: !0 })
], f.prototype, "inviteUser", 1);
D([
  N(),
  y(m.joinInGroupCall),
  Z({ engineInstance: !0 })
], f.prototype, "joinInGroupCall", 1);
D([
  N(),
  Z({ engineInstance: !0 })
], f.prototype, "calls", 1);
D([
  N(),
  Z({ engineInstance: !0 })
], f.prototype, "join", 1);
D([
  y(m.setLanguage)
], f.prototype, "setLanguage", 1);
D([
  y(m.enableFloatWindow)
], f.prototype, "enableFloatWindow", 1);
D([
  y(m.setSelfInfo)
], f.prototype, "setSelfInfo", 1);
D([
  y(m.setCallingBell)
], f.prototype, "setCallingBell", 1);
D([
  y(m.enableMuteMode)
], f.prototype, "enableMuteMode", 1);
D([
  N()
], f.prototype, "accept", 1);
D([
  N()
], f.prototype, "hangup", 1);
D([
  N()
], f.prototype, "reject", 1);
D([
  N()
], f.prototype, "openCamera", 1);
D([
  N()
], f.prototype, "closeCamera", 1);
D([
  N()
], f.prototype, "openMicrophone", 1);
D([
  N()
], f.prototype, "closeMicrophone", 1);
D([
  N()
], f.prototype, "switchScreen", 1);
D([
  N()
], f.prototype, "switchCallMediaType", 1);
D([
  N()
], f.prototype, "switchCamera", 1);
D([
  N()
], f.prototype, "setSoundMode", 1);
D([
  N()
], f.prototype, "setBlurBackground", 1);
D([
  y(m.setVideoDisplayMode)
], f.prototype, "setVideoDisplayMode", 1);
D([
  y(m.setVideoResolution)
], f.prototype, "setVideoResolution", 1);
let ri = f;
const Ei = ri.getInstance(), Ci = "4.0.12";
export {
  _ as CallMediaType,
  G as CallRole,
  Y as FeatureButton,
  je as LayoutMode,
  a as NAME,
  M as STATUS,
  r as StoreName,
  Ei as TUICallKitServer,
  Xe as TUIGlobal,
  c as TUIStore,
  Ci as Version,
  le as VideoDisplayMode,
  ce as VideoResolution,
  j as t,
  V as uiDesign
};