(function(){"use strict";try{if(typeof document!="undefined"){var e=document.createElement("style");e.appendChild(document.createTextNode("")),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}})(); import { EVENT as C, TUICallEngine as at } from "tuicall-engine-wx"; import { TUICore as te, TUIConstants as B, TUILogin as it } from "@tencentcloud/tui-core"; import Ge from "@tencentcloud/chat"; var n = /* @__PURE__ */ ((r) => (r.CALL = "call", r.CUSTOM = "custom", r))(n || {}), g = /* @__PURE__ */ ((r) => (r[r.UNKNOWN = 0] = "UNKNOWN", r[r.AUDIO = 1] = "AUDIO", r[r.VIDEO = 2] = "VIDEO", r))(g || {}), F = /* @__PURE__ */ ((r) => (r.UNKNOWN = "unknown", r.CALLEE = "callee", r.CALLER = "caller", r))(F || {}), h = /* @__PURE__ */ ((r) => (r.IDLE = "idle", r.CALLING = "calling", r.CONNECTED = "connected", r))(h || {}), ne = /* @__PURE__ */ ((r) => (r.CONTAIN = "contain", r.COVER = "cover", r.FILL = "fill", r))(ne || {}), oe = /* @__PURE__ */ ((r) => (r.RESOLUTION_480P = "480p", r.RESOLUTION_720P = "720p", r.RESOLUTION_1080P = "1080p", r))(oe || {}), be = /* @__PURE__ */ ((r) => (r.EN = "en", r["ZH-CN"] = "zh-cn", r.JA_JP = "ja_JP", r))(be || {}); const T = { 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" }, rt = { unknown: 0, audio: 1, video: 2 /* VIDEO */ }; var m = /* @__PURE__ */ ((r) => (r.EAR = "ear", r.SPEAKER = "speaker", r))(m || {}), se = /* @__PURE__ */ ((r) => (r[r.FRONT = 0] = "FRONT", r[r.BACK = 1] = "BACK", r))(se || {}), H = /* @__PURE__ */ ((r) => (r.Camera = "camera", r.Microphone = "microphone", r.SwitchCamera = "switchCamera", r.InviteUser = "inviteUser", r))(H || {}), q = /* @__PURE__ */ ((r) => (r.Open = "open", r.Close = "close", r))(q || {}), ke = /* @__PURE__ */ ((r) => (r.LocalInLargeView = "local", r.RemoteInLargeView = "remote", r))(ke || {}), J = /* @__PURE__ */ ((r) => (r[r.INVITE = 1] = "INVITE", r[r.CANCEL_INVITE = 2] = "CANCEL_INVITE", r[r.ACCEPT_INVITE = 3] = "ACCEPT_INVITE", r[r.REJECT_INVITE = 4] = "REJECT_INVITE", r[r.INVITE_TIMEOUT = 5] = "INVITE_TIMEOUT", r))(J || {}); const me = { 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 }, lt = { 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 Ye = /* @__PURE__ */ ((r) => (r[r.NORMAL = 0] = "NORMAL", r[r.RELEASE = 1] = "RELEASE", r[r.WARNING = 2] = "WARNING", r[r.ERROR = 3] = "ERROR", r[r.NONE = 4] = "NONE", r))(Ye || {}); const Ce = { 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", 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" }, nt = { INNER_ATTR_KIT_INFO: "inner_attr_kit_info" }, ot = { 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", ...ot, ...Ce, ...nt }, st = "https://web.sdk.qcloud.com/component/TUIKit/assets/call.png", At = "https://web.sdk.qcloud.com/component/TUIKit/assets/call-video-reverse.svg", Fe = 2147483647, ye = 4; var Ue = /* @__PURE__ */ ((r) => (r[r.TUI_CALL_KIT = 14] = "TUI_CALL_KIT", r[r.TIM_CALL_KIT = 15] = "TIM_CALL_KIT", r))(Ue || {}), pe = /* @__PURE__ */ ((r) => (r[r.NUMBER_ROOM_ID = 1] = "NUMBER_ROOM_ID", r[r.STRING_ROOM_ID = 2] = "STRING_ROOM_ID", r))(pe || {}); function ct() { wx.hideKeyboard && wx.hideKeyboard({ complete: () => { } }); } function ut() { wx.getSystemInfoSync().platform === "devtools" && wx.showModal({ icon: "none", title: "运行环境提醒", content: "微信开发者工具不支持原生推拉流组件(即 标签),请使用真机调试或者扫码预览。", showCancel: !1 }); } function He() { ct(), ut(); } async function It(r, e) { try { He(); const t = { microphone: !0, camera: r === g.VIDEO }; return await e._tuiCallEngine.deviceCheck(t) ? h.CALLING : h.IDLE; } catch (t) { return console.debug(t), h.IDLE; } } function Ct(r) { (r == null ? void 0 : r.code) === -1002 && wx.showModal({ icon: "none", title: "error", content: (r == null ? void 0 : r.message) || "", showCancel: !1 }); } function Et() { wx.showModal({ icon: "none", title: "权限提示", content: "当前小程序 appid 不具备 的使用权限,您将无法正常使用实时通话能力,请使用企业小程序账号申请权限后再进行开发体验", showCancel: !1 }); } const dt = { // 按钮文案 hangup: "Hang up", reject: "Decline", accept: "Accept", camera: "Camera", microphone: "Microphone", speaker: "speaker", "open camera": "Open Camera", "close camera": "Close Camera", "open microphone": "Open Microphone", "close microphone": "Close Microphone", "video-to-audio": "Switch to audio", "virtual-background": "Blur Background", // 通话结果 "other side reject call": "other side reject call", "reject call": "Reject Call", cancel: "Cancel Call", "other side line busy": "other side line busy", "in busy": "in busy", "call timeout": "call timeout", "no response from the other side": "no response from the other side", "end call": "end call", // 通话提示语 "caller calling message": "Awaiting response", "callee calling video message": "invites you to a video call", "callee calling audio message": "invites you to a voice call", "no microphone access": "no microphone access", "no camera access": "no camera access", "invite member": "Invite Member", "Invited group call": "invites you to a group call", waiting: "Calling...", me: "(me)", // 弹出层文案 "browser-authorization": "Browser authorization", "mac-privacy": "System Preferences -> Security and Privacy -> Privacy", "win-privacy": "Setting -> Privacy and Security -> App permissions", "mac-preferences": "Open System Preferences", "win-preferences": "Open Setting", "Please enter userID": "Please enter userID", "View more": "View more", "people selected": "people selected", "Select all": "Select all", Cancel: "Cancel", Done: "Done", "exist group call": "A group call already exists in the current group", // UI3.0 新增 "camera enabled": "Camera On", "camera disabled": "Camera Off", "microphone enabled": "Unmuted", "microphone disabled": "Muted", "speaker enabled": "Speaker On", "speaker disabled": "Speaker Off", "open speaker": "Turn on speaker", "close speaker": "Turn off speaker", "wait to be called": "Waiting", answered: "Connected", "people in the call": " other(s) in the call", "failed to obtain speakers": "failed to obtain speakers", "you have a new call": "You have a new call", "switch camera": "Switch", join: "Join", "people on the call": "people on the call", "Supports a maximum of 9 people for simultaneous calls": "Supports a maximum of 9 people for simultaneous calls", you: "(you)", "The network is poor during your current call": "The network is poor during your current call", "The other user network is poor during the current call": "The other party's network is poor during the current call", "TUICallKit init is not complete": "TUICallKit init is not complete. You need to use this API after the init API is finished.", // combine chat "Video call": "Video call", "Voice call": "Voice call", "Call End": "Call End", "Switch voice call": "Switch voice call", "Switch video call": "Switch video call", "Call duration": "Duration", "Call Cancel": "Canceled", "Other Side Cancel": "Call canceled by caller", Decline: "Declined", "Other Side Decline": "Call declined by user", "No answer": "Call not answered", "Other Side No Answer": "Call wasn't answered", Answered: "Answered", "Other Side Line Busy": "Line busy", "Line Busy": "Line busy. Call not received.", // 待废弃文案 "Those involved": "Those involved in the call are", call: "call", "video-call": "video call", "audio-call": "audio call", search: "search", "search-result": "search result", "no-user": "user not found", "member-not-added": "member not added", "input-phone-userID": "phone number or userID", "not-login": "not logged in", "login-status-expire": "login status is invalid, please refresh the page and try again", "experience-multi-call": "experience multi-person calls, please download the full-featured demo: ", "not-support-multi-call": "multi-person call interface is not open", userID: "userID", "already-enter": "entered the call", "camera-opened": "Camera on", "camera-closed": "Camera off", "microphone-opened": "Mic on", "microphone-closed": "Mic off", timeout: "timeout", "kick out": "kick out", "image-resolution": "Resolution", "default-image-resolution": "Default", "invited-person": "Invite", "be-rejected": "Call declined, ", "be-no-response": "No response, ", "be-line-busy": "Line busy, ", "be-canceled": "The call is canceled, ", "voice-call-end": "Voice call ended", "video-call-end": "Video call ended", "method-call-failed": "Failed to sync the operation", "failed-to-obtain-permission": "Failed to obtain permissions", "environment-detection-failed": "Failed to check the environment", "switchToAudioCall-call-failed": "switch to audio call method failed", "switchToVideoCall-call-failed": "switch to video call method failed", "microphone-unavailable": "No mic found", "camera-unavailable": "No camera found", "ban-device": "Device access denied", "not-supported-webrtc": "Your current environment does not support WebRTC", "blacklist-user-tips": "The identifier is in blacklist. Failed to send this message!", "is-already-calling": "TUICallKit is already on a call", "need-init": "Before initiating a call with TUICallKit, ensure that the TUICallKitServer.init() method has executed successfully. ", "can't call yourself": "Can't call yourself", // eslint-disable-line "Use-phone-and-computer": "Use your mobile phone and computer to experience video calls", "Wechat scan right QR code": "Wechat scan right QR code", "Scan the QR code above": "Scan the QR code above", "accept-error": "Accept failed", "accept-device-error": "Accept failed, unable to auth calling device", "call-error": "Start call failed" }, ht = { // 按钮文案 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": "拒绝通话", cancel: "取消通话", "other side line busy": "对方忙线", "in busy": "正在忙", "call timeout": "呼叫超时", "end call": "结束通话", // 通话提示语 "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: "超时", "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": "发起通话失败" }, Lt = { // 按钮文案 hangup: "通話終了", reject: "拒否", accept: "応答", camera: "カメラ", microphone: "マイク", speaker: "スピーカー", "virtual-background": "ボケ背景", // 通话结果 "other side reject call": "通話が拒否されました", "reject call": "通話拒否", cancel: "通話をキャンセル", "other side line busy": "相手が通話中です", "in busy": "通話中", "call timeout": "呼び出しタイムアウト", "end call": "通話終了", // 通话提示语 "caller calling message": "応答を待っています", "callee calling video message": "ビデオ通話に招待されました", "callee calling audio message": "音声通話に招待されました", "no microphone access": "マイクにアクセスできません", "no camera access": "カメラにアクセスできません", "invite member": "メンバーを招待する", // 弹出层文案 "browser-authorization": "ブラウザ認証", "mac-privacy": "システム環境設定 -> セキュリティとプライバシー ->プライバシー", "win-privacy": "設定 -> セキュリティとプライバシー ->アプリのアクセス許可", "mac-preferences": "システム環境設定を開く", "win-preferences": "システム設定を開く", "Please enter userID": "ユーザーIDを入力してください", "View more": "もっと見る", "people selected": "人が選択されました", "Select all": "すべて選択", Cancel: "キャンセル", Done: "完了", "exist group call": "現在のグループには既にグループ通話が存在しています", // combine chat "Video call": "ビデオ通話を開始", "Voice call": "音声通話を開始", "Call End": "通話終了", "Switch audio 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": "忙しいので応答できません", // UI3.0文案 "open camera": "オープンカメラ", "close camera": "カメラを閉じる", "open microphone": "オープンマイク", "close microphone": "マイクを閉じる", "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を使用する必要があります。", // 待废弃文案 timeout: "タイムアウト", "kick out": "キックアウトされました", "Invited group call": "グループ通話に招待されました。", "Those involved": "参加者:", call: "通話", "video-call": "ビデオ通話", "audio-call": "音声通話", search: "検索", "search-result": "検索結果", "Wechat scan right QR code": "WeChatで右側にあるQRコードを読み取ります。", "Use-phone-and-computer": "携帯電話とコンピュータを使用してビデオ通話を体験してください", "Scan the QR code above": "上のQRコードを読み取ります。", "no-user": "ユーザーが見つかりませんでした", "member-not-added": "メンバーが追加されていません", "not-login": "ログインしていません", "login-status-expire": "ログインの有効期限が過ぎています。ページを更新してもう一度お試しください", "experience-multi-call": "複数人で同時に音声通話できるグループ通話機能を体験するには、全機能のデモをダウンロードしてください", "not-support-multi-call": "グループ通話インターフェイスが開いていません", "input-phone-userID": "携帯電話番号/ユーザーIDを入力してください", userID: "ユーザーID", "already-enter": "すでに通話に参加しています", waiting: "応答を待っています...", "camera-opened": "カメラがオンになっています", "camera-closed": "カメラがオフになっています", "microphone-opened": "マイクがオンになっています", "microphone-closed": "マイクがオフになっています", "image-resolution": "解像度", "default-image-resolution": "デフォルト解像度", "invited-person": "メンバーを招待", "video-to-audio": "音声通話に切り替えます", me: "(自分)", "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": "自分に電話をかけることができません", "accept-error": "接続できませんでした", "accept-device-error": "接続できませんでした。発信側デバイスを認証できません", "call-error": "通話が開始できませんでした" }, O = { 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" }, Me = { en: dt, "zh-cn": ht, ja_JP: Lt }; function S(r) { var i; const e = A.getData(n.CALL, a.LANGUAGE); for (const l in Me) if (l === e) { const o = Me[l]; for (const s in o) if (s === r) return o[s]; } const t = (i = r.en) == null ? void 0 : i.key; return console.error(`${a.PREFIX}translation is not found: ${r}.`), t; } const Ee = typeof wx < "u" && typeof wx.getSystemInfoSync == "function" && !!wx.getSystemInfoSync().fontSizeSetting, xe = typeof uni < "u" && typeof uni > "u", ve = Ee || xe, Je = typeof uni < "u", We = function() { return (typeof uni < "u" || typeof window < "u") && !ve; }(), gt = function() { return Ee ? wx : Je ? uni : window; }(), b = We && window && window.navigator && window.navigator.userAgent || "", ft = /Android/i.test(b), Dt = /(?:Windows Phone)/.test(b), _t = /(?:SymbianOS)/.test(b), St = /iPad/i.test(b) || /iPhone/i.test(b) || /iPod/i.test(b), ze = ft || Dt || _t || St, Oe = We && !ze, pt = Oe && b.includes("Windows NT"), Bt = Oe && b.includes("Mac"); let qe = class ie { constructor() { this.global = gt, 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 ie.instance || (ie.instance = new ie()), ie.instance; } initEnv() { this.isPC = Oe, this.isH5 = ze, this.isWeChat = Ee, this.isApp = xe && !Ee, this.isUniPlatform = Je, this.isWIN = pt, this.isMAC = Bt; } initOfficial(e) { this.isOfficial = e === 1400187352 || e === 1400188366; } }; const Ne = function(r) { return typeof r === a.UNDEFINED; }, Xe = function(r) { if (typeof r !== a.OBJECT || r === null) return !1; const e = Object.getPrototypeOf(r); if (e === null) return !0; let t = e; for (; Object.getPrototypeOf(t) !== null; ) t = Object.getPrototypeOf(t); return e === t; }, je = function(r) { return typeof Array.isArray === a.FUNCTION ? Array.isArray(r) : Object.prototype.toString.call(r).match(/^\[object (.*)\]$/)[1].toLowerCase() === a.ARRAY; }, Be = function(r) { return typeof r === a.STRING; }, wt = function(r) { return typeof r === a.BOOLEAN; }, Ze = function(r) { return ( // eslint-disable-next-line r !== null && (typeof r === a.NUMBER && !isNaN(r - 0) || typeof r === a.OBJECT && r.constructor === Number) ); }; function $e(r) { const e = Math.floor(r / 3600), t = Math.floor(r % 3600 / 60), i = Math.floor(r % 60); let l = e > 9 ? `${e}` : `0${e}`; return l += t > 9 ? `:${t}` : `:0${t}`, l += i > 9 ? `:${i}` : `:0${i}`, l; } function Ut(r) { if (typeof r === a.STRING) try { return !!JSON.parse(r); } catch (e) { return console.debug(e), !1; } return !1; } const ce = function(r) { return !r || !Ut(r) ? r : JSON.parse(r); }; function Qe(r) { return (r == null ? void 0 : r.message.indexOf("is ongoing, please avoid repeated calls")) !== -1; } function Ot(r) { const { message: e } = r; return e.indexOf("NotAllowedError: Permission denied") !== -1; } function fe() { return Date.now(); } const Nt = function(r) { return typeof r === a.FUNCTION; }, Rt = () => { if (qe.getInstance().isWeChat) return "zh-cn"; const r = ((navigator == null ? void 0 : navigator.language) || (navigator == null ? void 0 : navigator.userLanguage) || "").substr(0, 2); let e = "en"; switch (r) { case "zh": e = "zh-cn"; break; case "ja": e = "ja_JP"; break; default: e = "en"; } return e; }, Tt = function(r) { return Object.prototype.toString.call(r).match(/^\[object (.*)\]$/)[1].toLowerCase(); }; function Gt(r, e, t) { if (!r.hasOwnProperty(e)) return r; const i = {}; return Object.keys(r).forEach((l) => { l === e ? i[t] = r[l] : i[l] = r[l]; }), i; } const mt = "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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", Pe = "data:audio/mpeg;base64,SUQzAwAAAAABRlRSQ0sAAAACAAAAMVRDT04AAAAIAAAAQW1iaWVudFRYWFgAAAAQAAAAVFhYWAAwLjcwNzk2NTE0VFBFMQAAAB0AAABTdGV3YXJ0IFJ1c3NlbGwgLSBzY3J1c3MuY29tVElUMgAAAF0AAAH//lcAZQBzAHQAZQByAG4AIABFAGwAZQBjAHQAcgBpAGMAIAAcIFAAcgBpAG4AYwBlAHMAcwAdICAAVABlAGwAZQBwAGgAbwBuAGUAIABSAGkAbgBnAGkAbgBnAP/7FGQADTBFAK+IAAAACaAWiAADAQFwAPgUMQAAMoAfgoAwAEA6X+g1/1hwyAyAQAaw4Cf9BmQqCAYnMuflPiB2QghiQMRxz0cP/24n/er0FPOAHij9xBP2Az+lXwQDH//7FGQIgACfEEWGFEAAFSIY4MaIAAHwCzK4sYAAP4Llgx4wAKjIIeADwJx5QLnmifiA/4sOL5s56H/yaSAeAAAC/NmidyyNfLoZGKFC6VsI6/C3q8VK/2aer/0VAeugPv/7FGQCD9BnAcsHMAAMDeBZYeeAAQIcEyYMBEBAOAFlBPGEAIuS6U2f9STsCqASaN4WWuo6v+vv2bhUFaqDsVRIPBRjW3os7ffyf0II5lgCdLjSmsZLd1f/WhtkyFDMy//7FGQDD/CCAsmDAggADAA5YDAhAYH0CSQEGGAAMQEkwPMAAAc1ziCL+lyV7/oAm2QbVdv/9TiwyWoCiBa0hNxxTAKLX30/xT/ULhQZg4g2eJx2zmP11SJ0vD6cBmEAkf/7FGQEj9BwBEoDBhgADSA5UTBDAIHECSwIDAAwL4FlAPGIBG2cAK1oIAKYxBknAVO31aelNIOiqKZZEAMeun/MrZyKCaNQlhxVVt8Xf2f1qg5L+hHHsRptuR8r9IfWUv/7FEQHj/BhA0mDAxAADaA5QGBAAAHECyYMJEAAMQDlgYEEBCAgUcxAZTojt2uoJCw4M2LJnhO52j+jd9YtV1gE2dmiabP/1rTVM7HNBhgVO7f9H/1iAFJuRul0V/3f/P/7FGQLD9BbAcsDAhAIDAA5YTAgAQE8CS4MCEAwLYElRPKIAKVmtL2jwiqnd/66UATijC5YvNM/3dFaBZHFVggC2xdr/91JwAABqhZH//wwVVJwAprJhkhSrv+j6CgBQv/7FGQSjdBdA8sCARAYC8ApkiBDAQFUBywsBEAgMIDlyGAIBMk/v3/5NaSazNUCDAAABdTSaS1K/0egIAAGM0iCxH//+0iDBAAiQFiRiv/7eyvSBgSO4gdUYAGW3/VIKv/7FGQZCfBmAcwx4RgIDYA5YjwjAQFUBzMhCAAgMQGlAJCIBAbgXWYSoqL/rICKJYLnmn9f/W3bpHqAAai9P9PETWGgMnAuHWm9//0+iiPuetYtH/+cSwAhMJf/Z9RI3v/7FEQeD/BNAMmB4hgACyApcDwiAQFYDSgEhEAwKAElgMGIBou6QwAeNPnn/9sm40JJRQkcSt0ftcb76mAAAZBOXRpX/VSXDgAkAEDBYAT+ln6KADCY1NX/jGMaxYEGEv/7FGQnCdBFAUuB4gAMC6ApYRhgAQFEBS7DBEAgK4FlQGEIBBnD7kD//9A+QAED4JUPCa9NP7ces0BZsDiNeFgVR/Z9//1lAABjMBN//9XvHKSNAyOMIKduj4buXRgAAv/7FGQwDfBhAUuQYRgICmBJdQhDAQFUCTBEiGAgKoFlQCCIBinAVFs//29lTIAAJAuYXWb/7nKRPrYDN0405b/7u1RAgDICN/q//5jgAEGj/+kqqljugEAMGwulDyt6Nv/7FGQ4DfBrA0mJhhgADQBJMCBjAAF4BzBDBCAgKgClgDCMBjE+OCgN9AwKPcZTd6f+aTYAEAARoYT6hZUBAAiAAAHlRA8HP+7b5sARmmKe3T/u56zqDFdOIeQUQsn3P//7FGQ9jZBbAkwR4wAIDSAZciQhAQEsBy4mAEAgJIDmWGCABL3L63gCwVO//10pGNeloAACIcDMEXL/6zoo5JwYPNkgZHUnxcKo9hD/QEdadZlm098cWb+kMwCpfd/22v/7FGRGDTBUAU0IQwgMDEAJMAxCAAGACSwIDCAgJgCpEICEBhc71MQsegBFIAAAABPzH4p+NaWqNu+scRkgMNi759IxnoGei6sHQygB4qOSMqYn+GRGoSHADAWG//9qwv/7FGRNhdByAUxJ4xgICsApYCAgAYGgCSgHjCAAKwBmSFCEBOFl6QQoPAYEw1suf/9Ok4BYCwWWHElM6e7t7aNCoDnVgl53//XUywUoFVamEAJ4MWQD1X68tl6WL6+uCP/7FGRTC5B3AcuR4QgIDMBZQDxhAQFkByynhAAwM4Cl2GCABBMAAAabFqd/0snOT2rCAQgACYUxJ///cv/SLQqBijkFqHf9PdrUAkwaJhlPZvTpFCsXZsGkgQwvavMhMv/7FGRXC9CGAcuwwQgIDkBZQCQiAQHUDSoHmEAgLYAmCCEIBKIXIKeLMb+7V//UgDYMCcoJXu9/1IKpIEAUBkuc//p/Ji+qIAACnfGRyR17v/zRtgAGwi2Dcn/9dn0oAf/7FGRYhdBcAUoBIRAIDUBpMCRCAAH4CTDHjAAgPQDlSMEAAAtYTFEsEBiP/999CRgEsIvlD3X9nY9S6ggAABWgJSBRn/v/tMCxAAACu2nVL7H/7AeeAxcsW/1DBV0z1f/7FGRahXByAcwxgQAIDKAphhhgAQGABywHhEAwKIClQGGIBOx1n/qJtcccNC4zQqP9dQdkFA4wYX819X/+soAIhAACIOC6v9Xy7P/QLxTiWaF3NrZvTYv/8UCsAG2hP//7FGRgDdBTAUoB4RgIDIA5QCwiAAFwAywmDEAgMYDlyCCIBP+1MbSrmAIeoljkK/6v0vSTaoQPtY9Hr/+SFAYBFQEdTjX/cr9H348oBChaf//W4Ny0YgQMgAAnQAIMff/7FGRmjZBkAUuR4ggIC4BJYTBDAQGMDygGDGAgL4Cl2GGABP/2PqTpBeQw9HijHCunvkiH5YOaHxW/+27/aqAKFBJhgw91ztuQL/TVFQ8hTBwCEbfd/7nJJAACTPjQAf/7FERsD/BtAcsRIhAIDWApcjRjAQGoFyQGAGQAKIElQPEIAPTq6dAVI2qEZhDDRIdKhd932TG2xBQBGAdVOj/zZ2meKgwUEww45IoGjtfd//rAIAGaZGmFsT79ILMBVP/7FGRwj5BjA0qCAxgIDYAZhiRBAQG0CSgHiAAALgDl2MCABA0V+j7l3upxYQ8kEC4NkfX6P/o9ddWAcgAAFLwVhv9HYs0arsAFAABM6zoIP///d/WBtELApXqNen1VJf/7FGR1DdBRAsuBgwgMCuA5YDxBAYGgCSxGCCAAKoDlyGEMBGwAyjDAe7U3/1JXR1epB1H9AqMWLEqKzI3/SHODwB0Du9b9vdFlB14EHDGGumu9vSgpkReUYWEDO101/v/7FGR8hdBwAcwxIRAICsBJUDxgAQFwCywHjCAwM4ClhGAABCrWISjbXQQZDTzapj2q/m1aAckGYGQdJkmLetUl+1msE4xA2D5Iy+n//+sdsMhMg5xqav/V9SVDlRpEhP/7FGSBj9BgAkoBZhgIDkA5QjwjAAG8BygHiAAALwClyGCIBHg8PNRzrF7fl+owA9psY6WaQG/+v0fvlxM2skIGOixVAp77v/SA58IzT/X/3/VQIuIMVFLW//9DmFwsGP/7FGSFj9BqA0qAxhAACiBJQBjDAAGECSwEjEAwMoDlBJEEAFH2sV/V/uEowJCvU4gLAT/ocj+gDzgVwAf2vxluBIpVCmZABgSgZSjiZpnV18PIABlULhYs0f/9O0cGNv/7FGSLAVBuAkuxgxAIDWA5hiwhAQFoBywEiEAwNYDlRIEAAJQTFhA1xx+lyUeg+pxfd1oT1hsuarK/AgbaOUszMMte/JzhFQNn27CgsAwyJhmN0h0ICcVOD14r+pxSif/7FGSPD/BlAkoDAxgAC4BJQBhgAQGcCygMBEAgLwFlQPGEBFWPj1k3gAIZJfRC/YwwfJmeQYVj4x9zOQNIv/mK+PFQKiMa1t/Fn1un2/cWveqKv3O+GcMUT/23UCARav/7FGSUj/ByAcoDAggADoBZMEBBAAFoCSwHiAAgNQIlAPCMBP5V4PRpBYjQs1Zl3XM+9BuJrq92No35KkZGbUZsyUvIcMj0B8AACrI1ltA7d/71bpEPaEJWUrd9yi5gyv/7FGSXj/BoAcqDCQAIDgA5UTxCAAGkDSgHhEAAJwElAMGIACU2L1cKv1xzp/aI5oTy9pd10HcZPjBHtAg8IZ36uf1/+DxQpbzI4bG9dntawgFhcY2troflWY8ZMRPOmf/7FGScifBWAcsB4RgMCsAZUCwiAYFoByyniGAgLYElQMEEBMolllTRur4JmjZcpUnVG2uDKZSAB+1ZxWsfSPU1oDCS/NNt39CIJQmrT77/5xwwJnO2BgIMBSwADzm9Tf/7FGSkD9BzA0qB4xgAC8ApYSQjAAJ4BS4MBEAARoLlwLCMAGKAVEkh/nMaz6iF9f/ZTEfxOaY2qiompWokIBa+JncUEBwid6CYgPENEZv+E2+C6YPgS0BEAPqZNlK6QP/7FGSiAABfAk2FJAAIDUAJoKGAAAQ4lVYYU4AAYhKpAwQgAP5t7f/ni34hf4wJmYlqiAdtgAA/u9OIkS0SWH0RCABCWxSlM/+Fff//N4YZWW/VVTUSwHGM//0MB4m////7FGSWAAEQJFYGIGAAH6SKhcEIAERYjWgYhAAAgxJrAw5wAM03RBEik95zIQZxelVe2PsFyYpF+aXidQ6lQM7B8ziH6bqb1EVV8RGFR4N/N8VkR2B6Zn031PaNmYuyef/7FGRxAREfHljnLUACHuO6zOOcAAOUdZfigFZwUo6qrNAeyL4n6GEqVg8PJGk4FTMleniINmZnawAAM9iYXAcKyku5yVfN0N/Ce7ppm//GvBP8PIOhAB/9XNNm1k0AIP/7FGRVAAEcHeT9JEAMGcQqgKUoAEP8jWoYcoAAeZGrgw5wAYR/VW/6lQEObr6/s/oFnahKFTM0cTDyjDuPREYXA28iMWMtZmZtuNS+v//8CIbwMAIwQaB6LrfqjUFChv/7FGQ1ARD1HeP/GKAMIEOq7OQcAAPkeZPgGOE4b47qUNAqwIGxt9X1DGQ+n50JwfH2E9AbbU7YP0AHUSEUBEkXuayOioi/4J+npt/0CD5VP/6z4KUpv/+ojkNP//1BeP/7FGQWAADjHeDlCEAMEoO6sKacAEP0kWoYcoAIVhDsQwpQAWLHsf5x9BSXQuBhLPbjKES4fwMRQb9z7asiBvwAUCLlEkCv/wicg8QH//TQdlz/l5DfDPqQXvG9/26Thf/7FGQCA7B2HdmHNKAADIAbVOAIAQIUR26ABKKAL48rYNAWyJo83/6gKP///8KQD/gQAVFzeJk/7P/kwP/xdhRMTrUACv00/4g//yAYf/0BQbq//pt9g1oUDAfr3yAL///7FGQEAAB8EdotFKAADOPK8KKIAAJoU3AYUoAANQPtAwQgAP+AxFdH6KK//4gAd///B////BD9H016OkYCe3SqJGCu+B0/r73zwNf/hHDKd+qi7+p+cxcl//jwEfT/+P/7FGQDi/BqHdqHHOAADUO7EOKUAAE8RXEAAOEQMo6qwKAeyEBJ///+Vb//ANW//92///8KH9SigwdO3T/8VO/9f/6COA4f//8PfsIGaP/0NARX//1CMt///8uB+YAAa//7FEQJAABpHdkFKOAADSAbuKAIAILIjWoYcoAIYRGtAwRwARUWcSd/h7/6f/wsYeWC/366YgCYLj3T/22c32bxMM/7WRrB/v1ylhwEMScPdPX1ajOS+LG8Tjn/8riDhP/7FGQCgABnCV4GFEAADYEbUMEIAAGwd2gcoQAAM47rg5RwAJveumxH+WvR/+DdnBer034t8WXfvR//GQZmt//0Fif///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 Ft { constructor() { this._bellContext = null, this._isMuteBell = !1, this._calleeBellFilePath = Pe, this._callRole = F.UNKNOWN, this._callStatus = h.IDLE, this._handleAudioInterruptionBegin = async () => { await this.stop(); }, this._handleAudioInterruptionEnd = async () => { this._callStatus !== h.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 = mt; this._callRole === F.CALLEE && (t = this._calleeBellFilePath || Pe), 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 = Ne(e.isMuteBell) ? this._isMuteBell : e.isMuteBell; } async play() { try { if (this._callStatus !== h.CALLING) return; this.setBellSrc(), this._callRole === F.CALLEE && !this._isMuteBell && await this._bellContext.play(), this._callRole === F.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 !== h.CALLING && this._callRole !== F.CALLEE || (e ? await this.stop() : await this.play()); } destroy() { try { this._isMuteBell = !1, this._calleeBellFilePath = "", this._callRole = F.UNKNOWN, this._callStatus = h.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 w() { return function(r, e, t) { const i = t.value, l = /* @__PURE__ */ new Set(); return t.value = async function(...o) { var s, u; if (l.has(this)) { console.warn(`${a.PREFIX}previous ${e}() is ongoing, please avoid repeated calls`), (u = (s = this == null ? void 0 : this.getTUICallEngineInstance()) == null ? void 0 : s.reportLog) == null || u.call(s, { name: "TUICallKit.avoidRepeatedCall.fail", data: { name: e }, error: `previous ${e}() is ongoing` }); return; } try { l.add(this); const c = await i.apply(this, o); return l.delete(this), c; } catch (c) { throw l.delete(this), c; } }, t; }; } const ae = a.PREFIX + "API"; function y(r) { return function(e, t, i) { let l = i.value; return i.value = function(...o) { return yt.call(this, r, o, t), l.apply(this, o); }, i; }; } function yt(r, e, t) { try { if (e[0].SDKAppID || (r = Gt(r, "SDKAppID", "sdkAppID")), je(r)) for (let i = 0; i < r.length; i++) Ve.call(this, { ...r[i], value: e[i], name: t }); else for (const i in r) r.hasOwnProperty(i) && Ve.call(this, { ...r[i], value: e[0][i], name: t, key: i }); } catch (i) { throw console.error(i), i; } } function Ve({ required: r, rules: e, range: t, value: i, allowEmpty: l, name: o, key: s }) { if (Ne(i)) { if (r) throw new Error(`${ae}<${o}>: ${s} is required.`); return; } const u = e.some((E) => E === Tt(i)); let c = ""; if (!u) { for (let E = 0; E < e.length; E++) { let I = e[E]; I = I.replace(I[0], I[0].toUpperCase()), c += `${I}/`; } throw c = c.substring(0, c.length - 1), new Error(`${ae}<${o}>: ${s} must be ${c}, current ${s} is ${typeof i}.`); } if (l === !1 && Be(i) && i.trim() === "") throw new Error(`${ae}<${o}>: ${s} is blank.`); if (je(t) && t && t.indexOf(i) === -1) throw new Error(`${ae}<${o}>: ${s} error, only be ${t}, current ${s} is ${i}.`); if (Be(t) && t.indexOf("~") !== -1) { const E = t.split("~"); if (i < +E[0] || i > +E[1] || Ze(i) && Number.isNaN(i)) throw new Error(`${ae}<${o}>: ${s} error, only be ${t}, current ${s} 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~${Fe}`, 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~${Fe}`, 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: [ne.CONTAIN, ne.COVER, ne.FILL], allowEmpty: !1 } ], setVideoResolution: [ { key: "resolution", required: !0, rules: [a.STRING], range: [oe.RESOLUTION_1080P, oe.RESOLUTION_480P, oe.RESOLUTION_720P], allowEmpty: !1 } ] }; function Le(r) { return function(e, t, i) { let l = i.value; return i.value = function(...o) { return Mt.call(this, r, o, t), l.apply(this, o); }, i; }; } function Mt(r) { if (r != null && r.engineInstance && !this._tuiCallEngine) { const e = `${a.PREFIX} ${S("TUICallKit init is not complete")}`; throw console.error(e), e; } } function de(r) { if (typeof r != "object" || r === null) return r; let e = Array.isArray(r) ? [] : {}; for (let t in r) r.hasOwnProperty(t) && (e[t] = de(r[t])); return e; } class vt { constructor() { this.defaultStore = { callStatus: h.IDLE, callRole: F.UNKNOWN, callMediaType: g.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: Rt(), // en, zh-cn isClickable: !1, // 是否可点击, 用于按钮增加 loading 效果,不可点击 deviceList: { cameraList: [], microphoneList: [], currentCamera: {}, currentMicrophone: {} }, showPermissionTip: !1, netWorkQualityList: [], // 显示网络状态差的提示 isMuteSpeaker: !1, groupID: "", roomID: 0, roomIdType: 0, cameraPosition: se.FRONT, // 前置或后置,值为front, back groupCallMembers: [], // chat 群会话在的通话中的成员 // TUICallKit 组件上的属性 displayMode: ne.COVER, // 设置预览远端的画面显示模式 videoResolution: oe.RESOLUTION_480P, 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: ke.RemoteInLargeView } }, this.store = de(this.defaultStore), this.prevStore = de(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, l) => ({ ...i, [l]: this.defaultStore[l] }), {}); this.store = { ...this.defaultStore, ...this.store, ...t }; } } let ge = class re { constructor() { this.timerId = -1, this.storeMap = { [n.CALL]: new vt() }, 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 l = this.task[e]; Object.keys(t).forEach((o) => { const s = t[o]; l[o] || (l[o] = /* @__PURE__ */ new Map()), l[o].set(s, 1); const { notifyRangeWhenWatch: u } = i || {}; if (u === a.ALL && this.notify(e, o), u === a.MYSELF) { const c = this.getData(e, o); s.call(this, c); } }); } /** * 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((l) => { i[l].delete(t[l]); }); } /** * 通用 store 数据更新,messageList 的变更需要单独处理 * @param {StoreName} storeName store 名称 * @param {string} key 变更的 key * @param {unknown} data 变更的数据 */ update(e, t, i) { var l; (Be(i) || Ze(i) || wt(i)) && this.storeMap[e].store[t] === i || ((l = this.storeMap[e]) == null || l.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 l = i[t], o = this.getData(e, t); for (const [s] of l.entries()) s.call(this, o); } } reset(e, t = [], i = !1) { if (e in this.storeMap) { const l = this.storeMap[e]; t.length === 0 && (t = Object.keys(l == null ? void 0 : l.store)), l.reset(t), i && t.forEach((o) => { this.notify(e, o); }); } } // 批量修改多个 key-value updateStore(e, t) { const i = t || n.CALL; Object.keys(e).forEach((l) => { this.update(i, l, e[l]); }); } }; const p = ge.getInstance(); function we(r, e) { const t = { userId: r, nick: "", avatar: "", remark: "", displayUserInfo: "", isAudioAvailable: !1, isVideoAvailable: !1, isEnter: !1, domId: e || r }; return e ? t : { ...t, isEnter: !1 }; } async function Qt(r, e) { var i, l, o, s, u; let t = we(r, a.LOCAL_VIDEO); try { if (!e) return t; const c = await e.getMyProfile(), E = p == null ? void 0 : p.getData(n.CALL, a.LOCAL_USER_INFO); return (c == null ? void 0 : c.code) === 0 && (t = { ...t, ...E, userId: (i = c == null ? void 0 : c.data) == null ? void 0 : i.userID, nick: (l = c == null ? void 0 : c.data) == null ? void 0 : l.nick, avatar: (o = c == null ? void 0 : c.data) == null ? void 0 : o.avatar, displayUserInfo: ((s = c == null ? void 0 : c.data) == null ? void 0 : s.nick) || ((u = c == null ? void 0 : c.data) == null ? void 0 : u.userID) }), t; } catch (c) { return console.error(`${a.PREFIX}getMyProfile failed, error: ${c}.`), t; } } async function Ae(r, e) { let t = r.map((i) => we(i)); try { if (!e) return t; const i = await e.getFriendProfile({ userIDList: r }); if (i.code === 0) { const { friendList: l = [], failureUserIDList: o = [] } = i.data; let s = o.map((I) => I.userID); if (o.length > 0) { const I = await e.getUserProfile({ userIDList: o.map((L) => L.userID) }); (I == null ? void 0 : I.code) === 0 && (s = (I == null ? void 0 : I.data) || []); } const u = p == null ? void 0 : p.getData(n.CALL, a.REMOTE_USER_INFO_LIST), c = l.map((I) => I.userID), E = s.map((I) => I.userID); t = r.map((I) => { var j, Z, $, ee, x, Re, Te; const L = we(I), f = c.indexOf(I), U = E.indexOf(I); let N = "", G = "", X = "", P = ""; f !== -1 && (N = ((j = l[f]) == null ? void 0 : j.remark) || "", G = (($ = (Z = l[f]) == null ? void 0 : Z.profile) == null ? void 0 : $.nick) || "", X = N || G || L.userId || "", P = ((x = (ee = l[f]) == null ? void 0 : ee.profile) == null ? void 0 : x.avatar) || ""), U !== -1 && (G = ((Re = s[U]) == null ? void 0 : Re.nick) || "", X = G || L.userId || "", P = ((Te = s[U]) == null ? void 0 : Te.avatar) || ""); const R = u.find((tt) => tt.userId === I) || {}; return { ...L, ...R, remark: N, nick: G, displayUserInfo: X, avatar: P }; }); } return t; } catch (i) { return console.error(`${a.PREFIX}getRemoteUserProfile failed, error: ${i}.`), t; } } function K(r, e, t) { const i = p.getData(n.CALL, a.IS_GROUP); let l = `${S(r)}`; return i && (l = e ? `${e} ${l}` : l, l = t ? `${l} ${t}` : l), l; } function ue() { const r = p.getData(n.CALL, a.CALL_STATUS); if (r === h.IDLE) return T.IDLE; const e = p.getData(n.CALL, a.IS_GROUP); if (r === h.CALLING) return e ? T.DIALING_GROUP : T.DIALING_C2C; const t = p.getData(n.CALL, a.CALL_MEDIA_TYPE); return e ? t === g.AUDIO ? T.CALLING_GROUP_AUDIO : T.CALLING_GROUP_VIDEO : t === g.AUDIO ? T.CALLING_C2C_AUDIO : T.CALLING_C2C_VIDEO; } async function Pt(r, e, t, i) { let l = []; try { const o = await e.getGroupMemberList({ groupID: r, count: t, offset: i }); if (o.code === 0) return o.data.memberList || l; } catch (o) { return console.error(`${a.PREFIX}getGroupMember failed, error: ${o}.`), l; } } async function Vt(r, e) { let t = {}; try { return (await e.getGroupProfile({ groupID: r })).data.group || t; } catch (i) { return console.warn(`${a.PREFIX}getGroupProfile failed, error: ${i}.`), t; } } function et(r, e) { r === 0 && e ? (p.update(n.CALL, a.ROOM_ID, e), p.update(n.CALL, a.ROOM_ID_TYPE, pe.STRING_ROOM_ID)) : (p.update(n.CALL, a.ROOM_ID, r), p.update(n.CALL, a.ROOM_ID_TYPE, pe.NUMBER_ROOM_ID)); } function Q(r) { return (r == null ? void 0 : r.data) || {}; } function De(r) { if (r.length === 0) return; let e = p.getData(n.CALL, a.REMOTE_USER_INFO_LIST); r.forEach((t) => { e = e.filter((i) => i.userId !== t); }), p.update(n.CALL, a.REMOTE_USER_INFO_LIST, e), p.update(n.CALL, a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, e); } function _e(r, e, t) { if (Ot(r)) { let i = ""; e === g.AUDIO && (i = K(O.NO_MICROPHONE_DEVICE_PERMISSION)), e === g.VIDEO && (i = K(O.NO_CAMERA_DEVICE_PERMISSION)), i && p.update(n.CALL, a.TOAST_INFO, { text: i, type: a.ERROR }), console.error(`${a.PREFIX}call failed, error: ${r.message}.`); } } function k(r, e) { let t = p.getData(n.CALL, a.LOCAL_USER_INFO); e === a.AUDIO && (t = { ...t, isAudioAvailable: r }), e === a.VIDEO && (t = { ...t, isVideoAvailable: r }), p.update(n.CALL, a.LOCAL_USER_INFO, t), p.update(n.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, t); } class he { 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 }, Xe(t) && (i = { ...i, ...t }), Nt(e) && (t = e, e = a.TIMEOUT); const l = { taskID: this.generateTaskID(), loopCount: 0, intervalID: null, timeoutID: null, taskName: e, callback: t, ...i }; return this.taskMap.set(l.taskID, l), e === a.INTERNAL ? this.interval(l) : this.timeout(l), l.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: l } = this.taskMap.get(e); return t && clearInterval(t), i && clearTimeout(i), l && document.removeEventListener("visibilitychange", l), 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; } } he.taskMap = /* @__PURE__ */ new Map(); he.currentTaskID = 1; const Kt = function(r) { if (r === null || typeof r > "u") return !0; if (typeof r == "boolean") return !1; if (typeof r == "number") return r === 0; if (typeof r == "string" || typeof r == "function" || Array.isArray(r)) return r.length === 0; if (r instanceof Error) return r.message === ""; if (Xe(r)) { for (const e in r) if (Object.prototype.hasOwnProperty.call(r, e)) return !1; return !0; } return !1; }, Se = "_local_user_id"; class Y { constructor() { this._viewConfig = { viewBackground: { local: {}, remote: {} } }, this._isSetViewBackgroundConfig = { remote: !1, local: !1 }, this._tuiCallEngine = null, this._tuiStore = null; } static getInstance() { return Y.instance || (Y.instance = new Y()), Y.instance; } _updateViewBackground() { var i, l, o; const e = (i = this._tuiStore) == null ? void 0 : i.getData(n.CALL, a.CUSTOM_UI_CONFIG), { userId: t } = (l = this._tuiStore) == null ? void 0 : l.getData(n.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( n.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: l } = (t = this._tuiStore) == null ? void 0 : t.getData(n.CALL, a.LOCAL_USER_INFO); if (Object.keys(this._viewConfig.viewBackground.remote).includes(l) && (delete this._viewConfig.viewBackground.remote[l], this._updateViewBackground()), !this._isSetViewBackgroundConfig.local) return; const o = this._viewConfig.viewBackground.local, s = o[l] || o[Se]; o[l] = o[Se], this._viewConfig.viewBackground.local = { [l]: s }, this._updateViewBackground(); } else { let l = this._viewConfig.viewBackground.remote; this._isSetViewBackgroundConfig.remote && Object.keys(l).includes("*") && (((i = this._tuiStore) == null ? void 0 : i.getData(n.CALL, a.REMOTE_USER_INFO_LIST)).map((u) => u.userId).forEach((u) => { Object.keys(l).includes(u) || (l[u] = l["*"]); }), this._viewConfig.viewBackground.remote = l, this._updateViewBackground()); } } hideFeatureButton(e) { var i, l, o, s, u; (l = (i = this._tuiCallEngine) == null ? void 0 : i.reportLog) == null || l.call(i, { name: "TUICallKit.hideFeatureButton.start", data: { buttonName: e } }); const t = (o = this._tuiStore) == null ? void 0 : o.getData(n.CALL, a.CUSTOM_UI_CONFIG); (u = this._tuiStore) == null || u.update( n.CALL, a.CUSTOM_UI_CONFIG, { ...t, button: { ...t.button, [e]: { ...((s = t.button) == null ? void 0 : s[e]) || {}, show: !1 } } } ); } setLocalViewBackgroundImage(e) { var i, l, o; (l = (i = this._tuiCallEngine) == null ? void 0 : i.reportLog) == null || l.call(i, { name: "TUICallKit.setLocalViewBackgroundImage.start", data: { url: e } }), this._isSetViewBackgroundConfig.local = !0; let { userId: t } = (o = this._tuiStore) == null ? void 0 : o.getData(n.CALL, a.LOCAL_USER_INFO); Kt(t) && (t = Se), this._viewConfig.viewBackground.local = { [t]: e }, this._updateViewBackground(); } setRemoteViewBackgroundImage(e, t) { var i, l; (l = (i = this._tuiCallEngine) == null ? void 0 : i.reportLog) == null || l.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, l; (l = (i = this._tuiCallEngine) == null ? void 0 : i.reportLog) == null || l.call(i, { name: "TUICallKit.setLayoutMode.start", data: { layoutMode: e } }); const t = this._tuiStore.getData(n.CALL, a.CUSTOM_UI_CONFIG); this._tuiStore.update( n.CALL, a.CUSTOM_UI_CONFIG, { ...t, layoutMode: e } ); } setCameraDefaultState(e) { var i, l; (l = (i = this._tuiCallEngine) == null ? void 0 : i.reportLog) == null || l.call(i, { name: "TUICallKit.setCameraDefaultState.start", data: { isOpen: e } }); const t = de(this._tuiStore.getData(n.CALL, a.CUSTOM_UI_CONFIG)); Object.keys(t.button).includes(H.Camera) || (t.button[H.Camera] = {}), t.button[H.Camera].state = e ? q.Open : q.Close, this._tuiStore.update(n.CALL, a.CUSTOM_UI_CONFIG, t); } } const Ie = ge.getInstance(), v = { audioCall: () => S("Voice call"), videoCall: () => S("Video call"), switchToAudio: () => S("Switch audio call"), switchToVideo: () => S("Switch video call"), hangup: ({ callDuration: r }) => `${S("Call duration")}:${r}` }; class W { constructor(e) { var t, i, l; this._callService = e.callService, te.registerEvent(B.TUILogin.EVENT.LOGIN_STATE_CHANGED, B.TUILogin.EVENT_SUB_KEY.USER_LOGIN_SUCCESS, this), (t = B.TUIChat) != null && t.EVENT && te.registerEvent((i = B.TUIChat.EVENT) == null ? void 0 : i.CHAT_STATE_CHANGED, (l = B.TUIChat.EVENT_SUB_KEY) == null ? void 0 : l.CHAT_OPENED, this), te.registerService(B.TUICalling.SERVICE.NAME, this), te.registerExtension(B.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 || {}; te.callService({ serviceName: B.TUIChat.SERVICE.NAME, method: B.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, l; if (e === B.TUIChat.EXTENSION.INPUT_MORE.EXT_ID) { if ((l = (i = this._callService.getTUICallEngineInstance()) == null ? void 0 : i.reportLog) == null || l.call(i, { name: "TUICallKit.onGetExtension", data: { extensionID: e, params: t } }), Ne(t)) return []; if ([B.TUIChat.TYPE.ROOM, B.TUIChat.TYPE.CUSTOMER_SERVICE].includes(t.chatType)) return []; let o = []; const s = { weight: 1e3, text: "语音通话", icon: st, data: { name: "voiceCall" }, listener: { onClicked: async (c) => await this._handleTUICoreOnClick(c, c.type || g.AUDIO) } }, u = { weight: 900, text: "视频通话", icon: At, data: { name: "videoCall" }, listener: { onClicked: async (c) => await this._handleTUICoreOnClick(c, c.type || g.VIDEO) } }; return t != null && t.chatType ? o = [s, u] : (!(t != null && t.filterVoice) && o.push(s), !(t != null && t.filterVideo) && o.push(u)), o; } } async onCall(e, t) { e === B.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 l, o, s, u, c, E, I, L; try { if (e === B.TUILogin.EVENT.LOGIN_STATE_CHANGED) if (t === B.TUILogin.EVENT_SUB_KEY.USER_LOGIN_SUCCESS) { const { chat: f, userID: U, userSig: N, SDKAppID: G } = it.getContext(); await ((l = this._callService) == null ? void 0 : l.init({ tim: f, userID: U, userSig: N, sdkAppID: G, isFromChat: !0, component: Ue.TIM_CALL_KIT })), (o = this._callService) == null || o.setIsFromChat(!0), (s = this._callService) == null || s.setLogLevel(Ye.NORMAL), this._addListenChatEvent(); } else t === B.TUILogin.EVENT_SUB_KEY.USER_LOGOUT_SUCCESS && (this._removeListenChatEvent(), await ((u = this._callService) == null ? void 0 : u.destroyed())); if ((c = B.TUIChat) != null && c.EVENT && e === B.TUIChat.EVENT.CHAT_STATE_CHANGED && t === B.TUIChat.EVENT_SUB_KEY.CHAT_OPENED) { if ((E = this._callService) == null || E.setCurrentGroupId((i == null ? void 0 : i.groupID) || ""), Ie.getData(n.CALL, a.CALL_STATUS) !== h.IDLE) return; const f = (I = this._callService) == null ? void 0 : I.getCurrentGroupId(), U = f ? await this.getGroupAttributes((L = this._callService) == null ? void 0 : L.getTim(), f) : {}; await this.updateStoreBasedOnGroupAttributes(U); } } catch (f) { console.error(`${a.PREFIX}TUICore onNotifyEvent failed, error: ${f}.`); } } // Handling the chat+call scenario, data required for the joinInGroupCall API: update store / clear relevant store data async updateStoreBasedOnGroupAttributes(e) { var t, i, l, o; (l = (i = (t = this._callService) == null ? void 0 : t.getTUICallEngineInstance()) == null ? void 0 : i.reportLog) == null || l.call(i, { name: "TUICallKit.getJoinGroupCallInfo.success", data: { groupAttributes: e } }); try { const { group_id: s = "", room_id: u = 0, room_id_type: c = 0, call_media_type: E = a.UNKNOWN, // @ts-ignore user_list: I // 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 L = (I || []).map((U) => U.userid); L = L.length && await Ae(L, (o = this._callService) == null ? void 0 : o.getTim()); const f = { [a.GROUP_ID]: s, [a.GROUP_CALL_MEMBERS]: L, [a.ROOM_ID]: u, [a.CALL_MEDIA_TYPE]: rt[E], [a.ROOM_ID_TYPE]: c }; Ie.updateStore(f, n.CALL); } catch (s) { console.warn(`${a.PREFIX}updateStoreBasedOnGroupAttributes fail, error: ${s}`); } } // 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 l; const t = ce(e.payload.data), i = ce(t == null ? void 0 : t.data); return (i == null ? void 0 : i.line_busy) === "line_busy" || (i == null ? void 0 : i.line_busy) === "" || ((l = i == null ? void 0 : i.data) == null ? void 0 : l.message) === "lineBusy"; } async getCallKitMessage(e, t) { var f, U, N, G; const i = ce(e.payload.data); if ((i == null ? void 0 : i.businessID) !== 1) return {}; let l = ""; const o = ce(i == null ? void 0 : i.data), s = o.call_type, u = i.inviteeList, c = (f = o == null ? void 0 : o.data) == null ? void 0 : f.inviter, E = Ie.getData(n.CALL, a.LOCAL_USER_INFO).userId, I = c === E, L = (U = o == null ? void 0 : o.data) == null ? void 0 : U.cmd; switch (i == null ? void 0 : i.actionType) { case J.INVITE: { l = v[L]({ callDuration: $e(o == null ? void 0 : o.call_end) }); break; } case J.CANCEL_INVITE: l = S(I ? "Call Cancel" : "Other Side Cancel"); break; case J.ACCEPT_INVITE: ["switchToAudio", "switchToVideo"].includes(L) ? l = (N = v == null ? void 0 : v[L]) == null ? void 0 : N.call(v) : l = S("Answered"); break; case J.REJECT_INVITE: this.isLineBusy(e) ? l = S(I ? "Line Busy" : "Other Side Line Busy") : l = S(I ? "Other Side Decline" : "Decline"); break; case J.INVITE_TIMEOUT: ["switchToAudio", "switchToVideo"].includes(L) ? l = (G = v == null ? void 0 : v[L]) == null ? void 0 : G.call(v) : l = S(I ? "Other Side No Answer" : "No answer"); break; } return { messageCardContent: l, callMediaType: s, inviteeList: u }; } // =========================【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(Ge.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(Ge.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. */ async _handleTUICoreOnClick(e, t) { var i, l; try { const { groupID: o, userIDList: s = [], ...u } = e; o ? await ((i = this._callService) == null ? void 0 : i.groupCall({ groupID: o, userIDList: s, type: t, ...u })) : s.length === 1 && await ((l = this._callService) == null ? void 0 : l.call({ userID: s[0], type: t, ...u })); } catch (o) { console.debug(o); } } async _handleGroupAttributesUpdated(e) { var o; if (Ie.getData(n.CALL, a.CALL_STATUS) !== h.IDLE) return; const t = (e == null ? void 0 : e.data) || {}, { groupID: i = "", groupAttributes: l = {} } = t; i === ((o = this._callService) == null ? void 0 : o.getCurrentGroupId()) && await this.updateStoreBasedOnGroupAttributes(l); } } const d = ge.getInstance(), bt = Y.getInstance(); class z { constructor(e) { this._callService = e.callService; } static getInstance(e) { return z.instance || (z.instance = new z(e)), z.instance; } addListenTuiCallEngineEvent() { var t; 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.INVITED, this._handleNewInvitationReceived, this), e.on(C.USER_ACCEPT, this._handleUserAccept, 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.CALLING_CANCEL, this._handleCallingCancel, 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.CALL_END, this._handleCallingEnd, this), e.on(C.CALL_MODE, this._handleCallTypeChange, this), e.on(C.USER_UPDATE, this._handleUserUpdate, this); } removeListenTuiCallEngineEvent() { var t; const e = (t = this._callService) == null ? void 0 : t.getTUICallEngineInstance(); e.off(C.ERROR, this._handleError, this), e.off(C.INVITED, this._handleNewInvitationReceived, this), e.off(C.USER_ACCEPT, this._handleUserAccept, 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.CALLING_CANCEL, this._handleCallingCancel, 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.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 = d.getData(n.CALL, a.CALL_ROLE); d.getData(n.CALL, a.CALL_STATUS) === h.CALLING && e === F.CALLER && (d.update(n.CALL, a.CALL_STATUS, h.CONNECTED), (i = this._callService) == null || i.startTimer()); } _unNormalEventsManager(e, t) { var o; console.log(`${a.PREFIX}${t} event data: ${JSON.stringify(e)}.`); const i = d.getData(n.CALL, a.IS_GROUP), l = d.getData(n.CALL, a.REMOTE_USER_INFO_LIST); switch (t) { case C.REJECT: case C.LINE_BUSY: { const { userID: s } = Q(e); let u = t === C.REJECT ? O.OTHER_SIDE_REJECT_CALL : O.OTHER_SIDE_LINE_BUSY, c = K(u); if (i) { const E = (l.find((I) => I.userId === s) || {}).displayUserInfo || s; u = t === C.REJECT ? O.REJECT_CALL : O.IN_BUSY, c = K(u, E); } d.update(n.CALL, a.TOAST_INFO, { text: c }), s && De([s]); break; } case C.NO_RESP: { const { userIDList: s = [] } = Q(e), u = i ? O.TIMEOUT : O.CALL_TIMEOUT, c = s.map((I) => (l.find((f) => f.userId === I) || {}).displayUserInfo || I), E = i ? K(u, c.join()) : K(u); d.update(n.CALL, a.TOAST_INFO, { text: E }), s.length > 0 && De(s); break; } case C.CALLING_CANCEL: { (o = this._callService) == null || o._resetCallStore(); break; } } } _handleError(e) { var s; const { code: t, message: i } = e || {}, l = Object.values(me).indexOf(t); let o = ""; if (l !== -1) { const u = Object.keys(me)[l]; o = S(lt[u]), o && d.update(n.CALL, a.TOAST_INFO, { text: o, type: a.ERROR }); } (s = this._callService) == null || s.executeExternalAfterCalling(), console.error(`${a.PREFIX}_handleError, errorCode: ${t}; errorMessage: ${o || i}.`); } async _handleNewInvitationReceived(e) { var j, Z, $, ee; console.log(`${a.PREFIX}onCallReceived event data: ${JSON.stringify(e)}.`); const { sponsor: t = "", isFromGroup: i, callMediaType: l, inviteData: o = {}, calleeIdList: s = [], groupID: u = "", roomID: c, strRoomID: E } = Q(e), I = d.getData(n.CALL, a.LOCAL_USER_INFO), L = [t, ...s.filter((x) => x !== I.userId)], f = l || o.callType, U = f === g.AUDIO ? O.CALLEE_CALLING_AUDIO_MSG : O.CALLEE_CALLING_VIDEO_MSG; let N = { [a.CALL_ROLE]: F.CALLEE, [a.IS_GROUP]: i, [a.CALL_STATUS]: h.CALLING, [a.CALL_MEDIA_TYPE]: f, [a.CALL_TIPS]: S(U), [a.CALLER_USER_INFO]: { userId: t }, [a.GROUP_ID]: u }; He(); const G = { enableCamera: f === g.VIDEO, enableMic: !0 }; N = { ...N, [a.PUSHER]: G }; const X = { microphone: !0, camera: f === g.VIDEO }; this._callService._preDevicePermission = await this._callService._tuiCallEngine.deviceCheck(X), et(c, E), d.updateStore(N, n.CALL), (j = this._callService) == null || j.executeExternalBeforeCalling(), (Z = this._callService) != null && Z.statusChanged && (($ = this._callService) == null || $.statusChanged({ oldStatus: T.IDLE, newStatus: T.BE_INVITED })); const P = await Ae(L, (ee = this._callService) == null ? void 0 : ee.getTim()), [R] = P.filter((x) => x.userId === t); P.length > 0 && d.updateStore({ [a.REMOTE_USER_INFO_LIST]: P, [a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST]: P, [a.CALLER_USER_INFO]: { userId: t, nick: (R == null ? void 0 : R.nick) || "", avatar: (R == null ? void 0 : R.avatar) || "", displayUserInfo: (R == null ? void 0 : R.remark) || (R == null ? void 0 : R.nick) || t } }, n.CALL); } _handleUserAccept(e) { this._callerChangeToConnected(), d.update(n.CALL, a.TOAST_INFO, S("answered")), console.log(`${a.PREFIX}accept event data: ${JSON.stringify(e)}.`); } async _handleUserEnter(e) { var s; this._callerChangeToConnected(); const { userID: t, data: i } = Q(e); i != null && i.playerList && d.update(n.CALL, a.PLAYER, i.playerList); let l = d.getData(n.CALL, a.REMOTE_USER_INFO_LIST); if (!l.find((u) => (u == null ? void 0 : u.userId) === t)) { l.push({ userId: t }), l.length > 0 && (d.update(n.CALL, a.REMOTE_USER_INFO_LIST, l), d.update(n.CALL, a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, l)); const [u] = await Ae([t], (s = this._callService) == null ? void 0 : s.getTim()); l = d.getData(n.CALL, a.REMOTE_USER_INFO_LIST), l.forEach((c) => { (c == null ? void 0 : c.userId) === t && (c = Object.assign(c, u)); }); } l = l.map((u) => (u.userId === t && (u.isEnter = !0), u)), l.length > 0 && (d.update(n.CALL, a.REMOTE_USER_INFO_LIST, l), d.update(n.CALL, a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, l), bt.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 } = Q(e); if (t != null && t.playerList && d.update(n.CALL, a.PLAYER, t.playerList), d.getData(n.CALL, a.IS_GROUP)) { const o = (d.getData(n.CALL, a.REMOTE_USER_INFO_LIST).find((u) => u.userId === i) || {}).displayUserInfo || i, s = K(O.END_CALL, o); d.update(n.CALL, a.TOAST_INFO, { text: s }); } i && De([i]); } _handleInviteeReject(e) { this._unNormalEventsManager(e, C.REJECT); } _handleNoResponse(e) { this._unNormalEventsManager(e, C.NO_RESP); } _handleLineBusy(e) { this._unNormalEventsManager(e, C.LINE_BUSY); } _handleCallingCancel(e) { var t; (t = this._callService) == null || t.executeExternalAfterCalling(), this._unNormalEventsManager(e, C.CALLING_CANCEL); } _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, l, o; let t = d.getData(n.CALL, a.LOCAL_USER_INFO); t = await Qt(t.userId, (i = this._callService) == null ? void 0 : i.getTim()), (o = this._callService) == null || o.setDefaultOfflinePushInfo({ ...(l = this._callService) == null ? void 0 : l.getDefaultOfflinePushInfo(), title: t == null ? void 0 : t.displayUserInfo }), d.update(n.CALL, a.LOCAL_USER_INFO, t), d.update(n.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, t); } _handleKickedOut(e) { var t, i, l; console.log(`${a.PREFIX}kickOut event data: ${JSON.stringify(e)}.`), (t = this._callService) != null && t.kickedOut && ((i = this._callService) == null || i.kickedOut(e)), d.update(n.CALL, a.CALL_TIPS, K(O.KICK_OUT)), (l = this._callService) == null || l._resetCallStore(); } _messageSentByMe(e) { var i, l; const t = e == null ? void 0 : e.data; (i = this._callService) != null && i.onMessageSentByMe && ((l = this._callService) == null || l.onMessageSentByMe(t)); } _handleCallMessage(e) { const t = Q(e); this._callService._chatCombine.callTUIService({ message: t }); } _handleCallTypeChange(e) { var l; const { newCallType: t, type: i } = Q(e); d.update(n.CALL, a.CALL_MEDIA_TYPE, t || i), (l = this._callService) == null || l.setSoundMode(m.EAR); } _handleNetworkQuality(e) { const { networkQualityList: t = [] } = Q(e); d.update(n.CALL, a.NETWORK_STATUS, t); const i = d.getData(n.CALL, a.IS_GROUP), l = d.getData(n.CALL, a.LOCAL_USER_INFO), o = d.getData(n.CALL, a.REMOTE_USER_INFO_LIST); if (!i) { if (t.find((c) => { var E; return ((E = o[0]) == null ? void 0 : E.userId) === (c == null ? void 0 : c.userId) && (c == null ? void 0 : c.quality) >= ye; })) { d.update(n.CALL, a.CALL_TIPS, S(O.REMOTE_NETWORK_IS_POOR)); return; } if (t.find((c) => (l == null ? void 0 : l.userId) === (c == null ? void 0 : c.userId) && (c == null ? void 0 : c.quality) >= ye)) { d.update(n.CALL, a.CALL_TIPS, S(O.LOCAL_NETWORK_IS_POOR)); return; } } } // ==========================【 miniProgram 私有事件】========================== _handleUserUpdate(e) { const t = Q(e); t != null && t.pusher && d.update(n.CALL, a.PUSHER, t.pusher), t != null && t.playerList && d.update(n.CALL, a.PLAYER, t.playerList); } } var kt = Object.defineProperty, Yt = Object.getOwnPropertyDescriptor, _ = (r, e, t, i) => { for (var l = i > 1 ? void 0 : i ? Yt(e, t) : e, o = r.length - 1, s; o >= 0; o--) (s = r[o]) && (l = (i ? s(e, t, l) : s(l)) || l); return i && l && kt(e, t, l), l; }; const zt = qe.getInstance(), A = ge.getInstance(), V = Y.getInstance(); V.setTUIStore(A); const Ke = "3.3.6", D = class le { constructor() { this._tim = null, this._TUICore = null, this._timerId = -1, this._startTimeStamp = fe(), this._bellContext = null, this._isFromChat = !1, this._currentGroupId = "", this._preDevicePermission = !1, this._defaultOfflinePushInfo = { title: "", description: S("you have a new call") }, this._permissionCheckTimer = null, this._chatCombine = null, this._engineEventHandler = null, this._handleCallStatusChange = async (e) => { var t, i, l, o; try { const s = { callRole: A.getData(n.CALL, a.CALL_ROLE), callStatus: A.getData(n.CALL, a.CALL_STATUS) }; if (this._bellContext.setBellProperties(s), e === h.CALLING) await ((t = this == null ? void 0 : this._bellContext) == null ? void 0 : t.play()); else { if (e === h.CONNECTED) { const u = A.getData(n.CALL, a.IS_GROUP), c = A.getData(n.CALL, a.CALL_MEDIA_TYPE), E = A.getData(n.CALL, a.REMOTE_USER_INFO_LIST), I = u ? T.DIALING_GROUP : T.DIALING_C2C; A.update(n.CALL, a.CALL_TIPS, ""), this.statusChanged && this.statusChanged({ oldStatus: I, newStatus: ue() }), !u && c === g.VIDEO && this.switchScreen(E[0].domId); } if (e === h.IDLE && this._isFromChat) { const u = this._currentGroupId ? await ((i = this._chatCombine) == null ? void 0 : i.getGroupAttributes(this._tim, this._currentGroupId)) : {}; await ((l = this._chatCombine) == null ? void 0 : l.updateStoreBasedOnGroupAttributes(u, A, this)); } await ((o = this == null ? void 0 : this._bellContext) == null ? void 0 : o.stop()); } } catch (s) { console.warn(`${a.PREFIX}handleCallStatusChange, ${s}.`); } }, console.log(`${a.PREFIX}version: ${Ke}`), this._watchTUIStore(), this._engineEventHandler = z.getInstance({ callService: this }), this._chatCombine = W.getInstance({ callService: this }); } static getInstance() { return le.instance || (le.instance = new le()), le.instance; } async init(e) { var t, i; try { if (this._tuiCallEngine) return; let { userID: l, tim: o, userSig: s, sdkAppID: u, SDKAppID: c, isFromChat: E, component: I = Ue.TUI_CALL_KIT } = e; this._TUICore && (u = this._TUICore.SDKAppID, o = this._TUICore.tim), this._tim = o, console.log(`${a.PREFIX}init sdkAppId: ${u || c}, userId: ${l}`), this._tuiCallEngine = at.createInstance({ tim: o, // @ts-ignore sdkAppID: u || c, // 兼容传入 SDKAppID 的问题 callkitVersion: Ke, chat: E || !1, component: I }), V.setEngineInstance(this._tuiCallEngine), this._addListenTuiCallEngineEvent(), this._bellContext = new Ft(), A.update(n.CALL, a.LOCAL_USER_INFO, { userId: l }), A.update(n.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, { userId: l }), V.updateViewBackgroundUserId("local"), await this._tuiCallEngine.login({ userID: l, userSig: s, assetsPath: "" }); const L = A.getData(n.CALL, a.CUSTOM_UI_CONFIG); (i = (t = this._tuiCallEngine) == null ? void 0 : t.reportLog) == null || i.call(t, { name: "TUICallkit.init", data: { uiConfig: L } }); } catch (l) { throw console.error(`${a.PREFIX}init failed, error: ${l}.`), l; } } // component destroy async destroyed() { var e; try { const t = A.getData(n.CALL, a.CALL_STATUS); if (t !== h.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 (A.getData(n.CALL, a.CALL_STATUS) === h.IDLE) try { const { type: t, userID: i, offlinePushInfo: l } = e; if (A.getData(n.CALL, a.CALL_STATUS) !== h.IDLE) return; await this._updateCallStoreBeforeCall(t, [{ userId: i }]), this.executeExternalBeforeCalling(), e.offlinePushInfo = { ...this._defaultOfflinePushInfo, ...l }; const o = await this._tuiCallEngine.call(e); await this._updateCallStoreAfterCall([i], o); } catch (t) { this._handleCallError(t, "call"); } } async groupCall(e) { if (A.getData(n.CALL, a.CALL_STATUS) === h.IDLE) try { const { userIDList: t, type: i, groupID: l, offlinePushInfo: o } = e; if (A.getData(n.CALL, a.CALL_STATUS) !== h.IDLE) return; const s = t.map((c) => ({ userId: c })); await this._updateCallStoreBeforeCall(i, s, l), this.executeExternalBeforeCalling(), e.offlinePushInfo = { ...this._defaultOfflinePushInfo, ...o }; const u = await this._tuiCallEngine.groupCall(e); await this._updateCallStoreAfterCall(t, u); } catch (t) { this._handleCallError(t, "groupCall"); } } async inviteUser(e) { if (A.getData(n.CALL, a.CALL_STATUS) !== h.IDLE) try { const { userIDList: t } = e; let i = await Ae(t, this.getTim()); const l = A.getData(n.CALL, a.REMOTE_USER_INFO_LIST); A.update(n.CALL, a.REMOTE_USER_INFO_LIST, [...l, ...i]), A.update(n.CALL, a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, [...l, ...i]), this._tuiCallEngine && await this._tuiCallEngine.inviteUser(e); } catch (t) { throw console.error(`${a.PREFIX}inviteUser failed, error: ${t}.`), this._resetCallStore(), t; } } async joinInGroupCall(e) { if (A.getData(n.CALL, a.CALL_STATUS) !== h.CONNECTED) try { const t = { [a.CALL_ROLE]: F.CALLEE, [a.IS_GROUP]: !0, [a.CALL_STATUS]: h.CONNECTED, [a.CALL_MEDIA_TYPE]: e.type, [a.GROUP_ID]: e.groupID, [a.ROOM_ID]: e.roomID }; A.updateStore(t, n.CALL); const i = await this._tuiCallEngine.joinInGroupCall(e), l = this._getFeatureButtonDefaultState(H.Camera) === q.Close; e.type === g.VIDEO && !l && await this.openCamera(a.LOCAL_VIDEO), A.update(n.CALL, a.IS_CLICKABLE, !0), this.startTimer(), A.update(n.CALL, a.PUSHER, i), this.setSoundMode(e.type === g.AUDIO ? m.EAR : m.SPEAKER); const o = A.getData(n.CALL, a.LOCAL_USER_INFO); A.update(n.CALL, a.LOCAL_USER_INFO, { ...o, isEnter: !0 }), A.update(n.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, { ...o, isEnter: !0 }), k(!0, a.AUDIO); } catch (t) { this._handleCallError(t, "joinInGroupCall"); } } // ===============================【其它对外接口】=============================== 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) { e && Object.values(be).includes(e) && A.update(n.CALL, a.LANGUAGE, e); } enableFloatWindow(e) { A.update(n.CALL, a.ENABLE_FLOAT_WINDOW, e); } async setSelfInfo(e) { const { nickName: t, avatar: i } = e; try { await this._tuiCallEngine.setSelfInfo(t, i); } catch (l) { console.error(`${a.PREFIX}setSelfInfo failed, error: ${l}.`); } } async enableVirtualBackground(e) { A.update(n.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); } async accept() { var t, i, l, o, s, u; const e = A.getData(n.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 !== h.CONNECTED) try { const E = { microphone: !0, camera: A.getData(n.CALL, a.CALL_MEDIA_TYPE) === g.VIDEO }, I = await this._tuiCallEngine.deviceCheck(E); I && !this._preDevicePermission && (A.update(n.CALL, a.PUSHER_ID, a.NEW_PUSHER), this._preDevicePermission = I); const L = await this._tuiCallEngine.accept(); if (L) { A.update(n.CALL, a.CALL_STATUS, h.CONNECTED), (o = this._chatCombine) == null || o.callTUIService({ message: (l = L == null ? void 0 : L.data) == null ? void 0 : l.message }), A.update(n.CALL, a.IS_CLICKABLE, !0), this.startTimer(); const f = A.getData(n.CALL, a.CALL_MEDIA_TYPE), U = this._getFeatureButtonDefaultState(H.Camera) === q.Close; f === g.VIDEO && !U && await this.openCamera(a.LOCAL_VIDEO), L.pusher && A.update(n.CALL, a.PUSHER, L.pusher), this.setSoundMode(f === g.AUDIO ? m.EAR : m.SPEAKER); const N = A.getData(n.CALL, a.LOCAL_USER_INFO); A.update(n.CALL, a.LOCAL_USER_INFO, { ...N, isEnter: !0 }), A.update(n.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, { ...N, isEnter: !0 }), k(!0, a.AUDIO); } } catch (c) { if ((u = (s = this._tuiCallEngine) == null ? void 0 : s.reportLog) == null || u.call(s, { name: "TUICallKit.accept.fail", level: "error", error: c }), Qe(c)) return; _e(c, g.AUDIO, this._tuiCallEngine), this._resetCallStore(); } } async hangup() { if (A.getData(n.CALL, a.CALL_STATUS) !== h.IDLE) { try { const e = await this._tuiCallEngine.hangup(); e == null || e.forEach((t) => { var i, l; (t == null ? void 0 : t.code) === 0 && ((l = this._chatCombine) == null || l.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 (A.getData(n.CALL, a.CALL_STATUS) !== h.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 { await this._tuiCallEngine.openCamera(), k(!0, a.VIDEO); } catch (t) { _e(t, g.VIDEO, this._tuiCallEngine), console.error(`${a.PREFIX}openCamera error: ${t}.`); } } async closeCamera() { try { await this._tuiCallEngine.closeCamera(), k(!1, a.VIDEO); } catch (e) { console.error(`${a.PREFIX}closeCamera error: ${e}.`); } } async openMicrophone() { try { await this._tuiCallEngine.openMicrophone(), k(!0, a.AUDIO); } catch (e) { console.error(`${a.PREFIX}openMicrophone failed, error: ${e}.`); } } async closeMicrophone() { try { await this._tuiCallEngine.closeMicrophone(), k(!1, a.AUDIO); } catch (e) { console.error(`${a.PREFIX}closeMicrophone failed, error: ${e}.`); } } switchScreen(e) { e && A.update(n.CALL, a.BIG_SCREEN_USER_ID, e); } async switchCallMediaType() { var e, t; try { const i = A.getData(n.CALL, a.CALL_MEDIA_TYPE); if (i === g.AUDIO) { console.warn(`${a.PREFIX}switchCallMediaType failed, ${i} not support.`); return; } const l = await this._tuiCallEngine.switchCallMediaType(g.AUDIO); (l == null ? void 0 : l.code) === 0 && ((t = this._chatCombine) == null || t.callTUIService({ message: (e = l == null ? void 0 : l.data) == null ? void 0 : e.message })), A.update(n.CALL, a.CALL_MEDIA_TYPE, g.AUDIO); const s = A.getData(n.CALL, a.IS_GROUP) ? T.CALLING_GROUP_VIDEO : T.CALLING_C2C_VIDEO, u = ue(); this.statusChanged && this.statusChanged({ oldStatus: s, newStatus: u }), this.setSoundMode(m.EAR); } catch (i) { console.error(`${a.PREFIX}switchCallMediaType failed, error: ${i}.`); } } async switchCamera() { const t = A.getData(n.CALL, a.CAMERA_POSITION) === se.BACK ? se.FRONT : se.BACK; try { await this._tuiCallEngine.switchCamera(t), A.update(n.CALL, a.CAMERA_POSITION, t); } catch (i) { console.error(`${a.PREFIX}_switchCamera failed, error: ${i}.`); } } setSoundMode(e) { var t; try { let i = A.getData(n.CALL, a.IS_EAR_PHONE); const l = e || (i ? m.SPEAKER : m.EAR); (t = this._tuiCallEngine) == null || t.selectAudioPlaybackDevice(l), e ? i = e === m.EAR : i = !i, A.update(n.CALL, a.IS_EAR_PHONE, i); } catch (i) { console.error(`${a.PREFIX}setSoundMode failed, error: ${i}.`); } } async setBlurBackground(e) { try { A.update(n.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: l, onMessageSentByMe: o, kickedOut: s, statusChanged: u } = e; t && (this.beforeCalling = t), i && (this.afterCalling = i), l && (this.onMinimized = l), o && (this.onMessageSentByMe = o), s && (this.kickedOut = s), u && (this.statusChanged = u); } toggleMinimize() { const e = A.getData(n.CALL, a.IS_MINIMIZED); A.update(n.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(); } // =========================【 miniProgram 公共方法】========================= // 处理用户异常退出的情况,处理了右滑退出,以及返回退出的情况。 async handleExceptionExit() { try { if (A.getData(n.CALL, a.CALL_STATUS) === h.IDLE) return; this._resetCallStore(), await this._tuiCallEngine.handleExceptionExit(); } catch (e) { console.error(`${a.PREFIX} handleExceptionExit failed, error: ${e}.`); } } // 处理 pusher 内部错误,没有 live-pusher 能力时做出弹窗提示。 handlePusherError(e) { var t; ((t = e == null ? void 0 : e.detail) == null ? void 0 : t.errMsg) === "fail:access denied" && Et(); } setVideoDisplayMode(e) { A.update(n.CALL, a.DISPLAY_MODE, e); } async setVideoResolution(e) { var t; try { if (!e) return; A.update(n.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 = fe(), this._timerId = he.run(a.TIMEOUT, this._updateCallDuration.bind(this), { delay: 1e3 })); } // =========================【private methods for service use】========================= // 处理 “呼叫” 抛出的异常 _handleCallError(e, t) { if (this._permissionCheckTimer && clearInterval(this._permissionCheckTimer), !Qe(e)) throw Ct(e), _e(e, g.AUDIO, this._tuiCallEngine), console.error(`${a.PREFIX}${t} failed, error: ${e}.`), this._resetCallStore(), e; } async _updateCallStoreBeforeCall(e, t, i) { const l = i || A.getData(n.CALL, a.IS_MINIMIZED) ? O.CALLER_GROUP_CALLING_MSG : O.CALLER_CALLING_MSG; let o = { [a.CALL_MEDIA_TYPE]: e, [a.CALL_ROLE]: F.CALLER, [a.REMOTE_USER_INFO_LIST]: t, [a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST]: t, [a.IS_GROUP]: !!i, [a.CALL_TIPS]: S(l), [a.GROUP_ID]: i }; const s = { enableCamera: e === g.VIDEO, enableMic: !0 }; o = { ...o, [a.PUSHER]: s }, A.updateStore(o, n.CALL); const u = await It(e, this); console.log(`${a.PREFIX}mini beforeCall return callStatus: ${u}.`), A.update(n.CALL, a.CALL_STATUS, u); const c = await Ae(t.map((L) => L.userId), this.getTim()); c.length > 0 && (A.update(n.CALL, a.REMOTE_USER_INFO_LIST, c), A.update(n.CALL, a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, c)); const E = { microphone: !0, camera: e === g.VIDEO }; let I = await this._tuiCallEngine.deviceCheck(E); I || (this._permissionCheckTimer && clearInterval(this._permissionCheckTimer), this._permissionCheckTimer = setInterval(async () => { I = await this._tuiCallEngine.deviceCheck(E), I && this._permissionCheckTimer && (clearInterval(this._permissionCheckTimer), A.update(n.CALL, a.CALL_STATUS, h.CALLING)); }, 500)); } async _updateCallStoreAfterCall(e, t) { var i, l; if (t) { A.update(n.CALL, a.IS_CLICKABLE, !0), et(t == null ? void 0 : t.roomID, t == null ? void 0 : t.strRoomID); const o = A.getData(n.CALL, a.CALL_MEDIA_TYPE); (l = this._chatCombine) == null || l.callTUIService({ message: (i = t == null ? void 0 : t.data) == null ? void 0 : i.message }), t.pusher && A.update(n.CALL, a.PUSHER, t.pusher), this.setSoundMode(o === g.AUDIO ? m.EAR : m.SPEAKER), A.update(n.CALL, a.CALL_STATUS, h.CALLING); const s = this._getFeatureButtonDefaultState(H.Camera) === q.Close; o === g.VIDEO && !s && await this.openCamera(a.LOCAL_VIDEO); const u = A.getData(n.CALL, a.LOCAL_USER_INFO); A.update(n.CALL, a.LOCAL_USER_INFO, { ...u, isEnter: !0 }), A.update(n.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, { ...u, isEnter: !0 }), k(!0, a.AUDIO); } else this._permissionCheckTimer && clearInterval(this._permissionCheckTimer), this._permissionCheckTimer = null, this._resetCallStore(); } _getFeatureButtonDefaultState(e) { var i; const { button: t } = A.getData(n.CALL, a.CUSTOM_UI_CONFIG); return (i = t == null ? void 0 : t[e]) == null ? void 0 : i.state; } _updateCallDuration() { const e = Math.round((fe() - this._startTimeStamp) / 1e3), t = $e(e); A.update(n.CALL, a.CALL_DURATION, t); } _stopTimer() { this._timerId !== -1 && (he.clearTask(this._timerId), this._timerId = -1); } _resetCallStore() { const e = ue(); this._stopTimer(); let t = Object.keys(Ce).filter((o) => { switch (Ce[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.LOCAL_USER_INFO_EXCLUDE_VOLUMN: return !1; default: return !0; } }); t = t.map((o) => Ce[o]), A.reset(n.CALL, t), A.getData(n.CALL, a.CALL_STATUS) !== h.IDLE && A.reset(n.CALL, [a.CALL_STATUS], !0), A.reset(n.CALL, [a.IS_MINIMIZED], !0), A.reset(n.CALL, [a.IS_EAR_PHONE], !0), A.reset(n.CALL, [a.ENABLE_VIRTUAL_BACKGROUND], !0), A.update(n.CALL, a.LOCAL_USER_INFO, { ...A.getData(n.CALL, a.LOCAL_USER_INFO), isVideoAvailable: !1, isAudioAvailable: !1 }), A.update(n.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN, { ...A.getData(n.CALL, a.LOCAL_USER_INFO_EXCLUDE_VOLUMN), isVideoAvailable: !1, isAudioAvailable: !1 }), A.update(n.CALL, a.REMOTE_USER_INFO_LIST, []), A.update(n.CALL, a.REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST, []); const l = ue(); e !== l && this.statusChanged && this.statusChanged({ oldStatus: e, newStatus: l }); } // =========================【Calling the Chat SDK APi】========================= // 获取群成员 async getGroupMemberList(e, t) { const i = A.getData(n.CALL, a.GROUP_ID); return await Pt(i, this.getTim(), e, t); } // 获取群信息 async getGroupProfile() { const e = A.getData(n.CALL, a.GROUP_ID); return await Vt(e, this.getTim()); } _watchTUIStore() { A == null || A.watch(n.CALL, { [a.CALL_STATUS]: this._handleCallStatusChange }); } _unwatchTUIStore() { A == null || A.unwatch(n.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._defaultOfflinePushInfo = e; } getDefaultOfflinePushInfo() { return this._defaultOfflinePushInfo; } async getCallMessage(e) { return await this._chatCombine.getCallKitMessage(e, this.getTim()); } }; _([ w(), y(M.init) ], D.prototype, "init", 1); _([ w(), y(M.call), Le({ engineInstance: !0 }) ], D.prototype, "call", 1); _([ w(), y(M.groupCall), Le({ engineInstance: !0 }) ], D.prototype, "groupCall", 1); _([ w(), y(M.inviteUser), Le({ engineInstance: !0 }) ], D.prototype, "inviteUser", 1); _([ w(), y(M.joinInGroupCall), Le({ engineInstance: !0 }) ], D.prototype, "joinInGroupCall", 1); _([ y(M.setLanguage) ], D.prototype, "setLanguage", 1); _([ y(M.enableFloatWindow) ], D.prototype, "enableFloatWindow", 1); _([ y(M.setSelfInfo) ], D.prototype, "setSelfInfo", 1); _([ y(M.setCallingBell) ], D.prototype, "setCallingBell", 1); _([ y(M.enableMuteMode) ], D.prototype, "enableMuteMode", 1); _([ w() ], D.prototype, "accept", 1); _([ w() ], D.prototype, "hangup", 1); _([ w() ], D.prototype, "reject", 1); _([ w() ], D.prototype, "openCamera", 1); _([ w() ], D.prototype, "closeCamera", 1); _([ w() ], D.prototype, "openMicrophone", 1); _([ w() ], D.prototype, "closeMicrophone", 1); _([ w() ], D.prototype, "switchScreen", 1); _([ w() ], D.prototype, "switchCallMediaType", 1); _([ w() ], D.prototype, "switchCamera", 1); _([ w() ], D.prototype, "setSoundMode", 1); _([ w() ], D.prototype, "setBlurBackground", 1); _([ y(M.setVideoDisplayMode) ], D.prototype, "setVideoDisplayMode", 1); _([ y(M.setVideoResolution) ], D.prototype, "setVideoResolution", 1); let Ht = D; const qt = Ht.getInstance(), Xt = "3.3.6"; export { g as CallMediaType, F as CallRole, H as FeatureButton, ke as LayoutMode, a as NAME, T as STATUS, n as StoreName, qt as TUICallKitServer, zt as TUIGlobal, A as TUIStore, Xt as Version, ne as VideoDisplayMode, oe as VideoResolution, S as t, V as uiDesign };