新增功能

This commit is contained in:
Your Name
2026-03-04 15:32:30 +08:00
parent a07e844c47
commit ab77f5488d
2266 changed files with 177942 additions and 3444 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"version":3,"file":"miniProgram.js","sources":["TUICallKit/src/TUICallService/CallService/miniProgram.ts"],"sourcesContent":["import { CallMediaType, CallStatus } from '../const/index';\n\nexport function initialUI() {\n // 收起键盘\n // @ts-ignore\n wx.hideKeyboard && wx.hideKeyboard({\n complete: () => {},\n });\n};\n// 检测运行时环境, 当是微信开发者工具时, 提示用户需要手机调试\nexport function checkRunPlatform() {\n // @ts-ignore\n const systemInfo = wx.getSystemInfoSync();\n if (systemInfo.platform === 'devtools') {\n // 当前运行在微信开发者工具里\n // @ts-ignore\n wx.showModal({\n icon: 'none',\n title: '运行环境提醒',\n content: '微信开发者工具不支持原生推拉流组件(即 <live-pusher> 和 <live-player> 标签),请使用真机调试或者扫码预览。',\n showCancel: false,\n });\n }\n};\nexport function initAndCheckRunEnv() {\n initialUI(); // miniProgram 收起键盘, 隐藏 tabBar\n checkRunPlatform(); // miniProgram 检测运行时环境\n}\nexport async function beforeCall(type: CallMediaType, that: any) {\n try {\n initAndCheckRunEnv();\n // 检查设备权限\n const deviceMap = {\n microphone: true,\n camera: type === CallMediaType.VIDEO,\n };\n const hasDevicePermission = await that._tuiCallEngine.deviceCheck(deviceMap); // miniProgram 检查设备权限\n return hasDevicePermission ? CallStatus.CALLING : CallStatus.IDLE;\n } catch (error) {\n console.debug(error);\n return CallStatus.IDLE;\n }\n}\n// 套餐问题提示, 小程序最低需要群组通话版, 1v1 通话版本使用 TRTC 就会报错\nexport function handlePackageError(error) {\n if (error?.code === -1002) {\n // @ts-ignore\n wx.showModal({\n icon: 'none',\n title: 'error',\n content: error?.message || '',\n showCancel: false,\n });\n }\n}\n\nexport function handleNoPusherCapabilityError(){\n // @ts-ignore\n wx.showModal({\n icon: 'none',\n title: '权限提示',\n content: '当前小程序 appid 不具备 <live-pusher> 和 <live-player> 的使用权限,您将无法正常使用实时通话能力,请使用企业小程序账号申请权限后再进行开发体验',\n showCancel: false,\n });\n}\n"],"names":["wx","CallMediaType","CallStatus","uni"],"mappings":";;;AAEO,SAAS,YAAY;AAGvBA,qBAAA,gBAAgBA,mBAAG,aAAa;AAAA,IACjC,UAAU,MAAM;AAAA,IAAC;AAAA,EAAA,CAClB;AACH;AAEO,SAAS,mBAAmB;AAE3B,QAAA,aAAaA,mBAAG;AAClB,MAAA,WAAW,aAAa,YAAY;AAGtCA,kBAAAA,KAAG,UAAU;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IAAA,CACb;AAAA,EACH;AACF;AACO,SAAS,qBAAqB;AACzB;AACO;AACnB;AACsB,eAAA,WAAW,MAAqB,MAAW;AAC3D,MAAA;AACiB;AAEnB,UAAM,YAAY;AAAA,MAChB,YAAY;AAAA,MACZ,QAAQ,SAASC,yCAAAA,cAAc;AAAA,IAAA;AAEjC,UAAM,sBAAsB,MAAM,KAAK,eAAe,YAAY,SAAS;AACpE,WAAA,sBAAsBC,yCAAW,WAAA,UAAUA,yCAAAA,WAAW;AAAA,WACtD,OAAO;AACAC,kBAAAA,MAAA,MAAA,SAAA,kEAAA,KAAK;AACnB,WAAOD,yCAAAA,WAAW;AAAA,EACpB;AACF;AAEO,SAAS,mBAAmB,OAAO;AACpC,OAAA,+BAAO,UAAS,OAAO;AAEzBF,kBAAAA,KAAG,UAAU;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAS,+BAAO,YAAW;AAAA,MAC3B,YAAY;AAAA,IAAA,CACb;AAAA,EACH;AACF;AAEO,SAAS,gCAA+B;AAE7CA,gBAAAA,KAAG,UAAU;AAAA,IACX,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,EAAA,CACb;AACH;;;;;"}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"version":3,"file":"tuiGlobal.js","sources":["TUICallKit/src/TUICallService/TUIGlobal/tuiGlobal.ts"],"sourcesContent":["import { APP_NAMESPACE, IS_PC, IS_H5, IN_WX_MINI_APP, IN_UNI_NATIVE_APP, IN_UNI_APP, IS_MAC, IS_WIN } from '../utils/env';\nimport { ITUIGlobal } from '../interface/ITUIGlobal';\n\nexport default class TUIGlobal implements ITUIGlobal {\n static instance: TUIGlobal;\n public global: any = APP_NAMESPACE;\n public isPC: boolean = false;\n public isH5: boolean = false;\n public isWeChat: boolean = false;\n public isApp: boolean = false;\n public isUniPlatform: boolean = false;\n public isOfficial: boolean = false;\n public isWIN: boolean = false;\n public isMAC: boolean = false;\n constructor() {\n this.initEnv();\n }\n\n /**\n * 获取 TUIGlobal 实例\n * @returns {TUIGlobal}\n */\n static getInstance() {\n if (!TUIGlobal.instance) {\n TUIGlobal.instance = new TUIGlobal();\n }\n return TUIGlobal.instance;\n }\n\n initEnv() {\n this.isPC = IS_PC;\n this.isH5 = IS_H5;\n this.isWeChat = IN_WX_MINI_APP;\n this.isApp = IN_UNI_NATIVE_APP && !IN_WX_MINI_APP; // uniApp 打包小程序时 IN_UNI_NATIVE_APP 为 true,所以此处需要增加条件\n this.isUniPlatform = IN_UNI_APP;\n this.isWIN = IS_WIN;\n this.isMAC = IS_MAC;\n }\n\n initOfficial(SDKAppID: number) {\n this.isOfficial = (SDKAppID === 1400187352 || SDKAppID === 1400188366);\n }\n}\n"],"names":["APP_NAMESPACE","IS_PC","IS_H5","IN_WX_MINI_APP","IN_UNI_NATIVE_APP","IN_UNI_APP","IS_WIN","IS_MAC"],"mappings":";;AAGA,MAAqB,UAAgC;AAAA,EAWnD,cAAc;AATd,SAAO,SAAcA;AACrB,SAAO,OAAgB;AACvB,SAAO,OAAgB;AACvB,SAAO,WAAoB;AAC3B,SAAO,QAAiB;AACxB,SAAO,gBAAyB;AAChC,SAAO,aAAsB;AAC7B,SAAO,QAAiB;AACxB,SAAO,QAAiB;AAEtB,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,cAAc;AACf,QAAA,CAAC,UAAU,UAAU;AACb,gBAAA,WAAW,IAAI;IAC3B;AACA,WAAO,UAAU;AAAA,EACnB;AAAA,EAEA,UAAU;AACR,SAAK,OAAOC;AACZ,SAAK,OAAOC;AACZ,SAAK,WAAWC;AACX,SAAA,QAAQC,6DAAqB,CAACD;AACnC,SAAK,gBAAgBE;AACrB,SAAK,QAAQC;AACb,SAAK,QAAQC;EACf;AAAA,EAEA,aAAa,UAAkB;AACxB,SAAA,aAAc,aAAa,cAAc,aAAa;AAAA,EAC7D;AACF;;"}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"version":3,"file":"error.js","sources":["TUICallKit/src/TUICallService/const/error.ts"],"sourcesContent":["// 错误码\nexport const ErrorCode: any = {\n SWITCH_TO_AUDIO_CALL_FAILED: 60001,\n SWITCH_TO_VIDEO_CALL_FAILED: 60002,\n MICROPHONE_UNAVAILABLE: 60003,\n CAMERA_UNAVAILABLE: 60004,\n BAN_DEVICE: 60005,\n NOT_SUPPORTED_WEBRTC: 60006,\n ERROR_BLACKLIST: 20007,\n} as const;\n\nexport const ErrorMessage: any = {\n SWITCH_TO_AUDIO_CALL_FAILED: 'switchToAudioCall-call-failed',\n SWITCH_TO_VIDEO_CALL_FAILED: 'switchToVideoCall-call-failed',\n MICROPHONE_UNAVAILABLE: 'microphone-unavailable',\n CAMERA_UNAVAILABLE: 'camera-unavailable',\n BAN_DEVICE: 'ban-device',\n NOT_SUPPORTED_WEBRTC: 'not-supported-webrtc',\n ERROR_BLACKLIST: 'blacklist-user-tips'\n} as const;\n"],"names":[],"mappings":";AACO,MAAM,YAAiB;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,sBAAsB;AAAA,EACtB,iBAAiB;AACnB;AAEO,MAAM,eAAoB;AAAA,EAC/B,6BAA6B;AAAA,EAC7B,6BAA6B;AAAA,EAC7B,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,sBAAsB;AAAA,EACtB,iBAAiB;AACnB;;;"}
@@ -0,0 +1 @@
{"version":3,"file":"index.js","sources":["TUICallKit/src/TUICallService/const/index.ts"],"sourcesContent":["export * from './call';\nexport * from './error';\nexport * from './log';\n\nexport const CALL_DATA_KEY: any = {\n CALL_STATUS: 'callStatus',\n CALL_ROLE: 'callRole',\n CALL_MEDIA_TYPE: 'callMediaType',\n LOCAL_USER_INFO: 'localUserInfo',\n LOCAL_USER_INFO_EXCLUDE_VOLUMN: 'localUserInfoExcludeVolume',\n REMOTE_USER_INFO_LIST: 'remoteUserInfoList',\n REMOTE_USER_INFO_EXCLUDE_VOLUMN_LIST: 'remoteUserInfoExcludeVolumeList',\n CALLER_USER_INFO: 'callerUserInfo',\n IS_GROUP: 'isGroup',\n CALL_DURATION: 'callDuration',\n CALL_TIPS: 'callTips',\n TOAST_INFO: 'toastInfo',\n IS_MINIMIZED: 'isMinimized',\n ENABLE_FLOAT_WINDOW: 'enableFloatWindow',\n BIG_SCREEN_USER_ID: 'bigScreenUserId',\n LANGUAGE: 'language',\n IS_CLICKABLE: 'isClickable',\n DISPLAY_MODE: 'displayMode',\n VIDEO_RESOLUTION: 'videoResolution',\n PUSHER: 'pusher',\n PLAYER: 'player',\n IS_EAR_PHONE: 'isEarPhone',\n IS_MUTE_SPEAKER: 'isMuteSpeaker',\n SHOW_PERMISSION_TIP: 'SHOW_PERMISSION_TIP',\n NETWORK_STATUS: 'NetWorkStatus',\n CALL_ID: 'callID',\n GROUP_ID: 'groupID',\n ROOM_ID: 'roomID',\n ROOM_ID_TYPE: 'roomIdType',\n SHOW_SELECT_USER: 'showSelectUser',\n IS_SHOW_ENABLE_VIRTUAL_BACKGROUND: 'isShowEnableVirtualBackground',\n ENABLE_VIRTUAL_BACKGROUND: 'enableVirtualBackground',\n GROUP_CALL_MEMBERS: 'groupCallMembers',\n PUSHER_ID: 'pusherId',\n IS_FORCE_USE_V2_API: 'isForceUseV2API',\n};\n\nexport const CHAT_DATA_KEY: any = {\n \"INNER_ATTR_KIT_INFO\": \"inner_attr_kit_info\",\n};\n\nexport const PUSHER_ID = {\n INITIAL_PUSHER: 'initialPusher',\n NEW_PUSHER: 'newPusher'\n};\n\nexport const NAME = {\n PREFIX: '【CallService】',\n AUDIO: 'audio',\n VIDEO: 'video',\n LOCAL_VIDEO: 'localVideo',\n ERROR: 'error',\n TIMEOUT: 'timeout',\n RAF: 'raf',\n INTERVAL: 'interval',\n DEFAULT: 'default',\n BOOLEAN: 'boolean',\n STRING: 'string',\n NUMBER: 'number',\n OBJECT: 'object',\n ARRAY: 'array',\n FUNCTION: 'function',\n UNDEFINED: \"undefined\",\n UNKNOWN: 'unknown',\n ALL: 'all',\n MYSELF: 'myself',\n DEVICE_LIST: 'deviceList',\n CAMERA_POSITION: 'cameraPosition',\n CUSTOM_UI_CONFIG: 'customUIConfig',\n TRANSLATE: 'translate',\n ...PUSHER_ID,\n ...CALL_DATA_KEY,\n ...CHAT_DATA_KEY,\n};\n\nexport const AudioCallIcon = 'https://web.sdk.qcloud.com/component/TUIKit/assets/call.png';\nexport const VideoCallIcon = 'https://web.sdk.qcloud.com/component/TUIKit/assets/call-video-reverse.svg';\nexport const MAX_NUMBER_ROOM_ID = 2147483647;\nexport const DEFAULT_BLUR_LEVEL = 3;\nexport const NETWORK_QUALITY_THRESHOLD = 4;\nexport enum PLATFORM {\n // eslint-disable-next-line no-unused-vars\n MAC = 'mac',\n // eslint-disable-next-line no-unused-vars\n WIN = 'win',\n};\nexport enum COMPONENT {\n // eslint-disable-next-line no-unused-vars\n TUI_CALL_KIT = 14,\n // eslint-disable-next-line no-unused-vars\n TIM_CALL_KIT = 15,\n};\nexport enum ROOM_ID_TYPE {\n // eslint-disable-next-line no-unused-vars\n NUMBER_ROOM_ID = 1,\n // eslint-disable-next-line no-unused-vars\n STRING_ROOM_ID = 2,\n};"],"names":["COMPONENT","ROOM_ID_TYPE"],"mappings":";AAIO,MAAM,gBAAqB;AAAA,EAChC,aAAa;AAAA,EACb,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,gCAAgC;AAAA,EAChC,uBAAuB;AAAA,EACvB,sCAAsC;AAAA,EACtC,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,UAAU;AAAA,EACV,cAAc;AAAA,EACd,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS;AAAA,EACT,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,mCAAmC;AAAA,EACnC,2BAA2B;AAAA,EAC3B,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,qBAAqB;AACvB;AAEO,MAAM,gBAAqB;AAAA,EAChC,uBAAuB;AACzB;AAEO,MAAM,YAAY;AAAA,EACvB,gBAAgB;AAAA,EAChB,YAAY;AACd;AAEO,MAAM,OAAO;AAAA,EAClB,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,aAAa;AAAA,EACb,OAAO;AAAA,EACP,SAAS;AAAA,EACT,KAAK;AAAA,EACL,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEO,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AAGtB,MAAM,4BAA4B;AAO7B,IAAA,8BAAAA,eAAL;AAELA,aAAAA,WAAA,kBAAe,EAAf,IAAA;AAEAA,aAAAA,WAAA,kBAAe,EAAf,IAAA;AAJUA,SAAAA;AAAA,GAAA,aAAA,CAAA,CAAA;AAMA,IAAA,iCAAAC,kBAAL;AAELA,gBAAAA,cAAA,oBAAiB,CAAjB,IAAA;AAEAA,gBAAAA,cAAA,oBAAiB,CAAjB,IAAA;AAJUA,SAAAA;AAAA,GAAA,gBAAA,CAAA,CAAA;;;;;;;;"}
@@ -0,0 +1 @@
{"version":3,"file":"log.js","sources":["TUICallKit/src/TUICallService/const/log.ts"],"sourcesContent":["/* eslint-disable */\n// 唯一一个变量格式有问题的, 但是为了和原来 TUICallKit 对外暴露的保持一致\nexport enum LOG_LEVEL {\n NORMAL = 0, // 普通级别,日志量较多,接入时建议使用\n RELEASE = 1, // release级别,SDK 输出关键信息,生产环境时建议使用\n WARNING = 2, // 告警级别,SDK 只输出告警和错误级别的日志\n ERROR = 3, // 错误级别,SDK 只输出错误级别的日志\n NONE = 4, // 无日志级别,SDK 将不打印任何日志\n}\n"],"names":["LOG_LEVEL"],"mappings":";AAEY,IAAA,8BAAAA,eAAL;AACLA,aAAAA,WAAA,YAAS,CAAT,IAAA;AACAA,aAAAA,WAAA,aAAU,CAAV,IAAA;AACAA,aAAAA,WAAA,aAAU,CAAV,IAAA;AACAA,aAAAA,WAAA,WAAQ,CAAR,IAAA;AACAA,aAAAA,WAAA,UAAO,CAAP,IAAA;AALUA,SAAAA;AAAA,GAAA,aAAA,CAAA,CAAA;;"}
@@ -0,0 +1 @@
{"version":3,"file":"index.js","sources":["TUICallKit/src/TUICallService/index.ts"],"sourcesContent":["import TUICallService, { TUIGlobal, TUIStore, uiDesign } from './CallService/index';\nimport {\n StoreName,\n NAME,\n CallRole,\n CallMediaType,\n CallStatus,\n StatusChange,\n VideoResolution,\n VideoDisplayMode,\n AudioPlayBackDevice,\n FeatureButton,\n LayoutMode,\n} from './const/index';\nimport { t } from './locales/index';\n\n// 实例化\nconst TUICallKitAPI = TUICallService.getInstance();\n// 输出产物\nexport {\n TUIGlobal,\n TUIStore,\n StoreName,\n TUICallKitAPI,\n NAME,\n CallStatus,\n CallRole,\n CallMediaType,\n StatusChange,\n VideoResolution,\n VideoDisplayMode,\n AudioPlayBackDevice,\n t,\n uiDesign,\n FeatureButton,\n LayoutMode,\n};\n"],"names":["TUICallService"],"mappings":";;;;AAiBM,MAAA,gBAAgBA,+DAAe,YAAY;;"}
@@ -0,0 +1 @@
{"version":3,"file":"index.js","sources":["TUICallKit/src/TUICallService/locales/index.ts"],"sourcesContent":["import { TUIStore } from '../CallService/index';\nimport { NAME, StoreName } from '../const/index';\nimport { zh } from './zh-cn';\nimport { interpolate, isString, isPlainObject } from '../utils/common-utils';\n\n\nexport const CallTips: any = {\n OTHER_SIDE: 'other side',\n CANCEL: 'cancel',\n OTHER_SIDE_REJECT_CALL: 'other side reject call',\n REJECT_CALL: 'reject call',\n OTHER_SIDE_LINE_BUSY: 'other side line busy',\n IN_BUSY: 'in busy',\n CALL_TIMEOUT: 'call timeout',\n END_CALL: 'end call',\n TIMEOUT: 'timeout',\n KICK_OUT: 'kick out',\n CALLER_CALLING_MSG: 'caller calling message',\n CALLER_GROUP_CALLING_MSG: 'wait to be called',\n CALLEE_CALLING_VIDEO_MSG: 'callee calling video message',\n CALLEE_CALLING_AUDIO_MSG: 'callee calling audio message',\n NO_MICROPHONE_DEVICE_PERMISSION: 'no microphone access',\n NO_CAMERA_DEVICE_PERMISSION: 'no camera access',\n EXIST_GROUP_CALL: 'exist group call',\n LOCAL_NETWORK_IS_POOR: 'The network is poor during your current call',\n REMOTE_NETWORK_IS_POOR: 'The other user network is poor during the current call',\n};\n\nexport const languageData: languageDataType = {\n 'zh-cn': zh,\n};\n\n// language translate\nexport function t(args): string {\n const language = TUIStore.getData(StoreName.CALL, NAME.LANGUAGE);\n let translationContent = '';\n if (isString(args)) {\n translationContent = languageData?.[language]?.[args] || '';\n } else if (isPlainObject(args)) {\n const { key, options } = args;\n translationContent = languageData?.[language]?.[key] || '';\n translationContent = interpolate(translationContent, options);\n }\n\n return translationContent;\n}\n\ninterface languageItemType {\n [key: string]: string;\n}\ninterface languageDataType {\n [key: string]: languageItemType;\n}\n"],"names":["zh","TUIStore","StoreName","NAME","isString","isPlainObject","interpolate"],"mappings":";;;;;;AAMO,MAAM,WAAgB;AAAA,EAC3B,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,wBAAwB;AAAA,EACxB,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,iCAAiC;AAAA,EACjC,6BAA6B;AAAA,EAC7B,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,wBAAwB;AAC1B;AAEO,MAAM,eAAiC;AAAA,EAC5C,SAASA,2CAAA;AACX;AAGO,SAAS,EAAE,MAAc;;AAC9B,QAAM,WAAWC,gDAAAA,SAAS,QAAQC,yCAAU,UAAA,MAAMC,0CAAAA,KAAK,QAAQ;AAC/D,MAAI,qBAAqB;AACrB,MAAAC,gDAAAA,SAAS,IAAI,GAAG;AAClB,2BAAqB,kDAAe,cAAf,mBAA2B,UAAS;AAAA,EAAA,WAChDC,gDAAAA,cAAc,IAAI,GAAG;AACxB,UAAA,EAAE,KAAK,QAAY,IAAA;AACzB,2BAAqB,kDAAe,cAAf,mBAA2B,SAAQ;AACnC,yBAAAC,gDAAA,YAAY,oBAAoB,OAAO;AAAA,EAC9D;AAEO,SAAA;AACT;;;"}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"version":3,"file":"promise-retry.js","sources":["TUICallKit/src/TUICallService/utils/decorators/promise-retry.ts"],"sourcesContent":["import promiseRetry from '../retry';\n\n/**\n * 异步函数重试 Interface\n * @param {number} [retries = 5] 重试次数\n * @param {number} [timeout = 2000] 重试间隔时间\n * @param {Function=} onError 重试错误回调\n * @param {Function=} onRetrying 重试回调\n * @param {Function=} onRetryFailed 重试失败回调\n */\ninterface IPromiseRetryDecoratorSettings {\n retries?: number;\n timeout?: number;\n onError?: Function;\n onRetrying?: Function;\n onRetryFailed?: Function;\n};\n\n/**\n * 装饰器函数:给异步函数增加重试\n * @param {Object} settings 入参\n * @returns {Function}\n * @example\n * class LocalStream {\n * @promiseRetryDecorator({\n * retries: 10,\n * timeout: 3000,\n * onRetryFailed: function(error) {\n * }\n * })\n * async recoverCapture(options) {}\n * }\n */\nexport default function promiseRetryDecorator(settings: IPromiseRetryDecoratorSettings) {\n return function(target, name, descriptor) {\n const { retries = 5, timeout = 2000, onError, onRetrying, onRetryFailed } = settings;\n const oldFn = promiseRetry({\n retryFunction: descriptor.value,\n settings: { retries, timeout },\n onError,\n onRetrying,\n onRetryFailed,\n context: null,\n });\n\n descriptor.value = function(...args) {\n return oldFn.apply(this, args);\n };\n return descriptor;\n };\n}\n"],"names":["promiseRetry"],"mappings":";;AAiCA,SAAwB,sBAAsB,UAA0C;AAC/E,SAAA,SAAS,QAAQ,MAAM,YAAY;AAClC,UAAA,EAAE,UAAU,GAAG,UAAU,KAAM,SAAS,YAAY,cAAkB,IAAA;AAC5E,UAAM,QAAQA,0CAAAA,aAAa;AAAA,MACzB,eAAe,WAAW;AAAA,MAC1B,UAAU,EAAE,SAAS,QAAQ;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IAAA,CACV;AAEU,eAAA,QAAQ,YAAY,MAAM;AAC5B,aAAA,MAAM,MAAM,MAAM,IAAI;AAAA,IAAA;AAExB,WAAA;AAAA,EAAA;AAEX;;"}
@@ -0,0 +1 @@
{"version":3,"file":"env.js","sources":["TUICallKit/src/TUICallService/utils/env.ts"],"sourcesContent":["// eslint-disable-next-line\ndeclare var wx: any;\n// eslint-disable-next-line\ndeclare var uni: any;\n// eslint-disable-next-line\ndeclare var window: any;\n\n// 在 uniApp 框架下,打包 H5、ios app、android app 时存在 wx/qq/tt/swan/my 等变量会导致引入 web sdk 环境判断失效\n// 小程序 getSystemInfoSync 返回的 fontSizeSetting 在 H5 和 app 中为 undefined,所以通过 fontSizeSetting 增强小程序环境判断\n// wx 小程序\nexport const IN_WX_MINI_APP = (typeof wx !== 'undefined' && typeof wx.getSystemInfoSync === 'function' && Boolean(wx.getSystemInfoSync().fontSizeSetting));\n\n// 用 uni-app 打包 native app,此时运行于 js core,无 window 等对象,此时调用 api 都得 uni.xxx,由于风格跟小程序类似,就归为 IN_MINI_APP 的一种\nexport const IN_UNI_NATIVE_APP = (typeof uni !== 'undefined' && typeof uni === 'undefined');\n\nexport const IN_MINI_APP = IN_WX_MINI_APP || IN_UNI_NATIVE_APP;\n\nexport const IN_UNI_APP = (typeof uni !== 'undefined');\n\n// 在 uniApp 框架下,由于客户打包 ios app、android app 时 window 不一定存在,所以通过 !IN_MINI_APP 进行判断\n// 非 uniApp 框架下,仍然通过 window 结合 IN_MINI_APP 进行判断,可兼容 Taro3.0+ 暴露 window 对象引起的 IN_BROWSER 判断失效问题\nexport const IN_BROWSER = (function () {\n if (typeof uni !== 'undefined') {\n return !IN_MINI_APP;\n }\n return (typeof window !== 'undefined') && !IN_MINI_APP;\n}());\n\n// 命名空间\nexport const APP_NAMESPACE = (function () {\n if (IN_WX_MINI_APP) {\n return wx;\n }\n if (IN_UNI_APP) {\n return uni;\n }\n return window;\n}());\n\n// eslint-disable-next-line no-mixed-operators\nconst USER_AGENT = IN_BROWSER && window && window.navigator && window.navigator.userAgent || '';\nconst IS_ANDROID = /Android/i.test(USER_AGENT);\nconst IS_WIN_PHONE = /(?:Windows Phone)/.test(USER_AGENT);\nconst IS_SYMBIAN = /(?:SymbianOS)/.test(USER_AGENT);\nconst IS_IOS = /iPad/i.test(USER_AGENT) || /iPhone/i.test(USER_AGENT) || /iPod/i.test(USER_AGENT);\n\nexport const IS_H5 = IS_ANDROID || IS_WIN_PHONE || IS_SYMBIAN || IS_IOS;\n\nexport const IS_PC = IN_BROWSER && !IS_H5;\nexport const IS_WIN = IS_PC && USER_AGENT.includes('Windows NT');\nexport const IS_MAC = IS_PC && USER_AGENT.includes('Mac');\n"],"names":["wx","uni"],"mappings":";;AAUO,MAAM,iBAAkB,OAAOA,cAAAA,SAAO,eAAe,OAAOA,cAAAA,KAAG,sBAAsB,cAAc,QAAQA,cAAAA,KAAG,kBAAkB,EAAE,eAAe;AAGjJ,MAAM,oBAAqB,OAAOC,cAAQ,UAAA,eAAe,OAAOA,cAAQ,UAAA;AAExE,MAAM,cAAc,kBAAkB;AAEhC,MAAA,aAAc,OAAOA,cAAAA,UAAQ;AAInC,MAAM,aAAc,WAAY;AACjC,MAAA,OAAOA,wBAAQ,aAAa;AAC9B,WAAO,CAAC;AAAA,EACV;AACQ,SAAA,OAAO,WAAW,eAAgB,CAAC;AAC7C;AAGO,MAAM,gBAAiB,WAAY;AACxC,MAAI,gBAAgB;AACX,WAAAD;EACT;AACA,MAAI,YAAY;AACP,WAAAC;EACT;AACO,SAAA;AACT,EAAE;AAGF,MAAM,aAAa,cAAc,UAAU,OAAO,aAAa,OAAO,UAAU,aAAa;AAC7F,MAAM,aAAa,WAAW,KAAK,UAAU;AAC7C,MAAM,eAAe,oBAAoB,KAAK,UAAU;AACxD,MAAM,aAAa,gBAAgB,KAAK,UAAU;AAClD,MAAM,SAAS,QAAQ,KAAK,UAAU,KAAK,UAAU,KAAK,UAAU,KAAK,QAAQ,KAAK,UAAU;AAEnF,MAAA,QAAQ,cAAc,gBAAgB,cAAc;AAEpD,MAAA,QAAQ,cAAc,CAAC;AAC7B,MAAM,SAAS,SAAS,WAAW,SAAS,YAAY;AACxD,MAAM,SAAS,SAAS,WAAW,SAAS,KAAK;;;;;;;;;"}
@@ -0,0 +1 @@
{"version":3,"file":"index.js","sources":["TUICallKit/src/TUICallService/utils/index.ts"],"sourcesContent":["export async function checkLocalMP3FileExists(src: string) {\n if (!src) return false;\n try {\n const response = await new Promise<XMLHttpRequest>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('HEAD', src, true);\n xhr.onload = () => resolve(xhr);\n xhr.onerror = () => reject(xhr);\n xhr.send();\n });\n return response.status === 200 && response.getResponseHeader('Content-Type') === 'audio/mpeg';\n } catch (error) {\n console.warn(error);\n return false;\n }\n}\n\nexport function deepClone(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n let clone = Array.isArray(obj) ? [] : {};\n\n for (let key in obj) {\n if (obj.hasOwnProperty(key)) {\n clone[key] = deepClone(obj[key]);\n }\n }\n\n return clone;\n}\n"],"names":[],"mappings":";;AAiBO,SAAS,UAAU,KAAK;AAC7B,MAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AACpC,WAAA;AAAA,EACT;AAEA,MAAI,QAAQ,MAAM,QAAQ,GAAG,IAAI,KAAK;AAEtC,WAAS,OAAO,KAAK;AACf,QAAA,IAAI,eAAe,GAAG,GAAG;AAC3B,YAAM,GAAG,IAAI,UAAU,IAAI,GAAG,CAAC;AAAA,IACjC;AAAA,EACF;AAEO,SAAA;AACT;;"}
@@ -0,0 +1 @@
{"version":3,"file":"is-empty.js","sources":["TUICallKit/src/TUICallService/utils/is-empty.ts"],"sourcesContent":["import { isPlainObject } from './common-utils';\n\nconst isEmpty = function (input: any) {\n // Null and Undefined...\n if (input === null || typeof (input) === 'undefined') return true;\n // Booleans...\n if (typeof input === 'boolean') return false;\n // Numbers...\n if (typeof input === 'number') return input === 0;\n // Strings...\n if (typeof input === 'string') return input.length === 0;\n // Functions...\n if (typeof input === 'function') return input.length === 0;\n // Arrays...\n if (Array.isArray(input)) return input.length === 0;\n // Errors...\n if (input instanceof Error) return input.message === '';\n // plain object\n if (isPlainObject(input)) {\n // eslint-disable-next-line\n for (const key in input) {\n if (Object.prototype.hasOwnProperty.call(input, key)) {\n return false;\n }\n }\n return true;\n }\n return false;\n};\n\nexport default isEmpty;\n"],"names":["isPlainObject"],"mappings":";;AAEM,MAAA,UAAU,SAAU,OAAY;AAEhC,MAAA,UAAU,QAAQ,OAAQ,UAAW;AAAoB,WAAA;AAE7D,MAAI,OAAO,UAAU;AAAkB,WAAA;AAEvC,MAAI,OAAO,UAAU;AAAU,WAAO,UAAU;AAEhD,MAAI,OAAO,UAAU;AAAU,WAAO,MAAM,WAAW;AAEvD,MAAI,OAAO,UAAU;AAAY,WAAO,MAAM,WAAW;AAErD,MAAA,MAAM,QAAQ,KAAK;AAAG,WAAO,MAAM,WAAW;AAElD,MAAI,iBAAiB;AAAO,WAAO,MAAM,YAAY;AAEjD,MAAAA,gDAAAA,cAAc,KAAK,GAAG;AAExB,eAAW,OAAO,OAAO;AACvB,UAAI,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG,GAAG;AAC7C,eAAA;AAAA,MACT;AAAA,IACF;AACO,WAAA;AAAA,EACT;AACO,SAAA;AACT;;"}
@@ -0,0 +1 @@
{"version":3,"file":"retry.js","sources":["TUICallKit/src/TUICallService/utils/retry.ts"],"sourcesContent":["import { isFunction, isUndefined } from './common-utils';\n\nconst RETRY_STATE_NOT_START = 0;\nconst RETRY_STATE_STARTED = 1;\nconst RETRY_STATE_STOPPED = 2;\n\n/**\n * 给异步函数封装重试逻辑\n * @param {Object} options 重试逻辑入参\n * @param {Object} options.retryFunction 需要封装的异步函数\n * @param {Object} options.settings 重试属性\n * @param {Number} [options.settings.retries = 5] 重试次数\n * @param {Number} [options.settings.timeout = 1000] 重试间隔\n * @param {onErrorCallback} options.onError 重试错误回调\n * @param {onRetryingCallback} [options.onRetrying] 重试后的回调\n * @param {Object} options.context 上下文,可选\n * @returns {Function} 封装后的函数\n * @example\n * const getUserMedia = promiseRetry({\n * retryFunction: getUserMedia_,\n * settings: { retries: 5, timeout: 2000 },\n * onError: (error, retry, reject) => {\n * if (error.name === 'NotReadableError') {\n * retry();\n * } else {\n * reject(error);\n * }\n * },\n * onRetrying: retryCount => {\n * console.warn(`getUserMedia NotReadableError observed, retrying [${retryCount}/5]`);\n * }\n * });\n */\nfunction promiseRetry({ retryFunction, settings, onError, onRetrying, onRetryFailed, context }) {\n return function(...args) {\n const retries = settings.retries || 5;\n let retryCount = 0;\n let timer: any = -1;\n let retryState = RETRY_STATE_NOT_START;\n const run = async (resolve, reject) => {\n const ctx = context || this;\n try {\n const result = await retryFunction.apply(ctx, args);\n // 执行成功,正常返回\n retryCount = 0;\n resolve(result);\n } catch (error) {\n // 用于停止重试\n const stopRetry = () => {\n clearTimeout(timer);\n retryCount = 0;\n retryState = RETRY_STATE_STOPPED;\n reject(error);\n };\n const retry = () => {\n if (retryState !== RETRY_STATE_STOPPED && retryCount < retries) {\n retryCount++;\n retryState = RETRY_STATE_STARTED;\n if (isFunction(onRetrying)) {\n onRetrying.call(ctx, retryCount, stopRetry);\n }\n timer = setTimeout(\n () => {\n timer = -1;\n run(resolve, reject);\n },\n isUndefined(settings.timeout) ? 1000 : settings.timeout\n );\n } else {\n stopRetry();\n if (isFunction(onRetryFailed)) {\n onRetryFailed.call(ctx, error);\n }\n }\n };\n if (isFunction(onError)) {\n onError.call(ctx, error, retry, reject, args);\n } else {\n retry();\n }\n }\n };\n\n return new Promise(run);\n };\n}\n\nexport default promiseRetry;\n"],"names":["isFunction","isUndefined"],"mappings":";;AAEA,MAAM,wBAAwB;AAC9B,MAAM,sBAAsB;AAC5B,MAAM,sBAAsB;AA6B5B,SAAS,aAAa,EAAE,eAAe,UAAU,SAAS,YAAY,eAAe,WAAW;AAC9F,SAAO,YAAY,MAAM;AACjB,UAAA,UAAU,SAAS,WAAW;AACpC,QAAI,aAAa;AACjB,QAAI,QAAa;AACjB,QAAI,aAAa;AACX,UAAA,MAAM,OAAO,SAAS,WAAW;AACrC,YAAM,MAAM,WAAW;AACnB,UAAA;AACF,cAAM,SAAS,MAAM,cAAc,MAAM,KAAK,IAAI;AAErC,qBAAA;AACb,gBAAQ,MAAM;AAAA,eACP,OAAO;AAEd,cAAM,YAAY,MAAM;AACtB,uBAAa,KAAK;AACL,uBAAA;AACA,uBAAA;AACb,iBAAO,KAAK;AAAA,QAAA;AAEd,cAAM,QAAQ,MAAM;AACd,cAAA,eAAe,uBAAuB,aAAa,SAAS;AAC9D;AACa,yBAAA;AACT,gBAAAA,gDAAAA,WAAW,UAAU,GAAG;AACf,yBAAA,KAAK,KAAK,YAAY,SAAS;AAAA,YAC5C;AACQ,oBAAA;AAAA,cACN,MAAM;AACI,wBAAA;AACR,oBAAI,SAAS,MAAM;AAAA,cACrB;AAAA,cACAC,gDAAAA,YAAY,SAAS,OAAO,IAAI,MAAO,SAAS;AAAA,YAAA;AAAA,UAClD,OACK;AACK;AACN,gBAAAD,gDAAAA,WAAW,aAAa,GAAG;AACf,4BAAA,KAAK,KAAK,KAAK;AAAA,YAC/B;AAAA,UACF;AAAA,QAAA;AAEE,YAAAA,gDAAAA,WAAW,OAAO,GAAG;AACvB,kBAAQ,KAAK,KAAK,OAAO,OAAO,QAAQ,IAAI;AAAA,QAAA,OACvC;AACC;QACR;AAAA,MACF;AAAA,IAAA;AAGK,WAAA,IAAI,QAAQ,GAAG;AAAA,EAAA;AAE1B;;"}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"version":3,"file":"avoidRepeatedCall.js","sources":["TUICallKit/src/TUICallService/utils/validate/avoidRepeatedCall.ts"],"sourcesContent":["import { NAME } from '../../const/index';\n\n/**\n * 装饰器:阻止函数重复调用\n * @export\n * @param {Object} options 入参\n * @param {Function} options.fn 函数\n * @param {Object} options.context 上下文对象\n * @param {String} options.name 函数名\n * @returns {Function} 封装后的函数\n */\nexport function avoidRepeatedCall() {\n return function (target: any, name: string, descriptor: any) {\n const oldFn = descriptor.value;\n const isCallingSet = new Set();\n descriptor.value = async function (...args: any[]) {\n if (isCallingSet.has(this)) {\n console.warn((`${NAME.PREFIX}previous ${name}() is ongoing, please avoid repeated calls`));\n // throw new Error(`previous ${name}() is ongoing, please avoid repeated calls`);\n this?.getTUICallEngineInstance()?.reportLog?.({\n name: 'TUICallKit.avoidRepeatedCall.fail',\n data: { name },\n error: `previous ${name}() is ongoing`,\n });\n return;\n }\n try {\n isCallingSet.add(this);\n const result = await oldFn.apply(this, args);\n isCallingSet.delete(this);\n return result;\n } catch (error) {\n isCallingSet.delete(this);\n throw error;\n }\n };\n\n descriptor.value.clearCallState = function(instance: any) {\n isCallingSet.delete(instance);\n };\n \n return descriptor;\n };\n}\n"],"names":["uni","NAME"],"mappings":";;;AAWO,SAAS,oBAAoB;AAC3B,SAAA,SAAU,QAAa,MAAc,YAAiB;AAC3D,UAAM,QAAQ,WAAW;AACnB,UAAA,mCAAmB;AACd,eAAA,QAAQ,kBAAmB,MAAa;;AAC7C,UAAA,aAAa,IAAI,IAAI,GAAG;AACbA,sBAAAA,MAAA,MAAA,QAAA,2EAAC,GAAGC,+CAAK,MAAM,YAAY,IAAI,4CAA6C;AAEnF,iDAAA,+BAAA,mBAA4B,cAA5B,4BAAwC;AAAA,UAC5C,MAAM;AAAA,UACN,MAAM,EAAE,KAAK;AAAA,UACb,OAAO,YAAY,IAAI;AAAA,QAAA;AAEzB;AAAA,MACF;AACI,UAAA;AACF,qBAAa,IAAI,IAAI;AACrB,cAAM,SAAS,MAAM,MAAM,MAAM,MAAM,IAAI;AAC3C,qBAAa,OAAO,IAAI;AACjB,eAAA;AAAA,eACA,OAAO;AACd,qBAAa,OAAO,IAAI;AAClB,cAAA;AAAA,MACR;AAAA,IAAA;AAGS,eAAA,MAAM,iBAAiB,SAAS,UAAe;AACxD,mBAAa,OAAO,QAAQ;AAAA,IAAA;AAGvB,WAAA;AAAA,EAAA;AAEX;;"}
@@ -0,0 +1 @@
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}