diff --git a/TUICallKit-Vue3/TUIKit/pages/chat/chat.vue b/TUICallKit-Vue3/TUIKit/pages/chat/chat.vue
index 3e8e03d5d..d9dfa003a 100755
--- a/TUICallKit-Vue3/TUIKit/pages/chat/chat.vue
+++ b/TUICallKit-Vue3/TUIKit/pages/chat/chat.vue
@@ -610,7 +610,7 @@ const { proxy } = getCurrentInstance()
patientLeaveNotified = false;
console.log('进入onMounted:', options);
const app = getApp();
- const userID = options.userID|| app.globalData.userID;
+ let userID = options.userID|| app.globalData.userID;
if(!userID.includes('patient')){
userID='patient_'+userID
}
diff --git a/TUICallKit-Vue3/components/dev-training-entry/index.vue b/TUICallKit-Vue3/components/dev-training-entry/index.vue
index 22916f9e4..5e3b3166c 100755
--- a/TUICallKit-Vue3/components/dev-training-entry/index.vue
+++ b/TUICallKit-Vue3/components/dev-training-entry/index.vue
@@ -1,729 +1,922 @@
-
-
-
-
-
-
-
-
-
- 居家耗糖训练
- 体验
-
- 低强度动起来,帮助身体消耗糖分
-
-
-
-
-
-
-
- 推荐
-
-
- {{ item.title }}
- {{ item.sub }}
- 进入
-
-
-
-
- 左右滑动,选择适合您的训练
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ 居家耗糖训练
+ 体验
+
+ 低强度动起来,帮助身体消耗糖分
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+ 新功能
+ 推荐
+
+ {{ item.desc }}
+
+ 去训练
+ ›
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TUICallKit-Vue3/manifest.json b/TUICallKit-Vue3/manifest.json
index 1bf579296..3d145036b 100755
--- a/TUICallKit-Vue3/manifest.json
+++ b/TUICallKit-Vue3/manifest.json
@@ -63,7 +63,7 @@
"requiredBackgroundModes" : [ "audio" ],
"plugins" : {
"WechatSI" : {
- "version" : "0.3.5",
+ "version" : "0.3.9",
"provider" : "wx069ba97219f66d99"
}
}
diff --git a/TUICallKit-Vue3/package.json b/TUICallKit-Vue3/package.json
index 9846baa6b..4b7d31fd3 100755
--- a/TUICallKit-Vue3/package.json
+++ b/TUICallKit-Vue3/package.json
@@ -9,7 +9,8 @@
"dev:app": "UNI_INPUT_DIR=\"$PWD\" uni -p app",
"build:mp-weixin": "UNI_INPUT_DIR=\"$PWD\" uni build -p mp-weixin",
"build:h5": "UNI_INPUT_DIR=\"$PWD\" uni build",
- "build:app": "UNI_INPUT_DIR=\"$PWD\" uni build -p app"
+ "build:app": "UNI_INPUT_DIR=\"$PWD\" uni build -p app",
+ "test:pose": "node --no-warnings --test \"training/pose/__tests__/*.test.ts\""
},
"keywords": [],
"author": "",
diff --git a/TUICallKit-Vue3/pages.json b/TUICallKit-Vue3/pages.json
index 223d8b39f..b5e14d2b6 100755
--- a/TUICallKit-Vue3/pages.json
+++ b/TUICallKit-Vue3/pages.json
@@ -162,6 +162,23 @@
"navigationBarTextStyle": "black",
"backgroundColor": "#f8fafc"
}
+ },
+ {
+ "path": "pages/pose-hub",
+ "style": {
+ "navigationBarTitleText": "AI 跟练",
+ "navigationBarBackgroundColor": "#f4fbf4",
+ "navigationBarTextStyle": "black",
+ "backgroundColor": "#f4fbf4"
+ }
+ },
+ {
+ "path": "pages/pose-coach",
+ "style": {
+ "navigationStyle": "custom",
+ "disableScroll": true,
+ "backgroundColor": "#0b1210"
+ }
}
]
},
@@ -179,7 +196,7 @@
"mp-weixin": {
"usingPlugins": {
"WechatSI": {
- "version": "0.3.5",
+ "version": "0.3.9",
"provider": "wx069ba97219f66d99"
}
}
@@ -196,7 +213,7 @@
"mp-weixin": {
"usingPlugins": {
"WechatSI": {
- "version": "0.3.5",
+ "version": "0.3.9",
"provider": "wx069ba97219f66d99"
}
}
@@ -213,7 +230,7 @@
"mp-weixin": {
"usingPlugins": {
"WechatSI": {
- "version": "0.3.5",
+ "version": "0.3.9",
"provider": "wx069ba97219f66d99"
}
}
diff --git a/TUICallKit-Vue3/tongji/components/TongjiIcon.vue b/TUICallKit-Vue3/tongji/components/TongjiIcon.vue
index 056aae927..53576727c 100755
--- a/TUICallKit-Vue3/tongji/components/TongjiIcon.vue
+++ b/TUICallKit-Vue3/tongji/components/TongjiIcon.vue
@@ -59,6 +59,7 @@ const ICON_PATHS = {
moon: '',
sunset: '',
mic: '',
+ keyboard: '',
camera: '',
bulb: '',
leaf: '',
diff --git a/TUICallKit-Vue3/tongji/pages/weekly.vue b/TUICallKit-Vue3/tongji/pages/weekly.vue
index 809932519..434ca2a18 100755
--- a/TUICallKit-Vue3/tongji/pages/weekly.vue
+++ b/TUICallKit-Vue3/tongji/pages/weekly.vue
@@ -82,16 +82,16 @@
-
+
图表已暂停显示
-
+
当前时间范围暂无血糖数据
@@ -190,53 +190,13 @@
-
+
-
- ×
-
-
-
-
+
+
+ 你问
+ {{ lastAskQuestion }}
-
-
-
-
-
-
-
-
-
- {{ sttListening ? '松手结束' : '准备录音…' }}
-
-
{{ dietAiAskResult.level_label }}
@@ -244,16 +204,68 @@
{{ dietAiAskResult.advice || (dietAiAsking ? '正在想…' : '') }}▍
+
+
+ ×
+
+
+
+
+
+
+
+ {{ holdBtnText }}
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
+
+
+
- {{ sttListening ? '正在聆听…' : '准备录音…' }}
- 松开手指结束并识别
+ {{ voicePartial || (sttListening ? '请说,比如“晚饭能吃西瓜吗”' : '准备录音…') }}
+ {{ voiceCancel ? '松开手指,取消发送' : '松开发送 · 上滑取消' }}
@@ -535,6 +547,7 @@ function onDietAiAskFocus() {
}
function onDietAiAskBlur() {
dietAiAskFocused.value = false
+ askInputFocus.value = false
}
/** 聚焦或已有内容时展开为多行输入(内容多则自动增高) */
const dietAiAskExpanded = computed(
@@ -547,6 +560,20 @@ function onKeyboardHeightChange(res) {
keyboardHeight.value = res && res.height ? Math.round(res.height) : 0
}
+/** 按住说话时手指上滑超过这个距离(px)进入取消状态 */
+const VOICE_CANCEL_DY = 60
+
+/** 输入方式:默认按住说话,右侧图标切到文字 */
+const askMode = ref('voice')
+const askInputFocus = ref(false)
+/** 上滑取消:松手后丢弃这次识别结果 */
+const voiceCancel = ref(false)
+/** 说话过程中的实时识别文字 */
+const voicePartial = ref('')
+let voiceStartY = 0
+/** 最近一次提问,显示在回答卡片上,方便核对语音有没有听错 */
+const lastAskQuestion = ref('')
+
const {
sttListening,
sttHolding,
@@ -555,19 +582,73 @@ const {
endHoldSpeech,
stopSpeechToText
} = useSpeechToText({
- onResult(text) {
- const prev = String(dietAiAskText.value || '').trim()
- dietAiAskText.value = prev ? `${prev} ${text}` : text
+ onPartial(text) {
+ voicePartial.value = text
+ },
+ onSettle(text) {
+ if (voiceCancel.value) {
+ voiceCancel.value = false
+ return true
+ }
+ // 没识别到内容:交给默认流程(按得太短不打扰,否则提示没听清)
+ if (!text) return false
+ submitAsk(text)
+ return true
},
showToast: (msg) => showUserToast(msg)
})
-function onDietAiSpeechStart() {
+/** 不支持语音的环境(如开发者工具)直接用文字输入 */
+const voiceMode = computed(() => sttSupported.value && askMode.value === 'voice')
+const hasAskText = computed(() => String(dietAiAskText.value || '').trim().length > 0)
+const holdBtnText = computed(() => {
+ if (dietAiAsking.value) return 'AI 正在回答…'
+ if (!sttHolding.value) return '按住 说话'
+ return voiceCancel.value ? '松开 取消' : '松开 发送'
+})
+
+function submitAsk(text) {
+ const q = String(text || '').trim()
+ if (!q || dietAiAsking.value) return
+ lastAskQuestion.value = q
+ dietAiAskText.value = q
+ askDietAiFood()
+}
+
+function sendTextAsk() {
+ submitAsk(dietAiAskText.value)
+}
+
+function toggleAskMode() {
+ if (askMode.value === 'voice') {
+ askMode.value = 'text'
+ askInputFocus.value = true
+ return
+ }
+ askMode.value = 'voice'
+ askInputFocus.value = false
+ uni.hideKeyboard()
+}
+
+function touchY(e) {
+ const t = (e && e.touches && e.touches[0]) || (e && e.changedTouches && e.changedTouches[0])
+ return t ? Number(t.clientY ?? t.pageY ?? 0) : 0
+}
+
+function onVoiceTouchStart(e) {
if (dietAiAsking.value) return
+ voiceStartY = touchY(e)
+ voiceCancel.value = false
+ voicePartial.value = ''
beginHoldSpeech()
}
-function onDietAiSpeechEnd() {
+function onVoiceTouchMove(e) {
+ if (!sttHolding.value) return
+ voiceCancel.value = voiceStartY - touchY(e) > VOICE_CANCEL_DY
+}
+
+function onVoiceTouchEnd() {
endHoldSpeech()
}
@@ -1812,9 +1893,11 @@ function closeInputForm() {
/** 任一录入弹层打开时需卸载 canvas(小程序原生组件会盖住普通 view)*/
const recordOverlayOpen = computed(() => inputForm.value.visible || phoneGateVisible.value)
+/** 2d 画布层级高于普通元素,会盖住弹层:录入弹窗、授权弹窗、按住说话浮层出现时先隐藏趋势图 */
+const chartHidden = computed(() => recordOverlayOpen.value || sttHolding.value)
-watch(recordOverlayOpen, (open) => {
- if (!open) {
+watch(chartHidden, (hidden) => {
+ if (!hidden) {
resetCanvasCache()
nextTick(() => scheduleChartRedraw())
}
diff --git a/TUICallKit-Vue3/tongji/styles/weekly-stitch.scss b/TUICallKit-Vue3/tongji/styles/weekly-stitch.scss
index ce1da2cb1..01d612020 100755
--- a/TUICallKit-Vue3/tongji/styles/weekly-stitch.scss
+++ b/TUICallKit-Vue3/tongji/styles/weekly-stitch.scss
@@ -8,6 +8,10 @@
--st-shadow-float: 0 16rpx 64rpx rgba(0, 108, 73, 0.15);
--tab-dock-full-offset: calc(220rpx + env(safe-area-inset-bottom));
padding-bottom: var(--tab-dock-full-offset);
+ // 页面宽度固定:子元素横向超出一律裁掉,整页不能左右滑动。
+ // clip 不会生成滚动容器;不支持 clip 的旧内核忽略第二条,回退到 hidden
+ overflow-x: hidden;
+ overflow-x: clip;
}
/* ===== Header ===== */
@@ -700,7 +704,7 @@
text-align: center;
}
-/* ===== 底部浮动输入 ===== */
+/* ===== 底部浮动 AI 输入:默认按住说话,右侧切换文字 ===== */
.weekly-page .st-float-ask {
position: fixed;
left: var(--st-container-margin);
@@ -709,14 +713,18 @@
z-index: 210;
}
+.weekly-page .st-float-bar {
+ position: relative;
+}
+
.weekly-page .st-float-close {
position: absolute;
- top: -18rpx;
+ top: -14rpx;
right: -6rpx;
- width: 44rpx;
- height: 44rpx;
+ width: 40rpx;
+ height: 40rpx;
border-radius: 50%;
- background: rgba(0, 0, 0, 0.45);
+ background: rgba(22, 29, 25, 0.55);
display: flex;
align-items: center;
justify-content: center;
@@ -725,7 +733,7 @@
.weekly-page .st-float-close-icon {
color: #ffffff;
- font-size: 30rpx;
+ font-size: 28rpx;
line-height: 1;
}
@@ -747,21 +755,21 @@
.weekly-page .st-float-inner {
display: flex;
align-items: center;
- gap: 16rpx;
- padding: 16rpx 16rpx 16rpx 28rpx;
+ gap: 14rpx;
+ padding: 12rpx;
border-radius: 999rpx;
- background: rgba(255, 255, 255, 0.9);
+ background: rgba(255, 255, 255, 0.92);
backdrop-filter: blur(20rpx);
border: 1rpx solid rgba(0, 108, 73, 0.1);
box-shadow: var(--st-shadow-float);
transition: border-radius 0.22s ease, padding 0.22s ease, border-color 0.22s ease;
}
-/* 聚焦/有内容时展开:底部对齐让输入框向上增高,圆角收敛为圆角矩形 */
+/* 文字输入聚焦 / 有内容时展开:底部对齐让输入框向上增高,圆角收敛为圆角矩形 */
.weekly-page .st-float-inner.is-expanded {
align-items: flex-end;
border-radius: 32rpx;
- padding: 18rpx 16rpx 18rpx 32rpx;
+ padding: 16rpx 12rpx 16rpx 16rpx;
border-color: rgba(0, 108, 73, 0.28);
}
@@ -776,6 +784,67 @@
flex-shrink: 0;
}
+/* 按住说话:占满整条,按下变实心主色,上滑取消变红 */
+.weekly-page .st-hold-btn {
+ flex: 1;
+ min-width: 0;
+ height: 80rpx;
+ border-radius: 999rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 12rpx;
+ background: linear-gradient(180deg, #f3faf6 0%, #e2f2e9 100%);
+ border: 1rpx solid rgba(0, 108, 73, 0.16);
+ transition: background 0.18s ease, transform 0.15s ease, box-shadow 0.18s ease;
+}
+
+.weekly-page .st-hold-text {
+ font-size: 30rpx;
+ font-weight: 700;
+ letter-spacing: 4rpx;
+ color: var(--primary);
+ line-height: 1;
+}
+
+.weekly-page .st-hold-btn.holding {
+ background: linear-gradient(180deg, #1f8a5c 0%, #006c49 100%);
+ border-color: transparent;
+ box-shadow: 0 8rpx 24rpx rgba(0, 108, 73, 0.3);
+ transform: scale(0.98);
+}
+
+.weekly-page .st-hold-btn.cancel {
+ background: linear-gradient(180deg, #e5484d 0%, #ba1a1a 100%);
+ box-shadow: 0 8rpx 24rpx rgba(186, 26, 26, 0.3);
+}
+
+.weekly-page .st-hold-btn.holding .st-hold-text {
+ color: #ffffff;
+}
+
+.weekly-page .st-hold-btn.disabled {
+ opacity: 0.55;
+ pointer-events: none;
+}
+
+.weekly-page .st-mode-toggle {
+ width: 72rpx;
+ height: 72rpx;
+ border-radius: 50%;
+ background: var(--surface-container-low);
+ border: 1rpx solid rgba(0, 108, 73, 0.1);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ transition: transform 0.15s ease;
+}
+
+.weekly-page .st-mode-toggle:active {
+ transform: scale(0.92);
+}
+
.weekly-page .st-float-input {
flex: 1;
min-width: 0;
@@ -797,7 +866,7 @@
}
.weekly-page .st-float-placeholder {
- color: rgba(60, 74, 66, 0.6);
+ color: rgba(60, 74, 66, 0.55);
font-size: 26rpx;
line-height: 40rpx;
white-space: nowrap;
@@ -805,106 +874,10 @@
text-overflow: ellipsis;
}
-.weekly-page .st-float-mic {
+.weekly-page .st-float-send {
width: 72rpx;
height: 72rpx;
border-radius: 50%;
- background: rgba(0, 108, 73, 0.1);
- display: flex;
- align-items: center;
- justify-content: center;
- flex-shrink: 0;
- transition: background 0.2s ease, transform 0.15s ease;
-}
-
-.weekly-page .st-float-mic.listening {
- background: var(--primary);
- animation: st-float-mic-pulse 1.2s ease-in-out infinite;
-}
-
-.weekly-page .st-float-mic.disabled {
- opacity: 0.45;
- pointer-events: none;
-}
-
-.weekly-page .st-float-mic:active {
- transform: scale(0.94);
-}
-
-.weekly-page .st-float-hold-hint {
- margin-top: 12rpx;
- text-align: center;
- font-size: 24rpx;
- color: var(--primary);
- line-height: 1.4;
-}
-
-.weekly-page .st-voice-overlay {
- position: fixed;
- left: 0;
- right: 0;
- top: 0;
- bottom: 0;
- z-index: 3000;
- display: flex;
- align-items: center;
- justify-content: center;
- background: rgba(0, 0, 0, 0.32);
- pointer-events: none;
-}
-
-.weekly-page .st-voice-card {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 20rpx;
- padding: 56rpx 64rpx;
- border-radius: 32rpx;
- background: rgba(20, 24, 22, 0.86);
- box-shadow: 0 16rpx 48rpx rgba(0, 0, 0, 0.35);
-}
-
-.weekly-page .st-voice-icon {
- width: 120rpx;
- height: 120rpx;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- background: linear-gradient(180deg, #2d7340 0%, #006c49 100%);
-}
-
-.weekly-page .st-voice-icon.active {
- animation: st-voice-pulse 1.1s ease-in-out infinite;
-}
-
-@keyframes st-voice-pulse {
- 0%, 100% { box-shadow: 0 0 0 0 rgba(0, 108, 73, 0.45); }
- 50% { box-shadow: 0 0 0 20rpx rgba(0, 108, 73, 0); }
-}
-
-.weekly-page .st-voice-title {
- font-size: 32rpx;
- font-weight: 700;
- color: #ffffff;
- line-height: 1.3;
-}
-
-.weekly-page .st-voice-sub {
- font-size: 24rpx;
- color: rgba(255, 255, 255, 0.7);
- line-height: 1.3;
-}
-
-@keyframes st-float-mic-pulse {
- 0%, 100% { box-shadow: 0 0 0 0 rgba(0, 108, 73, 0.35); }
- 50% { box-shadow: 0 0 0 12rpx rgba(0, 108, 73, 0); }
-}
-
-.weekly-page .st-float-send {
- width: 80rpx;
- height: 80rpx;
- border-radius: 50%;
background: var(--primary);
display: flex;
align-items: center;
@@ -923,13 +896,121 @@
transform: scale(0.95);
}
+/* 按住说话浮层:居中显示,避免被键盘/底栏遮挡;不拦截触摸,手指始终在按钮上 */
+.weekly-page .st-voice-overlay {
+ position: fixed;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ z-index: 3000;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(0, 0, 0, 0.36);
+ pointer-events: none;
+}
+
+.weekly-page .st-voice-card {
+ width: 540rpx;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 24rpx;
+ padding: 48rpx 40rpx 40rpx;
+ border-radius: 40rpx;
+ background: rgba(20, 24, 22, 0.9);
+ box-shadow: 0 16rpx 48rpx rgba(0, 0, 0, 0.35);
+ transition: background 0.18s ease;
+}
+
+.weekly-page .st-voice-card.cancel {
+ background: rgba(186, 26, 26, 0.92);
+}
+
+.weekly-page .st-voice-wave {
+ height: 72rpx;
+ display: flex;
+ align-items: center;
+ gap: 12rpx;
+}
+
+.weekly-page .st-voice-bar {
+ width: 10rpx;
+ height: 24rpx;
+ border-radius: 6rpx;
+ background: #4edea3;
+}
+
+.weekly-page .st-voice-card.cancel .st-voice-bar {
+ background: rgba(255, 255, 255, 0.85);
+}
+
+.weekly-page .st-voice-wave.active .st-voice-bar {
+ animation: st-voice-wave 0.9s ease-in-out infinite;
+}
+
+@keyframes st-voice-wave {
+ 0%, 100% { transform: scaleY(0.5); }
+ 50% { transform: scaleY(2.4); }
+}
+
+.weekly-page .st-voice-live {
+ min-height: 92rpx;
+ font-size: 32rpx;
+ font-weight: 600;
+ line-height: 1.45;
+ color: #ffffff;
+ text-align: center;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+}
+
+.weekly-page .st-voice-sub {
+ font-size: 24rpx;
+ color: rgba(255, 255, 255, 0.72);
+ line-height: 1.3;
+}
+
+/* 回答卡片:在输入栏上方,先显示“你问”方便核对语音识别 */
.weekly-page .st-float-result {
- margin-top: 16rpx;
- padding: 24rpx 32rpx;
- border-radius: var(--st-radius-xl);
- background: rgba(255, 255, 255, 0.95);
+ margin-bottom: 16rpx;
+ max-height: 42vh;
+ overflow-y: auto;
+ padding: 24rpx 28rpx;
+ border-radius: 32rpx;
+ background: rgba(255, 255, 255, 0.97);
border: 1rpx solid var(--outline-variant);
- box-shadow: var(--st-shadow-ambient);
+ box-shadow: var(--st-shadow-float);
+}
+
+.weekly-page .st-float-question {
+ display: flex;
+ align-items: flex-start;
+ gap: 12rpx;
+ margin-bottom: 14rpx;
+}
+
+.weekly-page .st-float-question-label {
+ flex-shrink: 0;
+ padding: 2rpx 12rpx;
+ border-radius: 8rpx;
+ font-size: 22rpx;
+ font-weight: 700;
+ color: var(--on-surface-variant);
+ background: var(--surface-container);
+ line-height: 1.6;
+}
+
+.weekly-page .st-float-question-text {
+ flex: 1;
+ min-width: 0;
+ font-size: 26rpx;
+ line-height: 1.6;
+ color: var(--on-surface-variant);
}
.weekly-page .st-float-badge {
@@ -946,7 +1027,7 @@
.weekly-page .st-float-advice {
font-size: 28rpx;
line-height: 1.5;
- color: var(--on-surface-variant);
+ color: var(--on-surface);
}
.weekly-page .ai-stream-cursor {
diff --git a/TUICallKit-Vue3/training/pages/components/amount-meter.vue b/TUICallKit-Vue3/training/pages/components/amount-meter.vue
new file mode 100644
index 000000000..72e6cb738
--- /dev/null
+++ b/TUICallKit-Vue3/training/pages/components/amount-meter.vue
@@ -0,0 +1,123 @@
+
+
+
+ 动作幅度
+ {{ reached ? '到位' : hint }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TUICallKit-Vue3/training/pages/components/coach-sprite.vue b/TUICallKit-Vue3/training/pages/components/coach-sprite.vue
new file mode 100644
index 000000000..fc0ccb3f0
--- /dev/null
+++ b/TUICallKit-Vue3/training/pages/components/coach-sprite.vue
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TUICallKit-Vue3/training/pages/components/pose-coach.scss b/TUICallKit-Vue3/training/pages/components/pose-coach.scss
new file mode 100644
index 000000000..71c533761
--- /dev/null
+++ b/TUICallKit-Vue3/training/pages/components/pose-coach.scss
@@ -0,0 +1,769 @@
+// AI 跟练页(跟练阶段)样式
+//
+// 训练中以教练示范为主画面(亮色舞台),自己的摄像头画面缩在右上角小窗;
+// 站位、离开画面或手动切换时自己的画面铺满,界面换成深色半透明面板(.is-dark)。
+// 层级:舞台 0 < 全屏画面 1 < 渐变遮罩 2 < 小窗 5 < 界面 10 < 暂停弹层 20
+
+$glass: rgba(15, 23, 20, 0.55);
+$glass-strong: rgba(15, 23, 20, 0.72);
+$mint: #34d399;
+$ink: #161d19;
+$ink-soft: #6b7a72;
+
+.page {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: #0b1210;
+ overflow: hidden;
+}
+
+.cam-stage {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+}
+
+// ───────── 教练舞台 ─────────
+.stage {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 0;
+ background-color: #f4f8f6;
+}
+
+.coach-box {
+ position: absolute;
+}
+
+.coach-box.is-stage {
+ z-index: 0;
+}
+
+// 看自己时,教练缩到右上角
+.coach-box.is-card {
+ right: 24rpx;
+ z-index: 5;
+ width: 216rpx;
+ height: 288rpx;
+ border-radius: 28rpx;
+ border: 4rpx solid #fff;
+ background: linear-gradient(180deg, #ffffff, #ecfdf5);
+ box-shadow: 0 16rpx 40rpx rgba(0, 0, 0, 0.3);
+ overflow: hidden;
+}
+
+.shade-top,
+.shade-bottom {
+ position: absolute;
+ left: 0;
+ right: 0;
+ z-index: 2;
+ pointer-events: none;
+}
+
+.shade-top {
+ top: 0;
+ height: 260rpx;
+ background: linear-gradient(180deg, rgba(0, 0, 0, 0.55), rgba(0, 0, 0, 0));
+}
+
+.shade-bottom {
+ bottom: 0;
+ height: 460rpx;
+ background: linear-gradient(0deg, rgba(0, 0, 0, 0.65), rgba(0, 0, 0, 0));
+}
+
+// ───────── 介绍页返回 ─────────
+.intro-back {
+ position: fixed;
+ left: 24rpx;
+ z-index: 20;
+ width: 64rpx;
+ height: 64rpx;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, 0.85);
+ box-shadow: 0 4rpx 16rpx rgba(22, 29, 25, 0.1);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.intro-back__arrow {
+ width: 18rpx;
+ height: 18rpx;
+ margin-left: 6rpx;
+ border-left: 4rpx solid $ink;
+ border-bottom: 4rpx solid $ink;
+ transform: rotate(45deg);
+}
+
+// ───────── 顶栏 ─────────
+.topbar {
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ z-index: 10;
+ box-sizing: content-box;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding-left: 24rpx;
+ padding-right: 210rpx; // 避开胶囊按钮
+}
+
+.icon-btn {
+ position: relative;
+ width: 64rpx;
+ height: 64rpx;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &.is-off {
+ opacity: 0.55;
+ }
+}
+
+// 右侧按钮组:背景音乐 ♪ + 教练语音
+.topbar__actions {
+ display: flex;
+ align-items: center;
+
+ .icon-btn + .icon-btn {
+ margin-left: 16rpx;
+ }
+}
+
+.icon-btn__note {
+ font-size: 34rpx;
+ line-height: 1;
+}
+
+// 背景音乐关闭:♪ 上加一道斜线
+.icon-btn--music.is-off::after {
+ content: '';
+ position: absolute;
+ left: 14rpx;
+ right: 14rpx;
+ top: 50%;
+ height: 4rpx;
+ margin-top: -2rpx;
+ border-radius: 2rpx;
+ transform: rotate(-45deg);
+}
+
+.icon-btn__x {
+ font-size: 44rpx;
+ line-height: 1;
+ margin-top: -4rpx;
+}
+
+.icon-btn__label {
+ font-size: 24rpx;
+ font-weight: 700;
+}
+
+.topbar__center {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.topbar__title {
+ font-size: 28rpx;
+ font-weight: 700;
+}
+
+.topbar__time {
+ font-size: 24rpx;
+ font-variant-numeric: tabular-nums;
+}
+
+.is-light {
+ .icon-btn {
+ background: rgba(255, 255, 255, 0.85);
+ box-shadow: 0 4rpx 16rpx rgba(22, 29, 25, 0.08);
+ }
+ .icon-btn__x,
+ .icon-btn__label,
+ .icon-btn__note,
+ .topbar__title {
+ color: $ink;
+ }
+ .icon-btn--music.is-off::after {
+ background: $ink;
+ }
+ .topbar__time {
+ color: $ink-soft;
+ }
+}
+
+.is-dark {
+ .icon-btn {
+ background: $glass;
+ }
+ .icon-btn__x,
+ .icon-btn__label,
+ .icon-btn__note,
+ .topbar__title {
+ color: #fff;
+ }
+ .icon-btn--music.is-off::after {
+ background: #fff;
+ }
+ .topbar__time {
+ color: rgba(255, 255, 255, 0.8);
+ }
+}
+
+// ───────── 计数环 + 连击 ─────────
+.ring-slot {
+ position: absolute;
+ left: 28rpx;
+ z-index: 10;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.combo {
+ margin-top: 16rpx;
+ display: flex;
+ align-items: baseline;
+ gap: 6rpx;
+ padding: 8rpx 22rpx;
+ border-radius: 999rpx;
+ background: linear-gradient(135deg, #f59e0b, #ef4444);
+ box-shadow: 0 8rpx 24rpx rgba(239, 68, 68, 0.35);
+ animation: combo-in 0.45s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.combo__n {
+ color: #fff;
+ font-size: 36rpx;
+ font-weight: 900;
+ font-style: italic;
+}
+
+.combo__t {
+ color: #fff;
+ font-size: 22rpx;
+ font-weight: 700;
+}
+
+@keyframes combo-in {
+ 0% {
+ transform: scale(0.4);
+ opacity: 0;
+ }
+ 100% {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+
+// ───────── 教练模式切换 ─────────
+.mode-switch {
+ position: absolute;
+ right: 24rpx;
+ z-index: 10;
+ width: 216rpx;
+ box-sizing: border-box;
+ display: flex;
+ padding: 4rpx;
+ border-radius: 999rpx;
+
+ text {
+ flex: 1;
+ text-align: center;
+ font-size: 22rpx;
+ padding: 6rpx 0;
+ border-radius: 999rpx;
+ }
+
+ .is-on {
+ font-weight: 700;
+ }
+}
+
+.is-light .mode-switch {
+ background: rgba(22, 29, 25, 0.06);
+
+ text {
+ color: $ink-soft;
+ }
+ .is-on {
+ background: #fff;
+ color: #006c49;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.08);
+ }
+}
+
+.is-dark .mode-switch {
+ background: $glass;
+
+ text {
+ color: rgba(255, 255, 255, 0.75);
+ }
+ .is-on {
+ background: #fff;
+ color: #006c49;
+ }
+}
+
+// ───────── 中央:倒计时 / 离开画面 ─────────
+.center {
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 30%;
+ z-index: 10;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ pointer-events: none;
+}
+
+// 倒计时时给画面罩一层,数字不和教练重叠得看不清
+.scrim {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 9;
+}
+
+.is-light .scrim {
+ background: rgba(244, 248, 246, 0.72);
+}
+
+.is-dark .scrim {
+ background: rgba(0, 0, 0, 0.35);
+}
+
+.countdown {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.countdown__n {
+ font-size: 280rpx;
+ line-height: 1;
+ font-weight: 900;
+ animation: count-pop 0.9s ease-out;
+}
+
+.countdown__t {
+ margin-top: 12rpx;
+ font-size: 34rpx;
+ font-weight: 700;
+ letter-spacing: 4rpx;
+}
+
+.is-light {
+ .countdown__n {
+ color: var(--accent);
+ }
+ .countdown__t {
+ color: $ink;
+ }
+}
+
+.is-dark {
+ .countdown__n {
+ color: #fff;
+ text-shadow: 0 8rpx 40rpx rgba(0, 0, 0, 0.45);
+ }
+ .countdown__t {
+ color: #fff;
+ }
+}
+
+@keyframes count-pop {
+ 0% {
+ transform: scale(1.8);
+ opacity: 0;
+ }
+ 30% {
+ transform: scale(1);
+ opacity: 1;
+ }
+ 100% {
+ transform: scale(0.94);
+ }
+}
+
+.lost {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: 32rpx 56rpx;
+ border-radius: 36rpx;
+ background: $glass-strong;
+}
+
+.lost__title {
+ color: #fff;
+ font-size: 36rpx;
+ font-weight: 800;
+}
+
+.lost__sub {
+ margin-top: 8rpx;
+ color: rgba(255, 255, 255, 0.8);
+ font-size: 26rpx;
+}
+
+// ───────── 评分弹出 ─────────
+.pop {
+ position: absolute;
+ left: 0;
+ right: 0;
+ z-index: 10;
+ display: flex;
+ justify-content: center;
+ align-items: baseline;
+ gap: 12rpx;
+ pointer-events: none;
+ animation: pop-up 1.1s ease-out forwards;
+}
+
+.pop__text {
+ font-size: 72rpx;
+ font-weight: 900;
+ font-style: italic;
+}
+
+.pop__score {
+ font-size: 40rpx;
+ font-weight: 800;
+ color: #10b981;
+}
+
+.is-light {
+ .pop__text {
+ color: var(--accent);
+ text-shadow: 0 4rpx 18rpx rgba(255, 255, 255, 0.9);
+ }
+ .pop--perfect .pop__text {
+ color: #f59e0b;
+ }
+}
+
+.is-dark {
+ .pop__text {
+ color: #fff;
+ text-shadow: 0 6rpx 24rpx rgba(0, 0, 0, 0.4);
+ }
+ .pop__score {
+ color: $mint;
+ }
+ .pop--perfect .pop__text {
+ color: #fde68a;
+ }
+}
+
+.pop--ok .pop__score {
+ color: #fbbf24 !important;
+}
+
+@keyframes pop-up {
+ 0% {
+ transform: translateY(40rpx) scale(0.6);
+ opacity: 0;
+ }
+ 20% {
+ transform: translateY(0) scale(1.1);
+ opacity: 1;
+ }
+ 35% {
+ transform: scale(1);
+ }
+ 80% {
+ opacity: 1;
+ }
+ 100% {
+ transform: translateY(-60rpx);
+ opacity: 0;
+ }
+}
+
+// ───────── 底部栏 ─────────
+.dock {
+ position: absolute;
+ left: 28rpx;
+ right: 28rpx;
+ bottom: calc(env(safe-area-inset-bottom) + 28rpx);
+ z-index: 10;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.framing {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ margin-bottom: 12rpx;
+}
+
+.framing__ring {
+ width: 120rpx;
+ height: 120rpx;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.framing__ring-inner {
+ width: 100rpx;
+ height: 100rpx;
+ border-radius: 50%;
+ background: $glass-strong;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #fff;
+ font-size: 24rpx;
+ font-weight: 700;
+}
+
+.framing__tip {
+ margin-top: 20rpx;
+ padding: 16rpx 32rpx;
+ border-radius: 999rpx;
+ background: $glass-strong;
+ color: #fff;
+ font-size: 30rpx;
+ font-weight: 600;
+}
+
+.tip {
+ display: flex;
+ align-items: center;
+ gap: 14rpx;
+ margin-bottom: 24rpx;
+ padding: 18rpx 30rpx;
+ border-radius: 999rpx;
+ background: #fbbf24;
+ box-shadow: 0 10rpx 30rpx rgba(251, 191, 36, 0.4);
+ animation: tip-in 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
+}
+
+.tip__icon {
+ width: 40rpx;
+ height: 40rpx;
+ line-height: 40rpx;
+ border-radius: 50%;
+ background: $ink;
+ color: #fbbf24;
+ text-align: center;
+ font-size: 26rpx;
+ font-weight: 900;
+}
+
+.tip__text {
+ color: $ink;
+ font-size: 32rpx;
+ font-weight: 800;
+}
+
+@keyframes tip-in {
+ 0% {
+ transform: translateY(20rpx) scale(0.8);
+ opacity: 0;
+ }
+ 100% {
+ transform: none;
+ opacity: 1;
+ }
+}
+
+// 教练口令(“吸气 · 屁股向后坐”):离得远也要看清
+.caption {
+ margin-bottom: 24rpx;
+ padding: 14rpx 34rpx;
+ border-radius: 999rpx;
+ font-size: 32rpx;
+ font-weight: 700;
+}
+
+.is-light .caption {
+ background: #fff;
+ color: $ink;
+ box-shadow: 0 8rpx 24rpx rgba(22, 29, 25, 0.08);
+}
+
+.is-dark .caption {
+ background: $glass;
+ color: #fff;
+}
+
+.dock__row {
+ width: 100%;
+ box-sizing: border-box;
+ display: flex;
+ align-items: center;
+ gap: 28rpx;
+ padding: 22rpx 22rpx 22rpx 32rpx;
+ border-radius: 36rpx;
+}
+
+.is-light .dock__row {
+ background: rgba(255, 255, 255, 0.9);
+ box-shadow: 0 12rpx 36rpx rgba(22, 29, 25, 0.1);
+}
+
+.is-dark .dock__row {
+ background: $glass-strong;
+}
+
+.dock__meter {
+ flex: 1;
+}
+
+.dock__guided {
+ flex: 1;
+ font-size: 26rpx;
+ font-weight: 600;
+ color: $ink-soft;
+}
+
+.dock__pause {
+ width: 88rpx;
+ height: 88rpx;
+ flex-shrink: 0;
+ border-radius: 50%;
+ background: var(--accent);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-shadow: 0 8rpx 20rpx rgba(22, 29, 25, 0.18);
+}
+
+.pause-icon {
+ width: 24rpx;
+ height: 30rpx;
+ border-left: 8rpx solid #fff;
+ border-right: 8rpx solid #fff;
+ box-sizing: border-box;
+}
+
+// ───────── 暂停弹层 ─────────
+.mask {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 20;
+ background: rgba(0, 0, 0, 0.55);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.dialog {
+ width: 600rpx;
+ padding: 48rpx 40rpx 32rpx;
+ border-radius: 40rpx;
+ background: #fff;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.dialog__title {
+ font-size: 40rpx;
+ font-weight: 800;
+ color: $ink;
+}
+
+.dialog__sub {
+ margin: 12rpx 0 36rpx;
+ font-size: 26rpx;
+ color: #6c7a71;
+}
+
+.dialog__btn {
+ width: 100%;
+ height: 92rpx;
+ border-radius: 46rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 30rpx;
+ font-weight: 700;
+ color: #3c4a42;
+ margin-top: 16rpx;
+
+ &.is-primary {
+ background: linear-gradient(135deg, #10b981, #006c49);
+ color: #fff;
+ }
+}
+
+// ───────── 示范视频 ─────────
+.video-mask {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 100;
+ background: #000;
+}
+
+.video {
+ width: 100%;
+ height: 100%;
+}
+
+.video-close {
+ position: absolute;
+ left: 24rpx;
+ width: 64rpx;
+ height: 64rpx;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, 0.2);
+ color: #fff;
+ font-size: 44rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+/* 开发版识别诊断面板:底部操作栏上方,不挡计数环和小窗,不拦截点击 */
+.diag {
+ position: absolute;
+ left: 16rpx;
+ right: 16rpx;
+ bottom: calc(270rpx + env(safe-area-inset-bottom));
+ z-index: 30;
+ padding: 10rpx 14rpx;
+ border-radius: 12rpx;
+ background: rgba(0, 0, 0, 0.62);
+ pointer-events: none;
+}
+
+.diag__text {
+ color: #a7f3d0;
+ font-size: 19rpx;
+ line-height: 1.45;
+ white-space: pre-wrap;
+ word-break: break-all;
+}
diff --git a/TUICallKit-Vue3/training/pages/components/pose-intro.vue b/TUICallKit-Vue3/training/pages/components/pose-intro.vue
new file mode 100644
index 000000000..a5c3f3d1c
--- /dev/null
+++ b/TUICallKit-Vue3/training/pages/components/pose-intro.vue
@@ -0,0 +1,430 @@
+
+
+
+
+
+
+
+
+
+
+ {{ phaseLabel || '跟着小甄一起做' }}
+
+
+
+ 完整示范
+
+
+
+
+
+ {{ exercise.name }}
+
+
+ {{ levelText }}
+
+
+ {{ exercise.tagline }}
+
+ {{ t }}
+
+
+
+ 动作要领
+
+ {{ i + 1 }}
+ {{ k }}
+
+
+
+
+
+ 目标次数
+ 约 {{ minutes }} 分钟 · {{ exercise.repStep }} 次一档
+
+
+
+ −
+
+ {{ target }}
+
+ +
+
+
+
+
+
+ 开始前
+
+
+ {{ tip.t }}
+ {{ tip.d }}
+
+
+
+
+
+
+
+
+
+ 开始 AI 跟练
+
+ 动作识别在手机本地完成,画面不会上传
+
+
+
+
+
+
+
diff --git a/TUICallKit-Vue3/training/pages/components/pose-summary.vue b/TUICallKit-Vue3/training/pages/components/pose-summary.vue
new file mode 100644
index 000000000..1d4fc8157
--- /dev/null
+++ b/TUICallKit-Vue3/training/pages/components/pose-summary.vue
@@ -0,0 +1,410 @@
+
+
+
+
+
+
+
+ {{ title }}
+
+ ★
+
+ {{ exercise.name }} · {{ summary.reps }}/{{ summary.targetReps }} 次
+
+
+
+
+
+ {{ summary.scores.length ? summary.avgScore : '--' }}
+ 动作评分
+
+
+
+
+ {{ summary.reps }}
+ 完成次数
+
+
+ {{ duration }}
+ 训练用时
+
+
+ {{ summary.bestCombo }}
+ 最高连击
+
+
+ {{ summary.kcal }}
+ 约消耗千卡
+
+
+
+
+
+
+ 每次动作质量
+
+ 完美
+ 不错
+ 待改进
+
+
+
+
+
+
+
+
+ {{ summary.adviceKind === 'tip' ? '练' : '赞' }}
+
+ {{ summary.adviceKind === 'tip' ? '下次注意' : '教练点评' }}
+ {{ summary.advice }}
+
+
+
+ 千卡为估算值(按 60kg 体重),仅供参考
+
+
+
+
+
+ 换个动作
+ 再练一组
+
+ 完成
+
+
+
+
+
+
diff --git a/TUICallKit-Vue3/training/pages/components/rep-ring.vue b/TUICallKit-Vue3/training/pages/components/rep-ring.vue
new file mode 100644
index 000000000..b3b998a44
--- /dev/null
+++ b/TUICallKit-Vue3/training/pages/components/rep-ring.vue
@@ -0,0 +1,102 @@
+
+
+
+ {{ count }}
+ / {{ target }}
+
+
+
+
+
+
+
diff --git a/TUICallKit-Vue3/training/pages/components/self-view.vue b/TUICallKit-Vue3/training/pages/components/self-view.vue
new file mode 100644
index 000000000..9ac519f6d
--- /dev/null
+++ b/TUICallKit-Vue3/training/pages/components/self-view.vue
@@ -0,0 +1,199 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ mode === 'vision' ? 'AI 识别中' : '模拟识别' }}
+
+
+
+
+
+
+
diff --git a/TUICallKit-Vue3/training/pages/pose-coach.vue b/TUICallKit-Vue3/training/pages/pose-coach.vue
new file mode 100644
index 000000000..0002bce67
--- /dev/null
+++ b/TUICallKit-Vue3/training/pages/pose-coach.vue
@@ -0,0 +1,807 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ×
+
+ {{ ex.name }}
+ {{ timeText }}
+
+
+
+ ♪
+
+
+ {{ voice.enabled.value ? '声' : '静' }}
+
+
+
+
+
+
+ {{ diagText }}
+
+
+
+
+
+
+ {{ hud.combo }}
+ 连击
+
+
+
+
+
+ 跟练
+ 镜像
+
+
+
+
+
+
+ {{ hud.countdown }}
+ 准备开始
+
+
+ 已自动暂停
+ 回到画面中间就继续
+
+
+
+
+
+ {{ pop.text }}
+ +{{ pop.score }}
+
+
+
+
+
+
+ {{ hud.framingIssue === 'none' ? '保持' : '站位' }}
+
+ {{ framingTip }}
+
+
+ !
+ {{ tip.text }}
+
+
+ {{ coachLabel }}
+
+
+
+
+
+ 领练模式 · 跟着小甄的节奏
+
+
+
+
+
+
+
+ 已暂停
+ 已完成 {{ hud.count }} 次,休息一下再继续
+ 继续训练
+ 结束并查看结果
+
+
+
+
+
+
+
+
+
+
+ ×
+
+
+
+
+
+
+
diff --git a/TUICallKit-Vue3/training/pages/pose-hub.vue b/TUICallKit-Vue3/training/pages/pose-hub.vue
new file mode 100644
index 000000000..5cc9edb71
--- /dev/null
+++ b/TUICallKit-Vue3/training/pages/pose-hub.vue
@@ -0,0 +1,355 @@
+
+
+
+
+ AI 跟练
+ 和小甄一起{{ '\n' }}动起来
+ 摄像头识别动作 · 自动计数 · 实时纠正
+
+
+ {{ stats.todayReps }}
+ 今日次数
+
+
+
+ {{ stats.todayMinutes }}
+ 今日分钟
+
+
+
+ {{ stats.streak }}
+ 连续天数
+
+
+
+
+
+
+
+
+
+ 选择动作
+ 建议饭后 30 分钟开始,每次 10~15 分钟
+
+
+
+
+
+
+
+ {{ ['', '轻松', '适中', '较累'][ex.level] }}
+
+
+
+ {{ ex.name }}
+ {{ ex.tagline }}
+
+ {{ ex.targetReps }} 次
+ 开练
+
+
+
+
+
+
+ 护
+
+ 隐私与安全
+ 动作识别在手机本地完成,画面不会上传。运动中如有胸闷、头晕、心慌、出冷汗,请立即停止休息;使用胰岛素或降糖药的用户,运动前血糖低于 5.6 mmol/L 请先少量加餐。
+
+
+
+
+
+
+
+
+
diff --git a/TUICallKit-Vue3/training/pose/__tests__/bgm.test.ts b/TUICallKit-Vue3/training/pose/__tests__/bgm.test.ts
new file mode 100644
index 000000000..ff672065f
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/__tests__/bgm.test.ts
@@ -0,0 +1,215 @@
+import { test } from 'node:test'
+import assert from 'node:assert/strict'
+import { createBgm, type BgmAudio } from '../bgm.ts'
+
+const URL = 'https://cdn.example.com/music/calm.mp3'
+
+function fakeAudio() {
+ const calls: string[] = []
+ let onError: ((err: { errMsg?: string; errCode?: number }) => void) | null = null
+ const audio: BgmAudio = {
+ src: '',
+ loop: false,
+ volume: 1,
+ play: () => calls.push('play'),
+ pause: () => calls.push('pause'),
+ stop: () => calls.push('stop'),
+ destroy: () => calls.push('destroy'),
+ onError: (cb) => {
+ onError = cb
+ },
+ }
+ return { audio, calls, fail: () => onError?.({ errMsg: 'play:fail', errCode: 10002 }) }
+}
+
+/** 手动推进的定时器:run() 执行到渐变结束,返回执行了几次 */
+function fakeClock() {
+ let fn: (() => void) | null = null
+ return {
+ every: (_ms: number, f: () => void) => {
+ fn = f
+ return () => {
+ fn = null
+ }
+ },
+ tick() {
+ fn?.()
+ },
+ run(limit = 1000) {
+ let n = 0
+ while (fn && n < limit) {
+ fn()
+ n += 1
+ }
+ return n
+ },
+ get running() {
+ return fn !== null
+ },
+ }
+}
+
+function setup(url = URL) {
+ const clock = fakeClock()
+ const player = fakeAudio()
+ let created = 0
+ const reasons: string[] = []
+ const bgm = createBgm({
+ url,
+ volume: 0.4,
+ every: clock.every,
+ create: () => {
+ created += 1
+ return player.audio
+ },
+ onUnavailable: (r) => reasons.push(r),
+ })
+ return { bgm, clock, player, reasons, created: () => created }
+}
+
+test('开始播放:循环、从静音淡入到设定音量', () => {
+ const { bgm, clock, player } = setup()
+ bgm.setState('playing')
+ assert.equal(player.audio.src, URL)
+ assert.equal(player.audio.loop, true)
+ assert.deepEqual(player.calls, ['play'])
+ assert.equal(player.audio.volume, 0)
+ clock.tick()
+ assert.ok(player.audio.volume > 0 && player.audio.volume < 0.4, '第一步只升一点')
+ const ticks = clock.run()
+ assert.equal(player.audio.volume, 0.4)
+ assert.ok(ticks >= 20, `淡入要持续一段时间,实际 ${ticks} 步`)
+})
+
+test('教练说话时压低、说完恢复;压得快、恢复得慢', () => {
+ const { bgm, clock, player } = setup()
+ bgm.setState('playing')
+ clock.run()
+ bgm.setDuck(0.35)
+ const down = clock.run()
+ assert.ok(Math.abs(player.audio.volume - 0.14) < 1e-9)
+ bgm.setDuck(1)
+ const up = clock.run()
+ assert.equal(player.audio.volume, 0.4)
+ assert.ok(down <= 6, `压低要快,实际 ${down} 步`)
+ assert.ok(up > down, '恢复比压低慢')
+ assert.deepEqual(player.calls, ['play'], '压低不会暂停播放器')
+})
+
+test('暂停:先淡出再暂停;继续:接着播', () => {
+ const { bgm, clock, player } = setup()
+ bgm.setState('playing')
+ clock.run()
+ bgm.setState('paused')
+ clock.tick()
+ assert.deepEqual(player.calls, ['play'], '淡出过程中还在播')
+ clock.run()
+ assert.equal(player.audio.volume, 0)
+ assert.deepEqual(player.calls, ['play', 'pause'])
+ bgm.setState('playing')
+ clock.run()
+ assert.deepEqual(player.calls, ['play', 'pause', 'play'])
+ assert.equal(player.audio.volume, 0.4)
+})
+
+test('停止:淡出后回到开头;暂停状态下停止也会回到开头', () => {
+ const a = setup()
+ a.bgm.setState('playing')
+ a.clock.run()
+ a.bgm.setState('stopped')
+ a.clock.run()
+ assert.deepEqual(a.player.calls, ['play', 'stop'])
+
+ const b = setup()
+ b.bgm.setState('playing')
+ b.clock.run()
+ b.bgm.setState('paused')
+ b.clock.run()
+ b.bgm.setState('stopped')
+ assert.deepEqual(b.player.calls, ['play', 'pause', 'stop'])
+})
+
+test('中途改主意:淡出一半又继续播,不会先暂停再播', () => {
+ const { bgm, clock, player } = setup()
+ bgm.setState('playing')
+ clock.run()
+ bgm.setState('paused')
+ clock.tick()
+ clock.tick()
+ bgm.setState('playing')
+ clock.run()
+ assert.deepEqual(player.calls, ['play'])
+ assert.equal(player.audio.volume, 0.4)
+})
+
+test('关掉背景音乐:不出声;训练中重新打开,接着播', () => {
+ const { bgm, clock, player, created } = setup()
+ bgm.setEnabled(false)
+ bgm.prepare()
+ bgm.setState('playing')
+ clock.run()
+ assert.equal(created(), 0, '关着的时候不去加载音乐')
+ bgm.setEnabled(true)
+ clock.run()
+ assert.deepEqual(player.calls, ['play'])
+ assert.equal(player.audio.volume, 0.4)
+ bgm.setEnabled(false)
+ clock.run()
+ assert.deepEqual(player.calls, ['play', 'pause'])
+})
+
+test('提前准备:建好播放器开始缓冲,但不出声', () => {
+ const { bgm, player, created } = setup()
+ bgm.prepare()
+ bgm.prepare()
+ assert.equal(created(), 1)
+ assert.equal(player.audio.src, URL)
+ assert.deepEqual(player.calls, [])
+})
+
+test('加载失败:静默放弃、只通知一次,之后不再尝试', () => {
+ const { bgm, clock, player, reasons, created } = setup()
+ bgm.setState('playing')
+ player.fail()
+ player.fail()
+ assert.equal(bgm.available, false)
+ assert.equal(reasons.length, 1)
+ assert.ok(player.calls.includes('destroy'))
+ assert.equal(clock.running, false)
+ bgm.setState('paused')
+ bgm.setState('playing')
+ clock.run()
+ assert.equal(created(), 1, '不会重新创建播放器')
+})
+
+test('没有配置音乐地址:不可用,也不创建播放器', () => {
+ const { bgm, clock, created } = setup('')
+ assert.equal(bgm.available, false)
+ bgm.prepare()
+ bgm.setState('playing')
+ clock.run()
+ assert.equal(created(), 0)
+})
+
+test('切到后台:立即静音暂停(后台定时器可能不跑,不能靠淡出)', () => {
+ const { bgm, clock, player } = setup()
+ bgm.setState('playing')
+ clock.run()
+ bgm.hush()
+ assert.equal(player.audio.volume, 0)
+ assert.deepEqual(player.calls, ['play', 'pause'])
+ assert.equal(clock.running, false)
+ // 回到前台、训练继续时照常淡入
+ bgm.setState('playing')
+ clock.run()
+ assert.deepEqual(player.calls, ['play', 'pause', 'play'])
+})
+
+test('销毁:释放播放器、停止定时器', () => {
+ const { bgm, clock, player } = setup()
+ bgm.setState('playing')
+ clock.tick()
+ bgm.destroy()
+ assert.ok(player.calls.includes('destroy'))
+ assert.equal(clock.running, false)
+})
diff --git a/TUICallKit-Vue3/training/pose/__tests__/cameraPermission.test.ts b/TUICallKit-Vue3/training/pose/__tests__/cameraPermission.test.ts
new file mode 100644
index 000000000..4724dd7b2
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/__tests__/cameraPermission.test.ts
@@ -0,0 +1,56 @@
+import { test } from 'node:test'
+import assert from 'node:assert/strict'
+import { classifyAuthError, requestCameraPermission, type PermissionApi } from '../cameraPermission.ts'
+
+function fakeApi(setting: Record | null, authorizeError?: { errno?: number; errMsg: string }) {
+ const calls = { authorize: 0 }
+ const api: PermissionApi = {
+ getSetting({ success, fail }) {
+ if (setting) success?.({ authSetting: setting })
+ else fail?.({ errMsg: 'getSetting:fail' })
+ },
+ authorize({ success, fail }) {
+ calls.authorize += 1
+ if (authorizeError) fail?.(authorizeError)
+ else success?.()
+ },
+ }
+ return { api, calls }
+}
+
+test('失败原因分类:后台未声明 / 未同意隐私指引 / 用户拒绝', () => {
+ assert.equal(classifyAuthError({ errno: 112, errMsg: 'authorize:fail api scope is not declared in the privacy agreement' }), 'undeclared')
+ assert.equal(classifyAuthError({ errMsg: 'authorize:fail api scope is not declared in the privacy agreement' }), 'undeclared')
+ assert.equal(classifyAuthError({ errno: 104, errMsg: 'authorize:fail privacy permission is not authorized' }), 'privacy_refused')
+ assert.equal(classifyAuthError({ errMsg: 'authorize:fail auth deny' }), 'denied')
+ assert.equal(classifyAuthError({ errMsg: 'authorize:fail system error' }), 'error')
+ assert.equal(classifyAuthError(undefined), 'error')
+})
+
+test('设置里已授权:直接可用,不再弹授权框', async () => {
+ const { api, calls } = fakeApi({ 'scope.camera': true })
+ assert.equal((await requestCameraPermission(api)).result, 'granted')
+ assert.equal(calls.authorize, 0)
+})
+
+test('设置里拒绝过:引导去设置页,不再弹授权框', async () => {
+ const { api, calls } = fakeApi({ 'scope.camera': false })
+ assert.equal((await requestCameraPermission(api)).result, 'denied')
+ assert.equal(calls.authorize, 0)
+})
+
+test('从没问过:弹授权框,按结果返回', async () => {
+ assert.equal((await requestCameraPermission(fakeApi({}).api)).result, 'granted')
+ const undeclared = await requestCameraPermission(
+ fakeApi({}, { errno: 112, errMsg: 'authorize:fail api scope is not declared in the privacy agreement' }).api,
+ )
+ assert.equal(undeclared.result, 'undeclared')
+ assert.match(undeclared.errMsg, /privacy agreement/)
+ assert.equal((await requestCameraPermission(fakeApi({}, { errMsg: 'authorize:fail auth deny' }).api)).result, 'denied')
+})
+
+test('读取设置失败时仍然尝试授权', async () => {
+ const { api, calls } = fakeApi(null)
+ assert.equal((await requestCameraPermission(api)).result, 'granted')
+ assert.equal(calls.authorize, 1)
+})
diff --git a/TUICallKit-Vue3/training/pose/__tests__/coachFrames.test.ts b/TUICallKit-Vue3/training/pose/__tests__/coachFrames.test.ts
new file mode 100644
index 000000000..1de4f9c0b
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/__tests__/coachFrames.test.ts
@@ -0,0 +1,108 @@
+import { test } from 'node:test'
+import assert from 'node:assert/strict'
+import { crispBlend, framePair, framesToLoad, frameUrl, hdCropOf, hdFrameUrl, peakFrame, sequenceOf } from '../coachFrames.ts'
+import { COACH_SEQUENCES } from '../coachSequences.ts'
+import { MOTIONS, createRepEdge, type MoveId } from '../motions.ts'
+
+const MOVES: MoveId[] = ['squat', 'march', 'jack', 'raise']
+
+/** 按播放规则(换帧点之前显示前一帧)取当前显示的帧在序列中的位置 */
+function shownIndex(m: MoveId, amount: number, side: 'L' | 'R') {
+ const p = framePair(m, amount, side)
+ return sequenceOf(m, side).indexOf(crispBlend(p.w) < 0.5 ? p.a : p.b)
+}
+
+test('每个序列至少 9 帧,幅度从 0 严格递增到 1', () => {
+ for (const [name, seq] of Object.entries(COACH_SEQUENCES)) {
+ assert.ok(seq.frames.length >= 9, name)
+ assert.equal(seq.amounts.length, seq.frames.length, name)
+ assert.equal(seq.amounts[0], 0, name)
+ assert.equal(seq.amounts[seq.amounts.length - 1], 1, name)
+ for (let i = 1; i < seq.amounts.length; i++) assert.ok(seq.amounts[i] > seq.amounts[i - 1], `${name} 第 ${i} 帧`)
+ }
+})
+
+test('左右交替的动作共用起始站姿,换边时不会跳', () => {
+ for (const m of ['march', 'jack'] as MoveId[]) assert.equal(sequenceOf(m, 'L')[0], sequenceOf(m, 'R')[0])
+})
+
+test('幅度 0 停在第一帧,幅度 1 停在最后一帧', () => {
+ for (const m of MOVES) {
+ for (const side of ['L', 'R'] as const) {
+ const frames = sequenceOf(m, side)
+ const p0 = framePair(m, 0, side)
+ assert.equal(p0.a, frames[0])
+ assert.ok(crispBlend(p0.w) < 1e-6)
+ const p1 = framePair(m, 1, side)
+ assert.equal(p1.b, frames[frames.length - 1])
+ assert.ok(Math.abs(crispBlend(p1.w) - 1) < 1e-6)
+ }
+ }
+})
+
+test('幅度连续变化时逐帧前进:不回退、不跳帧', () => {
+ for (const m of MOVES) {
+ for (const side of ['L', 'R'] as const) {
+ let prev = 0
+ for (let i = 0; i <= 1000; i++) {
+ const idx = shownIndex(m, i / 1000, side)
+ assert.ok(idx >= prev, `${m}/${side} 回退`)
+ assert.ok(idx - prev <= 1, `${m}/${side} 跳帧`)
+ prev = idx
+ }
+ assert.equal(prev, sequenceOf(m, side).length - 1)
+ }
+ }
+})
+
+test('示范节奏一个周期会经过该动作的全部帧', () => {
+ for (const m of MOVES) {
+ const seen = new Set()
+ for (let i = 0; i < 2000; i++) {
+ const a = MOTIONS[m].amountAt(i / 2000)
+ const p = framePair(m, a.amount, a.side)
+ seen.add(crispBlend(p.w) < 0.5 ? p.a : p.b)
+ }
+ assert.deepEqual([...seen].sort(), framesToLoad(m).sort(), m)
+ }
+})
+
+test('大部分时间显示单张清晰帧,只在换帧附近过渡', () => {
+ let crisp = 0
+ for (let i = 0; i <= 100; i++) {
+ const w = crispBlend(i / 100)
+ if (w < 0.01 || w > 0.99) crisp += 1
+ }
+ assert.ok(crisp >= 85, `清晰帧占比 ${crisp}%`)
+})
+
+test('帧地址指向分包内置 PNG', () => {
+ assert.equal(frameUrl('sq_00'), '/training/static/coach/sq_00.png')
+ assert.ok(peakFrame('squat').startsWith('sq_'))
+})
+
+test('领练计数:教练每个动作周期恰好完成 repsPerCycle 次,且在回到起始附近时计数', () => {
+ for (const m of MOVES) {
+ const spec = MOTIONS[m]
+ const edge = createRepEdge()
+ let reps = 0
+ for (let i = 0; i <= 3000; i++) {
+ const a = spec.amountAt((i / 1000) * 1)
+ if (edge(a.amount)) {
+ reps += 1
+ assert.ok(a.amount <= 0.25, `${m} 计数时幅度 ${a.amount}`)
+ }
+ }
+ assert.equal(reps, spec.repsPerCycle * 3, m)
+ }
+})
+
+test('高清帧:地址带版本号,裁切框在画布内且包含该动作的人物区域', () => {
+ assert.match(hdFrameUrl('https://cdn.example.com/coach', 'sq_00'), /^https:\/\/cdn\.example\.com\/coach\/sq_00\.webp\?v=\w+$/)
+ for (const m of MOVES) {
+ const [x0, y0, x1, y1] = hdCropOf(m)
+ assert.ok(0 <= x0 && x0 < x1 && x1 <= 1 && 0 <= y0 && y0 < y1 && y1 <= 1, m)
+ // 人物站在画布中下部:裁切框至少覆盖头顶(约 23%)到脚底(95%)
+ assert.ok(y0 <= 0.23 && y1 >= 0.95, `${m} ${y0}~${y1}`)
+ }
+})
diff --git a/TUICallKit-Vue3/training/pose/__tests__/counters.test.ts b/TUICallKit-Vue3/training/pose/__tests__/counters.test.ts
new file mode 100644
index 000000000..32868fdaa
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/__tests__/counters.test.ts
@@ -0,0 +1,278 @@
+/**
+ * 计数器单测:用示范动作(motions.ts)合成姿态序列来验证。
+ * 运行:node --test training/pose/__tests__/
+ */
+import { test } from 'node:test'
+import assert from 'node:assert/strict'
+import { createCounter, type CoachEvent } from '../counters.ts'
+import { MISTAKE_POSES, MOTIONS, type MoveId } from '../motions.ts'
+import { sampleMotion } from './sampleMotion.ts'
+import type { Pose } from '../keypoints.ts'
+
+const MOVES: MoveId[] = ['squat', 'march', 'jack', 'raise']
+
+/** 固定种子的伪随机,模拟关键点抖动 */
+function rng(seed: number) {
+ let s = seed
+ return () => ((s = (s * 16807) % 2147483647) / 2147483647) - 0.5
+}
+
+function run(move: MoveId, frames: Pose[]) {
+ const c = createCounter(move)
+ const events: CoachEvent[] = []
+ for (const f of frames) events.push(...c.update(f))
+ return { count: c.count, events, reps: events.filter((e) => e.type === 'rep'), tips: events.map((e) => (e.type === 'tip' ? e.text : e.tip)).filter(Boolean) }
+}
+
+function mistakeFrames(move: MoveId, seconds: number, fps = 12): Pose[] {
+ const spec = MOTIONS[move]
+ return Array.from({ length: Math.round(seconds * fps) }, (_, i) => {
+ const points = MISTAKE_POSES[move](i / fps / spec.cycleSeconds)
+ return { points, scores: points.map(() => 0.9), t: (i / fps) * 1000 }
+ })
+}
+
+/** 同一姿态放进 3:4 竖屏画面:x 归一化坐标被拉伸,aspect 修正后几何不变 */
+function toPortrait(frames: Pose[], aspect = 0.75): Pose[] {
+ return frames.map((f) => ({ ...f, aspect, points: f.points.map((p) => ({ x: 0.5 + (p.x - 0.5) / aspect, y: p.y })) }))
+}
+
+for (const move of MOVES) {
+ const cycles = 5
+ const expected = cycles * MOTIONS[move].repsPerCycle
+ const frames = sampleMotion(move, MOTIONS[move].cycleSeconds * cycles + 0.3)
+
+ test(`${move}: 标准示范动作计数准确且评分高`, () => {
+ const r = run(move, frames)
+ assert.equal(r.count, expected)
+ for (const rep of r.reps) if (rep.type === 'rep') assert.ok(rep.score >= 85, `score ${rep.score}`)
+ assert.deepEqual(r.tips, [])
+ })
+
+ test(`${move}: 关键点抖动下计数仍准确`, () => {
+ const noise = rng(7)
+ const noisy = frames.map((f) => ({ ...f, points: f.points.map((p) => ({ x: p.x + noise() * 0.008, y: p.y + noise() * 0.008 })) }))
+ assert.equal(run(move, noisy).count, expected)
+ })
+
+ test(`${move}: 竖屏画面比例下结果一致`, () => {
+ assert.equal(run(move, toPortrait(frames)).count, expected)
+ })
+
+ test(`${move}: 低帧率(6fps)下不漏计`, () => {
+ assert.equal(run(move, sampleMotion(move, MOTIONS[move].cycleSeconds * cycles + 0.3, 6)).count, expected)
+ })
+}
+
+test('squat: 膝盖内扣会被提示', () => {
+ const r = run('squat', mistakeFrames('squat', MOTIONS.squat.cycleSeconds * 3 + 0.3))
+ assert.equal(r.count, 3)
+ assert.ok(r.tips.some((t) => t!.includes('膝盖向外')), JSON.stringify(r.tips))
+})
+
+test('march: 抬腿太低不计数并提示', () => {
+ const r = run('march', mistakeFrames('march', MOTIONS.march.cycleSeconds * 4))
+ assert.equal(r.count, 0)
+ assert.ok(r.tips.some((t) => t!.includes('抬高')), JSON.stringify(r.tips))
+})
+
+test('jack: 手臂没举过头不计数并提示', () => {
+ const r = run('jack', mistakeFrames('jack', MOTIONS.jack.cycleSeconds * 3))
+ assert.equal(r.count, 0)
+ assert.ok(r.tips.some((t) => t!.includes('举过头顶')), JSON.stringify(r.tips))
+})
+
+test('raise: 耸肩或抬太高会被提示', () => {
+ const r = run('raise', mistakeFrames('raise', MOTIONS.raise.cycleSeconds * 3 + 0.3))
+ assert.equal(r.count, 3)
+ assert.ok(r.tips.some((t) => t!.includes('耸肩') || t!.includes('与肩同高')), JSON.stringify(r.tips))
+})
+
+test('关键点不可见时不计数', () => {
+ const frames = sampleMotion('squat', 10).map((f) => ({ ...f, scores: f.scores.map(() => 0.1) }))
+ assert.equal(run('squat', frames).count, 0)
+})
+
+test('同一提示在冷却时间内不重复', () => {
+ const r = run('march', mistakeFrames('march', 3))
+ const n = r.tips.filter((t) => t!.includes('抬高')).length
+ assert.ok(n <= 1, `tips ${n}`)
+})
+
+test('live 幅度跟随动作:到位时接近 1,站立时接近 0', () => {
+ for (const move of ['squat', 'march', 'jack', 'raise'] as MoveId[]) {
+ const c = createCounter(move)
+ let max = 0
+ let min = 1
+ for (const f of sampleMotion(move, MOTIONS[move].cycleSeconds * 2)) {
+ c.update(f)
+ max = Math.max(max, c.live.amount)
+ min = Math.min(min, c.live.amount)
+ }
+ assert.ok(max > 0.85, `${move} max ${max}`)
+ assert.ok(min < 0.12, `${move} min ${min}`)
+ }
+})
+
+test('live 左右侧判断正确(高抬腿)', () => {
+ const c = createCounter('march')
+ const spec = MOTIONS.march
+ const left = spec.poseAt(0.25)
+ c.update({ points: left, scores: left.map(() => 0.9), t: 0 })
+ assert.equal(c.live.side, 'L')
+ const right = spec.poseAt(0.75)
+ c.update({ points: right, scores: right.map(() => 0.9), t: 100 })
+ assert.equal(c.live.side, 'R')
+})
+
+test('幅度条目标线:到达目标幅度才计数', () => {
+ for (const m of ['squat', 'march', 'jack', 'raise'] as const) {
+ const c = createCounter(m)
+ assert.ok(c.goal > 0.2 && c.goal < 0.9, `${m} goal=${c.goal}`)
+ }
+})
+
+/** 把示范动作的幅度按比例缩小(与站立姿势线性插值),模拟做得没那么到位的用户 */
+function shallow(move: MoveId, k: number, seconds: number, fps = 12): Pose[] {
+ const stand = MOTIONS[move].poseAt(0)
+ return sampleMotion(move, seconds, fps).map((f) => ({
+ ...f,
+ points: f.points.map((p, i) => ({ x: stand[i].x + (p.x - stand[i].x) * k, y: stand[i].y + (p.y - stand[i].y) * k })),
+ }))
+}
+
+
+test('squat: 左右只看清一侧的髋和踝也能计数', () => {
+ const cycles = 4
+ const frames = sampleMotion('squat', MOTIONS.squat.cycleSeconds * cycles + 0.3).map((f) => ({
+ ...f,
+ scores: f.scores.map((s, i) => ([12, 16].includes(i) ? 0.05 : s)),
+ }))
+ assert.equal(run('squat', frames).count, cycles)
+})
+
+
+test('动作要求放宽:幅度没到旧标准、但到了新标准的动作也计数', () => {
+ // 各动作选一个幅度:峰值落在旧进入阈值和新进入阈值之间(放宽前不计、放宽后计数)
+ const cases: Array<[MoveId, number, number]> = [
+ ['squat', 0.45, 0.18],
+ ['march', 0.3, 0.22],
+ ['jack', 0.52, 120],
+ ['raise', 0.55, 68],
+ ]
+ for (const [m, k, oldEnter] of cases) {
+ const cycles = 4
+ const c = createCounter(m)
+ let peak = 0
+ for (const f of shallow(m, k, MOTIONS[m].cycleSeconds * cycles + 0.3)) {
+ c.update(f)
+ if (c.metric !== null) peak = Math.max(peak, c.metric)
+ }
+ assert.ok(peak < oldEnter, `${m} peak ${peak} 应低于旧阈值 ${oldEnter}`)
+ assert.equal(c.count, cycles * MOTIONS[m].repsPerCycle, `${m} count ${c.count}`)
+ }
+})
+
+test('squat: 蹲到底时脚踝偶尔一帧没识别到,不会多计(真机复现)', () => {
+ const cycles = 4
+ const frames = sampleMotion('squat', MOTIONS.squat.cycleSeconds * cycles + 0.3)
+ const c = createCounter('squat')
+ frames.forEach((f, i) => {
+ // 蹲下过程中(幅度大于 0.2)每隔几帧丢一次脚踝
+ const deep = (c.metric ?? 0) > 0.2
+ const drop = deep && i % 4 === 0
+ c.update({ ...f, scores: f.scores.map((s, k) => (drop && (k === 15 || k === 16) ? 0.05 : s)) })
+ })
+ assert.equal(c.count, cycles)
+})
+
+test('单帧识别抖动回到站立位置不计数:需要连续两帧', () => {
+ const cycles = 3
+ const frames = sampleMotion('squat', MOTIONS.squat.cycleSeconds * cycles + 0.3)
+ const c = createCounter('squat')
+ const stand = frames[0]
+ frames.forEach((f, i) => {
+ c.update(f)
+ // 蹲到底时插入一帧“站立”噪声
+ if ((c.metric ?? 0) > 0.3 && i % 3 === 0) c.update({ ...stand, t: f.t + 1 })
+ })
+ assert.equal(c.count, cycles)
+})
+
+test('离得太近、腿部关键点置信度很低时不计数(真机复现:脚踝位置乱飘、人没有下蹲却被计数)', () => {
+ const stand = sampleMotion('squat', 0.1)[0]
+ const c = createCounter('squat')
+ for (let i = 0; i < 60; i++) {
+ const ankleSeen = i % 3 !== 0
+ const drift = 0.15 * Math.abs(Math.sin(i / 4)) // 脚踝的识别位置在乱飘
+ c.update({
+ ...stand,
+ t: i * 100,
+ points: stand.points.map((p, k) => (k === 15 || k === 16 ? { x: p.x, y: p.y - drift } : p)),
+ scores: stand.scores.map((_, k) => ([11, 12, 13, 14].includes(k) ? 0.15 : k === 15 || k === 16 ? (ankleSeen ? 0.22 : 0.05) : 0.6)),
+ })
+ }
+ assert.equal(c.count, 0)
+})
+
+test('jack: 真机跟练的抬手幅度(手高过肩约 100°)计数,只举到与肩平不计', () => {
+ const c = createCounter('jack')
+ const sweep = (peak: number, t0: number) => {
+ // 手臂外展角 20° → peak → 20°,用示范动作在对应角度附近的姿态合成
+ const frames = sampleMotion('jack', MOTIONS.jack.cycleSeconds)
+ let best = frames[0]
+ let bestDiff = Infinity
+ for (const f of frames) {
+ c.update({ ...f, t: t0 })
+ const d = Math.abs((c.metric ?? 0) - peak)
+ if (d < bestDiff) [best, bestDiff] = [f, d]
+ }
+ return best
+ }
+ // 先找到 ~100° 和 ~88° 的姿态,再用它们做重复动作
+ const c100 = sweep(100, 0)
+ const c88 = sweep(88, 0)
+ const rest = sampleMotion('jack', 0.1)[0]
+ const counter = createCounter('jack')
+ let t = 0
+ for (let i = 0; i < 3; i++) for (const f of [rest, rest, c100, c100, rest, rest]) counter.update({ ...f, t: (t += 150) })
+ assert.equal(counter.count, 3, '约 100° 应计数')
+ const before = counter.count
+ for (let i = 0; i < 3; i++) for (const f of [rest, rest, c88, c88, rest, rest]) counter.update({ ...f, t: (t += 150) })
+ assert.equal(counter.count, before, '约 88° 不应计数')
+})
+
+test('单帧识别跳动越过计数线不计数(真机复现:高抬腿一帧跳到 0.46 又落回)', () => {
+ for (const m of ['squat', 'march', 'jack', 'raise'] as MoveId[]) {
+ const frames = sampleMotion(m, MOTIONS[m].cycleSeconds * 2)
+ const rest = frames[0]
+ // 找一帧“到位”的姿态当作跳动
+ const probe = createCounter(m)
+ let spike = rest
+ let best = -Infinity
+ for (const f of frames) {
+ probe.update(f)
+ if ((probe.metric ?? -Infinity) > best) [best, spike] = [probe.metric ?? -Infinity, f]
+ }
+ const c = createCounter(m)
+ let t = 0
+ for (let i = 0; i < 5; i++) for (const f of [rest, rest, rest, spike, rest, rest, rest]) c.update({ ...f, t: (t += 100) })
+ assert.equal(c.count, 0, `${m} 单帧跳动被计了 ${c.count} 次`)
+ }
+})
+
+test('jack: 不迈步只提示、不压分,提示 20 秒内最多一次', () => {
+ const cycles = 6
+ const stand = MOTIONS.jack.poseAt(0)
+ // 脚始终保持站立时的位置(不迈步),手臂照常
+ const frames = sampleMotion('jack', MOTIONS.jack.cycleSeconds * cycles + 0.3).map((f) => ({
+ ...f,
+ points: f.points.map((p, i) => ([15, 16, 19, 20, 21, 22].includes(i) ? stand[i] : p)),
+ }))
+ const r = run('jack', frames)
+ assert.equal(r.count, cycles * MOTIONS.jack.repsPerCycle)
+ for (const rep of r.reps) if (rep.type === 'rep') assert.ok(rep.score >= 90, `score ${rep.score}`)
+ const stepTips = r.tips.filter((t) => t!.includes('迈一步')).length
+ const seconds = MOTIONS.jack.cycleSeconds * cycles
+ assert.ok(stepTips >= 1 && stepTips <= Math.ceil(seconds / 20), `step tips ${stepTips}`)
+})
diff --git a/TUICallKit-Vue3/training/pose/__tests__/history.test.ts b/TUICallKit-Vue3/training/pose/__tests__/history.test.ts
new file mode 100644
index 000000000..282bcf879
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/__tests__/history.test.ts
@@ -0,0 +1,55 @@
+import { test } from 'node:test'
+import assert from 'node:assert/strict'
+import { appendHistory, loadHistory, statsOf, dayOf, type Storage } from '../history.ts'
+import type { SessionSummary } from '../session.ts'
+
+const memory = (): Storage => {
+ const m = new Map()
+ return { get: (k) => (m.has(k) ? m.get(k) : ''), set: (k, v) => m.set(k, v) }
+}
+
+const summary = (reps: number): SessionSummary => ({
+ move: 'squat',
+ reps,
+ targetReps: 12,
+ avgScore: 90,
+ bestCombo: 5,
+ durationSec: 120,
+ kcal: 8,
+ stars: 3,
+ scores: [],
+ advice: '',
+ adviceKind: 'praise',
+})
+
+const DAY = 86400000
+const now = new Date(2026, 8, 28, 20, 0, 0).getTime()
+
+test('空存储返回空数组', () => {
+ assert.deepEqual(loadHistory(memory()), [])
+})
+
+test('0 次的训练不记录', () => {
+ const s = memory()
+ appendHistory(s, summary(0), now)
+ assert.equal(loadHistory(s).length, 0)
+})
+
+test('今日统计与连续天数', () => {
+ const s = memory()
+ appendHistory(s, summary(10), now - 2 * DAY)
+ appendHistory(s, summary(10), now - DAY)
+ appendHistory(s, summary(12), now)
+ appendHistory(s, summary(8), now)
+ const st = statsOf(loadHistory(s), now)
+ assert.equal(st.todayReps, 20)
+ assert.equal(st.todayMinutes, 4)
+ assert.equal(st.streak, 3)
+})
+
+test('今天还没练时,连续天数从昨天算起', () => {
+ const s = memory()
+ appendHistory(s, summary(10), now - DAY)
+ assert.equal(statsOf(loadHistory(s), now).streak, 1)
+ assert.equal(dayOf(now), '2026-09-28')
+})
diff --git a/TUICallKit-Vue3/training/pose/__tests__/keypoints.test.ts b/TUICallKit-Vue3/training/pose/__tests__/keypoints.test.ts
new file mode 100644
index 000000000..5db2397be
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/__tests__/keypoints.test.ts
@@ -0,0 +1,60 @@
+/**
+ * 关键点转换与平滑:真机上画面外的点坐标是 NaN,不能让它污染后续帧。
+ * 运行:node --test training/pose/__tests__/
+ */
+import { test } from 'node:test'
+import assert from 'node:assert/strict'
+import { anchorToPose, checkFraming, smoothPose, KP, type Pose } from '../keypoints.ts'
+import { createCounter } from '../counters.ts'
+import { MOTIONS } from '../motions.ts'
+import { sampleMotion } from './sampleMotion.ts'
+
+const LEG = [KP.L_KNEE, KP.R_KNEE, KP.L_ANKLE, KP.R_ANKLE]
+
+/** 示范姿态转成 VisionKit 的 anchor,指定的点坐标为 NaN(画面外) */
+function anchorOf(pose: Pose, nanIdx: number[] = []) {
+ return {
+ points: pose.points.map((p, i) => (nanIdx.includes(i) ? { x: NaN, y: NaN } : { x: p.x, y: p.y })),
+ confidence: pose.scores.map((s, i) => (nanIdx.includes(i) ? 0.9 : s)),
+ score: 0.9,
+ }
+}
+
+test('anchorToPose:坐标为 NaN 的点视为看不见', () => {
+ const [f] = sampleMotion('squat', 0.1)
+ const p = anchorToPose(anchorOf(f, LEG), 480, 853, 0)!
+ for (const i of LEG) {
+ assert.equal(p.scores[i], 0, `score ${i}`)
+ assert.ok(Number.isFinite(p.points[i].x) && Number.isFinite(p.points[i].y), `point ${i}`)
+ }
+})
+
+test('smoothPose:上一帧是 NaN 时直接采用新坐标,不会一直是 NaN', () => {
+ const [f] = sampleMotion('squat', 0.1)
+ const poisoned: Pose = { ...f, points: f.points.map((p, i) => (LEG.includes(i) ? { x: NaN, y: NaN } : p)) }
+ const next = smoothPose(poisoned, f)
+ for (const i of LEG) assert.ok(Number.isFinite(next.points[i].y), `point ${i}`)
+})
+
+test('站位:脚踝坐标是 NaN 时不能判定为站位良好', () => {
+ const [f] = sampleMotion('squat', 0.1)
+ const p: Pose = { ...f, points: f.points.map((q, i) => (i === KP.L_ANKLE || i === KP.R_ANKLE ? { x: NaN, y: NaN } : q)) }
+ assert.notEqual(checkFraming(p), 'none')
+})
+
+test('真机复现:开始时腿在画面外(NaN),退回画面后深蹲照常计数', () => {
+ const cycles = 4
+ const frames = sampleMotion('squat', MOTIONS.squat.cycleSeconds * cycles + 0.3)
+ const counter = createCounter('squat')
+ let smoothed: Pose | null = null
+ // 前 1 秒:离得太近,膝和踝在画面外
+ for (let i = 0; i < 12; i++) {
+ const raw = anchorToPose(anchorOf(frames[0], LEG), 480, 853, i * 83)!
+ smoothed = smoothPose(smoothed, raw)
+ }
+ for (const f of frames) {
+ smoothed = smoothPose(smoothed, anchorToPose(anchorOf(f), 480, 853, f.t)!)
+ counter.update(smoothed)
+ }
+ assert.equal(counter.count, cycles)
+})
diff --git a/TUICallKit-Vue3/training/pose/__tests__/sampleMotion.ts b/TUICallKit-Vue3/training/pose/__tests__/sampleMotion.ts
new file mode 100644
index 000000000..6c1d7dcb2
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/__tests__/sampleMotion.ts
@@ -0,0 +1,15 @@
+/** 单测辅助:把示范动作按时间采样成 Pose 序列(文件名不带 .test,不会被当成用例执行) */
+import type { Pose } from '../keypoints.ts'
+import { MOTIONS, type MoveId } from '../motions.ts'
+
+export function sampleMotion(id: MoveId, seconds: number, fps = 12, startMs = 0): Pose[] {
+ const spec = MOTIONS[id]
+ const frames: Pose[] = []
+ const n = Math.round(seconds * fps)
+ for (let i = 0; i < n; i++) {
+ const tSec = i / fps
+ const points = spec.poseAt(tSec / spec.cycleSeconds)
+ frames.push({ points, scores: points.map(() => 0.9), t: startMs + tSec * 1000 })
+ }
+ return frames
+}
diff --git a/TUICallKit-Vue3/training/pose/__tests__/session.test.ts b/TUICallKit-Vue3/training/pose/__tests__/session.test.ts
new file mode 100644
index 000000000..1bb5381d2
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/__tests__/session.test.ts
@@ -0,0 +1,96 @@
+import { test } from 'node:test'
+import assert from 'node:assert/strict'
+import { TrainingSession, summarize, type SessionEvent } from '../session.ts'
+import { MOTIONS } from '../motions.ts'
+import { sampleMotion } from './sampleMotion.ts'
+import type { Pose } from '../keypoints.ts'
+
+const standing = (t: number): Pose => {
+ const points = MOTIONS.squat.poseAt(0)
+ return { points, scores: points.map(() => 0.9), t }
+}
+
+/** 站好 → 倒计时 → 开始训练,返回训练开始时刻 */
+function warmUp(s: TrainingSession, events: SessionEvent[]) {
+ let t = 0
+ for (; t <= 5000; t += 100) events.push(...s.feed(standing(t), t))
+ return t
+}
+
+test('站好保持 1.5 秒后进入倒计时,3 秒后开始训练', () => {
+ const s = new TrainingSession('squat', 5)
+ const events: SessionEvent[] = []
+ warmUp(s, events)
+ const phases = events.filter((e) => e.type === 'phase').map((e) => (e as any).phase)
+ assert.deepEqual(phases, ['countdown', 'training'])
+ const counts = events.filter((e) => e.type === 'countdown').map((e) => (e as any).n)
+ assert.deepEqual(counts, [3, 2, 1])
+})
+
+test('没站进画面不会开始', () => {
+ const s = new TrainingSession('squat', 5)
+ for (let t = 0; t < 5000; t += 100) s.feed(null, t)
+ assert.equal(s.phase, 'framing')
+ assert.equal(s.framingIssue, 'no_body')
+})
+
+test('完成目标次数后结束,并统计时长与连击', () => {
+ const s = new TrainingSession('squat', 4)
+ const events: SessionEvent[] = []
+ const t0 = warmUp(s, events)
+ for (const f of sampleMotion('squat', MOTIONS.squat.cycleSeconds * 5, 12, t0)) {
+ events.push(...s.feed(f, f.t))
+ if (s.phase === 'done') break
+ }
+ assert.equal(s.phase, 'done')
+ assert.equal(s.count, 4)
+ assert.equal(s.bestCombo, 4)
+ assert.ok(events.some((e) => e.type === 'combo' && e.combo === 3))
+ const sum = summarize(s, 4)
+ assert.equal(sum.stars, 3)
+ assert.equal(sum.adviceKind, 'praise')
+ assert.ok(sum.durationSec >= 9 && sum.durationSec <= 14, `duration ${sum.durationSec}`)
+ assert.ok(sum.kcal > 0)
+})
+
+test('离开画面自动进入 lost,回来后继续,离开期间不计时', () => {
+ const s = new TrainingSession('squat', 10)
+ const t0 = warmUp(s, [])
+ s.feed(standing(t0 + 100), t0 + 100)
+ const before = s.activeMs
+ let t = t0 + 200
+ for (; t < t0 + 6000; t += 100) s.feed(null, t)
+ assert.equal(s.phase, 'lost')
+ assert.ok(s.activeMs - before < 2000, `active grew ${s.activeMs - before}`)
+ s.feed(standing(t), t)
+ assert.equal(s.phase, 'training')
+})
+
+test('暂停与恢复', () => {
+ const s = new TrainingSession('raise', 10)
+ const t0 = warmUp(s, [])
+ s.pause()
+ assert.equal(s.phase, 'paused')
+ const before = s.activeMs
+ s.tick(t0 + 10000)
+ assert.equal(s.activeMs, before)
+ s.resume(t0 + 10000)
+ assert.equal(s.phase, 'training')
+})
+
+test('领练模式:跳过站位、按节奏计数、不会因无人而暂停', () => {
+ const s = new TrainingSession('march', 3, { detectLost: false })
+ s.startCountdown(0)
+ assert.equal(s.phase, 'countdown')
+ for (let t = 0; t <= 3200; t += 200) s.tick(t)
+ assert.equal(s.phase, 'training')
+ for (let t = 3400; t < 9000; t += 200) s.tick(t)
+ assert.equal(s.phase, 'training')
+ s.addGuidedRep()
+ s.addGuidedRep()
+ const last = s.addGuidedRep()
+ assert.equal(s.count, 3)
+ assert.equal(s.phase, 'done')
+ assert.ok(last.some((e) => e.type === 'phase' && e.phase === 'done'))
+ assert.equal(s.reps.length, 0)
+})
diff --git a/TUICallKit-Vue3/training/pose/__tests__/viewport.test.ts b/TUICallKit-Vue3/training/pose/__tests__/viewport.test.ts
new file mode 100644
index 000000000..5d6b6e208
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/__tests__/viewport.test.ts
@@ -0,0 +1,26 @@
+import { test } from 'node:test'
+import assert from 'node:assert/strict'
+import { toScreen } from '../viewport.ts'
+
+const near = (a: number, b: number) => Math.abs(a - b) < 1e-6
+
+test('比例一致时直接按尺寸缩放', () => {
+ const p = toScreen({ x: 0.25, y: 0.5 }, { width: 300, height: 400, frameWidth: 480, frameHeight: 640, mirror: false })
+ assert.ok(near(p.x, 75) && near(p.y, 200))
+})
+
+test('全屏竖屏按 aspectFill 裁掉左右两边,画面中心仍在屏幕中心', () => {
+ const vp = { width: 390, height: 844, frameWidth: 480, frameHeight: 640, mirror: false }
+ const c = toScreen({ x: 0.5, y: 0.5 }, vp)
+ assert.ok(near(c.x, 195) && near(c.y, 422))
+ const top = toScreen({ x: 0.5, y: 0 }, vp)
+ assert.ok(near(top.y, 0), '高度方向不裁剪')
+ const left = toScreen({ x: 0, y: 0.5 }, vp)
+ assert.ok(left.x < 0, '宽度方向被裁掉的部分落在屏幕外')
+})
+
+test('镜像预览左右翻转', () => {
+ const vp = { width: 300, height: 400, frameWidth: 480, frameHeight: 640, mirror: true }
+ const p = toScreen({ x: 0.2, y: 0.3 }, vp)
+ assert.ok(near(p.x, 240) && near(p.y, 120))
+})
diff --git a/TUICallKit-Vue3/training/pose/bgm.ts b/TUICallKit-Vue3/training/pose/bgm.ts
new file mode 100644
index 000000000..2d677d5d6
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/bgm.ts
@@ -0,0 +1,179 @@
+/**
+ * 训练背景音乐的播放控制(不依赖页面,便于测试)
+ *
+ * 一段首尾相接循环的舒缓音乐,音量比教练语音低一截,所有音量变化都是渐变:
+ * - 开始播放淡入;暂停 / 停止先淡出再真正暂停,不会突然出声或戛然而止;
+ * - 教练说话时压低(duck),压得快、恢复得慢,像电台主持人开口时压背景音乐;
+ * - 加载失败(地址不存在、断网)就当没有背景音乐:不再重试,也不打扰用户。
+ */
+
+export type BgmState = 'playing' | 'paused' | 'stopped'
+
+/** 播放器的最小接口:小程序 InnerAudioContext 的子集,测试时可换成假的 */
+export type BgmAudio = {
+ src: string
+ loop: boolean
+ volume: number
+ play(): void
+ pause(): void
+ stop(): void
+ destroy(): void
+ onError(cb: (err: { errMsg?: string; errCode?: number }) => void): void
+}
+
+export type BgmOptions = {
+ /** 音乐地址;为空表示没有背景音乐 */
+ url: string
+ create: () => BgmAudio
+ /** 正常播放时的音量(0~1,教练语音是 1) */
+ volume?: number
+ /** 定时器(测试时替换),返回取消函数 */
+ every?: (ms: number, fn: () => void) => () => void
+ /** 音乐不可用(加载失败)时回调,只回调一次 */
+ onUnavailable?: (reason: string) => void
+}
+
+const TICK_MS = 50
+/** 音量从 0 变到正常音量所需的时长(ms) */
+const RAMP_MS = { fade: 1600, duck: 250, unduck: 800 }
+
+function defaultEvery(ms: number, fn: () => void) {
+ const id = setInterval(fn, ms)
+ return () => clearInterval(id)
+}
+
+export function createBgm(opts: BgmOptions) {
+ const base = opts.volume ?? 0.35
+ const every = opts.every ?? defaultEvery
+ let audio: BgmAudio | null = null
+ let failed = !opts.url
+ let state: BgmState = 'stopped'
+ let enabled = true
+ let duck = 1
+ let level = 0
+ /** 播放器在出声(play 之后、pause / stop 之前) */
+ let running = false
+ /** 播放位置在开头 */
+ let rewound = true
+ /** 当前这次渐变是淡入淡出,还是压低 / 恢复 */
+ let ramp: 'fade' | 'duck' = 'fade'
+ let cancel: (() => void) | null = null
+
+ const target = () => (state === 'playing' && enabled && !failed ? base * duck : 0)
+
+ function ensure(): BgmAudio | null {
+ if (failed) return null
+ if (!audio) {
+ const a = opts.create()
+ a.src = opts.url
+ a.loop = true
+ a.volume = 0
+ a.onError((err) => fail(err?.errMsg || `errCode ${err?.errCode ?? '?'}`))
+ audio = a
+ }
+ return audio
+ }
+
+ function fail(reason: string) {
+ if (failed) return
+ failed = true
+ release()
+ opts.onUnavailable?.(reason)
+ }
+
+ function stopTicker() {
+ cancel?.()
+ cancel = null
+ }
+
+ function release() {
+ stopTicker()
+ try {
+ audio?.destroy()
+ } catch (e) {}
+ audio = null
+ running = false
+ rewound = true
+ level = 0
+ }
+
+ /** 音量降到 0 之后才真正暂停 / 停止(停止会回到开头,下次从头播) */
+ function settle() {
+ if (!audio || level > 0) return
+ if (state === 'stopped') {
+ if (running || !rewound) audio.stop()
+ rewound = true
+ } else if (running) {
+ audio.pause()
+ }
+ running = false
+ }
+
+ function step() {
+ const t = target()
+ const ms = ramp === 'fade' ? RAMP_MS.fade : t < level ? RAMP_MS.duck : RAMP_MS.unduck
+ const max = (base * TICK_MS) / ms
+ level = Math.abs(t - level) <= max ? t : level + Math.sign(t - level) * max
+ if (audio) audio.volume = level
+ if (level === t) {
+ stopTicker()
+ settle()
+ }
+ }
+
+ function update(kind: 'fade' | 'duck') {
+ ramp = kind
+ const t = target()
+ if (t > 0) {
+ const a = ensure()
+ if (!a) return
+ if (!running) {
+ a.play()
+ running = true
+ rewound = false
+ }
+ }
+ if (level === t) {
+ stopTicker()
+ settle()
+ } else if (!cancel) {
+ cancel = every(TICK_MS, step)
+ }
+ }
+
+ return {
+ /** 提前建好播放器、开始缓冲(不出声),开始训练时能立刻响起来 */
+ prepare() {
+ if (enabled) ensure()
+ },
+ setState(next: BgmState) {
+ if (next === state) return
+ state = next
+ update('fade')
+ },
+ /** 音量压到正常音量的几成(1 = 不压) */
+ setDuck(ratio: number) {
+ const r = Math.min(1, Math.max(0, ratio))
+ if (r === duck) return
+ duck = r
+ update('duck')
+ },
+ setEnabled(on: boolean) {
+ if (on === enabled) return
+ enabled = on
+ update('fade')
+ },
+ /** 立即静音暂停:切到后台时定时器可能不再执行,不能靠淡出 */
+ hush() {
+ if (state === 'playing') state = 'paused'
+ stopTicker()
+ level = 0
+ if (audio) audio.volume = 0
+ settle()
+ },
+ destroy: release,
+ get available() {
+ return !failed
+ },
+ }
+}
diff --git a/TUICallKit-Vue3/training/pose/cameraPermission.ts b/TUICallKit-Vue3/training/pose/cameraPermission.ts
new file mode 100644
index 000000000..c67befc6f
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/cameraPermission.ts
@@ -0,0 +1,51 @@
+/**
+ * 摄像头权限
+ *
+ * 摄像头属于微信的隐私接口:小程序后台《用户隐私保护指引》没有声明“摄像头”时,
+ * wx.authorize 直接失败(errno 112),不弹授权框,设置页里也不会出现“摄像头”选项。
+ * 所以授权失败后不能一律引导用户去设置页,要先分清原因:
+ * denied 用户拒绝过 → 设置页里有这一项,引导去开启
+ * privacy_refused 用户没同意隐私保护指引 → 重新弹出隐私授权
+ * undeclared 后台没声明摄像头 → 用户侧无解,只能改用领练模式(开发者需补充隐私指引)
+ */
+
+export type CameraPermission = 'granted' | 'denied' | 'privacy_refused' | 'undeclared' | 'error'
+
+type AuthError = { errno?: number; errMsg?: string } | undefined
+
+/** 与 uni / wx 同名接口的最小子集,便于单测注入 */
+export type PermissionApi = {
+ getSetting(opts: { success?: (res: { authSetting?: Record }) => void; fail?: (err: AuthError) => void }): void
+ authorize(opts: { scope: string; success?: () => void; fail?: (err: AuthError) => void }): void
+}
+
+const SCOPE = 'scope.camera'
+
+export function classifyAuthError(err: AuthError): CameraPermission {
+ const msg = String(err?.errMsg ?? '')
+ if (err?.errno === 112 || /not declared in the privacy agreement/i.test(msg)) return 'undeclared'
+ if (err?.errno === 104 || /privacy/i.test(msg)) return 'privacy_refused'
+ if (/deny|denied/i.test(msg)) return 'denied'
+ return 'error'
+}
+
+/** 先看设置里的授权状态:授权过直接用,拒绝过去设置页,从没问过才弹授权框 */
+export function requestCameraPermission(api: PermissionApi): Promise<{ result: CameraPermission; errMsg: string }> {
+ return new Promise((resolve) => {
+ const authorize = () =>
+ api.authorize({
+ scope: SCOPE,
+ success: () => resolve({ result: 'granted', errMsg: '' }),
+ fail: (err) => resolve({ result: classifyAuthError(err), errMsg: String(err?.errMsg ?? '') }),
+ })
+ api.getSetting({
+ success: (res) => {
+ const v = res?.authSetting?.[SCOPE]
+ if (v === true) resolve({ result: 'granted', errMsg: '' })
+ else if (v === false) resolve({ result: 'denied', errMsg: '' })
+ else authorize()
+ },
+ fail: () => authorize(),
+ })
+ })
+}
diff --git a/TUICallKit-Vue3/training/pose/coachFrames.ts b/TUICallKit-Vue3/training/pose/coachFrames.ts
new file mode 100644
index 000000000..5bcf5c45a
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/coachFrames.ts
@@ -0,0 +1,81 @@
+/**
+ * 教练“小甄”帧资源
+ *
+ * 动作帧是 AI 画的原图加少量插帧(由 training-videos/scripts 生成并对齐),内置在 training/static/coach。
+ * 每个动作的一侧 10~24 帧,出自同一张设定稿并统一了脸(前后帧一致,不会闪);
+ * 每帧带实测的动作幅度,按幅度查帧,帧间距不均匀时播放速度仍然均匀。
+ */
+import type { MoveId, Side } from './motions.ts'
+import { COACH_HD, COACH_SEQUENCES, type CoachSequence } from './coachSequences.ts'
+
+export type Gesture = 'wave' | 'cheer' | 'thumbs'
+
+const MOVE_SEQUENCE: Record> = {
+ squat: { L: 'squat', R: 'squat' },
+ march: { L: 'march_l', R: 'march_r' },
+ jack: { L: 'jack_l', R: 'jack_r' },
+ raise: { L: 'raise', R: 'raise' },
+}
+
+/** 错误示范帧(示范视频对比用) */
+export const MISTAKE_FRAMES: Record = {
+ squat: 'wrong_squat',
+ march: 'wrong_march',
+ jack: 'wrong_jack',
+ raise: 'wrong_raise',
+}
+
+function seqOf(move: MoveId, side: Side): CoachSequence {
+ return COACH_SEQUENCES[MOVE_SEQUENCE[move][side]]
+}
+
+export function sequenceOf(move: MoveId, side: Side): string[] {
+ return seqOf(move, side).frames
+}
+
+/** 动作到位的那一帧(封面、错误示范对比用) */
+export function peakFrame(move: MoveId): string {
+ const frames = sequenceOf(move, 'L')
+ return frames[frames.length - 1]
+}
+
+export function frameUrl(name: string): string {
+ return `/training/static/coach/${name}.png`
+}
+
+/** 高清帧地址(COS):带内容版本号,重新上传同名文件后缓存自动刷新 */
+export function hdFrameUrl(base: string, name: string): string {
+ return `${base}/${name}.webp?v=${COACH_HD.version}`
+}
+
+/** 高清帧的裁切框:在整张画布上的比例 [左, 上, 右, 下],用来把裁过的图放回原位 */
+export function hdCropOf(move: MoveId): [number, number, number, number] {
+ return COACH_HD.crops[move]
+}
+
+/** 播放某个动作需要加载的全部帧 */
+export function framesToLoad(move: MoveId): string[] {
+ return [...new Set([...sequenceOf(move, 'L'), ...sequenceOf(move, 'R')])]
+}
+
+export type FramePair = { a: string; b: string; w: number }
+
+/** 动作幅度 → 相邻两帧与两帧之间的位置(0~1),按每帧的实测幅度插值 */
+export function framePair(move: MoveId, amount: number, side: Side): FramePair {
+ const { frames, amounts } = seqOf(move, side)
+ const x = Math.min(1, Math.max(0, amount))
+ let i = 0
+ while (i < frames.length - 2 && amounts[i + 1] <= x) i += 1
+ const span = amounts[i + 1] - amounts[i]
+ const w = span > 0 ? Math.min(1, Math.max(0, (x - amounts[i]) / span)) : 1
+ return { a: frames[i], b: frames[i + 1], w }
+}
+
+/**
+ * 播放时的混合权重:大部分时间显示单张清晰帧,只在换帧的瞬间短暂过渡。
+ * 相邻两帧一直按比例混合的话,移动中的手臂会出现半透明的双影。
+ */
+export function crispBlend(w: number): number {
+ const t = Math.min(1, Math.max(0, (w - 0.44) / 0.12))
+ return t * t * (3 - 2 * t)
+}
diff --git a/TUICallKit-Vue3/training/pose/coachSequences.ts b/TUICallKit-Vue3/training/pose/coachSequences.ts
new file mode 100644
index 000000000..8a40fcfc3
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/coachSequences.ts
@@ -0,0 +1,53 @@
+/**
+ * 教练动作帧清单(由 training-videos/scripts/coach_export.py 自动生成,勿手改)
+ *
+ * 每个序列按动作幅度 0→1 排列,全部是 AI 原图帧(内置在 training/static/coach),
+ * 同一个动作出自同一张设定稿;右侧动作由左侧镜像换边生成。amounts 是每帧实测的动作幅度。
+ */
+export type CoachSequence = {
+ /** 帧名,按动作幅度 0→1 排列 */
+ frames: string[]
+ /** 每帧的动作幅度(0 = 起始姿势,1 = 动作到位),与 frames 一一对应、严格递增 */
+ amounts: number[]
+}
+
+export const COACH_SEQUENCES: Record = {
+ squat: {
+ frames: ['sq_00', 'sq_01', 'sq_02', 'sq_03', 'sq_04', 'sq_05', 'sq_06', 'sq_07', 'sq_08', 'sq_09', 'sq_10', 'sq_11', 'sq_12', 'sq_13', 'sq_14', 'sq_15', 'sq_16', 'sq_17', 'sq_18', 'sq_19', 'sq_20', 'sq_21', 'sq_22', 'sq_23'],
+ amounts: [0, 0.057, 0.077, 0.133, 0.168, 0.266, 0.304, 0.342, 0.383, 0.424, 0.456, 0.488, 0.528, 0.569, 0.609, 0.648, 0.702, 0.729, 0.781, 0.834, 0.859, 0.92, 0.957, 1],
+ },
+ raise: {
+ frames: ['ra_00', 'ra_01', 'ra_02', 'ra_03', 'ra_04', 'ra_05', 'ra_06', 'ra_07', 'ra_08', 'ra_09', 'ra_10', 'ra_11', 'ra_12', 'ra_13', 'ra_14', 'ra_15', 'ra_16', 'ra_17', 'ra_18', 'ra_19', 'ra_20', 'ra_21', 'ra_22', 'ra_23'],
+ amounts: [0, 0.118, 0.162, 0.206, 0.245, 0.285, 0.323, 0.36, 0.398, 0.437, 0.461, 0.485, 0.512, 0.579, 0.617, 0.645, 0.708, 0.743, 0.771, 0.821, 0.866, 0.909, 0.957, 1],
+ },
+ jack_l: {
+ frames: ['jl_00', 'jl_01', 'jl_02', 'jl_03', 'jl_04', 'jl_05', 'jl_06', 'jl_07', 'jl_08', 'jl_09'],
+ amounts: [0, 0.105, 0.239, 0.316, 0.463, 0.539, 0.677, 0.782, 0.876, 1],
+ },
+ jack_r: {
+ frames: ['jl_00', 'jr_01', 'jr_02', 'jr_03', 'jr_04', 'jr_05', 'jr_06', 'jr_07', 'jr_08', 'jr_09'],
+ amounts: [0, 0.105, 0.239, 0.316, 0.463, 0.539, 0.677, 0.782, 0.876, 1],
+ },
+ march_l: {
+ frames: ['ml_00', 'ml_01', 'ml_02', 'ml_03', 'ml_04', 'ml_05', 'ml_06', 'ml_07', 'ml_08', 'ml_09', 'ml_10', 'ml_11', 'ml_12'],
+ amounts: [0, 0.025, 0.25, 0.303, 0.356, 0.427, 0.499, 0.576, 0.638, 0.728, 0.755, 0.877, 1],
+ },
+ march_r: {
+ frames: ['ml_00', 'mr_01', 'mr_02', 'mr_03', 'mr_04', 'mr_05', 'mr_06', 'mr_07', 'mr_08', 'mr_09', 'mr_10', 'mr_11', 'mr_12'],
+ amounts: [0, 0.025, 0.25, 0.303, 0.356, 0.427, 0.499, 0.576, 0.638, 0.728, 0.755, 0.877, 1],
+ },
+}
+
+/**
+ * 高清帧(training-videos/out/coach 上传到 COS):每个动作裁出人物所在区域,
+ * crops 是裁切框在整张画布上的比例 [左, 上, 右, 下];version 随内容变化,用来刷新 CDN 缓存。
+ */
+export const COACH_HD: { version: string; crops: Record } = {
+ version: '7ea1f74601',
+ crops: {
+ squat: [0.358, 0.219, 0.642, 0.962],
+ raise: [0.169, 0.218, 0.822, 0.962],
+ jack: [0.173, 0.13, 0.825, 0.962],
+ march: [0.362, 0.218, 0.64, 0.961],
+ },
+}
diff --git a/TUICallKit-Vue3/training/pose/counters.ts b/TUICallKit-Vue3/training/pose/counters.ts
new file mode 100644
index 000000000..87409f3cb
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/counters.ts
@@ -0,0 +1,418 @@
+/**
+ * 动作计数与纠错
+ *
+ * 每个动作一个“单指标 + 滞回阈值”的状态机:
+ * 指标越过 enter 阈值 → 进入动作中,记录峰值与动作期间的姿态问题
+ * 指标回落到 exit 阈值 → 结束一次,按峰值评分并给出提示
+ * 阈值全部是身体比例或关节角度,与人离镜头远近无关。
+ *
+ * 纯逻辑,不依赖 uni / wx,可直接用 Node 单测。
+ */
+import { KP, MIN_POINT_SCORE, angleAt, isVisible, mid, pt, shoulderWidth, type Point, type Pose } from './keypoints.ts'
+import type { Amount, MoveId, Side } from './motions.ts'
+
+export type Grade = 'perfect' | 'good' | 'ok'
+
+export type CoachEvent =
+ | { type: 'rep'; count: number; score: number; grade: Grade; tip?: string; joints?: number[] }
+ | { type: 'tip'; text: string; joints?: number[] }
+
+export interface RepCounter {
+ readonly move: MoveId
+ readonly count: number
+ /** 当前帧的动作幅度(0~1),镜像模式用它驱动教练 */
+ readonly live: Amount
+ /** 计一次所需的动作幅度(进入阈值换算成 0~1),界面幅度条上的目标线 */
+ readonly goal: number
+ /** 最近一帧的原始指标;关键点看不清、这一帧没算出来时为 null(诊断用) */
+ readonly metric: number | null
+ update(pose: Pose): CoachEvent[]
+ reset(): void
+}
+
+/** 一次动作过程中收集的信息 */
+type RepTrace = {
+ peak: number
+ startT: number
+ /** 动作期间出现过的问题(取最严重的一次) */
+ flags: Set
+}
+
+type Rule = {
+ /** 当前帧指标;关键点不可见时返回 null */
+ metric: (pose: Pose, ctx: Ctx) => number | null
+ enter: number
+ exit: number
+ /** 峰值达到 attempt 但没到 enter,回落时提示“幅度不够” */
+ attempt: number
+ attemptTip: string
+ attemptJoints: number[]
+ /** 峰值 → 分数与提示 */
+ judge: (peak: number, trace: RepTrace) => { score: number; tip?: string; joints?: number[] }
+ /** 动作进行中逐帧检查姿态 */
+ checkForm?: (pose: Pose, ctx: Ctx, flags: Set) => void
+ /** 最短单次时长(ms),更快则提示放慢 */
+ minRepMs?: number
+ /** 连续几帧回到起始位才算完成一次(默认 1):在起始位会停留的动作设 2,单帧识别抖动不会多计 */
+ exitFrames?: number
+ /** 指标 → 动作幅度(0 = 起始姿势,1 = 标准到位) */
+ amount: (v: number) => number
+ /** 左右交替的动作:当前是哪一侧 */
+ side?: (pose: Pose) => Side
+}
+
+type Ctx = {
+ /** 站立基线(腿长等),缓慢自适应 */
+ baseline: Record
+}
+
+/** 纠错提示文案(语音会在训练前预合成,改文案只需改这里) */
+export const TIPS = {
+ squat: {
+ shallowAttempt: '再蹲低一点,屁股向后坐',
+ valgus: '膝盖向外打开,对准脚尖',
+ shallow: '不错,下次再蹲深一点',
+ },
+ march: {
+ lowAttempt: '膝盖再抬高一点',
+ low: '膝盖抬到腰的高度更有效',
+ },
+ jack: {
+ armsAttempt: '双手举过头顶',
+ step: '手举起来时,脚向外迈一步',
+ },
+ raise: {
+ lowAttempt: '手臂再抬高,与肩同高',
+ shrug: '肩膀下沉,不要耸肩',
+ high: '抬到与肩同高就好,不用更高',
+ asym: '两只手一起抬,保持平衡',
+ },
+} as const
+
+export const TEMPO_TIP = '慢一点,控制好节奏'
+
+/** 某个动作可能播报的全部提示 */
+export function tipTextsOf(move: MoveId): string[] {
+ return [...Object.values(TIPS[move]), TEMPO_TIP]
+}
+
+const TIP_COOLDOWN_MS = 3500
+/** 只是建议、不影响计数和评分的提示,冷却更久,免得每次都念 */
+const ADVICE_TIPS: ReadonlySet = new Set([TIPS.jack.step])
+const ADVICE_COOLDOWN_MS = 20000
+/**
+ * 连续几帧达到计数线才算动作开始:识别引擎偶尔有单帧跳动(真机:高抬腿一帧从 0.05 跳到 0.46 又落回),
+ * 真实动作在计数线以上至少持续 0.3 秒,两帧确认不影响正常计数
+ */
+const ENTER_FRAMES = 2
+
+const gradeOf = (score: number): Grade => (score >= 90 ? 'perfect' : score >= 75 ? 'good' : 'ok')
+
+const clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v))
+
+/** 线性映射到分数区间 */
+const scale = (v: number, v0: number, v1: number, s0: number, s1: number) => s0 + (s1 - s0) * clamp((v - v0) / (v1 - v0), 0, 1)
+
+/**
+ * 计数用的关键点可见阈值,与站位一致。
+ * 真机实测:离得太近、腿被画面裁掉时,腿部点置信度只有 0.1~0.2,位置是模型猜的(膝盖跑到髋上方、脚踝乱飘),
+ * 放宽到 0.2 会把这些点拿来计数、没下蹲也计数。看不清时宁可不计,由页面提示用户后退。
+ */
+export const TRACK_MIN_SCORE = MIN_POINT_SCORE
+
+function visibleAll(pose: Pose, idx: number[]) {
+ return idx.every((i) => isVisible(pose, i, TRACK_MIN_SCORE))
+}
+
+/** 一组点里看得清的那些的平均位置(左右成对的点只看清一个也能用);一个都看不清返回 null */
+function avgVisible(pose: Pose, idx: number[]): Point | null {
+ const seen = idx.filter((i) => isVisible(pose, i, TRACK_MIN_SCORE)).map((i) => pt(pose, i))
+ if (!seen.length) return null
+ return { x: seen.reduce((s, p) => s + p.x, 0) / seen.length, y: seen.reduce((s, p) => s + p.y, 0) / seen.length }
+}
+
+/** 躯干长度:看得清的肩、髋的中点之间的距离 */
+function visibleTorso(pose: Pose): number | null {
+ const sh = avgVisible(pose, [KP.L_SHOULDER, KP.R_SHOULDER])
+ const hip = avgVisible(pose, [KP.L_HIP, KP.R_HIP])
+ if (!sh || !hip) return null
+ return Math.hypot(sh.x - hip.x, sh.y - hip.y)
+}
+
+/** 肩外展角:躯干侧线(髋→肩)与手臂(肩→腕)的夹角 */
+function abduction(pose: Pose, side: 'L' | 'R'): number | null {
+ const [sh, hip, wr] = side === 'L' ? [KP.L_SHOULDER, KP.L_HIP, KP.L_WRIST] : [KP.R_SHOULDER, KP.R_HIP, KP.R_WRIST]
+ if (!visibleAll(pose, [sh, hip, wr])) return null
+ return angleAt(pt(pose, hip), pt(pose, sh), pt(pose, wr))
+}
+
+function avgAbduction(pose: Pose): number | null {
+ const l = abduction(pose, 'L')
+ const r = abduction(pose, 'R')
+ if (l === null && r === null) return null
+ if (l === null) return r
+ if (r === null) return l
+ return (l + r) / 2
+}
+
+// ─────────────────────────── 各动作规则 ───────────────────────────
+
+/**
+ * 深蹲:髋部下降比例 = 1 - 当前(踝→髋高度) / 站立时(踝→髋高度)。左右髋、左右踝各看清一个就够。
+ * 不用髋→膝高度做替补:真机上脚踝看不清时膝盖往往也是猜的,两种估算逐帧交替会算出 0 和 0.4 来回跳,凭空计数。
+ */
+function squatRule(): Rule {
+ return {
+ metric(pose, ctx) {
+ const hip = avgVisible(pose, [KP.L_HIP, KP.R_HIP])
+ const ankle = avgVisible(pose, [KP.L_ANKLE, KP.R_ANKLE])
+ if (!hip || !ankle) return null
+ const span = ankle.y - hip.y
+ const b = ctx.baseline
+ // 站立基线:取近期最大值,并缓慢衰减以适应前后走动
+ b.legSpan = Math.max(span, (b.legSpan ?? span) * 0.998)
+ return b.legSpan > 0 ? clamp(1 - span / b.legSpan, 0, 1) : null
+ },
+ enter: 0.13,
+ exit: 0.06,
+ attempt: 0.08,
+ attemptTip: TIPS.squat.shallowAttempt,
+ amount: (v) => clamp(v / 0.34, 0, 1),
+ attemptJoints: [KP.L_HIP, KP.R_HIP],
+ minRepMs: 1200,
+ exitFrames: 2,
+ checkForm(pose, _ctx, flags) {
+ if (!visibleAll(pose, [KP.L_KNEE, KP.R_KNEE, KP.L_ANKLE, KP.R_ANKLE])) return
+ const kneeGap = Math.abs(pt(pose, KP.L_KNEE).x - pt(pose, KP.R_KNEE).x)
+ const ankleGap = Math.abs(pt(pose, KP.L_ANKLE).x - pt(pose, KP.R_ANKLE).x)
+ const hipDrop = legSpanDropFlag(pose)
+ if (hipDrop && ankleGap > 0 && kneeGap / ankleGap < 0.8) flags.add('valgus')
+ },
+ judge(peak, trace) {
+ let score = scale(peak, 0.13, 0.3, 70, 100)
+ if (trace.flags.has('valgus')) {
+ score = Math.min(score, 72)
+ return { score, tip: TIPS.squat.valgus, joints: [KP.L_KNEE, KP.R_KNEE] }
+ }
+ if (peak < 0.24) return { score, tip: TIPS.squat.shallow, joints: [KP.L_HIP, KP.R_HIP] }
+ return { score }
+ },
+ }
+}
+
+/** checkForm 只在蹲下时判断膝内扣,用躯干长度估计是否已明显下蹲 */
+function legSpanDropFlag(pose: Pose): boolean {
+ const hip = mid(pt(pose, KP.L_HIP), pt(pose, KP.R_HIP))
+ const ankle = mid(pt(pose, KP.L_ANKLE), pt(pose, KP.R_ANKLE))
+ const torso = visibleTorso(pose) ?? 0
+ return torso > 0 && (ankle.y - hip.y) / torso < 1.25
+}
+
+/** 高抬腿:抬起侧膝盖比支撑侧膝盖高出多少(按躯干长度归一;肩、髋各看清一侧即可) */
+function marchRule(): Rule {
+ return {
+ metric(pose) {
+ if (!visibleAll(pose, [KP.L_KNEE, KP.R_KNEE])) return null
+ const torso = visibleTorso(pose)
+ if (!torso) return null
+ const diff = Math.abs(pt(pose, KP.L_KNEE).y - pt(pose, KP.R_KNEE).y)
+ return diff / torso
+ },
+ enter: 0.16,
+ exit: 0.06,
+ attempt: 0.08,
+ attemptTip: TIPS.march.lowAttempt,
+ amount: (v) => clamp(v / 0.55, 0, 1),
+ side: (pose) => (pt(pose, KP.L_KNEE).y < pt(pose, KP.R_KNEE).y ? 'L' : 'R'),
+ attemptJoints: [KP.L_KNEE, KP.R_KNEE],
+ minRepMs: 250,
+ judge(peak) {
+ const score = scale(peak, 0.16, 0.45, 72, 100)
+ if (peak < 0.3) return { score, tip: TIPS.march.low, joints: [KP.L_KNEE, KP.R_KNEE] }
+ return { score }
+ },
+ }
+}
+
+/** 低冲击开合:双臂外展角;同时检查脚是否向外迈开 */
+function jackRule(): Rule {
+ return {
+ metric: (pose) => avgAbduction(pose),
+ // 手臂高过肩就算(只举到与肩平约 90° 仍不计)。真机实测跟练用户的峰值多在 99°~110°,远低于示范的 178°
+ enter: 95,
+ exit: 50,
+ attempt: 65,
+ attemptTip: TIPS.jack.armsAttempt,
+ amount: (v) => clamp((v - 12) / 158, 0, 1),
+ side(pose) {
+ const c = mid(pt(pose, KP.L_HIP), pt(pose, KP.R_HIP)).x
+ const l = Math.abs(pt(pose, KP.L_ANKLE).x - c)
+ const r = Math.abs(pt(pose, KP.R_ANKLE).x - c)
+ return l >= r ? 'L' : 'R'
+ },
+ attemptJoints: [KP.L_WRIST, KP.R_WRIST],
+ minRepMs: 500,
+ checkForm(pose, ctx, flags) {
+ if (!visibleAll(pose, [KP.L_ANKLE, KP.R_ANKLE, KP.L_SHOULDER, KP.R_SHOULDER])) return
+ const sw = shoulderWidth(pose)
+ if (sw <= 0) return
+ const spread = Math.abs(pt(pose, KP.L_ANKLE).x - pt(pose, KP.R_ANKLE).x) / sw
+ ctx.baseline.maxSpread = Math.max(ctx.baseline.maxSpread ?? 0, spread)
+ if (spread >= 1.05) flags.add('stepped')
+ },
+ judge(peak, trace) {
+ // 满分线按真机跟练的实际幅度定(示范 178°,用户多在 100°~130°):举到 140° 就是满分
+ const score = scale(peak, 95, 140, 75, 100)
+ // 没迈步只提示、不压分:手臂到位才是评分依据(提示冷却较长,不会每次都念)
+ if (!trace.flags.has('stepped')) return { score, tip: TIPS.jack.step, joints: [KP.L_ANKLE, KP.R_ANKLE] }
+ return { score }
+ },
+ }
+}
+
+/** 侧平举:双臂外展角,理想峰值 80~100 度;同时检查耸肩与左右不对称 */
+function raiseRule(): Rule {
+ const neckRatio = (pose: Pose) => {
+ const sh = mid(pt(pose, KP.L_SHOULDER), pt(pose, KP.R_SHOULDER))
+ const sw = shoulderWidth(pose)
+ return sw > 0 ? (sh.y - pt(pose, KP.NOSE).y) / sw : null
+ }
+ return {
+ metric(pose, ctx) {
+ const a = avgAbduction(pose)
+ if (a !== null && a < 30 && isVisible(pose, KP.NOSE)) {
+ // 手臂放下时记录颈部基线,用于判断耸肩
+ const r = neckRatio(pose)
+ if (r !== null) ctx.baseline.neck = ctx.baseline.neck === undefined ? r : ctx.baseline.neck * 0.9 + r * 0.1
+ }
+ return a
+ },
+ enter: 58,
+ exit: 30,
+ attempt: 38,
+ attemptTip: TIPS.raise.lowAttempt,
+ amount: (v) => clamp((v - 10) / 78, 0, 1),
+ attemptJoints: [KP.L_WRIST, KP.R_WRIST],
+ minRepMs: 1200,
+ checkForm(pose, ctx, flags) {
+ const l = abduction(pose, 'L')
+ const r = abduction(pose, 'R')
+ if (l !== null && r !== null && Math.abs(l - r) > 28) flags.add('asym')
+ const base = ctx.baseline.neck
+ const cur = isVisible(pose, KP.NOSE) ? neckRatio(pose) : null
+ if (base && cur !== null && cur < base * 0.8) flags.add('shrug')
+ },
+ judge(peak, trace) {
+ if (trace.flags.has('shrug')) return { score: 70, tip: TIPS.raise.shrug, joints: [KP.L_SHOULDER, KP.R_SHOULDER] }
+ if (peak > 112) return { score: 75, tip: TIPS.raise.high, joints: [KP.L_WRIST, KP.R_WRIST] }
+ if (trace.flags.has('asym')) return { score: 78, tip: TIPS.raise.asym, joints: [KP.L_WRIST, KP.R_WRIST] }
+ const score = peak >= 80 ? 100 : scale(peak, 58, 80, 75, 95)
+ return { score }
+ },
+ }
+}
+
+const RULES: Record Rule> = {
+ squat: squatRule,
+ march: marchRule,
+ jack: jackRule,
+ raise: raiseRule,
+}
+
+// ─────────────────────────── 通用状态机 ───────────────────────────
+
+export function createCounter(move: MoveId): RepCounter {
+ const rule = RULES[move]()
+ let ctx: Ctx = { baseline: {} }
+ let count = 0
+ let active: RepTrace | null = null
+ let attemptPeak = 0
+ let lastRepEnd = 0
+ let exitStreak = 0
+ let enterStreak = 0
+ let live: Amount = { amount: 0, side: 'L' }
+ let metric: number | null = null
+ const goal = rule.amount(rule.enter)
+ const lastTipAt = new Map()
+
+ const allowTip = (text: string, t: number) => {
+ const last = lastTipAt.get(text) ?? -Infinity
+ if (t - last < (ADVICE_TIPS.has(text) ? ADVICE_COOLDOWN_MS : TIP_COOLDOWN_MS)) return false
+ lastTipAt.set(text, t)
+ return true
+ }
+
+ return {
+ move,
+ get count() {
+ return count
+ },
+ get live() {
+ return live
+ },
+ get metric() {
+ return metric
+ },
+ goal,
+ reset() {
+ ctx = { baseline: {} }
+ count = 0
+ active = null
+ attemptPeak = 0
+ lastRepEnd = 0
+ exitStreak = 0
+ enterStreak = 0
+ live = { amount: 0, side: 'L' }
+ metric = null
+ lastTipAt.clear()
+ },
+ update(pose) {
+ const events: CoachEvent[] = []
+ const raw = rule.metric(pose, ctx)
+ // 兜底:指标算出 NaN / Infinity(坐标异常)时按看不清处理,不让幅度条和计数卡住
+ const v = raw !== null && Number.isFinite(raw) ? raw : null
+ metric = v
+ if (v === null) return events
+ live = { amount: rule.amount(v), side: rule.side?.(pose) ?? 'L' }
+
+ if (!active) {
+ enterStreak = v >= rule.enter ? enterStreak + 1 : 0
+ if (enterStreak >= ENTER_FRAMES) {
+ enterStreak = 0
+ active = { peak: Math.max(v, attemptPeak), startT: pose.t, flags: new Set() }
+ attemptPeak = 0
+ exitStreak = 0
+ } else if (v >= rule.attempt) {
+ attemptPeak = Math.max(attemptPeak, v)
+ } else if (attemptPeak > 0 && v <= rule.exit) {
+ // 做了动作但幅度不够,回到起始位
+ if (allowTip(rule.attemptTip, pose.t)) events.push({ type: 'tip', text: rule.attemptTip, joints: rule.attemptJoints })
+ attemptPeak = 0
+ }
+ }
+
+ if (active) {
+ active.peak = Math.max(active.peak, v)
+ rule.checkForm?.(pose, ctx, active.flags)
+ exitStreak = v <= rule.exit ? exitStreak + 1 : 0
+ if (exitStreak >= (rule.exitFrames ?? 1)) {
+ exitStreak = 0
+ count += 1
+ const judged = rule.judge(active.peak, active)
+ let { tip, joints } = judged
+ const duration = pose.t - (lastRepEnd || active.startT)
+ if (!tip && rule.minRepMs && lastRepEnd && duration < rule.minRepMs) {
+ tip = TEMPO_TIP
+ joints = undefined
+ }
+ const score = Math.round(judged.score)
+ const showTip = tip && allowTip(tip, pose.t) ? tip : undefined
+ events.push({ type: 'rep', count, score, grade: gradeOf(score), tip: showTip, joints: showTip ? joints : undefined })
+ lastRepEnd = pose.t
+ active = null
+ }
+ }
+ return events
+ },
+ }
+}
diff --git a/TUICallKit-Vue3/training/pose/exercises.ts b/TUICallKit-Vue3/training/pose/exercises.ts
new file mode 100644
index 000000000..d131a43d4
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/exercises.ts
@@ -0,0 +1,133 @@
+/**
+ * 跟练动作的展示文案与训练参数
+ *
+ * 纯数据,小程序页面与 Remotion 示范视频共用。
+ */
+import type { MoveId } from './motions.ts'
+
+export type ExerciseInfo = {
+ id: MoveId
+ name: string
+ /** 一句话卖点 */
+ tagline: string
+ /** 锻炼部位 */
+ targets: string[]
+ /** 强度:1 轻松 ~ 3 较累 */
+ level: 1 | 2 | 3
+ /** 默认目标次数 */
+ targetReps: number
+ /** 目标次数可调范围与步长 */
+ repRange: [number, number]
+ repStep: number
+ /** 估算代谢当量(净 MET,已扣除静息 1 MET) */
+ netMet: number
+ /** 动作要领(示范视频逐条出现) */
+ keyPoints: string[]
+ /** 常见错误 → 正确做法 */
+ mistake: { wrong: string; right: string }
+ /** 主题色 */
+ color: string
+ /** 示范视频地址;上传 COS 后填入,留空时正式环境不显示“完整示范”按钮 */
+ videoUrl: string
+}
+
+export const EXERCISES: Record = {
+ squat: {
+ id: 'squat',
+ name: '徒手深蹲',
+ tagline: '练大腿和臀部,大肌群最耗糖',
+ targets: ['大腿', '臀部', '核心'],
+ level: 2,
+ targetReps: 12,
+ repRange: [6, 30],
+ repStep: 2,
+ netMet: 4,
+ keyPoints: ['双脚与肩同宽,脚尖微微向外', '屁股向后坐,像要坐椅子', '膝盖对准脚尖,不要内扣', '蹲到大腿接近水平,脚跟发力站起'],
+ mistake: { wrong: '膝盖向内扣', right: '膝盖朝脚尖方向打开' },
+ color: '#10b981',
+ videoUrl: 'https://gz-1349751149.cos.ap-guangzhou.myqcloud.com/yundong/video/squat.mp4',
+ },
+ march: {
+ id: 'march',
+ name: '原地高抬腿',
+ tagline: '不出门的有氧,饭后 10 分钟正合适',
+ targets: ['下肢', '心肺'],
+ level: 1,
+ targetReps: 40,
+ repRange: [20, 100],
+ repStep: 10,
+ netMet: 3,
+ keyPoints: ['上身挺直,目视前方', '左右交替抬膝', '膝盖尽量抬到腰的高度', '手臂自然前后摆动'],
+ mistake: { wrong: '膝盖只抬一点点', right: '大腿抬到接近水平' },
+ color: '#f59e0b',
+ videoUrl: 'https://gz-1349751149.cos.ap-guangzhou.myqcloud.com/yundong/video/march.mp4',
+ },
+ jack: {
+ id: 'jack',
+ name: '低冲击开合',
+ tagline: '不用跳,对膝盖友好的全身燃脂',
+ targets: ['全身', '肩部', '心肺'],
+ level: 2,
+ targetReps: 20,
+ repRange: [8, 40],
+ repStep: 4,
+ netMet: 3.5,
+ keyPoints: ['一只脚向侧面迈出一步', '同时双手从两侧举过头顶', '收脚时手臂放下', '左右交替,保持节奏'],
+ mistake: { wrong: '手臂只抬到胸口', right: '双手完全举过头顶' },
+ color: '#6366f1',
+ videoUrl: 'https://gz-1349751149.cos.ap-guangzhou.myqcloud.com/yundong/video/jack.mp4',
+ },
+ raise: {
+ id: 'raise',
+ name: '站姿侧平举',
+ tagline: '坐久了肩颈僵?练练肩膀',
+ targets: ['肩部', '上背'],
+ level: 1,
+ targetReps: 15,
+ repRange: [9, 30],
+ repStep: 3,
+ netMet: 2,
+ keyPoints: ['双脚与肩同宽,微收腹', '手臂伸直,从两侧慢慢抬起', '抬到与肩同高停一秒', '慢慢放下,肩膀不要耸起'],
+ mistake: { wrong: '耸肩、手臂抬过头', right: '肩膀下沉,抬到与肩平齐' },
+ color: '#0ea5e9',
+ videoUrl: 'https://gz-1349751149.cos.ap-guangzhou.myqcloud.com/yundong/video/raise.mp4',
+ },
+}
+
+export const EXERCISE_ORDER: MoveId[] = ['squat', 'march', 'jack', 'raise']
+
+/**
+ * 示范视频地址:线上用 COS 地址(上传后填到 EXERCISES[x].videoUrl);
+ * 开发环境回退到本机 training-videos 静态服务(npm run serve,端口 5179),
+ * 真机调试时把 DEV_VIDEO_HOST 改成电脑的局域网 IP。
+ */
+export const DEV_VIDEO_HOST = 'http://127.0.0.1:5179'
+
+export function videoUrlOf(ex: ExerciseInfo, isDev: boolean): string {
+ if (ex.videoUrl) return ex.videoUrl
+ return isDev ? `${DEV_VIDEO_HOST}/${ex.id}.mp4` : ''
+}
+
+/**
+ * 教练高清帧的 COS 目录:把 training-videos/out/coach 整个上传后填入,
+ * 例如 'https://xxx.cos.ap-guangzhou.myqcloud.com/training/coach'(末尾不带斜杠)。
+ * 留空只用包内帧;开发环境留空时读本机 npm run serve(真机访问不到会自动退回包内帧)。
+ */
+export const COACH_CDN_BASE = 'https://gz-1349751149.cos.ap-guangzhou.myqcloud.com/yundong/coach'
+
+export function coachCdnBase(isDev: boolean): string {
+ if (COACH_CDN_BASE) return COACH_CDN_BASE
+ return isDev ? `${DEV_VIDEO_HOST}/coach` : ''
+}
+
+/**
+ * 跟练背景音乐:training-videos 里 npm run bgm 生成的 out/music/calm.mp3 上传到 COS 后填入;
+ * 换音乐时换个文件名(避免缓存)。留空时开发环境读本机 npm run serve,正式环境不放音乐;
+ * 地址打不开时自动不放、隐藏开关,不影响训练。
+ */
+export const BGM_URL = 'https://gz-1349751149.cos.ap-guangzhou.myqcloud.com/uploads/file/20260930/20260930085356d4f920988.mp3'
+
+export function bgmUrlOf(isDev: boolean): string {
+ if (BGM_URL) return BGM_URL
+ return isDev ? `${DEV_VIDEO_HOST}/music/calm.mp3` : ''
+}
diff --git a/TUICallKit-Vue3/training/pose/history.ts b/TUICallKit-Vue3/training/pose/history.ts
new file mode 100644
index 000000000..628a77df9
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/history.ts
@@ -0,0 +1,92 @@
+/**
+ * 跟练记录(本地存储)
+ *
+ * 只保存汇总数据,不含任何画面。纯函数部分可单测,存取通过 storage 适配器注入。
+ */
+import type { MoveId } from './motions.ts'
+import type { SessionSummary } from './session.ts'
+
+export type HistoryRecord = {
+ move: MoveId
+ reps: number
+ avgScore: number
+ durationSec: number
+ kcal: number
+ /** 本地日期 YYYY-MM-DD */
+ day: string
+ at: number
+}
+
+export type Storage = {
+ get: (key: string) => unknown
+ set: (key: string, value: unknown) => void
+}
+
+const KEY = 'pose_coach_history_v1'
+const MAX_RECORDS = 200
+
+export function dayOf(ts: number): string {
+ const d = new Date(ts)
+ const mm = String(d.getMonth() + 1).padStart(2, '0')
+ const dd = String(d.getDate()).padStart(2, '0')
+ return `${d.getFullYear()}-${mm}-${dd}`
+}
+
+export function loadHistory(store: Storage): HistoryRecord[] {
+ try {
+ const raw = store.get(KEY)
+ return Array.isArray(raw) ? (raw as HistoryRecord[]) : []
+ } catch (e) {
+ return []
+ }
+}
+
+export function appendHistory(store: Storage, s: SessionSummary, now = Date.now()): HistoryRecord[] {
+ if (s.reps <= 0) return loadHistory(store)
+ const rec: HistoryRecord = {
+ move: s.move,
+ reps: s.reps,
+ avgScore: s.avgScore,
+ durationSec: s.durationSec,
+ kcal: s.kcal,
+ day: dayOf(now),
+ at: now,
+ }
+ const next = [rec, ...loadHistory(store)].slice(0, MAX_RECORDS)
+ try {
+ store.set(KEY, next)
+ } catch (e) {}
+ return next
+}
+
+export type HistoryStats = {
+ todayReps: number
+ todayMinutes: number
+ /** 连续训练天数(含今天;今天没练则从昨天算起) */
+ streak: number
+ total: number
+}
+
+export function statsOf(records: HistoryRecord[], now = Date.now()): HistoryStats {
+ const today = dayOf(now)
+ const todays = records.filter((r) => r.day === today)
+ const days = new Set(records.map((r) => r.day))
+ let streak = 0
+ let cursor = days.has(today) ? now : now - 86400000
+ while (days.has(dayOf(cursor))) {
+ streak += 1
+ cursor -= 86400000
+ }
+ return {
+ todayReps: todays.reduce((a, r) => a + r.reps, 0),
+ todayMinutes: Math.round(todays.reduce((a, r) => a + r.durationSec, 0) / 60),
+ streak,
+ total: records.length,
+ }
+}
+
+/** uni 本地存储适配器 */
+export const uniStorage: Storage = {
+ get: (k) => uni.getStorageSync(k),
+ set: (k, v) => uni.setStorageSync(k, v),
+}
diff --git a/TUICallKit-Vue3/training/pose/keypoints.ts b/TUICallKit-Vue3/training/pose/keypoints.ts
new file mode 100644
index 000000000..9c6a218be
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/keypoints.ts
@@ -0,0 +1,194 @@
+/**
+ * 人体关键点定义与几何工具
+ *
+ * 点位遵循微信 VisionKit body 检测的 23 点定义(基础库 >= 2.28.0):
+ * 0 鼻子 1/2 左/右眼 3/4 左/右耳
+ * 5/6 左/右肩 7/8 左/右肘 9/10 左/右腕
+ * 11/12 左/右髋 13/14 左/右膝 15/16 左/右踝
+ * 17/18 左/右手尖 19/20 左/右脚外侧 21/22 左/右脚内侧
+ * “左/右”指被拍摄者自身的左右。
+ *
+ * 本文件不依赖 uni / wx,可在 Node 单测与 Remotion 中直接复用。
+ */
+
+export type Point = { x: number; y: number }
+
+/** 一帧姿态:23 个点,坐标归一化到 [0,1],score 为该点置信度(0~1) */
+export type Pose = {
+ points: Point[]
+ scores: number[]
+ /** 采集时间戳(ms) */
+ t: number
+ /** 画面宽高比(宽/高),用于把 x 换算到与 y 同一尺度;缺省为 1 */
+ aspect?: number
+}
+
+/** 取某个点,并把 x 换算到与 y 相同的尺度(角度、距离计算必须用它) */
+export function pt(pose: Pose, idx: number): Point {
+ const p = pose.points[idx]
+ return { x: p.x * (pose.aspect ?? 1), y: p.y }
+}
+
+export const KP = {
+ NOSE: 0,
+ L_EYE: 1,
+ R_EYE: 2,
+ L_EAR: 3,
+ R_EAR: 4,
+ L_SHOULDER: 5,
+ R_SHOULDER: 6,
+ L_ELBOW: 7,
+ R_ELBOW: 8,
+ L_WRIST: 9,
+ R_WRIST: 10,
+ L_HIP: 11,
+ R_HIP: 12,
+ L_KNEE: 13,
+ R_KNEE: 14,
+ L_ANKLE: 15,
+ R_ANKLE: 16,
+ L_HAND: 17,
+ R_HAND: 18,
+ L_FOOT_OUT: 19,
+ R_FOOT_OUT: 20,
+ L_FOOT_IN: 21,
+ R_FOOT_IN: 22,
+} as const
+
+export const KEYPOINT_COUNT = 23
+
+/** 判定“全身入镜”需要看得到的点 */
+export const FULL_BODY_POINTS = [
+ KP.NOSE,
+ KP.L_SHOULDER,
+ KP.R_SHOULDER,
+ KP.L_HIP,
+ KP.R_HIP,
+ KP.L_KNEE,
+ KP.R_KNEE,
+ KP.L_ANKLE,
+ KP.R_ANKLE,
+]
+
+export const MIN_POINT_SCORE = 0.3
+
+export function dist(a: Point, b: Point): number {
+ return Math.hypot(a.x - b.x, a.y - b.y)
+}
+
+export function mid(a: Point, b: Point): Point {
+ return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }
+}
+
+/** 以 b 为顶点的夹角 ∠abc,单位度,范围 [0,180] */
+export function angleAt(a: Point, b: Point, c: Point): number {
+ const v1x = a.x - b.x
+ const v1y = a.y - b.y
+ const v2x = c.x - b.x
+ const v2y = c.y - b.y
+ const n = Math.hypot(v1x, v1y) * Math.hypot(v2x, v2y)
+ if (n === 0) return 180
+ const cos = Math.min(1, Math.max(-1, (v1x * v2x + v1y * v2y) / n))
+ return (Math.acos(cos) * 180) / Math.PI
+}
+
+/** 坐标是有效数字(真机上画面外的点坐标是 NaN) */
+export function isFinitePoint(p: Point | undefined): p is Point {
+ return !!p && Number.isFinite(p.x) && Number.isFinite(p.y)
+}
+
+export function isVisible(pose: Pose, idx: number, min = MIN_POINT_SCORE): boolean {
+ return (pose.scores[idx] ?? 0) >= min && isFinitePoint(pose.points[idx])
+}
+
+/** 肩宽,作为身体尺度基准(对远近不敏感) */
+export function shoulderWidth(pose: Pose): number {
+ return dist(pt(pose, KP.L_SHOULDER), pt(pose, KP.R_SHOULDER))
+}
+
+/** 躯干长度:肩中点到髋中点 */
+export function torsoLength(pose: Pose): number {
+ const s = mid(pt(pose, KP.L_SHOULDER), pt(pose, KP.R_SHOULDER))
+ const h = mid(pt(pose, KP.L_HIP), pt(pose, KP.R_HIP))
+ return dist(s, h)
+}
+
+export type FramingIssue = 'none' | 'no_body' | 'too_close' | 'too_far' | 'off_center' | 'partial'
+
+/**
+ * 站位检查:是否全身入镜、远近是否合适、是否居中。
+ * 返回第一个需要纠正的问题。
+ */
+export function checkFraming(pose: Pose | null): FramingIssue {
+ if (!pose) return 'no_body'
+ const missing = FULL_BODY_POINTS.filter((i) => !isVisible(pose, i))
+ if (missing.length >= FULL_BODY_POINTS.length - 2) return 'no_body'
+
+ const top = pose.points[KP.NOSE].y
+ const bottom = Math.max(pose.points[KP.L_ANKLE].y, pose.points[KP.R_ANKLE].y)
+ const height = bottom - top
+
+ const anklesMissing = !isVisible(pose, KP.L_ANKLE) || !isVisible(pose, KP.R_ANKLE)
+ if (anklesMissing || bottom > 0.98 || top < 0.02) return 'too_close'
+ if (missing.length > 0) return 'partial'
+ if (height < 0.35) return 'too_far'
+
+ const cx = (pose.points[KP.L_HIP].x + pose.points[KP.R_HIP].x) / 2
+ if (cx < 0.25 || cx > 0.75) return 'off_center'
+ return 'none'
+}
+
+export const FRAMING_TIPS: Record = {
+ none: '站位很好,保持住',
+ no_body: '请站到镜头前',
+ too_close: '请往后退,让头和脚都进入画面',
+ too_far: '请再往前走一点',
+ off_center: '请站到画面中间',
+ partial: '请让全身都进入画面',
+}
+
+/**
+ * 指数平滑:抑制关键点抖动。alpha 越大越跟手,越小越稳。
+ * 置信度低的点保留上一帧位置,避免骨架乱跳。
+ * 上一帧坐标无效(NaN)时直接用新坐标重新开始——否则 NaN 会一直传下去,这个点永远是 NaN。
+ */
+export function smoothPose(prev: Pose | null, next: Pose, alpha = 0.55): Pose {
+ if (!prev) return next
+ const points = next.points.map((p, i) => {
+ const q = prev.points[i]
+ if (!isFinitePoint(q)) return p
+ if ((next.scores[i] ?? 0) < MIN_POINT_SCORE || !isFinitePoint(p)) return q
+ return { x: q.x + (p.x - q.x) * alpha, y: q.y + (p.y - q.y) * alpha }
+ })
+ const scores = next.scores.map((s, i) => Math.max(s, (prev.scores[i] ?? 0) * 0.7))
+ return { points, scores, t: next.t, aspect: next.aspect }
+}
+
+type RawPoint = { x: number; y: number } | [number, number]
+
+/**
+ * 把 VisionKit 的 anchor 转成归一化 Pose。
+ * 官方示例里 points 已是 0~1 的 {x,y};文档描述为“图像中的坐标”,
+ * 这里两种都兼容:发现坐标 > 1.5 即按像素处理。
+ * 画面外的点真机返回 NaN 坐标(置信度却可能不低):坐标置 0、置信度置 0,当作看不见。
+ */
+export function anchorToPose(
+ anchor: { points?: RawPoint[]; confidence?: number[]; score?: number },
+ frameWidth: number,
+ frameHeight: number,
+ t: number,
+): Pose | null {
+ const raw = anchor?.points
+ if (!raw || raw.length < 17) return null
+ const pts: Point[] = raw.map((p) => (Array.isArray(p) ? { x: p[0], y: p[1] } : { x: p?.x, y: p?.y }))
+ const isPixel = pts.some((p) => isFinitePoint(p) && (p.x > 1.5 || p.y > 1.5))
+ const points = pts.map((p) => (!isFinitePoint(p) ? { x: 0, y: 0 } : isPixel ? { x: p.x / frameWidth, y: p.y / frameHeight } : p))
+ while (points.length < KEYPOINT_COUNT) points.push({ x: 0, y: 0 })
+ const fallback = typeof anchor.score === 'number' ? anchor.score : 1
+ const scores = points.map((_, i) => {
+ if (i >= raw.length || !isFinitePoint(pts[i])) return 0
+ const c = anchor.confidence?.[i]
+ return typeof c === 'number' && Number.isFinite(c) ? c : fallback
+ })
+ return { points, scores, t, aspect: frameWidth / frameHeight }
+}
diff --git a/TUICallKit-Vue3/training/pose/motions.ts b/TUICallKit-Vue3/training/pose/motions.ts
new file mode 100644
index 000000000..9c6f127db
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/motions.ts
@@ -0,0 +1,328 @@
+/**
+ * 示范动作骨架动画(正面视角)
+ *
+ * 用途:
+ * 1. 示范节奏:amountAt 决定教练逐帧动画与示范视频的节拍
+ * 2. 单测与开发者工具模拟:用示范动作合成姿态,验证识别计数逻辑
+ *
+ * 坐标系与 VisionKit 一致:x/y 归一化到 [0,1],y 向下;
+ * 被拍摄者的“左侧”在画面右侧(未镜像的正面视角)。
+ */
+import { KEYPOINT_COUNT, type Point } from './keypoints.ts'
+
+export type MoveId = 'squat' | 'march' | 'jack' | 'raise'
+
+type ArmParams = {
+ /** 外展角:0 = 手臂自然下垂,90 = 侧平举,180 = 举过头顶 */
+ abd: number
+ /** 前平举程度 0~1(正面看手臂“缩短”) */
+ fwd: number
+}
+
+type LegParams = {
+ /** 抬膝程度 0~1(1 = 大腿抬平) */
+ lift: number
+ /** 脚向外侧迈出的距离 */
+ step: number
+}
+
+type BodyParams = {
+ /** 下蹲深度 0~1(1 ≈ 大腿与地面平行) */
+ squat: number
+ /** 整体上下起伏(踏步时的弹动) */
+ bounce: number
+ left: { arm: ArmParams; leg: LegParams }
+ right: { arm: ArmParams; leg: LegParams }
+}
+
+const CX = 0.5
+const GROUND = 0.93
+const THIGH = 0.2
+const SHIN = 0.2
+const TORSO = 0.27
+const HIP_HALF = 0.058
+const SHOULDER_HALF = 0.098
+const UPPER_ARM = 0.15
+const FOREARM = 0.135
+const HAND = 0.045
+
+const rad = (d: number) => (d * Math.PI) / 180
+
+function buildArm(shoulder: Point, side: 1 | -1, arm: ArmParams) {
+ // 前举时手臂在画面上投影变短
+ const shrink = 1 - 0.82 * arm.fwd
+ const a = rad(arm.abd)
+ const dx = side * Math.sin(a)
+ const dy = Math.cos(a)
+ const elbow = { x: shoulder.x + dx * UPPER_ARM * shrink, y: shoulder.y + dy * UPPER_ARM * shrink }
+ const wrist = { x: elbow.x + dx * FOREARM * shrink, y: elbow.y + dy * FOREARM * shrink }
+ const hand = { x: wrist.x + dx * HAND * shrink, y: wrist.y + dy * HAND * shrink }
+ return { elbow, wrist, hand }
+}
+
+function buildLeg(hip: Point, side: 1 | -1, leg: LegParams, squat: number) {
+ const ankleX = hip.x + side * (0.008 + leg.step)
+ if (leg.lift > 0) {
+ // 抬膝:大腿向前抬起,正面投影变短;小腿自然下垂
+ const thighProj = THIGH * Math.cos(rad(leg.lift * 90))
+ const knee = { x: hip.x + side * 0.004, y: hip.y + thighProj }
+ const ankle = { x: ankleX, y: knee.y + SHIN * 0.92 }
+ return { knee, ankle }
+ }
+ const ankle = { x: ankleX, y: GROUND }
+ // 下蹲时膝盖向外打开(膝盖对准脚尖)
+ const knee = {
+ x: (hip.x + ankle.x) / 2 + side * 0.035 * squat,
+ y: hip.y + (ankle.y - hip.y) * (0.5 - 0.06 * squat),
+ }
+ return { knee, ankle }
+}
+
+export function buildPose(p: BodyParams): Point[] {
+ const pts: Point[] = new Array(KEYPOINT_COUNT)
+ // 下蹲:髋部下降,大腿越接近水平,正面投影越短
+ const hipY = GROUND - SHIN - THIGH * Math.cos(rad(p.squat * 80)) - p.bounce
+ const lHip = { x: CX + HIP_HALF, y: hipY }
+ const rHip = { x: CX - HIP_HALF, y: hipY }
+ // 下蹲时上身前倾,正面看躯干略微变短
+ const torso = TORSO * (1 - 0.14 * p.squat)
+ const shoulderY = hipY - torso
+ const lSh = { x: CX + SHOULDER_HALF, y: shoulderY }
+ const rSh = { x: CX - SHOULDER_HALF, y: shoulderY }
+ const noseY = shoulderY - 0.1
+
+ pts[0] = { x: CX, y: noseY }
+ pts[1] = { x: CX + 0.018, y: noseY - 0.018 }
+ pts[2] = { x: CX - 0.018, y: noseY - 0.018 }
+ pts[3] = { x: CX + 0.042, y: noseY - 0.008 }
+ pts[4] = { x: CX - 0.042, y: noseY - 0.008 }
+ pts[5] = lSh
+ pts[6] = rSh
+ pts[11] = lHip
+ pts[12] = rHip
+
+ const la = buildArm(lSh, 1, p.left.arm)
+ const ra = buildArm(rSh, -1, p.right.arm)
+ pts[7] = la.elbow
+ pts[9] = la.wrist
+ pts[17] = la.hand
+ pts[8] = ra.elbow
+ pts[10] = ra.wrist
+ pts[18] = ra.hand
+
+ const ll = buildLeg(lHip, 1, p.left.leg, p.squat)
+ const rl = buildLeg(rHip, -1, p.right.leg, p.squat)
+ pts[13] = ll.knee
+ pts[15] = ll.ankle
+ pts[14] = rl.knee
+ pts[16] = rl.ankle
+ pts[19] = { x: ll.ankle.x + 0.035, y: ll.ankle.y + 0.022 }
+ pts[21] = { x: ll.ankle.x - 0.008, y: ll.ankle.y + 0.026 }
+ pts[20] = { x: rl.ankle.x - 0.035, y: rl.ankle.y + 0.022 }
+ pts[22] = { x: rl.ankle.x + 0.008, y: rl.ankle.y + 0.026 }
+ return pts
+}
+
+const ease = (t: number) => 0.5 - 0.5 * Math.cos(Math.PI * t)
+const wrap = (p: number) => ((p % 1) + 1) % 1
+
+/** 平滑的 0→1→0 往返曲线,带顶部/底部停顿 */
+function pingPong(phase: number, holdTop = 0.1, holdBottom = 0.1): number {
+ const moving = (1 - holdTop - holdBottom) / 2
+ const p = wrap(phase)
+ if (p < moving) return ease(p / moving)
+ if (p < moving + holdTop) return 1
+ if (p < moving * 2 + holdTop) return 1 - ease((p - moving - holdTop) / moving)
+ return 0
+}
+
+export type Side = 'L' | 'R'
+
+/** 动作幅度:0 = 起始姿势,1 = 标准到位;side 用于左右交替的动作 */
+export type Amount = { amount: number; side: Side }
+
+export type MotionSpec = {
+ id: MoveId
+ /** 一个完整动作周期(秒),即示范节奏 */
+ cycleSeconds: number
+ /** 一个周期计几次(踏步、开合左右各算一次) */
+ repsPerCycle: number
+ /** 相位 → 动作幅度 */
+ amountAt: (phase: number) => Amount
+ /** 动作幅度 → 骨架(镜像模式直接用用户的实际幅度驱动) */
+ poseFor: (a: Amount) => Point[]
+ /** 相位 → 骨架 */
+ poseAt: (phase: number) => Point[]
+ /** 相位 → 当前阶段提示(示范字幕) */
+ phaseLabel: (phase: number) => string
+}
+
+type SpecInput = Omit
+
+const spec = (s: SpecInput): MotionSpec => ({ ...s, poseAt: (phase) => s.poseFor(s.amountAt(phase)) })
+
+/** 左右交替动作:前半周期左侧,后半周期右侧 */
+function alternating(phase: number, shape: (half: number) => number): Amount {
+ const p = wrap(phase)
+ const side: Side = p < 0.5 ? 'L' : 'R'
+ const half = p < 0.5 ? p / 0.5 : (p - 0.5) / 0.5
+ return { amount: shape(half), side }
+}
+
+export const MOTIONS: Record = {
+ squat: spec({
+ id: 'squat',
+ cycleSeconds: 3.2,
+ repsPerCycle: 1,
+ amountAt: (phase) => ({ amount: pingPong(phase, 0.12, 0.16), side: 'L' }),
+ poseFor({ amount: d }) {
+ const arm = { abd: 8 + 4 * d, fwd: d }
+ return buildPose({
+ squat: d * 0.95,
+ bounce: 0,
+ left: { arm, leg: { lift: 0, step: 0.045 } },
+ right: { arm, leg: { lift: 0, step: 0.045 } },
+ })
+ },
+ phaseLabel(phase) {
+ const p = wrap(phase)
+ if (p < 0.36) return '吸气 · 屁股向后坐'
+ if (p < 0.48) return '停一下 · 膝盖对准脚尖'
+ if (p < 0.84) return '呼气 · 脚跟发力站起'
+ return '站直 · 准备下一次'
+ },
+ }),
+ march: spec({
+ id: 'march',
+ cycleSeconds: 1.6,
+ repsPerCycle: 2,
+ amountAt: (phase) => alternating(phase, (h) => Math.sin(Math.PI * h)),
+ poseFor({ amount: a, side }) {
+ // 抬起一侧膝盖,对侧手臂前摆
+ const l = side === 'L' ? a : 0
+ const r = side === 'R' ? a : 0
+ return buildPose({
+ squat: 0,
+ bounce: 0.012 * a,
+ left: { arm: { abd: 10, fwd: 0.75 * r }, leg: { lift: 0.85 * l, step: 0 } },
+ right: { arm: { abd: 10, fwd: 0.75 * l }, leg: { lift: 0.85 * r, step: 0 } },
+ })
+ },
+ phaseLabel(phase) {
+ return wrap(phase) < 0.5 ? '抬左膝 · 右手前摆' : '抬右膝 · 左手前摆'
+ },
+ }),
+ jack: spec({
+ id: 'jack',
+ cycleSeconds: 2.4,
+ repsPerCycle: 2,
+ amountAt: (phase) => alternating(phase, (h) => pingPong(h, 0.14, 0.14)),
+ poseFor({ amount: o, side }) {
+ // 低冲击版:不跳,左右交替向侧面迈步,同时双臂上举
+ const arm = { abd: 12 + 158 * o, fwd: 0 }
+ return buildPose({
+ squat: 0.06 * o,
+ bounce: 0,
+ left: { arm, leg: { lift: 0, step: side === 'L' ? 0.11 * o : 0 } },
+ right: { arm, leg: { lift: 0, step: side === 'R' ? 0.11 * o : 0 } },
+ })
+ },
+ phaseLabel(phase) {
+ return wrap(phase) < 0.5 ? '左脚向外迈 · 双手举过头' : '右脚向外迈 · 双手举过头'
+ },
+ }),
+ raise: spec({
+ id: 'raise',
+ cycleSeconds: 3,
+ repsPerCycle: 1,
+ amountAt: (phase) => ({ amount: pingPong(phase, 0.14, 0.14), side: 'L' }),
+ poseFor({ amount: o }) {
+ const arm = { abd: 10 + 78 * o, fwd: 0 }
+ return buildPose({
+ squat: 0,
+ bounce: 0,
+ left: { arm, leg: { lift: 0, step: 0.035 } },
+ right: { arm, leg: { lift: 0, step: 0.035 } },
+ })
+ },
+ phaseLabel(phase) {
+ const p = wrap(phase)
+ if (p < 0.36) return '呼气 · 手臂向两侧抬起'
+ if (p < 0.5) return '停一下 · 与肩同高'
+ if (p < 0.86) return '吸气 · 慢慢放下'
+ return '放松 · 肩膀下沉'
+ },
+ }),
+}
+
+/**
+ * 常见错误动作(示范视频“错误 vs 正确”对比用,也用于单测验证纠错提示)
+ */
+export const MISTAKE_POSES: Record Point[]> = {
+ // 膝盖内扣:下蹲时膝盖向身体中线靠拢
+ squat(phase) {
+ const d = pingPong(phase, 0.12, 0.16)
+ const pts = MOTIONS.squat.poseAt(phase)
+ const pull = 0.075 * d
+ pts[13] = { x: pts[13].x - pull, y: pts[13].y }
+ pts[14] = { x: pts[14].x + pull, y: pts[14].y }
+ return pts
+ },
+ // 膝盖抬得太低
+ march(phase) {
+ const p = wrap(phase)
+ const l = p < 0.5 ? Math.sin(Math.PI * (p / 0.5)) : 0
+ const r = p >= 0.5 ? Math.sin(Math.PI * ((p - 0.5) / 0.5)) : 0
+ return buildPose({
+ squat: 0,
+ bounce: 0.006 * Math.max(l, r),
+ left: { arm: { abd: 8, fwd: 0.2 * r }, leg: { lift: 0.32 * l, step: 0 } },
+ right: { arm: { abd: 8, fwd: 0.2 * l }, leg: { lift: 0.32 * r, step: 0 } },
+ })
+ },
+ // 手臂只抬到胸口
+ jack(phase) {
+ const p = wrap(phase)
+ const half = p < 0.5 ? p / 0.5 : (p - 0.5) / 0.5
+ const o = pingPong(half, 0.14, 0.14)
+ const arm = { abd: 12 + 70 * o, fwd: 0 }
+ const leftOut = p < 0.5
+ return buildPose({
+ squat: 0,
+ bounce: 0,
+ left: { arm, leg: { lift: 0, step: leftOut ? 0.05 * o : 0 } },
+ right: { arm, leg: { lift: 0, step: leftOut ? 0 : 0.05 * o } },
+ })
+ },
+ // 耸肩且手臂抬得过高
+ raise(phase) {
+ const o = pingPong(phase, 0.14, 0.14)
+ const arm = { abd: 10 + 125 * o, fwd: 0 }
+ const pts = buildPose({
+ squat: 0,
+ bounce: 0,
+ left: { arm, leg: { lift: 0, step: 0.035 } },
+ right: { arm, leg: { lift: 0, step: 0.035 } },
+ })
+ const shrug = 0.03 * o
+ for (const i of [5, 6, 7, 8, 9, 10, 17, 18]) pts[i] = { x: pts[i].x, y: pts[i].y - shrug }
+ return pts
+ },
+}
+
+/**
+ * 示范动作“完成一次”的检测:幅度到过顶点、再回落到起始附近,算完成一次。
+ * 领练模式按教练动画计数,报数和画面同步(按时钟计数会比教练做完晚半拍)。
+ */
+export function createRepEdge(peak = 0.9, exit = 0.25) {
+ let peaked = false
+ return (amount: number): boolean => {
+ if (amount >= peak) {
+ peaked = true
+ } else if (peaked && amount <= exit) {
+ peaked = false
+ return true
+ }
+ return false
+ }
+}
diff --git a/TUICallKit-Vue3/training/pose/remoteLog.ts b/TUICallKit-Vue3/training/pose/remoteLog.ts
new file mode 100644
index 000000000..d9b23e6cb
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/remoteLog.ts
@@ -0,0 +1,51 @@
+/**
+ * 开发版真机排查(默认全部关闭,编译时用环境变量打开,发行版始终不生效):
+ * - VITE_POSE_DIAG=1:跟练页显示识别诊断面板,console 每 2 秒输出识别摘要
+ * - VITE_POSE_LOG_URL=http://电脑局域网IP:端口/log:把识别数据批量发到电脑上的日志服务,边练边看。
+ * 地址不写进代码;需要项目关闭合法域名校验(manifest 里 urlCheck: false)
+ */
+const LOG_URL: string = ((import.meta as any).env?.VITE_POSE_LOG_URL as string | undefined) || ''
+const FLUSH_MS = 1000
+/** 断网时最多攒这么多条,超出丢最旧的 */
+const MAX_QUEUE = 600
+
+const IS_DEV = process.env.NODE_ENV === 'development'
+
+export const remoteLogEnabled = Boolean(LOG_URL) && IS_DEV
+/** 识别诊断面板和 console 摘要 */
+export const poseDiagEnabled = IS_DEV && Boolean((import.meta as any).env?.VITE_POSE_DIAG)
+
+let queue: Record[] = []
+let timer: ReturnType | null = null
+let session = ''
+let failWarned = false
+
+/** 开始一次新的跟练:之后的日志带上同一个会话编号 */
+export function rlogSession() {
+ session = String(Date.now())
+}
+
+export function rlog(type: string, data: Record = {}) {
+ if (!remoteLogEnabled) return
+ queue.push({ t: Date.now(), type, ...data })
+ if (queue.length > MAX_QUEUE) queue = queue.slice(-MAX_QUEUE)
+ if (!timer) timer = setTimeout(flush, FLUSH_MS)
+}
+
+function flush() {
+ timer = null
+ if (!queue.length) return
+ const entries = queue
+ queue = []
+ uni.request({
+ url: LOG_URL,
+ method: 'POST',
+ data: { session, entries },
+ timeout: 3000,
+ fail: (e) => {
+ if (failWarned) return
+ failWarned = true
+ console.warn('[跟练日志] 发送失败,检查手机和电脑是否在同一网络、日志服务是否启动', LOG_URL, e)
+ },
+ })
+}
diff --git a/TUICallKit-Vue3/training/pose/session.ts b/TUICallKit-Vue3/training/pose/session.ts
new file mode 100644
index 000000000..5355988be
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/session.ts
@@ -0,0 +1,232 @@
+/**
+ * 一次跟练的状态机(纯逻辑,可单测)
+ *
+ * framing ──站好并保持 1.5s──▶ countdown ──3s──▶ training ──达到目标──▶ done
+ * │ ▲
+ * 离开画面 >1.5s ▼ │ 回到画面
+ * lost
+ * 任意训练阶段可 pause / resume,finish 提前结束。
+ */
+import { checkFraming, type FramingIssue, type Pose } from './keypoints.ts'
+import { createCounter, type CoachEvent, type Grade, type RepCounter } from './counters.ts'
+import type { Amount, MoveId } from './motions.ts'
+
+export type SessionPhase = 'framing' | 'countdown' | 'training' | 'lost' | 'paused' | 'done'
+
+export type SessionEvent =
+ | { type: 'phase'; phase: SessionPhase }
+ | { type: 'countdown'; n: number }
+ | { type: 'combo'; combo: number }
+ | CoachEvent
+
+export type RepRecord = { score: number; grade: Grade; tip?: string }
+
+export const FRAMING_HOLD_MS = 1500
+export const COUNTDOWN_MS = 3000
+export const LOST_AFTER_MS = 1500
+/** 连击:连续得分不低于该值 */
+export const COMBO_SCORE = 80
+const COMBO_MILESTONES = [3, 5, 10, 15, 20, 30, 40, 50]
+
+export class TrainingSession {
+ readonly move: MoveId
+ readonly targetReps: number
+ readonly counter: RepCounter
+
+ phase: SessionPhase = 'framing'
+ framingIssue: FramingIssue = 'no_body'
+ /** 站位保持进度 0~1 */
+ holdProgress = 0
+ /** 倒计时剩余整数秒 */
+ countdown = 0
+ combo = 0
+ bestCombo = 0
+ reps: RepRecord[] = []
+ /** 有效训练时长(不含站位、倒计时、离开画面与暂停) */
+ activeMs = 0
+
+ /** 领练模式(无识别)按节奏累计的次数 */
+ private guidedReps = 0
+ private readonly detectLost: boolean
+ private okSince = 0
+ private countdownStart = 0
+ private lastSeen = 0
+ private lastTick = 0
+ private beforePause: SessionPhase = 'training'
+
+ constructor(move: MoveId, targetReps: number, opts: { detectLost?: boolean } = {}) {
+ this.move = move
+ this.targetReps = targetReps
+ this.counter = createCounter(move)
+ this.detectLost = opts.detectLost ?? true
+ }
+
+ get count() {
+ return this.counter.count + this.guidedReps
+ }
+
+ get live(): Amount {
+ return this.counter.live
+ }
+
+ get progress() {
+ return Math.min(1, this.count / this.targetReps)
+ }
+
+ /** 每收到一帧检测结果调用(pose 为 null 表示画面里没人) */
+ feed(pose: Pose | null, now: number): SessionEvent[] {
+ const events = this.tick(now)
+ const issue = checkFraming(pose)
+ this.framingIssue = issue
+ if (issue !== 'no_body') this.lastSeen = now
+
+ switch (this.phase) {
+ case 'framing':
+ if (issue === 'none') {
+ if (!this.okSince) this.okSince = now
+ this.holdProgress = Math.min(1, (now - this.okSince) / FRAMING_HOLD_MS)
+ if (now - this.okSince >= FRAMING_HOLD_MS) {
+ this.countdownStart = now
+ this.countdown = 3
+ events.push(...this.setPhase('countdown'), { type: 'countdown', n: 3 })
+ }
+ } else {
+ this.okSince = 0
+ this.holdProgress = 0
+ }
+ break
+ case 'training':
+ if (pose && issue !== 'no_body') {
+ for (const e of this.counter.update(pose)) events.push(...this.onCoach(e))
+ }
+ break
+ case 'lost':
+ if (issue === 'none' || issue === 'partial') events.push(...this.setPhase('training'))
+ break
+ }
+ return events
+ }
+
+ /** 驱动计时与倒计时;没有新帧时也应定时调用 */
+ tick(now: number): SessionEvent[] {
+ const events: SessionEvent[] = []
+ const dt = this.lastTick ? now - this.lastTick : 0
+ this.lastTick = now
+
+ if (this.phase === 'training') {
+ this.activeMs += dt
+ if (this.detectLost && this.lastSeen && now - this.lastSeen > LOST_AFTER_MS) events.push(...this.setPhase('lost'))
+ } else if (this.phase === 'countdown') {
+ const left = Math.ceil((COUNTDOWN_MS - (now - this.countdownStart)) / 1000)
+ if (left <= 0) {
+ this.lastSeen = now
+ events.push(...this.setPhase('training'))
+ } else if (left !== this.countdown) {
+ this.countdown = left
+ events.push({ type: 'countdown', n: left })
+ }
+ }
+ return events
+ }
+
+ /** 跳过站位直接倒计时(领练模式) */
+ startCountdown(now: number): SessionEvent[] {
+ if (this.phase !== 'framing') return []
+ this.countdownStart = now
+ this.countdown = 3
+ this.lastTick = now
+ return [...this.setPhase('countdown'), { type: 'countdown', n: 3 }]
+ }
+
+ /** 领练模式:按示范节奏计一次(不评分,不计入动作质量) */
+ addGuidedRep(): SessionEvent[] {
+ if (this.phase !== 'training') return []
+ this.guidedReps += 1
+ const out: SessionEvent[] = [{ type: 'rep', count: this.count, score: 0, grade: 'ok' }]
+ if (this.count >= this.targetReps) out.push(...this.setPhase('done'))
+ return out
+ }
+
+ pause(): SessionEvent[] {
+ if (this.phase === 'paused' || this.phase === 'done') return []
+ this.beforePause = this.phase === 'lost' ? 'training' : this.phase
+ return this.setPhase('paused')
+ }
+
+ resume(now: number): SessionEvent[] {
+ if (this.phase !== 'paused') return []
+ this.lastTick = now
+ this.lastSeen = now
+ // 倒计时中被暂停,恢复后重新站位
+ const next = this.beforePause === 'countdown' ? 'framing' : this.beforePause
+ this.okSince = 0
+ return this.setPhase(next)
+ }
+
+ finish(): SessionEvent[] {
+ return this.phase === 'done' ? [] : this.setPhase('done')
+ }
+
+ private setPhase(p: SessionPhase): SessionEvent[] {
+ if (this.phase === p) return []
+ this.phase = p
+ return [{ type: 'phase', phase: p }]
+ }
+
+ private onCoach(e: CoachEvent): SessionEvent[] {
+ if (e.type !== 'rep') return [e]
+ const out: SessionEvent[] = [e]
+ this.reps.push({ score: e.score, grade: e.grade, tip: e.tip })
+ if (e.score >= COMBO_SCORE && !e.joints) {
+ this.combo += 1
+ this.bestCombo = Math.max(this.bestCombo, this.combo)
+ if (COMBO_MILESTONES.includes(this.combo)) out.push({ type: 'combo', combo: this.combo })
+ } else {
+ this.combo = 0
+ }
+ if (this.count >= this.targetReps) out.push(...this.setPhase('done'))
+ return out
+ }
+}
+
+export type SessionSummary = {
+ move: MoveId
+ reps: number
+ targetReps: number
+ avgScore: number
+ bestCombo: number
+ durationSec: number
+ kcal: number
+ stars: 1 | 2 | 3
+ scores: number[]
+ /** 出现最多的纠正提示,作为下次训练建议;没有纠正时为鼓励语 */
+ advice: string
+ /** advice 是纠正建议(tip)还是鼓励(praise) */
+ adviceKind: 'tip' | 'praise'
+}
+
+/** 汇总结果;kcal = 净 MET × 体重 × 小时 */
+export function summarize(s: TrainingSession, netMet: number, weightKg = 60): SessionSummary {
+ const scores = s.reps.map((r) => r.score)
+ const avg = scores.length ? Math.round(scores.reduce((a, b) => a + b, 0) / scores.length) : 0
+ const durationSec = Math.round(s.activeMs / 1000)
+ const kcal = Math.round(netMet * weightKg * (durationSec / 3600) * 10) / 10
+ const tips = new Map()
+ for (const r of s.reps) if (r.tip) tips.set(r.tip, (tips.get(r.tip) ?? 0) + 1)
+ const top = [...tips.entries()].sort((a, b) => b[1] - a[1])[0]?.[0]
+ const done = s.count >= s.targetReps
+ const stars: 1 | 2 | 3 = done && avg >= 88 ? 3 : done && avg >= 75 ? 2 : 1
+ return {
+ move: s.move,
+ reps: s.count,
+ targetReps: s.targetReps,
+ avgScore: avg,
+ bestCombo: s.bestCombo,
+ durationSec,
+ kcal,
+ stars,
+ scores,
+ advice: top ?? (avg >= 90 ? '动作非常标准,继续保持!' : '保持节奏,每次都做到位'),
+ adviceKind: top ? 'tip' : 'praise',
+ }
+}
diff --git a/TUICallKit-Vue3/training/pose/useBgm.ts b/TUICallKit-Vue3/training/pose/useBgm.ts
new file mode 100644
index 000000000..0be55baa2
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/useBgm.ts
@@ -0,0 +1,64 @@
+/**
+ * 训练背景音乐(页面用)
+ *
+ * 播放控制在 bgm.ts;这里负责创建播放器、把开关记在本地。
+ * 音乐地址为空或加载失败时 available 为 false,页面隐藏开关,训练照常进行。
+ */
+import { onUnmounted, ref } from 'vue'
+import { createBgm, type BgmAudio, type BgmState } from './bgm'
+
+const STORAGE_KEY = 'pose_coach_bgm_enabled'
+/** 教练语音音量是 1,音乐压在它下面约 9dB,报数、口令都听得清 */
+const BGM_VOLUME = 0.35
+
+export function useBgm(url: string) {
+ const enabled = ref(readEnabled())
+ const available = ref(Boolean(url))
+ const player = createBgm({
+ url,
+ volume: BGM_VOLUME,
+ create: createAudio,
+ onUnavailable: (reason) => {
+ available.value = false
+ if (process.env.NODE_ENV === 'development') console.warn('[背景音乐] 加载失败,本次不播放:', reason, url)
+ },
+ })
+ player.setEnabled(enabled.value)
+
+ function toggle() {
+ enabled.value = !enabled.value
+ try {
+ uni.setStorageSync(STORAGE_KEY, enabled.value)
+ } catch (e) {}
+ player.setEnabled(enabled.value)
+ }
+
+ onUnmounted(() => player.destroy())
+
+ return {
+ enabled,
+ available,
+ toggle,
+ prepare: () => player.prepare(),
+ setState: (s: BgmState) => player.setState(s),
+ setDuck: (ratio: number) => player.setDuck(ratio),
+ hush: () => player.hush(),
+ }
+}
+
+function readEnabled() {
+ try {
+ const v = uni.getStorageSync(STORAGE_KEY)
+ return v === '' ? true : Boolean(v)
+ } catch (e) {
+ return true
+ }
+}
+
+/**
+ * 长音频用默认的系统播放器边下边播(教练语音用的 WebAudio 实现要把整段解码进内存)。
+ * 静音键:跟练页进入时统一设置了不跟随静音键(setInnerAudioOption),这里不用单独设。
+ */
+function createAudio(): BgmAudio {
+ return uni.createInnerAudioContext() as unknown as BgmAudio
+}
diff --git a/TUICallKit-Vue3/training/pose/useCoachVoice.ts b/TUICallKit-Vue3/training/pose/useCoachVoice.ts
new file mode 100644
index 000000000..95096a3bc
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/useCoachVoice.ts
@@ -0,0 +1,223 @@
+/**
+ * 教练语音播报
+ *
+ * 报数要和动作同步,关键是“即时出声”:
+ * - 语音由 WechatSI 同声传译插件合成(需要联网),进入页面就把报数、口令、纠错预合成好;
+ * - 每句合成后立刻建好一个 WebAudio 驱动的播放器(useWebAudioImplement,短音频延迟低),
+ * 播报时从头播放,不再临时创建播放器、下载音频;
+ * - 报数没准备好就跳过这一次,不在几百毫秒后“补报”,免得越报越落后。
+ * 优先级:high(纠错、倒计时)> count(报数)> low(鼓励)。
+ * high 打断一切;count 打断 count / low,不打断 high;low 只在空闲时播。
+ * 其它端:H5 用 speechSynthesis,都不支持时静默。
+ * speaking 是正在播的语句的优先级(没在说话时为 null),背景音乐据此压低音量。
+ */
+import { ref, onUnmounted } from 'vue'
+
+export type Priority = 'low' | 'count' | 'high'
+
+const STORAGE_KEY = 'pose_coach_voice_enabled'
+/** 没预合成的 high 语句:合成耗时超过这个值就不播了,避免提示和动作对不上 */
+const HIGH_STALE_MS = 1500
+const RANK: Record = { low: 0, count: 1, high: 2 }
+/** 单句都很短:超过这个时间还没收到播完回调(个别机型不触发),视为已播完 */
+const MAX_UTTERANCE_MS = 4000
+
+type Player = UniApp.InnerAudioContext
+
+export function useCoachVoice() {
+ const enabled = ref(readEnabled())
+ const players = new Map()
+ const inflight = new Map>()
+ let current: { player: Player; priority: Priority; at: number } | null = null
+ const speaking = ref(null)
+ let utterance = 0
+ let speakingTimer: ReturnType | null = null
+
+ function readEnabled() {
+ try {
+ const v = uni.getStorageSync(STORAGE_KEY)
+ return v === '' ? true : Boolean(v)
+ } catch (e) {
+ return true
+ }
+ }
+
+ function toggle() {
+ enabled.value = !enabled.value
+ try {
+ uni.setStorageSync(STORAGE_KEY, enabled.value)
+ } catch (e) {}
+ if (!enabled.value) stop()
+ }
+
+ /** 标记开始 / 结束说话,返回这句话的编号;个别机型不触发播完回调,最长按 MAX_UTTERANCE_MS 算 */
+ function markSpeaking(priority: Priority | null) {
+ utterance += 1
+ const id = utterance
+ speaking.value = priority
+ if (speakingTimer) clearTimeout(speakingTimer)
+ speakingTimer = priority ? setTimeout(() => endSpeaking(id), MAX_UTTERANCE_MS) : null
+ return id
+ }
+
+ function endSpeaking(id: number) {
+ if (id === utterance) markSpeaking(null)
+ }
+
+ /** 合成一句语音,返回音频地址 */
+ function synth(text: string): Promise {
+ return new Promise((resolve) => {
+ // #ifdef MP-WEIXIN
+ try {
+ // eslint-disable-next-line no-undef
+ const plugin = requirePlugin('WechatSI')
+ plugin.textToSpeech({
+ lang: 'zh_CN',
+ tts: true,
+ content: text,
+ success: (res: { filename?: string }) => resolve(res?.filename || null),
+ fail: () => resolve(null),
+ })
+ } catch (e) {
+ resolve(null)
+ }
+ // #endif
+ // #ifndef MP-WEIXIN
+ resolve(null)
+ // #endif
+ })
+ }
+
+ function createPlayer(src: string): Player {
+ let p: Player
+ // #ifdef MP-WEIXIN
+ p = (wx as any).createInnerAudioContext({ useWebAudioImplement: true })
+ // #endif
+ // #ifndef MP-WEIXIN
+ p = uni.createInnerAudioContext()
+ // #endif
+ p.src = src
+ ;(p as any).obeyMuteSwitch = false
+ p.onEnded(() => {
+ if (current?.player !== p) return
+ current = null
+ markSpeaking(null)
+ })
+ return p
+ }
+
+ /** 合成并建好播放器(同一句只做一次) */
+ function prepare(text: string): Promise {
+ const ready = players.get(text)
+ if (ready) return Promise.resolve(ready)
+ const running = inflight.get(text)
+ if (running) return running
+ const p = synth(text)
+ .then((src) => {
+ if (!src) return null
+ const player = createPlayer(src)
+ player.onError(() => {
+ // 音频地址过期或加载失败:丢掉,下次重新合成
+ if (players.get(text) === player) players.delete(text)
+ if (current?.player === player) {
+ current = null
+ markSpeaking(null)
+ }
+ })
+ players.set(text, player)
+ return player
+ })
+ .finally(() => inflight.delete(text))
+ inflight.set(text, p)
+ return p
+ }
+
+ /** 预合成(并发 2),不阻塞页面 */
+ async function preload(texts: string[]) {
+ const queue = [...new Set(texts)].filter((t) => t && !players.has(t))
+ const worker = async () => {
+ while (queue.length) {
+ const t = queue.shift()
+ if (t) await prepare(t)
+ }
+ }
+ await Promise.all([worker(), worker()])
+ }
+
+ function canPlay(priority: Priority) {
+ if (current && Date.now() - current.at > MAX_UTTERANCE_MS) current = null
+ if (!current) return true
+ if (priority === 'low') return false
+ return RANK[priority] >= RANK[current.priority]
+ }
+
+ function playNow(player: Player, priority: Priority) {
+ if (current && current.player !== player) {
+ try {
+ current.player.stop()
+ } catch (e) {}
+ }
+ try {
+ player.seek(0)
+ } catch (e) {}
+ player.play()
+ current = { player, priority, at: Date.now() }
+ markSpeaking(priority)
+ }
+
+ async function speak(text: string, priority: Priority = 'low') {
+ if (!enabled.value || !text || !canPlay(priority)) return
+ // #ifdef H5
+ speakWeb(text, priority)
+ return
+ // #endif
+ const ready = players.get(text)
+ if (ready) return playNow(ready, priority)
+ if (priority !== 'high') {
+ // 报数、鼓励没准备好:这次跳过,合成好留给下次
+ void prepare(text)
+ return
+ }
+ const t0 = Date.now()
+ const player = await prepare(text)
+ if (player && enabled.value && Date.now() - t0 <= HIGH_STALE_MS && canPlay(priority)) playNow(player, priority)
+ }
+
+ /** H5:浏览器自带语音合成 */
+ function speakWeb(text: string, priority: Priority) {
+ try {
+ const synthApi = (window as any).speechSynthesis
+ if (!synthApi) return
+ if (priority !== 'low') synthApi.cancel()
+ const u = new (window as any).SpeechSynthesisUtterance(text)
+ u.lang = 'zh-CN'
+ u.rate = 1.1
+ const id = markSpeaking(priority)
+ u.onend = () => endSpeaking(id)
+ synthApi.speak(u)
+ } catch (e) {}
+ }
+
+ function stop() {
+ if (current) {
+ try {
+ current.player.stop()
+ } catch (e) {}
+ current = null
+ }
+ markSpeaking(null)
+ }
+
+ onUnmounted(() => {
+ stop()
+ if (speakingTimer) clearTimeout(speakingTimer)
+ for (const p of players.values()) {
+ try {
+ p.destroy()
+ } catch (e) {}
+ }
+ players.clear()
+ })
+
+ return { enabled, toggle, speak, preload, stop, speaking }
+}
diff --git a/TUICallKit-Vue3/training/pose/usePoseCamera.ts b/TUICallKit-Vue3/training/pose/usePoseCamera.ts
new file mode 100644
index 000000000..f9e17c85c
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/usePoseCamera.ts
@@ -0,0 +1,322 @@
+/**
+ * 摄像头取帧 + VisionKit 人体关键点检测
+ *
+ * 方案: 负责预览(原生、流畅),CameraContext.onCameraFrame 拿 RGBA 帧,
+ * 节流后交给 VKSession.detectBody(mode 2,手动传图),结果通过 updateAnchors 回调。
+ * 这样不需要自己用 WebGL 渲染相机画面; 放在哪个组件里都可以(一个页面只有一个摄像头)。
+ *
+ * 要求:微信基础库 >= 2.28.0;非微信端或不支持的机型会返回 unsupported。
+ */
+import { ref, shallowRef, onUnmounted } from 'vue'
+import { anchorToPose, smoothPose, type Pose } from './keypoints.ts'
+import { poseDiagEnabled, rlog } from './remoteLog.ts'
+
+export type CameraStatus = 'idle' | 'starting' | 'running' | 'unsupported' | 'denied' | 'error'
+
+/** 检测间隔:约 10fps,兼顾流畅与发热 */
+const DETECT_INTERVAL_MS = 90
+/** 检测请求超时:没有回调视为画面里没人 */
+const DETECT_TIMEOUT_MS = 600
+/** 连续多久没检测到人,清空姿态 */
+const LOST_AFTER_MS = 800
+
+/** 诊断面板刷新间隔;console 摘要间隔 */
+const DIAG_REFRESH_MS = 500
+const DIAG_LOG_MS = 2000
+
+type FrameInfo = { width: number; height: number }
+type AnchorSource = 'add' | 'update' | 'remove' | 'timeout'
+
+/** 真机排查用:识别引擎的事件计数和最近一次识别到人的原始数据摘要(开发版跟练页显示) */
+export type PoseDiag = {
+ events: Record
+ /** detectBody 发出到收到结果的耗时 */
+ latencyMs: number
+ /** 最近一次识别到人的原始数据摘要 */
+ raw: string
+}
+
+
+export function usePoseCamera(onPose?: (pose: Pose | null) => void) {
+ const status = ref('idle')
+ const errorText = ref('')
+ const pose = shallowRef(null)
+ const frame = ref({ width: 480, height: 640 })
+ /** 实际检测帧率,调试用 */
+ const fps = ref(0)
+ const diag = shallowRef(emptyDiag())
+ const events = { ...emptyDiag().events }
+ let latencyMs = 0
+ let lastRaw = ''
+ let firstAnchorLogged = false
+ let lastDiagAt = 0
+ let lastLogAt = 0
+
+ let session: any = null
+ let listener: any = null
+ let pending = false
+ let pendingTimer: ReturnType | null = null
+ let lastSent = 0
+ let lastSeen = 0
+ let sentFrame: FrameInfo = { width: 0, height: 0 }
+ let fpsCount = 0
+ let fpsTimer: ReturnType | null = null
+
+ function emit(next: Pose | null) {
+ pose.value = next
+ onPose?.(next)
+ }
+
+ function clearPending() {
+ pending = false
+ if (pendingTimer) {
+ clearTimeout(pendingTimer)
+ pendingTimer = null
+ }
+ }
+
+ function handleAnchors(anchors: any[], source: AnchorSource) {
+ // 已经停止(训练结束、切到领练)后迟到的识别结果直接丢弃
+ if (!session) return
+ const now = Date.now()
+ if (pending && (source === 'add' || source === 'update')) latencyMs = now - lastSent
+ events[source] += 1
+ clearPending()
+ fpsCount += 1
+ // 画面里多人时取检测框最大的那个
+ const best = (anchors || []).slice().sort((a, b) => area(b) - area(a))[0]
+ rlog('det', {
+ src: source,
+ lat: source === 'add' || source === 'update' ? latencyMs : undefined,
+ n: anchors?.length ?? 0,
+ // 原始坐标不是有效数字的点(画面外的点真机返回 NaN)
+ nan: best ? nanPoints(best) : undefined,
+ })
+ if (best) recordRaw(best)
+ const next = best ? anchorToPose(best, sentFrame.width, sentFrame.height, now) : null
+ if (next) {
+ lastSeen = now
+ emit(smoothPose(pose.value, next))
+ } else if (now - lastSeen > LOST_AFTER_MS) {
+ emit(null)
+ }
+ refreshDiag(now)
+ }
+
+ /** 记下原始 anchor 的摘要;第一次识别到人时把完整原始数据打到 console,便于核对字段格式 */
+ function recordRaw(anchor: any) {
+ if (poseDiagEnabled && !firstAnchorLogged) {
+ firstAnchorLogged = true
+ // anchor 是原生对象,字段不可枚举,直接 JSON.stringify 得到 {};逐个取出再序列化,NaN 显式写出来
+ const json = JSON.stringify(plainAnchor(anchor))
+ console.log('[跟练诊断] 首个原始 anchor', `帧 ${sentFrame.width}x${sentFrame.height}`, json.slice(0, 1500))
+ rlog('first_anchor', { frame: `${sentFrame.width}x${sentFrame.height}`, anchor: json.slice(0, 4000) })
+ }
+ lastRaw = summarizeAnchor(anchor)
+ }
+
+ function refreshDiag(now: number) {
+ if (now - lastDiagAt < DIAG_REFRESH_MS) return
+ lastDiagAt = now
+ diag.value = { events: { ...events }, latencyMs, raw: lastRaw }
+ if (poseDiagEnabled && now - lastLogAt >= DIAG_LOG_MS) {
+ lastLogAt = now
+ const e = events
+ console.log(
+ `[跟练诊断] 帧 ${frame.value.width}x${frame.value.height} 延迟 ${latencyMs}ms 事件 add${e.add} upd${e.update} rm${e.remove} 超时${e.timeout} 错${e.error} | ${lastRaw || '尚未识别到人'}`,
+ )
+ }
+ }
+
+ function area(a: any) {
+ const s = a?.size
+ if (!s) return 0
+ return Array.isArray(s) ? s[0] * s[1] : (s.width || 0) * (s.height || 0)
+ }
+
+ /** 相机组件 initdone 后调用 */
+ function start() {
+ if (status.value === 'running' || status.value === 'starting') return
+ status.value = 'starting'
+ Object.assign(events, emptyDiag().events)
+ latencyMs = 0
+ lastRaw = ''
+ firstAnchorLogged = false
+ diag.value = emptyDiag()
+ rlog('camera_start', deviceInfo())
+ // #ifdef MP-WEIXIN
+ startVisionKit()
+ // #endif
+ // #ifndef MP-WEIXIN
+ status.value = 'unsupported'
+ // #endif
+ }
+
+ function startVisionKit() {
+ try {
+ const w: any = wx
+ if (typeof w.createVKSession !== 'function' || (w.isVKSupport && !w.isVKSupport('v1'))) {
+ status.value = 'unsupported'
+ rlog('vk_unsupported', { hasCreate: typeof w.createVKSession === 'function' })
+ return
+ }
+ session = w.createVKSession({ track: { body: { mode: 2 } }, version: 'v1' })
+ // 连续帧(sourceType 0)会跟踪人体:首次识别到人、丢失后重新出现走 addAnchors,之后每帧走 updateAnchors(同官方示例)
+ session.on('addAnchors', (anchors: any[]) => handleAnchors(anchors, 'add'))
+ session.on('updateAnchors', (anchors: any[]) => handleAnchors(anchors, 'update'))
+ session.on('removeAnchors', () => handleAnchors([], 'remove'))
+ session.start((err: any) => {
+ if (err) {
+ status.value = 'unsupported'
+ errorText.value = String(err?.errMsg || err)
+ rlog('vk_start_error', { err: errorText.value })
+ return
+ }
+ rlog('vk_started')
+ startFrames()
+ })
+ } catch (e: any) {
+ status.value = 'unsupported'
+ errorText.value = String(e?.message || e)
+ rlog('vk_exception', { err: errorText.value })
+ }
+ }
+
+ function startFrames() {
+ const cam: any = uni.createCameraContext()
+ if (!cam?.onCameraFrame) {
+ status.value = 'unsupported'
+ rlog('no_camera_frame_api')
+ return
+ }
+ listener = cam.onCameraFrame((f: { data: ArrayBuffer; width: number; height: number }) => {
+ const now = Date.now()
+ if (pending || now - lastSent < DETECT_INTERVAL_MS || !session) return
+ if (frame.value.width !== f.width || frame.value.height !== f.height) {
+ frame.value = { width: f.width, height: f.height }
+ rlog('frame_size', { w: f.width, h: f.height, bytes: f.data?.byteLength })
+ }
+ pending = true
+ lastSent = now
+ sentFrame = { width: f.width, height: f.height }
+ pendingTimer = setTimeout(() => handleAnchors([], 'timeout'), DETECT_TIMEOUT_MS)
+ try {
+ session.detectBody({
+ frameBuffer: f.data,
+ width: f.width,
+ height: f.height,
+ scoreThreshold: 0.5,
+ // 0 表示输入来自视频连续帧,算法会做帧间跟踪
+ sourceType: 0,
+ })
+ } catch (e) {
+ events.error += 1
+ if (poseDiagEnabled) console.warn('[跟练诊断] detectBody 异常', e)
+ rlog('detect_err', { err: String((e as any)?.message || e) })
+ clearPending()
+ }
+ })
+ listener.start({
+ success: () => {
+ status.value = 'running'
+ rlog('frames_started')
+ fpsTimer = setInterval(() => {
+ fps.value = fpsCount
+ fpsCount = 0
+ }, 1000)
+ },
+ fail: (e: any) => {
+ status.value = 'error'
+ errorText.value = String(e?.errMsg || e)
+ rlog('frames_fail', { err: errorText.value })
+ },
+ })
+ }
+
+ function stop() {
+ clearPending()
+ try {
+ listener?.stop?.()
+ } catch (e) {}
+ listener = null
+ const oldSession = session
+ session = null
+ rlog('camera_stop')
+ // 停止可能发生在识别引擎自己的回调里(第 N 次计数 → 结束 → 关摄像头):在回调里同步销毁引擎,iOS 真机会卡死。
+ // 先断开引用(之后迟到的回调全部丢弃),等当前回调返回后再销毁
+ setTimeout(() => {
+ try {
+ oldSession?.stop?.()
+ oldSession?.destroy?.()
+ } catch (e) {}
+ }, 0)
+ if (fpsTimer) clearInterval(fpsTimer)
+ fpsTimer = null
+ if (status.value === 'running' || status.value === 'starting') status.value = 'idle'
+ pose.value = null
+ }
+
+ /** :通常是用户拒绝了摄像头权限 */
+ function onCameraError(e: any) {
+ status.value = 'denied'
+ errorText.value = String(e?.detail?.errMsg || '')
+ }
+
+ onUnmounted(stop)
+
+ return { status, errorText, pose, frame, fps, diag, start, stop, onCameraError }
+}
+
+const num = (v: unknown) => (typeof v === 'number' ? (Number.isFinite(v) ? +v.toFixed(4) : String(v)) : v)
+const rawXY = (p: any) => (Array.isArray(p) ? [p[0], p[1]] : [p?.x, p?.y])
+
+/** 原始坐标不是有效数字的点的序号,如 "13,14,15,16" */
+function nanPoints(anchor: any): string {
+ const pts: any[] = Array.isArray(anchor?.points) ? anchor.points : []
+ return pts
+ .map((p, i) => (rawXY(p).every((v) => typeof v === 'number' && Number.isFinite(v)) ? -1 : i))
+ .filter((i) => i >= 0)
+ .join(',')
+}
+
+function plainAnchor(a: any) {
+ return {
+ keys: Object.keys(a ?? {}),
+ score: num(a?.score),
+ origin: a?.origin ? [num(a.origin.x), num(a.origin.y)] : a?.origin,
+ size: a?.size ? [num(a.size.width), num(a.size.height)] : a?.size,
+ points: Array.isArray(a?.points) ? a.points.map((p: any) => rawXY(p).map(num)) : typeof a?.points,
+ confidence: Array.isArray(a?.confidence) ? a.confidence.map(num) : typeof a?.confidence,
+ }
+}
+
+/** 机型与微信版本,排查机型差异用 */
+function deviceInfo() {
+ try {
+ const s: any = uni.getSystemInfoSync()
+ return { brand: s.brand, model: s.model, system: s.system, platform: s.platform, wx: s.version, sdk: s.SDKVersion }
+ } catch (e) {
+ return {}
+ }
+}
+
+function emptyDiag(): PoseDiag {
+ return { events: { add: 0, update: 0, remove: 0, timeout: 0, error: 0 }, latencyMs: 0, raw: '' }
+}
+
+const f2 = (v: unknown) => (typeof v === 'number' ? v.toFixed(2) : String(v))
+
+/** 原始 anchor 摘要:点数、坐标是比例还是像素、置信度范围,以及鼻子 / 髋 / 踝的原始坐标 */
+function summarizeAnchor(a: any): string {
+ const pts: any[] = Array.isArray(a?.points) ? a.points : []
+ const xy = (i: number) => {
+ const p = pts[i]
+ if (!p) return '-'
+ return Array.isArray(p) ? `${f2(p[0])},${f2(p[1])}` : `${f2(p.x)},${f2(p.y)}`
+ }
+ const flat = pts.flatMap((p) => (Array.isArray(p) ? p : [p?.x, p?.y])).filter((v) => typeof v === 'number')
+ const unit = flat.some((v) => v > 1.5) ? '像素' : '比例'
+ const conf: number[] = Array.isArray(a?.confidence) ? a.confidence : []
+ const confText = conf.length ? `${f2(Math.min(...conf))}~${f2(Math.max(...conf))}` : '无'
+ return `${pts.length}点 ${unit} 框分${f2(a?.score)} 点置信${confText} 鼻${xy(0)} 左髋${xy(11)} 右髋${xy(12)} 左踝${xy(15)} 右踝${xy(16)}`
+}
diff --git a/TUICallKit-Vue3/training/pose/viewport.ts b/TUICallKit-Vue3/training/pose/viewport.ts
new file mode 100644
index 000000000..58fe08353
--- /dev/null
+++ b/TUICallKit-Vue3/training/pose/viewport.ts
@@ -0,0 +1,26 @@
+/**
+ * 摄像头帧坐标 → 屏幕坐标
+ *
+ * 识别出的关键点是相对摄像头帧归一化的 [0,1] 坐标; 预览按 aspectFill 铺满显示区域(裁掉多出的部分),
+ * 前置摄像头的预览是镜像的。纠正动作时在画面上标出关节,需要用它换算位置。
+ */
+import type { Point } from './keypoints.ts'
+
+export type Viewport = {
+ /** 显示区域尺寸(px) */
+ width: number
+ height: number
+ /** 摄像头帧尺寸 */
+ frameWidth: number
+ frameHeight: number
+ /** 预览是否镜像 */
+ mirror: boolean
+}
+
+export function toScreen(p: Point, vp: Viewport): Point {
+ const scale = Math.max(vp.width / vp.frameWidth, vp.height / vp.frameHeight)
+ const ox = (vp.width - vp.frameWidth * scale) / 2
+ const oy = (vp.height - vp.frameHeight * scale) / 2
+ const x = vp.mirror ? 1 - p.x : p.x
+ return { x: ox + x * vp.frameWidth * scale, y: oy + p.y * vp.frameHeight * scale }
+}
diff --git a/TUICallKit-Vue3/training/static/coach/cheer.png b/TUICallKit-Vue3/training/static/coach/cheer.png
new file mode 100644
index 000000000..2cf74761d
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/cheer.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jl_00.png b/TUICallKit-Vue3/training/static/coach/jl_00.png
new file mode 100644
index 000000000..4fffd9b04
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jl_00.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jl_01.png b/TUICallKit-Vue3/training/static/coach/jl_01.png
new file mode 100644
index 000000000..c9612b3c5
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jl_01.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jl_02.png b/TUICallKit-Vue3/training/static/coach/jl_02.png
new file mode 100644
index 000000000..9e6d55525
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jl_02.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jl_03.png b/TUICallKit-Vue3/training/static/coach/jl_03.png
new file mode 100644
index 000000000..8408b1b0a
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jl_03.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jl_04.png b/TUICallKit-Vue3/training/static/coach/jl_04.png
new file mode 100644
index 000000000..e4ad1fbc1
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jl_04.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jl_05.png b/TUICallKit-Vue3/training/static/coach/jl_05.png
new file mode 100644
index 000000000..420cc2938
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jl_05.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jl_06.png b/TUICallKit-Vue3/training/static/coach/jl_06.png
new file mode 100644
index 000000000..9671ab0fe
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jl_06.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jl_07.png b/TUICallKit-Vue3/training/static/coach/jl_07.png
new file mode 100644
index 000000000..656e8e605
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jl_07.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jl_08.png b/TUICallKit-Vue3/training/static/coach/jl_08.png
new file mode 100644
index 000000000..61307b425
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jl_08.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jl_09.png b/TUICallKit-Vue3/training/static/coach/jl_09.png
new file mode 100644
index 000000000..e258d3eea
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jl_09.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jr_01.png b/TUICallKit-Vue3/training/static/coach/jr_01.png
new file mode 100644
index 000000000..e4df254eb
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jr_01.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jr_02.png b/TUICallKit-Vue3/training/static/coach/jr_02.png
new file mode 100644
index 000000000..f1ef94dbf
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jr_02.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jr_03.png b/TUICallKit-Vue3/training/static/coach/jr_03.png
new file mode 100644
index 000000000..51e2fe70d
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jr_03.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jr_04.png b/TUICallKit-Vue3/training/static/coach/jr_04.png
new file mode 100644
index 000000000..d9ede4e03
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jr_04.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jr_05.png b/TUICallKit-Vue3/training/static/coach/jr_05.png
new file mode 100644
index 000000000..0a7dbda93
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jr_05.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jr_06.png b/TUICallKit-Vue3/training/static/coach/jr_06.png
new file mode 100644
index 000000000..1f125c6c6
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jr_06.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jr_07.png b/TUICallKit-Vue3/training/static/coach/jr_07.png
new file mode 100644
index 000000000..b3180ef6d
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jr_07.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jr_08.png b/TUICallKit-Vue3/training/static/coach/jr_08.png
new file mode 100644
index 000000000..b0681e48d
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jr_08.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/jr_09.png b/TUICallKit-Vue3/training/static/coach/jr_09.png
new file mode 100644
index 000000000..19c17afc4
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/jr_09.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ml_00.png b/TUICallKit-Vue3/training/static/coach/ml_00.png
new file mode 100644
index 000000000..346d79b26
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ml_00.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ml_01.png b/TUICallKit-Vue3/training/static/coach/ml_01.png
new file mode 100644
index 000000000..91bcecc1b
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ml_01.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ml_02.png b/TUICallKit-Vue3/training/static/coach/ml_02.png
new file mode 100644
index 000000000..a5ace4ed4
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ml_02.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ml_03.png b/TUICallKit-Vue3/training/static/coach/ml_03.png
new file mode 100644
index 000000000..cf7939824
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ml_03.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ml_04.png b/TUICallKit-Vue3/training/static/coach/ml_04.png
new file mode 100644
index 000000000..90872dc27
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ml_04.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ml_05.png b/TUICallKit-Vue3/training/static/coach/ml_05.png
new file mode 100644
index 000000000..e2d287ac6
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ml_05.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ml_06.png b/TUICallKit-Vue3/training/static/coach/ml_06.png
new file mode 100644
index 000000000..bfa647af6
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ml_06.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ml_07.png b/TUICallKit-Vue3/training/static/coach/ml_07.png
new file mode 100644
index 000000000..17a324b79
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ml_07.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ml_08.png b/TUICallKit-Vue3/training/static/coach/ml_08.png
new file mode 100644
index 000000000..71b5d33db
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ml_08.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ml_09.png b/TUICallKit-Vue3/training/static/coach/ml_09.png
new file mode 100644
index 000000000..d37a512ff
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ml_09.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ml_10.png b/TUICallKit-Vue3/training/static/coach/ml_10.png
new file mode 100644
index 000000000..ce8c2a950
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ml_10.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ml_11.png b/TUICallKit-Vue3/training/static/coach/ml_11.png
new file mode 100644
index 000000000..39bd0d7a5
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ml_11.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ml_12.png b/TUICallKit-Vue3/training/static/coach/ml_12.png
new file mode 100644
index 000000000..e0aa62fdd
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ml_12.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/mr_01.png b/TUICallKit-Vue3/training/static/coach/mr_01.png
new file mode 100644
index 000000000..977a198e0
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/mr_01.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/mr_02.png b/TUICallKit-Vue3/training/static/coach/mr_02.png
new file mode 100644
index 000000000..8f3fd329f
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/mr_02.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/mr_03.png b/TUICallKit-Vue3/training/static/coach/mr_03.png
new file mode 100644
index 000000000..545a62fef
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/mr_03.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/mr_04.png b/TUICallKit-Vue3/training/static/coach/mr_04.png
new file mode 100644
index 000000000..a1b3b8145
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/mr_04.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/mr_05.png b/TUICallKit-Vue3/training/static/coach/mr_05.png
new file mode 100644
index 000000000..34262e0db
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/mr_05.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/mr_06.png b/TUICallKit-Vue3/training/static/coach/mr_06.png
new file mode 100644
index 000000000..1e3d705d5
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/mr_06.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/mr_07.png b/TUICallKit-Vue3/training/static/coach/mr_07.png
new file mode 100644
index 000000000..bfbf41153
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/mr_07.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/mr_08.png b/TUICallKit-Vue3/training/static/coach/mr_08.png
new file mode 100644
index 000000000..776fe9ae6
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/mr_08.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/mr_09.png b/TUICallKit-Vue3/training/static/coach/mr_09.png
new file mode 100644
index 000000000..7267b93a8
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/mr_09.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/mr_10.png b/TUICallKit-Vue3/training/static/coach/mr_10.png
new file mode 100644
index 000000000..f7393b44c
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/mr_10.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/mr_11.png b/TUICallKit-Vue3/training/static/coach/mr_11.png
new file mode 100644
index 000000000..e2d758ff9
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/mr_11.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/mr_12.png b/TUICallKit-Vue3/training/static/coach/mr_12.png
new file mode 100644
index 000000000..1dd3b24c0
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/mr_12.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_00.png b/TUICallKit-Vue3/training/static/coach/ra_00.png
new file mode 100644
index 000000000..395fcc91b
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_00.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_01.png b/TUICallKit-Vue3/training/static/coach/ra_01.png
new file mode 100644
index 000000000..600eea84a
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_01.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_02.png b/TUICallKit-Vue3/training/static/coach/ra_02.png
new file mode 100644
index 000000000..283f4c62f
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_02.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_03.png b/TUICallKit-Vue3/training/static/coach/ra_03.png
new file mode 100644
index 000000000..5d0fad404
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_03.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_04.png b/TUICallKit-Vue3/training/static/coach/ra_04.png
new file mode 100644
index 000000000..f5f7e1286
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_04.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_05.png b/TUICallKit-Vue3/training/static/coach/ra_05.png
new file mode 100644
index 000000000..e23c0f8d8
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_05.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_06.png b/TUICallKit-Vue3/training/static/coach/ra_06.png
new file mode 100644
index 000000000..54f59f2f3
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_06.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_07.png b/TUICallKit-Vue3/training/static/coach/ra_07.png
new file mode 100644
index 000000000..3eb3e8833
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_07.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_08.png b/TUICallKit-Vue3/training/static/coach/ra_08.png
new file mode 100644
index 000000000..7d3e23aff
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_08.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_09.png b/TUICallKit-Vue3/training/static/coach/ra_09.png
new file mode 100644
index 000000000..efdca464a
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_09.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_10.png b/TUICallKit-Vue3/training/static/coach/ra_10.png
new file mode 100644
index 000000000..24892f481
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_10.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_11.png b/TUICallKit-Vue3/training/static/coach/ra_11.png
new file mode 100644
index 000000000..e8a0addac
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_11.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_12.png b/TUICallKit-Vue3/training/static/coach/ra_12.png
new file mode 100644
index 000000000..f1fc1ebb3
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_12.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_13.png b/TUICallKit-Vue3/training/static/coach/ra_13.png
new file mode 100644
index 000000000..305894082
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_13.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_14.png b/TUICallKit-Vue3/training/static/coach/ra_14.png
new file mode 100644
index 000000000..82365d9ed
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_14.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_15.png b/TUICallKit-Vue3/training/static/coach/ra_15.png
new file mode 100644
index 000000000..1415654ef
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_15.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_16.png b/TUICallKit-Vue3/training/static/coach/ra_16.png
new file mode 100644
index 000000000..94fa2662d
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_16.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_17.png b/TUICallKit-Vue3/training/static/coach/ra_17.png
new file mode 100644
index 000000000..10d1721c1
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_17.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_18.png b/TUICallKit-Vue3/training/static/coach/ra_18.png
new file mode 100644
index 000000000..f32368f16
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_18.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_19.png b/TUICallKit-Vue3/training/static/coach/ra_19.png
new file mode 100644
index 000000000..43edc6d9f
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_19.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_20.png b/TUICallKit-Vue3/training/static/coach/ra_20.png
new file mode 100644
index 000000000..7ec2e0840
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_20.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_21.png b/TUICallKit-Vue3/training/static/coach/ra_21.png
new file mode 100644
index 000000000..ee831057a
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_21.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_22.png b/TUICallKit-Vue3/training/static/coach/ra_22.png
new file mode 100644
index 000000000..bc2288ea7
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_22.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/ra_23.png b/TUICallKit-Vue3/training/static/coach/ra_23.png
new file mode 100644
index 000000000..b5f6b7256
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/ra_23.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_00.png b/TUICallKit-Vue3/training/static/coach/sq_00.png
new file mode 100644
index 000000000..444e6ed48
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_00.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_01.png b/TUICallKit-Vue3/training/static/coach/sq_01.png
new file mode 100644
index 000000000..0bce77dd2
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_01.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_02.png b/TUICallKit-Vue3/training/static/coach/sq_02.png
new file mode 100644
index 000000000..0af29b668
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_02.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_03.png b/TUICallKit-Vue3/training/static/coach/sq_03.png
new file mode 100644
index 000000000..d84301c90
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_03.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_04.png b/TUICallKit-Vue3/training/static/coach/sq_04.png
new file mode 100644
index 000000000..b2102c735
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_04.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_05.png b/TUICallKit-Vue3/training/static/coach/sq_05.png
new file mode 100644
index 000000000..d643bb28e
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_05.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_06.png b/TUICallKit-Vue3/training/static/coach/sq_06.png
new file mode 100644
index 000000000..d5695e780
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_06.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_07.png b/TUICallKit-Vue3/training/static/coach/sq_07.png
new file mode 100644
index 000000000..fb2cfd90f
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_07.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_08.png b/TUICallKit-Vue3/training/static/coach/sq_08.png
new file mode 100644
index 000000000..c32cc45e8
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_08.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_09.png b/TUICallKit-Vue3/training/static/coach/sq_09.png
new file mode 100644
index 000000000..39059e111
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_09.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_10.png b/TUICallKit-Vue3/training/static/coach/sq_10.png
new file mode 100644
index 000000000..86526713d
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_10.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_11.png b/TUICallKit-Vue3/training/static/coach/sq_11.png
new file mode 100644
index 000000000..ed290b310
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_11.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_12.png b/TUICallKit-Vue3/training/static/coach/sq_12.png
new file mode 100644
index 000000000..512c7be3c
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_12.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_13.png b/TUICallKit-Vue3/training/static/coach/sq_13.png
new file mode 100644
index 000000000..04dfa3253
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_13.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_14.png b/TUICallKit-Vue3/training/static/coach/sq_14.png
new file mode 100644
index 000000000..471dd644f
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_14.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_15.png b/TUICallKit-Vue3/training/static/coach/sq_15.png
new file mode 100644
index 000000000..8106e34c7
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_15.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_16.png b/TUICallKit-Vue3/training/static/coach/sq_16.png
new file mode 100644
index 000000000..4171d032b
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_16.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_17.png b/TUICallKit-Vue3/training/static/coach/sq_17.png
new file mode 100644
index 000000000..fb8f85ada
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_17.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_18.png b/TUICallKit-Vue3/training/static/coach/sq_18.png
new file mode 100644
index 000000000..2c55e9092
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_18.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_19.png b/TUICallKit-Vue3/training/static/coach/sq_19.png
new file mode 100644
index 000000000..0e2084a34
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_19.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_20.png b/TUICallKit-Vue3/training/static/coach/sq_20.png
new file mode 100644
index 000000000..4b8d86130
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_20.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_21.png b/TUICallKit-Vue3/training/static/coach/sq_21.png
new file mode 100644
index 000000000..338692706
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_21.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_22.png b/TUICallKit-Vue3/training/static/coach/sq_22.png
new file mode 100644
index 000000000..53180e44b
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_22.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/sq_23.png b/TUICallKit-Vue3/training/static/coach/sq_23.png
new file mode 100644
index 000000000..762eccca8
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/sq_23.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/thumbs.png b/TUICallKit-Vue3/training/static/coach/thumbs.png
new file mode 100644
index 000000000..f45dcf012
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/thumbs.png differ
diff --git a/TUICallKit-Vue3/training/static/coach/wave.png b/TUICallKit-Vue3/training/static/coach/wave.png
new file mode 100644
index 000000000..5e0de07c9
Binary files /dev/null and b/TUICallKit-Vue3/training/static/coach/wave.png differ
diff --git a/app/src/doctor_workstation/__init__.py b/app/src/doctor_workstation/__init__.py
index 952bd12ec..8e9d851cb 100755
--- a/app/src/doctor_workstation/__init__.py
+++ b/app/src/doctor_workstation/__init__.py
@@ -3,7 +3,7 @@
__all__ = ["DEBUG_MODE", "ONLINE_API_BASE_URL", "__version__"]
# Single source of truth for runtime, package, installer, and executable versions.
-__version__ = "1.5.1"
+__version__ = "1.5.2"
# 调试模式开启时,登录页显示“演示模式”和“服务器设置”。
# 正式发布请保持 False;此时程序只使用下面配置的线上域名。
diff --git a/app/src/doctor_workstation/services/api_client.py b/app/src/doctor_workstation/services/api_client.py
index a081facb5..ddb7a1c5c 100755
--- a/app/src/doctor_workstation/services/api_client.py
+++ b/app/src/doctor_workstation/services/api_client.py
@@ -213,6 +213,7 @@ class ApiClient:
files: Mapping[str, Any],
data: Mapping[str, Any] | None = None,
headers: Mapping[str, str] | None = None,
+ timeout: float | None = None,
) -> Any:
"""Issue a non-retried multipart POST and return unwrapped data.
@@ -229,6 +230,7 @@ class ApiClient:
data=data or {},
files=files,
headers=headers,
+ timeout=timeout,
)
def post_independent(
diff --git a/app/src/doctor_workstation/services/repository.py b/app/src/doctor_workstation/services/repository.py
index 72ee10964..d6c5e3c5f 100755
--- a/app/src/doctor_workstation/services/repository.py
+++ b/app/src/doctor_workstation/services/repository.py
@@ -211,6 +211,9 @@ class DoctorRepository(Protocol):
) -> Iterator[dict[str, Any]]:
"""Yield normalized assistant content and preparation progress events."""
+ def analyze_tongue_screenshot(self, diagnosis_id: int, content: bytes, *, request_id: str, model: str = "qwen") -> dict[str, Any]:
+ """Analyze a temporary video image without adding it to the clinical record."""
+
def cancel_diagnosis_ai(self, diagnosis_id: int, request_id: str) -> dict[str, Any]:
"""Request server/upstream cancellation of one correlated stream."""
@@ -1521,6 +1524,22 @@ class RemoteDoctorRepository:
if cancelled is None or not cancelled():
raise ApiProtocolError("video AI stream ended before done")
+ def analyze_tongue_screenshot(self, diagnosis_id: int, content: bytes, *, request_id: str, model: str = "qwen") -> dict[str, Any]:
+ """Analyze a temporary video image without adding it to the clinical record."""
+ if (not isinstance(model, str) or model not in {"qwen", "openai"}
+ or isinstance(diagnosis_id, bool) or not isinstance(diagnosis_id, int) or diagnosis_id <= 0
+ or not isinstance(content, bytes) or not 4 <= len(content) <= 10 * 1024 * 1024
+ or not content.startswith(b"\xff\xd8")
+ or not isinstance(request_id, str)
+ or re.fullmatch(r"[0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}", request_id) is None):
+ raise ValueError("invalid tongue screenshot request")
+ endpoint = "tcm.diagnosis/aiTongueScreenshot"
+ payload = self.client.post_multipart(
+ endpoint, files={"file": ("tongue-screenshot.jpg", BytesIO(content), "image/jpeg")},
+ data={"id": str(diagnosis_id), "request_id": request_id, "model": model}, timeout=60.0,
+ )
+ return dict(_require_mapping(payload, endpoint))
+
def cancel_diagnosis_ai(self, diagnosis_id: int, request_id: str) -> dict[str, Any]:
"""Use an independent short request, even while the stream is idle."""
diff --git a/app/src/doctor_workstation/video/screenshot.py b/app/src/doctor_workstation/video/screenshot.py
index a364767bb..eb540ea18 100644
--- a/app/src/doctor_workstation/video/screenshot.py
+++ b/app/src/doctor_workstation/video/screenshot.py
@@ -1,4 +1,4 @@
-"""Capture the rendered call region without accessing the rest of the desktop."""
+"""Validate patient video frames and manage the screenshot preview window."""
from __future__ import annotations
@@ -8,6 +8,29 @@ from collections.abc import Mapping
from typing import Any
+def validate_patient_video_frame(data_url: Any) -> str:
+ """Validate the trusted renderer's JPEG without cropping or re-encoding pixels."""
+ from PySide6.QtCore import QBuffer, QByteArray, QIODevice
+ from PySide6.QtGui import QImageReader
+
+ from .tongue_screenshot import jpeg_bytes
+
+ content = jpeg_bytes(data_url)
+ if not content.endswith(b"\xff\xd9"):
+ raise ValueError("患者视频截图不完整,请重新截屏。")
+ data = QByteArray(content)
+ buffer = QBuffer(data)
+ buffer.open(QIODevice.OpenModeFlag.ReadOnly)
+ reader = QImageReader(buffer, b"JPEG")
+ size = reader.size()
+ if not (64 <= size.width() <= 1920 and 64 <= size.height() <= 1920):
+ raise ValueError("患者视频截图尺寸无效,请重新截屏。")
+ image = reader.read()
+ if image.isNull() or image.size() != size:
+ raise ValueError("患者视频截图无法读取,请重新截屏。")
+ return data_url
+
+
class ScreenshotPreviewSize:
"""Temporarily give a compact call the same space as a normal preview."""
diff --git a/app/src/doctor_workstation/video/tongue_screenshot.py b/app/src/doctor_workstation/video/tongue_screenshot.py
new file mode 100644
index 000000000..771d924e7
--- /dev/null
+++ b/app/src/doctor_workstation/video/tongue_screenshot.py
@@ -0,0 +1,243 @@
+"""Bounded image-only assistance, separate from recording and call persistence."""
+from __future__ import annotations
+
+import base64
+import binascii
+import hashlib
+from collections import deque
+from collections.abc import Mapping
+from threading import BoundedSemaphore, RLock, Thread
+from typing import Any
+from uuid import UUID
+
+from ..core.errors import (
+ ApiBusinessError,
+ ApiHttpError,
+ ApiTimeoutError,
+ AuthenticationExpiredError,
+)
+from ..core.transcript_text import simplified_transcript
+
+MAX_IMAGE_BYTES = 10 * 1024 * 1024
+_SLOTS = BoundedSemaphore(4)
+_MODELS = {"qwen", "openai"}
+_BUSINESS_MESSAGES = {
+ "GPT 模型接口配置异常,请管理员检查 Dify 中的模型 API 地址。": "GPT 模型接口配置异常,请管理员检查 Dify 中的模型 API 地址。",
+ "千问 模型接口配置异常,请管理员检查 Dify 中的模型 API 地址。": "千问 模型接口配置异常,请管理员检查 Dify 中的模型 API 地址。",
+ "截图分析超时,请稍后重试": "舌象分析超时,请重试。",
+ "截图分析结果格式无效,请重新截图后重试": "模型返回的舌象结果格式不符合要求,请重试此模型。",
+ "截图分析未返回有效结果,请重新截图后重试": "模型未返回有效的舌象结果,请重试此模型。",
+ "截图分析服务配置不完整": "舌象分析服务配置不完整,请管理员检查现有 AI 配置。",
+ "AI 截图分析功能未启用": "当前服务尚未启用舌象 AI 分析。",
+ "权限不足,无法使用诊单 AI 助手": "当前账号没有舌象分析权限。",
+ "诊单不存在或无权访问": "当前诊单不可访问,请重新打开问诊。",
+}
+_PREFIX = "data:image/jpeg;base64,"
+
+
+def _uuid(value: Any) -> bool:
+ try:
+ return isinstance(value, str) and len(value) == 36 and str(UUID(value)) == value.lower()
+ except ValueError:
+ return False
+
+
+def jpeg_bytes(data_url: Any) -> bytes:
+ if (not isinstance(data_url, str) or not data_url.startswith(_PREFIX)
+ or len(data_url) > 14 * 1024 * 1024):
+ raise ValueError("invalid screenshot")
+ try:
+ content = base64.b64decode(data_url[len(_PREFIX):], validate=True)
+ except (ValueError, binascii.Error) as exc:
+ raise ValueError("invalid screenshot") from exc
+ if not 4 <= len(content) <= MAX_IMAGE_BYTES or not content.startswith(b"\xff\xd8"):
+ raise ValueError("invalid screenshot")
+ return content
+
+
+def validated_result(value: Any, diagnosis_id: int, request_id: str, digest: str, model: str = "qwen") -> dict[str, Any]:
+ if (not isinstance(value, Mapping) or isinstance(value.get("diagnosis_id"), bool)
+ or value.get("diagnosis_id") != diagnosis_id or value.get("request_id") != request_id
+ or value.get("image_sha256") != digest or value.get("model") != model or model not in _MODELS):
+ raise ValueError("screenshot result identity mismatch")
+ analysis = value.get("analysis")
+ if not isinstance(analysis, Mapping) or analysis.get("image_quality") not in {"usable", "limited", "unusable"}:
+ raise ValueError("invalid image analysis")
+
+ def text(raw: Any, limit: int) -> str:
+ if not isinstance(raw, str) or not raw.strip() or len(raw) > limit:
+ raise ValueError("invalid image analysis text")
+ return simplified_transcript(raw.strip())
+
+ features = analysis.get("features")
+ limitations = analysis.get("limitations")
+ if (not isinstance(features, list) or len(features) > 8
+ or not isinstance(limitations, list) or len(limitations) > 8
+ or (analysis["image_quality"] == "unusable" and features)):
+ raise ValueError("invalid image findings")
+ clean_features = []
+ for feature in features:
+ if not isinstance(feature, Mapping):
+ raise ValueError("invalid image feature")
+ clean_features.append({"name": text(feature.get("name"), 40),
+ "observation": text(feature.get("observation"), 500)})
+ label = value.get("model_label", "")
+ if not isinstance(label, str) or len(label) > 100:
+ raise ValueError("invalid model label")
+ diagnosis = analysis.get("tcm_diagnosis")
+ if not isinstance(diagnosis, Mapping) or diagnosis.get("status") not in {"possible_patterns", "insufficient"}:
+ raise ValueError("invalid TCM reference")
+
+ def texts(raw: Any, count: int, limit: int) -> list[str]:
+ if not isinstance(raw, list) or not 1 <= len(raw) <= count:
+ raise ValueError("invalid TCM evidence")
+ return [text(item, limit) for item in raw]
+
+ candidates = diagnosis.get("candidates")
+ if (not isinstance(candidates, list) or len(candidates) > 3
+ or (diagnosis["status"] == "insufficient" and candidates)
+ or (diagnosis["status"] == "possible_patterns" and not candidates)
+ or (analysis["image_quality"] == "unusable" and diagnosis["status"] != "insufficient")):
+ raise ValueError("contradictory TCM reference")
+ names = {feature["name"] for feature in clean_features}
+ clean_candidates = []
+ for candidate in candidates:
+ if not isinstance(candidate, Mapping):
+ raise ValueError("invalid TCM candidate")
+ basis = texts(candidate.get("basis"), 7, 40)
+ if any(item not in names for item in basis) or len(set(basis)) != len(basis):
+ raise ValueError("TCM candidate has no visible evidence")
+ clean_candidates.append({"name": text(candidate.get("name"), 40), "basis": basis,
+ "verify": texts(candidate.get("verify"), 4, 160)})
+ return {"request_id": request_id, "diagnosis_id": diagnosis_id, "image_sha256": digest,
+ "model": model, "model_label": simplified_transcript(label),
+ "analysis": {"image_quality": analysis["image_quality"],
+ "quality_note": text(analysis.get("quality_note"), 600),
+ "features": clean_features,
+ "limitations": [text(item, 400) for item in limitations],
+ "tcm_diagnosis": {"status": diagnosis["status"],
+ "summary": text(diagnosis.get("summary"), 240),
+ "candidates": clean_candidates,
+ "missing_information": texts(diagnosis.get("missing_information"), 6, 160)}}}
+
+
+class TongueScreenshotController:
+ """Analyze the current frame registered by the trusted call window, never URLs."""
+
+ def __init__(self, repository: Any, *, diagnosis_id: int, enabled: bool) -> None:
+ self._repository = repository
+ self._diagnosis_id = diagnosis_id
+ self._enabled = enabled is True and callable(getattr(repository, "analyze_tongue_screenshot", None))
+ self._lock = RLock()
+ self._generation = 0
+ self._closed = False
+ self._capture = b""
+ self._requests: dict[str, str] = {}
+ self._seen: deque[str] = deque(maxlen=128)
+ self._results: deque[dict[str, Any]] = deque(maxlen=8)
+ self._workers: list[Thread] = []
+
+ def register_capture(self, data_url: str) -> None:
+ content = jpeg_bytes(data_url)
+ with self._lock:
+ if self._closed:
+ return
+ self.clear_capture()
+ self._capture = content
+
+ def clear_capture(self) -> None:
+ with self._lock:
+ self._generation += 1
+ self._capture = b""
+ self._requests.clear()
+ self._results.clear()
+
+ def cancel(self, request_id: str) -> None:
+ with self._lock:
+ self._requests = {model: value for model, value in self._requests.items() if value != request_id}
+ self._results = deque((item for item in self._results if item["requestId"] != request_id), maxlen=8)
+
+ def analyze(self, request_id: Any, data_url: Any, model: Any = "qwen") -> None:
+ with self._lock:
+ if (self._closed or not _uuid(request_id) or request_id in self._seen
+ or not isinstance(model, str) or model not in _MODELS):
+ return
+ self._seen.append(request_id)
+ generation = self._generation
+ self._requests[model] = request_id
+ self._results = deque((item for item in self._results if item["model"] != model), maxlen=8)
+ message = ""
+ if not self._enabled:
+ message = "当前账号或客户端尚未启用舌象 AI 分析。"
+ else:
+ try:
+ content = jpeg_bytes(data_url)
+ if not self._capture or content != self._capture:
+ raise ValueError("capture mismatch")
+ except ValueError:
+ message = "截图已失效,请重新截取当前视频画面。"
+ if message:
+ self._results.append({"requestId": request_id, "model": model, "ok": False, "message": message})
+ return
+ if not _SLOTS.acquire(blocking=False):
+ self._results.append({"requestId": request_id, "model": model, "ok": False,
+ "message": "上一张截图仍在分析,请稍后点击重试。"})
+ return
+ worker = Thread(target=self._run, args=(generation, request_id, content, model),
+ name="tongue-screenshot-ai", daemon=True)
+ self._workers = [item for item in self._workers if item.is_alive()]
+ self._workers.append(worker)
+ try:
+ worker.start()
+ except RuntimeError:
+ _SLOTS.release()
+ self._workers.remove(worker)
+ self._results.append({"requestId": request_id, "model": model, "ok": False, "message": "分析未能启动,请重试。"})
+
+ def _run(self, generation: int, request_id: str, content: bytes, model: str) -> None:
+ try:
+ with self._lock:
+ if self._closed or generation != self._generation or self._requests.get(model) != request_id:
+ return
+ value = self._repository.analyze_tongue_screenshot(
+ self._diagnosis_id, content, request_id=request_id, model=model)
+ data = validated_result(value, self._diagnosis_id, request_id, hashlib.sha256(content).hexdigest(), model)
+ result = {"requestId": request_id, "model": model, "ok": True, "data": data}
+ except Exception as error:
+ message = "舌象分析未完成,请稍后重试。"
+ if isinstance(error, ApiTimeoutError):
+ message = "舌象分析超时,请重试。"
+ elif isinstance(error, AuthenticationExpiredError):
+ message = "登录状态已失效,请重新登录后分析。"
+ elif isinstance(error, ApiHttpError) and error.status_code in {404, 405}:
+ message = "服务端尚未提供舌象截图分析,请更新服务端。"
+ elif isinstance(error, ApiHttpError) and error.status_code == 403:
+ message = "当前账号没有舌象分析权限。"
+ elif isinstance(error, ApiBusinessError):
+ message = _BUSINESS_MESSAGES.get(str(error), message)
+ elif isinstance(error, ValueError):
+ message = "分析结果与当前截图不一致或格式无效,请重试。"
+ result = {"requestId": request_id, "model": model, "ok": False, "message": message}
+ finally:
+ _SLOTS.release()
+ with self._lock:
+ if not self._closed and generation == self._generation and self._requests.get(model) == request_id:
+ self._results.append(result)
+
+ def take_result(self) -> dict[str, Any] | None:
+ with self._lock:
+ while not self._closed and self._results:
+ result = self._results.popleft()
+ if self._requests.get(result["model"]) == result["requestId"]:
+ return result
+ return None
+
+ def close(self) -> None:
+ with self._lock:
+ self._closed = True
+ self.clear_capture()
+
+ def wait(self, timeout: float = 1.0) -> bool:
+ for worker in list(self._workers):
+ worker.join(max(0, min(5, timeout)))
+ return not any(worker.is_alive() for worker in self._workers)
diff --git a/app/src/doctor_workstation/video/window.py b/app/src/doctor_workstation/video/window.py
index 4af441911..388c8c19a 100755
--- a/app/src/doctor_workstation/video/window.py
+++ b/app/src/doctor_workstation/video/window.py
@@ -37,8 +37,9 @@ from .launcher import (
)
from .lifecycle import OrderedCallLifecycle, normalize_transcript_segment
from .live_ai import LiveAiController
-from .screenshot import ScreenshotPreviewSize, capture_view_region
+from .screenshot import ScreenshotPreviewSize, capture_view_region, validate_patient_video_frame
from .security import TrustedDocumentError, TrustedDocumentPolicy
+from .tongue_screenshot import TongueScreenshotController
try: # Optional by design: core-only builds must still import this module.
from PySide6.QtCore import QObject, Qt, QTimer, QUrl, Signal, Slot
@@ -196,10 +197,25 @@ if WEBENGINE_AVAILABLE: # pragma: no cover - GUI behavior needs an integration
self,
callback: Callable[[Mapping[str, Any]], None],
capture_screenshot: Callable[[Mapping[str, Any]], str],
+ prepare_patient_screenshot: Callable[[str, str], str] | None = None,
) -> None:
super().__init__()
self._callback = callback
self._capture_screenshot = capture_screenshot
+ self._prepare_patient_screenshot = prepare_patient_screenshot
+
+ @Slot(str, str, result=str) # type: ignore[misc]
+ def preparePatientScreenshot(self, target_user_id: str, data_url: str) -> str: # noqa: N802
+ """Bind one clean patient frame for preview/AI; never grab the widget."""
+ try:
+ if (not isinstance(target_user_id, str) or not 1 <= len(target_user_id) <= 256
+ or not isinstance(data_url, str) or len(data_url) > 14 * 1024 * 1024
+ or self._prepare_patient_screenshot is None):
+ raise ValueError("invalid patient frame")
+ result = {"dataUrl": self._prepare_patient_screenshot(target_user_id, data_url)}
+ except (ValueError, TypeError, RuntimeError):
+ result = {"error": "无法截取患者视频,请确认对方摄像头已开启后重试。"}
+ return json.dumps(result, ensure_ascii=False)
@Slot(str, result=str) # type: ignore[misc]
def captureScreenshot(self, payload: str) -> str: # noqa: N802 - Qt bridge API
@@ -227,6 +243,23 @@ if WEBENGINE_AVAILABLE: # pragma: no cover - GUI behavior needs an integration
if isinstance(message, Mapping) and message.get("source") == "doctor-call":
self._callback(message)
+ @Slot(str, str) # type: ignore[misc]
+ def analyzeTongueScreenshot(self, request_id: str, data_url: str) -> None: # noqa: N802
+ if (not isinstance(request_id, str) or len(request_id) != 36
+ or not isinstance(data_url, str) or len(data_url) > 14 * 1024 * 1024):
+ return
+ self._callback({"source": "doctor-call", "event": "tongue-screenshot-analyze",
+ "requestId": request_id, "dataUrl": data_url})
+
+ @Slot(str, str, str) # type: ignore[misc]
+ def analyzeTongueScreenshotModel(self, request_id: str, data_url: str, model: str) -> None: # noqa: N802
+ if (not isinstance(request_id, str) or len(request_id) != 36
+ or not isinstance(data_url, str) or len(data_url) > 14 * 1024 * 1024
+ or not isinstance(model, str) or model not in {"qwen", "openai"}):
+ return
+ self._callback({"source": "doctor-call", "event": "tongue-screenshot-analyze",
+ "requestId": request_id, "dataUrl": data_url, "model": model})
+
@Slot(str) # type: ignore[misc]
def saveScreenshot(self, data_url: str) -> None: # noqa: N802 - Qt bridge API
"""Forward one bounded JPEG data URL to the trusted desktop host."""
@@ -380,6 +413,9 @@ if WEBENGINE_AVAILABLE: # pragma: no cover - GUI behavior needs an integration
self._live_ai = LiveAiController(
repository, diagnosis_id=request.diagnosis_id, enabled=can_ai_assistant is True,
)
+ self._tongue_ai = TongueScreenshotController(
+ repository, diagnosis_id=request.diagnosis_id, enabled=can_ai_assistant is True,
+ )
# The default recognizer is Tencent's existing call transcriber.
# Keep local audio recording independent; no local model is loaded.
self._local_transcription = None
@@ -390,6 +426,7 @@ if WEBENGINE_AVAILABLE: # pragma: no cover - GUI behavior needs an integration
self._video_ai_timer = QTimer(self)
self._video_ai_timer.setInterval(100)
self._video_ai_timer.timeout.connect(self._flush_video_ai)
+ self._video_ai_timer.timeout.connect(self._flush_tongue_ai)
self._video_ai_timer.start()
self._screenshot_preview_size = ScreenshotPreviewSize()
self._local_audio_capture: _LocalAudioCapture | None = None
@@ -429,7 +466,7 @@ if WEBENGINE_AVAILABLE: # pragma: no cover - GUI behavior needs an integration
self._configure_settings(self._page.settings())
self._bridge = _QtVideoBridge(
- self._handle_bridge_message, self._capture_screenshot_preview
+ self._handle_bridge_message, self._capture_screenshot_preview, self._prepare_patient_screenshot
)
self._channel = QWebChannel(self._page)
self._channel.registerObject("qtVideoBridge", self._bridge)
@@ -512,6 +549,9 @@ if WEBENGINE_AVAILABLE: # pragma: no cover - GUI behavior needs an integration
def _on_load_finished(self, succeeded: bool) -> None:
if self._closing:
return
+ tongue = getattr(self, "_tongue_ai", None)
+ if tongue is not None:
+ tongue.clear_capture()
if not succeeded:
self.logger.error(
"embedded video companion failed to load",
@@ -582,6 +622,13 @@ if WEBENGINE_AVAILABLE: # pragma: no cover - GUI behavior needs an integration
if self._closing:
return
event = str(message.get("event", ""))
+ if event in {"tongue-screenshot-analyze", "tongue-screenshot-cancel"}:
+ if self._im_ai_context_is_trusted():
+ if event == "tongue-screenshot-cancel":
+ self._tongue_ai.cancel(message.get("requestId"))
+ elif self._media_active and self._start_requested and not self._call_cycle_closed:
+ self._tongue_ai.analyze(message.get("requestId"), message.get("dataUrl"), message.get("model", "qwen"))
+ return
if event.startswith("local-transcription-"):
# An old companion must not start a second recognizer.
return
@@ -597,6 +644,8 @@ if WEBENGINE_AVAILABLE: # pragma: no cover - GUI behavior needs an integration
visible = message.get("visible")
if isinstance(visible, bool):
self._set_screenshot_preview_visible(visible)
+ if not visible and hasattr(self, "_tongue_ai"):
+ self._tongue_ai.clear_capture()
return
if event == "open-diagnosis-request":
if self._on_open_diagnosis is not None:
@@ -688,6 +737,8 @@ if WEBENGINE_AVAILABLE: # pragma: no cover - GUI behavior needs an integration
status = str(message.get("status", "unknown"))[:80]
self.status_changed.emit(status)
elif event == "hangup":
+ if hasattr(self, "_tongue_ai"):
+ self._tongue_ai.clear_capture()
status = str(message.get("status", "ended"))[:80]
self.call_ended.emit(status)
self.lifecycle.end(f"companion-{status}")
@@ -727,6 +778,9 @@ if WEBENGINE_AVAILABLE: # pragma: no cover - GUI behavior needs an integration
self._page.runJavaScript(f"window.doctorConsultation?.imAiResult?.({payload});")
def _close_im_ai(self) -> None:
+ tongue = getattr(self, "_tongue_ai", None)
+ if tongue is not None:
+ tongue.close()
controller = getattr(self, "_im_ai", None)
if controller is not None:
controller.close()
@@ -827,6 +881,14 @@ if WEBENGINE_AVAILABLE: # pragma: no cover - GUI behavior needs an integration
payload = json.dumps(state, ensure_ascii=True, separators=(",", ":"))
self._page.runJavaScript(f"window.doctorConsultation?.videoAiState?.({payload});")
+ def _flush_tongue_ai(self) -> None:
+ if not self._im_ai_context_is_trusted():
+ return
+ result = self._tongue_ai.take_result()
+ if result is not None:
+ payload = json.dumps(result, ensure_ascii=True, separators=(",", ":"))
+ self._page.runJavaScript(f"window.doctorConsultation?.tongueScreenshotResult?.({payload});")
+
def _close_video_assistance(self, *, close_asr: bool = True) -> None:
controller = getattr(self, "_live_ai", None)
if controller is not None:
@@ -1221,6 +1283,9 @@ if WEBENGINE_AVAILABLE: # pragma: no cover - GUI behavior needs an integration
def _start_call_cycle(self, *, call_type: int = 2) -> None:
if self._closing or self._shutdown_requested or self._start_requested:
return
+ tongue = getattr(self, "_tongue_ai", None)
+ if tongue is not None:
+ tongue.clear_capture()
self._prepare_call_cycle()
live_ai = getattr(self, "_live_ai", None)
if live_ai is not None:
@@ -1254,12 +1319,25 @@ if WEBENGINE_AVAILABLE: # pragma: no cover - GUI behavior needs an integration
def restore_screenshot_preview(self) -> None:
self._screenshot_preview_size.restore(self)
+ def _prepare_patient_screenshot(self, target_user_id: str, data_url: str) -> str:
+ if (not self._im_ai_context_is_trusted() or not self._media_active
+ or not self._start_requested or self._call_cycle_closed):
+ raise ValueError("视频通话不可用。")
+ if target_user_id != self.request.target_user_id:
+ raise ValueError("视频截图与当前患者不匹配。")
+ data_url = validate_patient_video_frame(data_url)
+ self._tongue_ai.register_capture(data_url)
+ return data_url
+
def _capture_screenshot_preview(self, region: Mapping[str, Any]) -> str:
if self._closing or self._released or self._shutdown_requested or not self._media_active:
raise ValueError("视频窗口已关闭。")
if not self._policy.allows_main_document(self._page.url().toString()):
raise ValueError("视频页面不可用。")
- return capture_view_region(self.web_view, region)
+ data_url = capture_view_region(self.web_view, region)
+ if hasattr(self, "_tongue_ai"):
+ self._tongue_ai.register_capture(data_url)
+ return data_url
def _save_screenshot(self, data_url: str) -> None:
prefix = "data:image/jpeg;base64,"
diff --git a/app/tests/test_patient_video_frame.py b/app/tests/test_patient_video_frame.py
new file mode 100644
index 000000000..c6fca64ed
--- /dev/null
+++ b/app/tests/test_patient_video_frame.py
@@ -0,0 +1,146 @@
+from __future__ import annotations
+
+import base64
+import hashlib
+import json
+from types import SimpleNamespace
+from unittest.mock import Mock
+from uuid import uuid4
+
+import pytest
+from PySide6.QtCore import QBuffer, QByteArray, QIODevice
+from PySide6.QtGui import QColor, QImage
+
+from doctor_workstation.video import window
+from doctor_workstation.video.screenshot import validate_patient_video_frame
+from doctor_workstation.video.tongue_screenshot import TongueScreenshotController
+
+
+def frame(width=320, height=480, image_format="JPEG"):
+ image = QImage(width, height, QImage.Format.Format_RGB32)
+ image.fill(QColor("#234567"))
+ data = QByteArray()
+ buffer = QBuffer(data)
+ buffer.open(QIODevice.OpenModeFlag.WriteOnly)
+ assert image.save(buffer, image_format, 90)
+ buffer.close()
+ return "data:image/jpeg;base64," + base64.b64encode(bytes(data)).decode()
+
+
+def host(**changes):
+ return SimpleNamespace(**{
+ "_im_ai_context_is_trusted": lambda: True,
+ "_media_active": True, "_start_requested": True, "_call_cycle_closed": False,
+ "request": SimpleNamespace(target_user_id="patient_42"),
+ "_tongue_ai": Mock(), "web_view": Mock(), "lifecycle": Mock(),
+ **changes,
+ })
+
+
+@pytest.mark.parametrize("width,height", [(320, 480), (1920, 1080), (1080, 1920), (64, 64)])
+def test_patient_frame_keeps_original_jpeg_bytes_and_aspect_ratio(width, height):
+ source = frame(width, height)
+ assert validate_patient_video_frame(source) == source
+
+
+@pytest.mark.parametrize("width,height", [(32, 100), (100, 32), (1921, 64), (64, 1921)])
+def test_patient_frame_dimensions_are_bounded_before_decode(width, height):
+ with pytest.raises(ValueError, match="尺寸无效"):
+ validate_patient_video_frame(frame(width, height))
+
+
+@pytest.mark.parametrize("source", [None, "https://example.test/frame.jpg", "data:image/png;base64,AAAA",
+ "data:image/jpeg;base64,@@@@", "data:image/jpeg;base64,/9j/2Q=="])
+def test_invalid_patient_frame_cannot_be_registered(source):
+ with pytest.raises(ValueError):
+ validate_patient_video_frame(source)
+
+
+def test_png_disguised_as_jpeg_and_truncated_jpeg_are_rejected():
+ with pytest.raises(ValueError):
+ validate_patient_video_frame(frame(image_format="PNG"))
+ content = base64.b64decode(frame().split(",", 1)[1])
+ with pytest.raises(ValueError, match="不完整"):
+ validate_patient_video_frame("data:image/jpeg;base64," + base64.b64encode(content[:-2]).decode())
+
+
+def test_preparation_binds_patient_pixels_without_widget_grab_save_or_ai_submission():
+ target = host()
+ source = frame()
+ events = []
+ legacy_capture = Mock(side_effect=AssertionError("must never capture the whole widget"))
+ bridge = window._QtVideoBridge(events.append, legacy_capture,
+ lambda user, image: window._EmbeddedVideoWindow._prepare_patient_screenshot(target, user, image))
+ prepared = json.loads(bridge.preparePatientScreenshot("patient_42", source))
+ assert prepared == {"dataUrl": source}
+ target._tongue_ai.register_capture.assert_called_once_with(source)
+ target.web_view.grab.assert_not_called()
+ target.lifecycle.save_screenshot.assert_not_called()
+ target._tongue_ai.analyze.assert_not_called()
+ legacy_capture.assert_not_called()
+ assert events == []
+ bridge.saveScreenshot(prepared["dataUrl"])
+ assert events == [{"source": "doctor-call", "event": "screenshot", "dataUrl": source}]
+
+
+@pytest.mark.parametrize("changes", [
+ {"_im_ai_context_is_trusted": lambda: False}, {"_media_active": False},
+ {"_start_requested": False}, {"_call_cycle_closed": True},
+ {"request": SimpleNamespace(target_user_id="another_patient")},
+])
+def test_wrong_patient_or_inactive_call_cannot_prepare_a_frame(changes):
+ target = host(**changes)
+ with pytest.raises(ValueError):
+ window._EmbeddedVideoWindow._prepare_patient_screenshot(target, "patient_42", frame())
+ target._tongue_ai.register_capture.assert_not_called()
+ target.web_view.grab.assert_not_called()
+
+
+@pytest.mark.parametrize("user,image", [("", "unused"), ("x" * 257, "unused"),
+ (None, "unused"), ("patient_42", None), ("patient_42", "x" * (14 * 1024 * 1024 + 1))],
+ ids=["empty-user", "oversized-user", "null-user", "null-image", "oversized-image"])
+def test_bridge_bounds_inputs_before_native_preparation(user, image):
+ prepare = Mock()
+ bridge = window._QtVideoBridge(Mock(), Mock(), prepare)
+ assert "error" in json.loads(bridge.preparePatientScreenshot(user, image))
+ prepare.assert_not_called()
+
+
+def test_missing_preparation_handler_and_internal_error_fail_without_fallback():
+ legacy = Mock()
+ for prepare in (None, Mock(side_effect=ValueError("private patient details"))):
+ bridge = window._QtVideoBridge(Mock(), legacy, prepare)
+ result = json.loads(bridge.preparePatientScreenshot("patient_42", frame()))
+ assert set(result) == {"error"} and "private" not in result["error"]
+ legacy.assert_not_called()
+
+
+def test_registered_patient_frame_is_the_exact_image_received_by_ai():
+ source = frame()
+ content = base64.b64decode(source.split(",", 1)[1])
+ calls = []
+
+ def analyze(diagnosis_id, jpeg, *, request_id, model="qwen"):
+ calls.append((diagnosis_id, jpeg))
+ return {"request_id": request_id, "diagnosis_id": diagnosis_id,
+ "image_sha256": hashlib.sha256(jpeg).hexdigest(), "model": model, "model_label": "合成测试",
+ "analysis": {"image_quality": "unusable", "quality_note": "纯色画面未见舌头",
+ "features": [], "limitations": ["无法观察舌头"], "tcm_diagnosis": {
+ "status": "insufficient", "summary": "纯色图片无法辨证", "candidates": [],
+ "missing_information": ["清晰舌象、症状与脉象"]}}}
+
+ controller = TongueScreenshotController(SimpleNamespace(analyze_tongue_screenshot=analyze),
+ diagnosis_id=42, enabled=True)
+ target = host(_tongue_ai=controller)
+ try:
+ prepared = window._EmbeddedVideoWindow._prepare_patient_screenshot(target, "patient_42", source)
+ assert calls == []
+ controller.analyze(str(uuid4()), prepared)
+ assert controller.wait(3)
+ result = controller.take_result()
+ assert result["ok"] is True
+ assert result["data"]["image_sha256"] == hashlib.sha256(content).hexdigest()
+ assert calls == [(42, content)]
+ target.web_view.grab.assert_not_called()
+ finally:
+ controller.close()
diff --git a/app/tests/test_tongue_screenshot.py b/app/tests/test_tongue_screenshot.py
new file mode 100644
index 000000000..d22a1637a
--- /dev/null
+++ b/app/tests/test_tongue_screenshot.py
@@ -0,0 +1,390 @@
+from __future__ import annotations
+
+import base64
+import hashlib
+from copy import deepcopy
+from threading import BoundedSemaphore, Event
+from types import SimpleNamespace
+from uuid import uuid4
+
+import httpx
+import pytest
+
+from doctor_workstation.core.errors import ApiBusinessError, ApiTimeoutError
+from doctor_workstation.services.api_client import ApiClient
+from doctor_workstation.services.repository import RemoteDoctorRepository
+from doctor_workstation.video import tongue_screenshot as tongue
+from doctor_workstation.video import window
+
+JPEG = b"\xff\xd8synthetic-test-bytes\xff\xd9"
+URL = "data:image/jpeg;base64," + base64.b64encode(JPEG).decode()
+
+
+def response(request_id, content=JPEG, model="qwen"):
+ return {"request_id": request_id, "diagnosis_id": 71, "image_sha256": hashlib.sha256(content).hexdigest(),
+ "model": model, "model_label": "合成模型", "analysis": {"image_quality": "unusable", "quality_note": "未見清晰舌體。",
+ "features": [], "limitations": ["請重新截圖。"], "tcm_diagnosis": {
+ "status": "insufficient", "summary": "無法根據此圖辨證。", "candidates": [],
+ "missing_information": ["清晰舌象、症狀與脈象"]}}}
+
+
+class Repo:
+ def __init__(self):
+ self.calls = []
+ self.started = Event()
+ self.release = Event()
+ self.release.set()
+ self.change = lambda value: value
+ self.error = None
+
+ def analyze_tongue_screenshot(self, diagnosis_id, content, *, request_id, model="qwen"):
+ self.calls.append((diagnosis_id, content, request_id))
+ self.started.set()
+ assert self.release.wait(3)
+ if self.error:
+ raise self.error
+ return self.change(response(request_id, content, model))
+
+
+@pytest.fixture
+def service(monkeypatch):
+ monkeypatch.setattr(tongue, "_SLOTS", BoundedSemaphore(2))
+ repo = Repo()
+ controller = tongue.TongueScreenshotController(repo, diagnosis_id=71, enabled=True)
+ controller.register_capture(URL)
+ yield controller, repo
+ controller.close()
+ repo.release.set()
+ assert controller.wait(3)
+
+
+def test_capture_is_local_and_analysis_is_bound_without_chart_write(service):
+ controller, repo = service
+ assert repo.calls == []
+ request_id = str(uuid4())
+ controller.analyze(request_id, URL)
+ assert controller.wait(3)
+ result = controller.take_result()
+ assert result["ok"] and result["requestId"] == request_id
+ assert result["data"]["analysis"] == {
+ "image_quality": "unusable", "quality_note": "未见清晰舌体。", "features": [], "limitations": ["请重新截图。"],
+ "tcm_diagnosis": {"status": "insufficient", "summary": "无法根据此图辨证。", "candidates": [],
+ "missing_information": ["清晰舌象、症状与脉象"]}}
+ assert repo.calls == [(71, JPEG, request_id)]
+ controller.analyze(request_id, URL)
+ assert len(repo.calls) == 1 and controller.take_result() is None
+
+
+@pytest.mark.parametrize("data_url", ["https://test.invalid/image.jpg", "data:image/png;base64,AAAA",
+ "data:image/jpeg;base64,@@@@", "data:image/jpeg;base64,AAAA",
+ URL + "AAAA"])
+def test_arbitrary_or_changed_image_never_reaches_service(service, data_url):
+ controller, repo = service
+ controller.analyze(str(uuid4()), data_url)
+ assert controller.take_result()["ok"] is False
+ assert not repo.calls
+
+
+def test_permission_disabled_does_not_submit():
+ repo = Repo()
+ controller = tongue.TongueScreenshotController(repo, diagnosis_id=71, enabled=False)
+ controller.register_capture(URL)
+ controller.analyze(str(uuid4()), URL)
+ assert controller.take_result()["ok"] is False and not repo.calls
+ controller.close()
+
+
+@pytest.mark.parametrize("finish", ["cancel", "new_capture", "clear", "close"])
+def test_late_result_cannot_replace_current_preview(service, finish):
+ controller, repo = service
+ repo.release.clear()
+ request_id = str(uuid4())
+ controller.analyze(request_id, URL)
+ assert repo.started.wait(2)
+ if finish == "cancel":
+ controller.cancel(request_id)
+ elif finish == "new_capture":
+ controller.register_capture(URL)
+ elif finish == "clear":
+ controller.clear_capture()
+ else:
+ controller.close()
+ repo.release.set()
+ assert controller.wait(3) and controller.take_result() is None
+
+
+@pytest.mark.parametrize("change", [
+ lambda value: {**value, "diagnosis_id": 72},
+ lambda value: {**value, "request_id": str(uuid4())},
+ lambda value: {**value, "image_sha256": "a" * 64},
+ lambda value: {**value, "analysis": {**value["analysis"], "image_quality": "perfect"}},
+ lambda value: {**value, "analysis": {**value["analysis"], "features": [{"name": "舌苔", "observation": "白"}]}},
+ lambda value: {**value, "analysis": {**value["analysis"], "limitations": [123]}},
+])
+def test_invalid_identity_or_contradictory_findings_rejected(service, change):
+ controller, repo = service
+ repo.change = change
+ controller.analyze(str(uuid4()), URL)
+ assert controller.wait(3)
+ assert controller.take_result()["ok"] is False
+
+
+def test_timeout_and_raw_error_do_not_disclose_payload(service):
+ controller, repo = service
+ repo.error = ApiTimeoutError("private image/body/credential")
+ controller.analyze(str(uuid4()), URL)
+ assert controller.wait(3)
+ result = controller.take_result()
+ assert "超时" in result["message"] and "private" not in str(result)
+
+
+def test_global_concurrency_is_bounded(service, monkeypatch):
+ controller, repo = service
+ monkeypatch.setattr(tongue, "_SLOTS", BoundedSemaphore(0))
+ controller.analyze(str(uuid4()), URL)
+ assert "稍后" in controller.take_result()["message"] and not repo.calls
+
+
+@pytest.mark.parametrize("model", ["qwen", "openai"])
+def test_repository_uses_single_authenticated_temporary_multipart_request(model):
+ requests = []
+ request_id = str(uuid4())
+
+ def handler(request):
+ requests.append(request)
+ return httpx.Response(200, json={"code": 1, "data": response(request_id, model=model)})
+
+ with ApiClient("https://synthetic.test", token="synthetic-token", transport=httpx.MockTransport(handler)) as client:
+ result = RemoteDoctorRepository(client).analyze_tongue_screenshot(71, JPEG, request_id=request_id, model=model)
+ assert result["request_id"] == request_id and len(requests) == 1
+ request = requests[0]
+ assert request.url.path == "/adminapi/tcm.diagnosis/aiTongueScreenshot"
+ assert request.headers["token"] == "synthetic-token"
+ assert request.headers["content-type"].startswith("multipart/form-data;")
+ assert JPEG in request.content and request_id.encode() in request.content
+ assert model.encode() in request.content
+ assert request.extensions["timeout"]["read"] == 60.0
+
+
+@pytest.mark.parametrize("changes", [{"diagnosis_id": True}, {"diagnosis_id": 0}, {"request_id": "bad"},
+ {"content": b"not-jpeg"}, {"content": b"\xff\xd8" + b"a" * tongue.MAX_IMAGE_BYTES},
+ {"model": "unknown"}, {"model": ["qwen"]}])
+def test_repository_invalid_input_never_sends(changes):
+ args = {"diagnosis_id": 71, "content": JPEG, "request_id": str(uuid4()), **changes}
+ repo = RemoteDoctorRepository(SimpleNamespace())
+ with pytest.raises(ValueError):
+ repo.analyze_tongue_screenshot(**args)
+
+
+def test_bridge_has_dedicated_image_slot_and_trusted_document_gate():
+ messages = []
+ bridge = window._QtVideoBridge(messages.append, lambda _region: URL)
+ request_id = str(uuid4())
+ bridge.analyzeTongueScreenshot(request_id, URL)
+ assert messages == [{"source": "doctor-call", "event": "tongue-screenshot-analyze",
+ "requestId": request_id, "dataUrl": URL}]
+ calls = []
+ host = SimpleNamespace(_closing=False, _media_active=True, _start_requested=True, _call_cycle_closed=False,
+ _tongue_ai=SimpleNamespace(analyze=lambda *args: calls.append(args)),
+ _im_ai_context_is_trusted=lambda: False)
+ window._EmbeddedVideoWindow._handle_bridge_message(host, messages[0])
+ assert not calls
+ host._im_ai_context_is_trusted = lambda: True
+ window._EmbeddedVideoWindow._handle_bridge_message(host, messages[0])
+ assert calls == [(request_id, URL, "qwen")]
+ host._call_cycle_closed = True
+ window._EmbeddedVideoWindow._handle_bridge_message(host, messages[0])
+ assert len(calls) == 1
+
+
+def test_result_projection_discards_unexpected_fields():
+ request_id = str(uuid4())
+ value = response(request_id)
+ value["raw_model"] = "private"
+ value["analysis"]["diagnosis"] = "unsupported"
+ clean = tongue.validated_result(deepcopy(value), 71, request_id, hashlib.sha256(JPEG).hexdigest())
+ assert "private" not in str(clean) and "unsupported" not in str(clean)
+
+
+class DualRepo:
+ def __init__(self):
+ self.started = {model: Event() for model in ("qwen", "openai")}
+ self.release = {model: Event() for model in self.started}
+ self.calls = []
+ self.errors = {}
+
+ def analyze_tongue_screenshot(self, diagnosis_id, content, *, request_id, model="qwen"):
+ self.calls.append((model, request_id, content))
+ self.started[model].set()
+ assert self.release[model].wait(3)
+ if model in self.errors:
+ raise self.errors[model]
+ return response(request_id, content, model)
+
+
+@pytest.fixture
+def dual_service(monkeypatch):
+ monkeypatch.setattr(tongue, "_SLOTS", BoundedSemaphore(4))
+ repo = DualRepo()
+ controller = tongue.TongueScreenshotController(repo, diagnosis_id=71, enabled=True)
+ controller.register_capture(URL)
+ yield controller, repo
+ controller.close()
+ for event in repo.release.values():
+ event.set()
+ assert controller.wait(3)
+
+
+def test_both_models_run_concurrently_and_fast_result_arrives_while_other_waits(dual_service):
+ controller, repo = dual_service
+ ids = {model: str(uuid4()) for model in repo.started}
+ for model, request_id in ids.items():
+ controller.analyze(request_id, URL, model)
+ assert all(event.wait(1) for event in repo.started.values())
+ repo.release["openai"].set()
+ assert not controller.wait(0.2), "qwen is still waiting, GPT must not wait for it"
+ fast = controller.take_result()
+ assert fast["ok"] and fast["data"]["model"] == "openai"
+ assert fast["requestId"] == ids["openai"] and controller.take_result() is None
+ repo.release["qwen"].set()
+ assert controller.wait(2)
+ assert controller.take_result()["data"]["model"] == "qwen"
+ assert all(content == JPEG for _, _, content in repo.calls)
+
+
+def test_cancel_or_retry_one_model_retains_the_other_model_result(dual_service):
+ controller, repo = dual_service
+ qwen, gpt = str(uuid4()), str(uuid4())
+ controller.analyze(qwen, URL, "qwen")
+ controller.analyze(gpt, URL, "openai")
+ assert all(event.wait(1) for event in repo.started.values())
+ controller.cancel(qwen)
+ for event in repo.release.values():
+ event.set()
+ assert controller.wait(2)
+ retry = str(uuid4())
+ controller.analyze(retry, URL, "qwen")
+ assert controller.wait(2)
+ results = [controller.take_result(), controller.take_result()]
+ assert {item["requestId"] for item in results} == {gpt, retry}
+ assert all(item["ok"] for item in results)
+ assert controller.take_result() is None
+
+
+def test_one_model_failure_does_not_replace_other_success(dual_service):
+ controller, repo = dual_service
+ repo.errors["qwen"] = ApiTimeoutError("private failure body")
+ for event in repo.release.values():
+ event.set()
+ for model in repo.started:
+ controller.analyze(str(uuid4()), URL, model)
+ assert controller.wait(2)
+ results = {item["model"]: item for item in (controller.take_result(), controller.take_result())}
+ assert results["qwen"]["ok"] is False and "private" not in str(results["qwen"])
+ assert results["openai"]["ok"] is True
+
+
+@pytest.mark.parametrize("end", ["clear_capture", "close"])
+def test_replacing_or_closing_capture_discards_both_late_model_results(dual_service, end):
+ controller, repo = dual_service
+ for model in repo.started:
+ controller.analyze(str(uuid4()), URL, model)
+ assert all(event.wait(1) for event in repo.started.values())
+ getattr(controller, end)()
+ for event in repo.release.values():
+ event.set()
+ assert controller.wait(2) and controller.take_result() is None
+
+
+def test_swapped_model_identity_is_rejected(service):
+ controller, repo = service
+ repo.change = lambda value: {**value, "model": "qwen"}
+ controller.analyze(str(uuid4()), URL, "openai")
+ assert controller.wait(2)
+ assert controller.take_result()["ok"] is False
+
+
+def possible_pattern(request_id):
+ value = response(request_id)
+ value["analysis"].update({"image_quality": "limited", "features": [
+ {"name": "舌苔颜色", "observation": "合成白色示例"}], "tcm_diagnosis": {
+ "status": "possible_patterns", "summary": "合成辨證參考,需四診核實。",
+ "candidates": [{"name": "待核實的示例證候", "basis": ["舌苔颜色"], "verify": ["待詢問症狀與脈象"]}],
+ "missing_information": ["主訴、症狀與脈象"]}})
+ return value
+
+
+def test_tcm_reference_preserves_visible_feature_links_and_converts_to_simplified():
+ request_id = str(uuid4())
+ clean = tongue.validated_result(possible_pattern(request_id), 71, request_id, hashlib.sha256(JPEG).hexdigest())
+ diagnosis = clean["analysis"]["tcm_diagnosis"]
+ assert diagnosis["candidates"][0]["basis"] == ["舌苔颜色"]
+ assert diagnosis["summary"] == "合成辨证参考,需四诊核实。"
+ assert diagnosis["candidates"][0]["name"] == "待核实的示例证候"
+
+
+@pytest.mark.parametrize("change", [
+ lambda a: a.pop("tcm_diagnosis"),
+ lambda a: a.update(image_quality="unusable"),
+ lambda a: a["tcm_diagnosis"].update(status="confirmed"),
+ lambda a: a["tcm_diagnosis"].update(status="insufficient"),
+ lambda a: a["tcm_diagnosis"].update(candidates=[]),
+ lambda a: a["tcm_diagnosis"].update(missing_information=[]),
+ lambda a: a["tcm_diagnosis"]["candidates"][0].update(basis=["未观察到的舌体颜色"]),
+ lambda a: a["tcm_diagnosis"]["candidates"][0].update(basis=[]),
+ lambda a: a["tcm_diagnosis"]["candidates"][0].update(verify=[]),
+])
+def test_incomplete_unsupported_or_unobservable_tcm_references_fail_closed(change):
+ request_id = str(uuid4())
+ value = possible_pattern(request_id)
+ change(value["analysis"])
+ with pytest.raises(ValueError):
+ tongue.validated_result(value, 71, request_id, hashlib.sha256(JPEG).hexdigest())
+
+
+def test_model_bridge_accepts_only_configured_model_keys_and_forwards_identity():
+ messages = []
+ bridge = window._QtVideoBridge(messages.append, lambda _region: URL)
+ request_id = str(uuid4())
+ for model in ("unknown", None, ["qwen"]):
+ bridge.analyzeTongueScreenshotModel(request_id, URL, model)
+ assert messages == []
+ bridge.analyzeTongueScreenshotModel(request_id, URL, "openai")
+ assert messages == [{"source": "doctor-call", "event": "tongue-screenshot-analyze", "requestId": request_id,
+ "dataUrl": URL, "model": "openai"}]
+
+
+@pytest.mark.parametrize("message,visible", [
+ ("GPT 模型接口配置异常,请管理员检查 Dify 中的模型 API 地址。", True),
+ ("API upstream secret private patient detail", False),
+])
+def test_only_allowlisted_configuration_failure_is_exposed(service, message, visible):
+ controller, repo = service
+ repo.error = ApiBusinessError(message)
+ controller.analyze(str(uuid4()), URL, "openai")
+ assert controller.wait(2)
+ result = controller.take_result()
+ assert result["ok"] is False and (result["message"] == message) is visible
+
+
+@pytest.mark.parametrize("server_message,expected", [
+ ("截图分析超时,请稍后重试", "舌象分析超时,请重试。"),
+ ("截图分析结果格式无效,请重新截图后重试", "模型返回的舌象结果格式不符合要求,请重试此模型。"),
+ ("截图分析服务配置不完整", "舌象分析服务配置不完整,请管理员检查现有 AI 配置。"),
+ ("权限不足,无法使用诊单 AI 助手", "当前账号没有舌象分析权限。"),
+ ("upstream sensitive credential and patient text", "舌象分析未完成,请稍后重试。"),
+])
+def test_real_business_error_envelope_retains_safe_failure_category(monkeypatch, server_message, expected):
+ monkeypatch.setattr(tongue, "_SLOTS", BoundedSemaphore(2))
+ client = ApiClient("https://fixture.test", token="synthetic-token", transport=httpx.MockTransport(
+ lambda request: httpx.Response(200, json={"code": 0, "msg": server_message, "data": []})))
+ controller = tongue.TongueScreenshotController(RemoteDoctorRepository(client), diagnosis_id=71, enabled=True)
+ try:
+ controller.register_capture(URL)
+ controller.analyze(str(uuid4()), URL, "qwen")
+ assert controller.wait(2)
+ result = controller.take_result()
+ assert result["ok"] is False and result["message"] == expected
+ finally:
+ controller.close()
+ client.close()
diff --git a/app/tests/test_video_contract.py b/app/tests/test_video_contract.py
index 2f591bf58..6195a3e7d 100755
--- a/app/tests/test_video_contract.py
+++ b/app/tests/test_video_contract.py
@@ -570,7 +570,7 @@ def test_built_video_companion_contains_the_patient_case_rail() -> None:
assert "AI辅助、对话原文与患者资料" in scripts
-def test_companion_screenshot_requires_doctor_confirmation_before_upload() -> None:
+def test_companion_screenshot_requires_doctor_confirmation_before_chart_save() -> None:
source = (PROJECT_ROOT / "video_companion" / "src" / "App.vue").read_text(
encoding="utf-8"
)
@@ -581,13 +581,17 @@ def test_companion_screenshot_requires_doctor_confirmation_before_upload() -> No
"watch(", 1
)[0]
- assert "await captureVideoStage(videoStage.value)" in capture
+ assert "await props.onCaptureScreenshot(videoStage.value)" in capture
assert "generation === screenshotGeneration" in capture
assert "onSaveScreenshot" not in capture
assert "await props.onSaveScreenshot(screenshotPreview.value)" in confirm
- assert "确认画面后再保存到患者资料" in source
- assert "确认并上传" in source
- assert "取消" in source
+ preview = (PROJECT_ROOT / "video_companion" / "src" / "ScreenshotPreview.vue").read_text(
+ encoding="utf-8"
+ )
+ assert "@save=\"confirmScreenshot\"" in source
+ assert "截图会自动发送至千问和 GPT 进行 AI 分析" in preview
+ assert "只有点击“确认并上传”才会保存到患者资料" in preview
+ assert "取消" in preview
def test_companion_loads_im_history_without_an_empty_first_page_cursor() -> None:
diff --git a/app/video_companion/README.md b/app/video_companion/README.md
index 565f58e1d..d21c47b11 100755
--- a/app/video_companion/README.md
+++ b/app/video_companion/README.md
@@ -16,9 +16,15 @@ npm run build
## 宿主契约
-截屏通过 `qtVideoBridge.captureScreenshot(region, callback)` 获取 QtWebEngine 实际渲染的视频区域,保留主画面裁切、本地小窗、镜像和可见控件。`region` 为包含 `x`、`y`、`width`、`height`、`viewportWidth`、`viewportHeight` 的 JSON,使用 CSS 像素;宿主处理窗口缩放与显示 DPI,并返回包含 `dataUrl` 或 `error` 的 JSON。
+截屏按当前患者的用户 ID 匹配 SDK 远端视频,通过 Canvas 提取该视频的原始画面,保持比例、最长边不超过 1920 像素。画面不含医生小窗、按钮、字幕、姓名或侧栏,也不受大小窗切换、CSS 裁切或镜像影响。远端摄像头关闭、帧不可用或身份不匹配时明确报错,不回退到整窗截屏。
-截取仅生成内存预览,医生点击“确认并上传”后才调用 `saveScreenshot`。该功能需要同步更新桌面宿主与前端资源。
+前端通过 `qtVideoBridge.preparePatientScreenshot(targetUserId, dataUrl, callback)` 将 JPEG 交给宿主校验。宿主核对当前通话、患者身份及图片实际格式和尺寸,注册同一张图供 AI 分析,返回包含 `dataUrl` 或 `error` 的 JSON;注册本身不上传也不保存。新版前端和桌面宿主需要同步更新。
+
+截取后立即显示预览,通过 `analyzeTongueScreenshotModel(requestId, dataUrl, model)` 同时提交千问(`qwen`)和 GPT(`openai`)分析同一张 JPEG。两者使用现有 AI 服务中各自配置的模型应用;每个模型有独立请求 UUID、结果和错误状态,先完成的可先查看,切换标签直接读取缓存,重试仅重新调用当前模型。分析仅使用本张截图,不读取病历,不写诊单;只有医生点击“确认并上传”才调用 `saveScreenshot` 保存患者舌像资料。该功能需要同步更新桌面宿主、前端资源及服务端 `tcm.diagnosis/aiTongueScreenshot` 接口,并配置两个支持图片的模型应用。
+
+分析响应通过 `doctorConsultation.tongueScreenshotResult` 回传,绑定请求 UUID、模型、当前诊单和图片 SHA-256。响应包含可见舌象与 `tcm_diagnosis` 中医诊断参考:初步证候、引用本次舌象的依据、需要核实的问题和缺失资料;不足以辨证时明确返回 `insufficient`。图片不清晰或没有可辨认舌象时返回重拍提示,不生成特征或证候。关闭预览或切换上下文后丢弃两个模型的迟到结果;在途网络请求仍受独立超时限制。AI 结果不自动写入病历或发送给患者。
+
+每个模型请求共享 50 秒服务端总时限(含上传),桌面桥接等待上限为 65 秒。首次成功取得字符串答案但未通过结果契约校验时,若总时限还剩至少 3 秒,服务端会使用同一模型、同一已上传图片和匿名请求用户执行一次格式纠正;只追加固定规则,不回传原答案,不读取历史,也不重新上传或切换模型。纠正结果必须通过同一套完整校验,仍不合格就返回安全错误。上传、HTTP、鉴权、模型接口配置、超时、外层响应格式或答案超限错误均不触发纠正;首次结果合格只调用模型一次。
预览显示后发送 `screenshot-preview` 通知(`visible: true/false`)。宿主将小窗临时放大到正常窗口尺寸,取消、提交或结束通话后恢复原位置和大小;先抓图再放大,避免改变截图内容。图片按预览区域等比例放大显示。
diff --git a/app/video_companion/dist/assets/index-CTyzVIZB.js b/app/video_companion/dist/assets/index-BSFyyCww.js
similarity index 59%
rename from app/video_companion/dist/assets/index-CTyzVIZB.js
rename to app/video_companion/dist/assets/index-BSFyyCww.js
index ff8f0596b..f2be2d2f1 100755
--- a/app/video_companion/dist/assets/index-CTyzVIZB.js
+++ b/app/video_companion/dist/assets/index-BSFyyCww.js
@@ -1,4 +1,4 @@
-(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const I of document.querySelectorAll('link[rel="modulepreload"]'))c(I);new MutationObserver(I=>{for(const C of I)if(C.type==="childList")for(const f of C.addedNodes)f.tagName==="LINK"&&f.rel==="modulepreload"&&c(f)}).observe(document,{childList:!0,subtree:!0});function s(I){const C={};return I.integrity&&(C.integrity=I.integrity),I.referrerPolicy&&(C.referrerPolicy=I.referrerPolicy),I.crossOrigin==="use-credentials"?C.credentials="include":I.crossOrigin==="anonymous"?C.credentials="omit":C.credentials="same-origin",C}function c(I){if(I.ep)return;I.ep=!0;const C=s(I);fetch(I.href,C)}})();var yg=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ZW(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}function zU(t){if(t.__esModule)return t;var i=t.default;if(typeof i=="function"){var s=function c(){return this instanceof c?Reflect.construct(i,arguments,this.constructor):i.apply(this,arguments)};s.prototype=i.prototype}else s={};return Object.defineProperty(s,"__esModule",{value:!0}),Object.keys(t).forEach(function(c){var I=Object.getOwnPropertyDescriptor(t,c);Object.defineProperty(s,c,I.get?I:{enumerable:!0,get:function(){return t[c]}})}),s}var uY={exports:{}},GsA=uY.exports,U8;function bsA(){return U8||(U8=1,function(t,i){(function(s,c){t.exports=c()})(GsA,function(){const s=n=>n===void 0,c=n=>typeof n=="string",I=n=>{var r;return(r=Object.prototype.toString.call(n).match(/^\[object (.*)\]$/))===null||r===void 0?void 0:r[1].toLowerCase()},C=n=>typeof Array.isArray=="function"?Array.isArray(n):I(n)==="array",f=n=>n!==null&&typeof n=="object",w=n=>C(n)||f(n),_=n=>{if(typeof n!="string")return!1;const r=n[0];return!/[^a-zA-Z0-9]/.test(r)},N=n=>{if(typeof n!="object"||n===null)return!1;const r=Object.getPrototypeOf(n);if(r===null)return!0;let g=r;for(;Object.getPrototypeOf(g)!==null;)g=Object.getPrototypeOf(g);return r===g};function L(n=99999999){return Math.round(Math.random()*n)}const q=(n,r,g,u)=>{if(!w(n)||!w(r))return 0;let E=0;const m=Object.keys(r);let D;for(let v=0,T=m.length;v"u"&&typeof uni.requireNativePlugin=="function",Hi=ze&&typeof wx.miniapp=="object",Vi=typeof uni<"u",ws=Qt&&typeof tt.enterChat=="function",Ui=ze||Ve||Qt||Pt||ii||ao||bi,es=typeof window>"u"&&!Ui&&typeof yg<"u"&&yg.NativeScriptGlobals!==void 0,Ro=typeof yg<"u"&&(yg.nativeModuleProxy!==void 0||yg.ReactNative!==void 0),oo=typeof wx<"u"&&typeof wx.getAccountInfoSync=="function"&&!!wx.getAccountInfoSync().plugin,$t=typeof uni<"u"?!Ui:typeof window<"u"&&!Ui&&!Ro,so=Ve?qq:Qt?tt:Pt?swan:ii?my:ze?wx:ao?uni:bi?jd:{},Ri=$t&&window&&window.navigator&&window.navigator.userAgent||"",Qs=/(micromessenger|webbrowser)/i.test(Ri),HA=function(){let n="WEB";return Qs?n="WEB":Ve?n="QQ_MP":Qt?n="TT_MP":Pt?n="BAIDU_MP":ii?n="ALI_MP":ze?n=Hi?"DONUT_NATIVE_APP":"WX_MP":ao?n="UNI_NATIVE_APP":es?n="NS_NATIVE_APP":Ro&&(n="RN_NATIVE_APP"),tA[n]}(),Ie=/iPad/i.test(Ri),Ye=/iPhone/i.test(Ri)&&!Ie,Lt=/iPod/i.test(Ri),at=Ye||Ie||Lt,Et=function(){const n=Ri.match(/OS (\d+)_/i);return n&&n[1]?n[1]:null}(),ei=/Android/i.test(Ri),Jt=function(){const n=Ri.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i);if(!n)return null;const r=n[1]&&parseFloat(n[1]),g=n[2]&&parseFloat(n[2]);return r&&g?parseFloat(`${n[1]}.${n[2]}`):r||null}(),Le=/Firefox/i.test(Ri),$e=/Edge/i.test(Ri),Tt=!$e&&/Chrome/i.test(Ri),Gt=/MSIE/.test(Ri)||Ri.indexOf("Trident")>-1&&Ri.indexOf("rv:11.0")>-1,Ji=function(){const n=/MSIE\s(\d+)\.\d/.exec(Ri);let r=n&&parseFloat(n[1]);return!r&&/Trident\/7.0/i.test(Ri)&&/rv:11.0/.test(Ri)&&(r=11),r}(),po=/Safari/i.test(Ri)&&!Tt&&!ei&&!$e,To=/Windows/i.test(Ri),zi=/MAC OS X/i.test(Ri),wo=$t&&typeof Worker<"u"&&!Gt,ds=ei||at,rs=function(){if(typeof window>"u"||window.navigator===void 0)return!1;const{standalone:n}=window.navigator;return!(!at||n||po)}();function Vo(){let n="unknown";if(zi&&(n="mac"),To&&(n="windows"),at&&(n="ios"),ei&&(n="android"),Ui)try{const{platform:r}=so.getSystemInfoSync();r!==void 0&&(n=r)}catch(r){console.error(r)}return n}const Hs=typeof process<"u"&&process.versions!==void 0&&process.versions.node!==void 0&&typeof window>"u";function vo(n,r){var g={};for(var u in n)Object.prototype.hasOwnProperty.call(n,u)&&r.indexOf(u)<0&&(g[u]=n[u]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function"){var E=0;for(u=Object.getOwnPropertySymbols(n);E{so.request({url:g,data:u,method:r,timeout:E,header:{"content-type":Ur},success:v=>m(v.data),fail:()=>D(new Error(`{"message":"Network error","code":${xn}}`))})}):Hs?void 0:new Promise((m,D)=>{const v=new XMLHttpRequest,T=setTimeout(()=>{v.abort(),D(new Error(`{"message":"Request timeout","code":${Zn}}`))},E);v.onreadystatechange=function(){if(v.readyState===4)if(clearTimeout(T),v.status===200||v.status===304)try{m(v.responseText?JSON.parse(v.responseText):null)}catch{m(v.responseText)}else D(new Error(`{"message":"Network error","code":${xn}}`))},v.open(r,g,!0),v.setRequestHeader("Content-type",Ur),v.send(u||null)})})}function ts(n){if(n==null)return!0;if(typeof n=="boolean")return!1;if(typeof n=="number")return n===0;if(typeof n=="string"||typeof n=="function"||Array.isArray(n))return n.length===0;if(n instanceof Error)return n.message==="";if(N(n)){for(const r in n)if(Object.prototype.hasOwnProperty.call(n,r))return!1;return!0}return(Object.prototype.toString.call(n)==="[object Map]"||Object.prototype.toString.call(n)==="[object Set]"||Object.prototype.toString.call(n)==="[object File]")&&n.size===0}function Kn(n,r){if(n===null||typeof n!="object")return n;const g=r||new WeakMap;if(g.has(n))return g.get(n);if(n instanceof Date)return new Date(n.getTime());if(n instanceof RegExp)return new RegExp(n.source,n.flags);if(n instanceof Map){const m=new Map;return g.set(n,m),n.forEach((D,v)=>{m.set(Kn(v,g),Kn(D,g))}),m}if(n instanceof Set){const m=new Set;return g.set(n,m),n.forEach(D=>{m.add(Kn(D,g))}),m}if(Array.isArray(n)){const m=[];return g.set(n,m),n.forEach(D=>{m.push(Kn(D,g))}),m}const u=Object.getPrototypeOf(n),E=Object.create(u);return g.set(n,E),[...Object.getOwnPropertyNames(n),...Object.getOwnPropertySymbols(n)].forEach(m=>{if(m==="__ob__"||m==="__v_skip"||m==="__v_isRef"||m==="__v_isReadonly")return;const D=Object.getOwnPropertyDescriptor(n,m);D&&(D.get||D.set?Object.defineProperty(E,m,D):E[m]=Kn(n[m],g))}),E}function _s(n,r,g){const u=new WeakSet,E=(m,D)=>{if(r&&(D=r(m,D)),D===void 0)return"undefined";if(D===null)return null;if(Number.isNaN(D))return"NaN";if(D===1/0)return"Infinity";if(D===-1/0)return"-Infinity";if(typeof D=="function")return`[Function: ${D.name||"anonymous"}]`;if(typeof D=="symbol")return D.toString();if(typeof D=="bigint")return`${D.toString()}n`;if(typeof D=="object"&&D!==null){if(u.has(D))return"[Circular]";u.add(D)}return D instanceof Date?D.toISOString():D instanceof Error?{name:D.name,message:D.message}:D instanceof Map?{dataType:"Map",value:Array.from(D.entries())}:D instanceof Set?{dataType:"Set",value:Array.from(D.values())}:D};try{return JSON.stringify(n,E,g)}catch(m){return console.error("Failed to stringify:",m),""}}function ln(){let n,r;return{promise:new Promise((g,u)=>{n=g,r=u}),resolve:n,reject:r}}var qt,Xa=Object.freeze({__proto__:null,ANDROID_VERSION:Jt,IE_VERSION:Ji,IN_ALIPAY_MINI_APP:ii,IN_BAIDU_MINI_APP:Pt,IN_BROWSER:$t,IN_DONUT_NATIVE_APP:Hi,IN_FEISHU_MINI_APP:ws,IN_JD_MINI_APP:bi,IN_MINI_APP:Ui,IN_NODE:Hs,IN_NS_NATIVE_APP:es,IN_QQ_MINI_APP:Ve,IN_RN_APP:Ro,IN_TT_MINI_APP:Qt,IN_TT_MINI_GAME:Ai,IN_UNI_APP:Vi,IN_UNI_NATIVE_APP:ao,IN_WX_MINI_APP:ze,IN_WX_MINI_APP_DESK:ot,IN_WX_MINI_GAME:ge,IN_WX_MINI_PLUGIN:oo,IOS_VERSION:Et,IS_ANDROID:ei,IS_CHROME:Tt,IS_EDGE:$e,IS_FIREFOX:Le,IS_IE:Gt,IS_IOS:at,IS_IPAD:Ie,IS_IPHONE:Ye,IS_IPOD:Lt,IS_MAC:zi,IS_SAFARI:po,IS_WECHAT:Qs,IS_WIN:To,IS_WORKER_AVAILABLE:wo,MINI_APP_NAMESPACE:so,USER_AGENT:Ri,base16EncodeBinaryString:lA,deepCopyWithMethods:Kn,deepMerge:q,generatePromise:ln,getPlatformType:Vo,getType:I,httpRequest:qi,isArray:C,isArrayOrObject:w,isEmpty:ts,isH5:ds,isIOSWebView:rs,isNumber:n=>n!==null&&(typeof n=="number"&&!Number.isNaN(n-0)||typeof n=="object"&&n.constructor===Number),isObject:f,isPlainObject:N,isString:c,isUndefined:s,isUniIOSApp:function(){return ao&&uni.getDeviceInfo().platform.toLocaleLowerCase()==="ios"},isValidRequestKey:_,platform:HA,randomInt:L,randomString:function(){const n="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";let r="";for(let g=32;g>0;--g)r+=n[Math.floor(62*Math.random())];return r},safeStringify:_s});class Ln{constructor(){this.listeners={}}on(r,g,u){this.listeners[r]||(this.listeners[r]=[]),this.listeners[r].push({fn:g,context:u})}off(r,g,u){var E;g&&(this.listeners[r]=(E=this.listeners[r])===null||E===void 0?void 0:E.filter(m=>{const D=m.fn===g,v=!u||m.context===u;return!(D&&v)}))}emit(r,...g){const u=this.listeners[r];u&&u.forEach(E=>{const{fn:m,context:D}=E;try{m.apply(D,g)}catch(v){console.warn(`Error in event handler for ${r} error: ${_s(v)}`)}})}once(r,g,u){const E=(...m)=>{g.apply(u,m),this.off(r,E)};this.on(r,E)}}(function(n){n.BUSINESS_COMMAND="business_command",n.C2C_REALTIME_MESSAGE="c2c_realtime_message",n.C2C_MESSAGE_MODIFIED="c2c_message_modified",n.C2C_REVOKED_MESSAGE="c2c_message_revoked",n.GROUP_REALTIME_MESSAGE="group_realtime_message",n.GROUP_MESSAGE_MODIFIED="group_message_modified",n.GROUP_MESSAGE_REVOKED="group_message_revoked",n.C2C_MESSAGE_READ_RECEIPT="c2c_message_read_receipt",n.MESSAGE_REACTION_UPDATED="message_reaction_updated",n.MESSAGE_REACTION_UPDATED_SYNC="message_reaction_updated_sync",n.GROUP_AT_TIPS="group_at_tips",n.USER_STATUS_UPDATE="user_status_update",n.FRIEND_LIST_MODIFIED="friend_list_modified",n.PROFILE_MODIFIED="profile_modified",n.CONV_MODIFIED="conversation_modified",n.GROUP_TIPS_NOTIFICATION="group_tips_notification",n.GROUP_MESSAGE_READ_RECEIPT="group_message_read_receipt",n.GROUP_MESSAGE_READ_SYNC="group_message_read_sync",n.GROUP_SYSTEM_NOTIFICATION="group_system_notification",n.C2C_MESSAGE_PEER_READ="c2c_message_peer_read",n.C2C_MESSAGE_READ_SYNC="c2c_message_read_sync",n.C2C_REMIND_TYPE_SYNC="c2c_remind_type_sync",n.FOLLOW_LIST_UPDATED="follow_list_updated",n.MESSAGE_EXTENSIONS_UPDATED="message_extensions_updated",n.ALL_MESSAGE_READ="all_message_read",n.CONVERSATION_MARK_UPDATED="conversation_mark_updated",n.CONVERSATION_GROUP_ADD="conversation_group_add",n.CONVERSATION_GROUP_DELETED="conversation_group_deleted",n.CONVERSATION_GROUP_UPDATED="conversation_group_updated",n.ALL_RECEIVE_MESSAGE_OPTION="all_receive_message_option",n.TOPIC_AT_TIPS="topic_at_tips",n.TOPIC_TIPS_NOTIFICATION="topic_tips_notification",n.TOPIC_SYSTEM_NOTIFICATION="topic_system_notification",n.TOPIC_MESSAGE_READ_SYNC="topic_message_read_sync",n.TOPIC_LATEST_MESSAGE="topic_latest_message",n.GROUP_MESSAGE_PINNED="group_message_pinned"})(qt||(qt={}));const hn=[16,17];function Ls(n){var r;const g=[];return(r=n?.GroupTips)===null||r===void 0||r.forEach(u=>{var E;u.GroupInfo.MillionGroupFlag===2?g.push(qt.TOPIC_TIPS_NOTIFICATION):hn.includes((E=u?.MsgBody)===null||E===void 0?void 0:E.OpType)?g.push(qt.GROUP_MESSAGE_PINNED):g.push(qt.GROUP_TIPS_NOTIFICATION)}),g}const Ir=[{conditions:[{type:"event",value:100}],subType:qt.BUSINESS_COMMAND},{conditions:[{type:"event",value:24}],subType:qt.ALL_RECEIVE_MESSAGE_OPTION},{conditions:[{type:"event",value:26}],subType:qt.TOPIC_LATEST_MESSAGE},{conditions:[{type:"hasKey",value:"C2cMsgArray"}],subType:qt.C2C_REALTIME_MESSAGE},{conditions:[{type:"hasKey",value:"C2cMsgModNotifys"}],subType:qt.C2C_MESSAGE_MODIFIED},{conditions:[{type:"hasKey",value:"ProfileDataMod"}],subType:qt.PROFILE_MODIFIED},{conditions:[{type:"hasKey",value:"UserStatusList"}],subType:qt.USER_STATUS_UPDATE},{conditions:[{type:"hasKey",value:"FriendListMod"}],subType:qt.FRIEND_LIST_MODIFIED},{conditions:[{type:"hasKey",value:"GroupMsgArray"}],subType:qt.GROUP_REALTIME_MESSAGE},{conditions:[{type:"hasKey",value:"GroupMsgModNotifys"}],subType:qt.GROUP_MESSAGE_MODIFIED},{conditions:[{type:"hasKey",value:"C2cNotifyMsgArray"}],subTypeParser:function(n){var r;const g=[];return(r=n?.C2cNotifyMsgArray)===null||r===void 0||r.forEach(u=>{u.WithdrawC2cMsgNotify&&g.push(qt.C2C_REVOKED_MESSAGE),u.C2cReadedReceipt&&g.push(qt.C2C_MESSAGE_PEER_READ),u.ReadC2cMsgNotify&&g.push(qt.C2C_MESSAGE_READ_SYNC),u.MuteNotificationsSync&&g.push(qt.C2C_REMIND_TYPE_SYNC)}),g}},{conditions:[{type:"hasKey",value:"GroupTips"},{type:"event",value:4}],subTypeParser:Ls},{conditions:[{type:"hasKey",value:"GroupTips"},{type:"event",value:5}],subTypeParser:function(n){var r;const g=[];return(r=n?.GroupTips)===null||r===void 0||r.forEach(u=>{Array.isArray(u.MsgBody.GroupWithdrawInfoArray)?g.push(qt.GROUP_MESSAGE_REVOKED):Array.isArray(u.MsgBody.GroupMsgReceiptList)?g.push(qt.GROUP_MESSAGE_READ_RECEIPT):Array.isArray(u.MsgBody.GroupReadInfoArray)?u.MsgBody.GroupReadInfoArray[0].TopicId?g.push(qt.TOPIC_MESSAGE_READ_SYNC):g.push(qt.GROUP_MESSAGE_READ_SYNC):u.GroupInfo.MillionGroupFlag===2?g.push(qt.TOPIC_SYSTEM_NOTIFICATION):g.push(qt.GROUP_SYSTEM_NOTIFICATION)}),g}},{conditions:[{type:"hasKey",value:"GroupTips"},{type:"event",value:6}],subTypeParser:Ls},{conditions:[{type:"hasKey",value:"GroupTips"},{type:"event",value:12}],subTypeParser:function(n){var r;const g=[];return(r=n?.GroupTips)===null||r===void 0||r.forEach(u=>{const{GroupAtTips:{TopicId:E}}=u;E?g.push(qt.TOPIC_AT_TIPS):g.push(qt.GROUP_AT_TIPS)}),g}},{conditions:[{type:"hasKey",value:"RecentContactMod"}],subTypeParser:function(n){var r;const g=[];return(r=n?.RecentContactMod)===null||r===void 0||r.forEach(u=>{switch(u.PushType){case We.CONV_MARK_UPDATED:g.push(qt.CONVERSATION_MARK_UPDATED);break;case We.CONV_GROUP_ADDED:g.push(qt.CONVERSATION_GROUP_ADD);break;case We.CONV_GROUP_DELETED:g.push(qt.CONVERSATION_GROUP_DELETED);break;case We.CONV_GROUP_UPDATED:g.push(qt.CONVERSATION_GROUP_UPDATED);break;default:g.push(qt.CONV_MODIFIED)}}),g}},{conditions:[{type:"hasKey",value:"MsgReactionNotifyList"}],subType:qt.MESSAGE_REACTION_UPDATED},{conditions:[{type:"hasKey",value:"MsgReactionNotify"}],subType:qt.MESSAGE_REACTION_UPDATED_SYNC},{conditions:[{type:"hasKey",value:"C2cMsgInfo"}],subType:qt.C2C_MESSAGE_READ_RECEIPT},{conditions:[{type:"hasKey",value:"FollowChangeList"}],subType:qt.FOLLOW_LIST_UPDATED},{conditions:[{type:"hasKey",value:"MsgExtensionNotify"}],subType:qt.MESSAGE_EXTENSIONS_UPDATED},{conditions:[{type:"hasKey",value:"C2CReadAllMsg"}],subType:qt.ALL_MESSAGE_READ}];var Us;function rr(n){var r;const g=Array.isArray((r=n?.body)===null||r===void 0?void 0:r.EventArray)?n.body.EventArray:[],u=[];return g.forEach(E=>{E.Flag=n.body.Flag;const m=Ir.find(v=>v.conditions.every(T=>{switch(T.type){case"event":return E.Event===T.value;case"hasKey":return Object.prototype.hasOwnProperty.call(E,T.value);default:return!1}}));if(!m)return null;let D=[];typeof m.subTypeParser=="function"?D=m.subTypeParser(E):m.subType&&(D=m.subType),Array.isArray(D)?D.forEach(v=>{u.push({type:`${Us.SERVER_PUSH_MESSAGE}:${v}`,data:E})}):u.push({type:`${Us.SERVER_PUSH_MESSAGE}:${D}`,data:E})}),u}(function(n){n.SERVER_PUSH_MESSAGE="im_open_push.msg_push",n.SERVER_PUSH_MESSAGE_MULTIPLE="im_open_push.multi_msg_push_ws",n.ERROR="error"})(Us||(Us={}));const fo={[Us.SERVER_PUSH_MESSAGE]:rr,[Us.SERVER_PUSH_MESSAGE_MULTIPLE]:rr,[Us.ERROR]:function(n){const{errorCode:r}=n;return[{type:`error:${r}`,data:n}]}},$s=new class{constructor(){this._outerEventEmitter=null,this._innerEventEmitter=null,this._filteredCallbackMap=new Map,this._outerEventEmitter=new Ln,this._innerEventEmitter=new Ln,this.InnerEventSubType=qt}subscribeInnerEvent(n,r,g,u,E){var m;let D,v,T,P;["string","number"].includes(typeof r)?(T=`${n}:${r}`,P=g,v=u,D=E):(T=n,P=r,v=g,D=typeof u=="function"?u:void 0),D?this._subscribeWithFilter(T,P,v,D):(m=this._innerEventEmitter)===null||m===void 0||m.on(T,P,v)}emitInnerEvent(n,r){var g,u;if((g=this._innerEventEmitter)===null||g===void 0||g.emit(n,r),Object.keys(fo).includes(n)){const E=(u=fo[n])===null||u===void 0?void 0:u.call(fo,r);E?.forEach(m=>{var D;m&&((D=this._innerEventEmitter)===null||D===void 0||D.emit(m.type,m.data))})}}subscribeOuterEvent(n,r,g){var u;(u=this._outerEventEmitter)===null||u===void 0||u.on(n,r,g)}unSubscribeOuterEvent(n,r,g){var u;(u=this._outerEventEmitter)===null||u===void 0||u.off(n,r,g)}unSubscribeInnerEvent(n,r,g,u){if(["string","number"].includes(typeof r)){const E=g,m=`${n}:${r}`;this._unsubscribeEvent(m,E,u)}else{const E=r;this._unsubscribeEvent(n,E,g)}}emitOuterEvent(n,r){var g;(g=this._outerEventEmitter)===null||g===void 0||g.emit(n,r)}getOuterEventEmitter(){return this._outerEventEmitter}rest(){this._outerEventEmitter=null,this._innerEventEmitter=null}_subscribeWithFilter(n,r,g,u){var E;const m=D=>{u.call(g,D)&&r.call(g,D)};this._filteredCallbackMap.has(n)||this._filteredCallbackMap.set(n,[]),this._filteredCallbackMap.get(n).push({originalCallback:r,filteredCallback:m,filter:u,context:g}),(E=this._innerEventEmitter)===null||E===void 0||E.on(n,m,g)}_unsubscribeEvent(n,r,g){var u,E;const m=this._filteredCallbackMap.get(n);if(m){const D=m.findIndex(v=>v.originalCallback===r&&v.context===g);if(D!==-1){const{filteredCallback:v}=m[D];return(u=this._innerEventEmitter)===null||u===void 0||u.off(n,v,g),m.splice(D,1),void(m.length===0&&this._filteredCallbackMap.delete(n))}}(E=this._innerEventEmitter)===null||E===void 0||E.off(n,r,g)}};class Sc{constructor(){this._socket=null}connectSocket(r){return this._socket=new WebSocket(r),this._socket}send(r){var g,u;try{(g=this._socket)===null||g===void 0||g.send(r)}catch(E){(u=this._onSendFail)===null||u===void 0||u.call(this,E)}}bindSocketHandlers(r){const{onOpen:g,onMessage:u,onClose:E,onError:m,onSendFail:D}=r;this._socket&&(this._socket.binaryType="arraybuffer",this._socket.onopen=g,this._socket.onmessage=u,this._socket.onclose=E,this._socket.onerror=m,this._onSendFail=D)}unbindSocketHandlers(){this._socket&&(this._socket.onopen=null,this._socket.onmessage=null,this._socket.onclose=null,this._socket.onerror=null)}disconnect(){this._socket&&(this._socket.close(),this._socket=null)}}class An{constructor(r){this._onError=r.onError}connectSocket(r){const g=this;return this._socket=so.connectSocket({url:r,header:{"content-type":"application/json"},complete:()=>{},fail:u=>g._onError(u)}),this._socket}send(r){var g;(g=this._socket)===null||g===void 0||g.send({data:r,fail:this._onSendFail})}bindSocketHandlers(r){const{onOpen:g,onMessage:u,onClose:E,onError:m,onSendFail:D}=r;this._socket&&(this._socket.onClose(E),this._socket.onOpen(g),this._socket.onMessage(u),this._socket.onError(m),this._onSendFail=D)}unbindSocketHandlers(){this._socket&&(this._socket.onClose(()=>{}),this._socket.onOpen(()=>{}),this._socket.onMessage(()=>{}),this._socket.onError(()=>{}))}disconnect(){this._socket&&(this._socket.close(),this._socket=null)}}const ur="CONNECT",Ds="SEND",Sg="DISCONNECT",fs="OPEN",re="MESSAGE",At="CLOSE",Zt="ERROR",Jo="SEND_FAIL";class ha{constructor(){this._worker=null,this._blobUrl=null}connectSocket(r){const g=new Blob([`
+(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const I of document.querySelectorAll('link[rel="modulepreload"]'))c(I);new MutationObserver(I=>{for(const C of I)if(C.type==="childList")for(const m of C.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&c(m)}).observe(document,{childList:!0,subtree:!0});function n(I){const C={};return I.integrity&&(C.integrity=I.integrity),I.referrerPolicy&&(C.referrerPolicy=I.referrerPolicy),I.crossOrigin==="use-credentials"?C.credentials="include":I.crossOrigin==="anonymous"?C.credentials="omit":C.credentials="same-origin",C}function c(I){if(I.ep)return;I.ep=!0;const C=n(I);fetch(I.href,C)}})();var Dg=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function i4(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function $U(e){if(e.__esModule)return e;var i=e.default;if(typeof i=="function"){var n=function c(){return this instanceof c?Reflect.construct(i,arguments,this.constructor):i.apply(this,arguments)};n.prototype=i.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(c){var I=Object.getOwnPropertyDescriptor(e,c);Object.defineProperty(n,c,I.get?I:{enumerable:!0,get:function(){return e[c]}})}),n}var hY={exports:{}},YnA=hY.exports,V8;function VnA(){return V8||(V8=1,function(e,i){(function(n,c){e.exports=c()})(YnA,function(){const n=s=>s===void 0,c=s=>typeof s=="string",I=s=>{var r;return(r=Object.prototype.toString.call(s).match(/^\[object (.*)\]$/))===null||r===void 0?void 0:r[1].toLowerCase()},C=s=>typeof Array.isArray=="function"?Array.isArray(s):I(s)==="array",m=s=>s!==null&&typeof s=="object",R=s=>C(s)||m(s),_=s=>{if(typeof s!="string")return!1;const r=s[0];return!/[^a-zA-Z0-9]/.test(r)},T=s=>{if(typeof s!="object"||s===null)return!1;const r=Object.getPrototypeOf(s);if(r===null)return!0;let g=r;for(;Object.getPrototypeOf(g)!==null;)g=Object.getPrototypeOf(g);return r===g};function b(s=99999999){return Math.round(Math.random()*s)}const J=(s,r,g,u)=>{if(!R(s)||!R(r))return 0;let E=0;const f=Object.keys(r);let D;for(let v=0,N=f.length;v"u"&&typeof uni.requireNativePlugin=="function",Ji=Xe&&typeof wx.miniapp=="object",Vi=typeof uni<"u",wn=pt&&typeof tt.enterChat=="function",Fi=Xe||Je||pt||Pt||ii||ao||ki,en=typeof window>"u"&&!Fi&&typeof Dg<"u"&&Dg.NativeScriptGlobals!==void 0,Ro=typeof Dg<"u"&&(Dg.nativeModuleProxy!==void 0||Dg.ReactNative!==void 0),oo=typeof wx<"u"&&typeof wx.getAccountInfoSync=="function"&&!!wx.getAccountInfoSync().plugin,Ai=typeof uni<"u"?!Fi:typeof window<"u"&&!Fi&&!Ro,no=Je?qq:pt?tt:Pt?swan:ii?my:Xe?wx:ao?uni:ki?jd:{},Ri=Ai&&window&&window.navigator&&window.navigator.userAgent||"",pn=/(micromessenger|webbrowser)/i.test(Ri),jA=function(){let s="WEB";return pn?s="WEB":Je?s="QQ_MP":pt?s="TT_MP":Pt?s="BAIDU_MP":ii?s="ALI_MP":Xe?s=Ji?"DONUT_NATIVE_APP":"WX_MP":ao?s="UNI_NATIVE_APP":en?s="NS_NATIVE_APP":Ro&&(s="RN_NATIVE_APP"),eA[s]}(),ue=/iPad/i.test(Ri),He=/iPhone/i.test(Ri)&&!ue,Lt=/iPod/i.test(Ri),ct=He||ue||Lt,Ct=function(){const s=Ri.match(/OS (\d+)_/i);return s&&s[1]?s[1]:null}(),ei=/Android/i.test(Ri),Ht=function(){const s=Ri.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i);if(!s)return null;const r=s[1]&&parseFloat(s[1]),g=s[2]&&parseFloat(s[2]);return r&&g?parseFloat(`${s[1]}.${s[2]}`):r||null}(),Le=/Firefox/i.test(Ri),it=/Edge/i.test(Ri),Tt=!it&&/Chrome/i.test(Ri),Gt=/MSIE/.test(Ri)||Ri.indexOf("Trident")>-1&&Ri.indexOf("rv:11.0")>-1,Hi=function(){const s=/MSIE\s(\d+)\.\d/.exec(Ri);let r=s&&parseFloat(s[1]);return!r&&/Trident\/7.0/i.test(Ri)&&/rv:11.0/.test(Ri)&&(r=11),r}(),po=/Safari/i.test(Ri)&&!Tt&&!ei&&!it,To=/Windows/i.test(Ri),Zi=/MAC OS X/i.test(Ri),wo=Ai&&typeof Worker<"u"&&!Gt,Cn=ei||ct,an=function(){if(typeof window>"u"||window.navigator===void 0)return!1;const{standalone:s}=window.navigator;return!(!ct||s||po)}();function Vo(){let s="unknown";if(Zi&&(s="mac"),To&&(s="windows"),ct&&(s="ios"),ei&&(s="android"),Fi)try{const{platform:r}=no.getSystemInfoSync();r!==void 0&&(s=r)}catch(r){console.error(r)}return s}const jn=typeof process<"u"&&process.versions!==void 0&&process.versions.node!==void 0&&typeof window>"u";function vo(s,r){var g={};for(var u in s)Object.prototype.hasOwnProperty.call(s,u)&&r.indexOf(u)<0&&(g[u]=s[u]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function"){var E=0;for(u=Object.getOwnPropertySymbols(s);E{no.request({url:g,data:u,method:r,timeout:E,header:{"content-type":Fr},success:v=>f(v.data),fail:()=>D(new Error(`{"message":"Network error","code":${xs}}`))})}):jn?void 0:new Promise((f,D)=>{const v=new XMLHttpRequest,N=setTimeout(()=>{v.abort(),D(new Error(`{"message":"Request timeout","code":${Zs}}`))},E);v.onreadystatechange=function(){if(v.readyState===4)if(clearTimeout(N),v.status===200||v.status===304)try{f(v.responseText?JSON.parse(v.responseText):null)}catch{f(v.responseText)}else D(new Error(`{"message":"Network error","code":${xs}}`))},v.open(r,g,!0),v.setRequestHeader("Content-type",Fr),v.send(u||null)})})}function tn(s){if(s==null)return!0;if(typeof s=="boolean")return!1;if(typeof s=="number")return s===0;if(typeof s=="string"||typeof s=="function"||Array.isArray(s))return s.length===0;if(s instanceof Error)return s.message==="";if(T(s)){for(const r in s)if(Object.prototype.hasOwnProperty.call(s,r))return!1;return!0}return(Object.prototype.toString.call(s)==="[object Map]"||Object.prototype.toString.call(s)==="[object Set]"||Object.prototype.toString.call(s)==="[object File]")&&s.size===0}function Ks(s,r){if(s===null||typeof s!="object")return s;const g=r||new WeakMap;if(g.has(s))return g.get(s);if(s instanceof Date)return new Date(s.getTime());if(s instanceof RegExp)return new RegExp(s.source,s.flags);if(s instanceof Map){const f=new Map;return g.set(s,f),s.forEach((D,v)=>{f.set(Ks(v,g),Ks(D,g))}),f}if(s instanceof Set){const f=new Set;return g.set(s,f),s.forEach(D=>{f.add(Ks(D,g))}),f}if(Array.isArray(s)){const f=[];return g.set(s,f),s.forEach(D=>{f.push(Ks(D,g))}),f}const u=Object.getPrototypeOf(s),E=Object.create(u);return g.set(s,E),[...Object.getOwnPropertyNames(s),...Object.getOwnPropertySymbols(s)].forEach(f=>{if(f==="__ob__"||f==="__v_skip"||f==="__v_isRef"||f==="__v_isReadonly")return;const D=Object.getOwnPropertyDescriptor(s,f);D&&(D.get||D.set?Object.defineProperty(E,f,D):E[f]=Ks(s[f],g))}),E}function _n(s,r,g){const u=new WeakSet,E=(f,D)=>{if(r&&(D=r(f,D)),D===void 0)return"undefined";if(D===null)return null;if(Number.isNaN(D))return"NaN";if(D===1/0)return"Infinity";if(D===-1/0)return"-Infinity";if(typeof D=="function")return`[Function: ${D.name||"anonymous"}]`;if(typeof D=="symbol")return D.toString();if(typeof D=="bigint")return`${D.toString()}n`;if(typeof D=="object"&&D!==null){if(u.has(D))return"[Circular]";u.add(D)}return D instanceof Date?D.toISOString():D instanceof Error?{name:D.name,message:D.message}:D instanceof Map?{dataType:"Map",value:Array.from(D.entries())}:D instanceof Set?{dataType:"Set",value:Array.from(D.values())}:D};try{return JSON.stringify(s,E,g)}catch(f){return console.error("Failed to stringify:",f),""}}function Is(){let s,r;return{promise:new Promise((g,u)=>{s=g,r=u}),resolve:s,reject:r}}var qt,$a=Object.freeze({__proto__:null,ANDROID_VERSION:Ht,IE_VERSION:Hi,IN_ALIPAY_MINI_APP:ii,IN_BAIDU_MINI_APP:Pt,IN_BROWSER:Ai,IN_DONUT_NATIVE_APP:Ji,IN_FEISHU_MINI_APP:wn,IN_JD_MINI_APP:ki,IN_MINI_APP:Fi,IN_NODE:jn,IN_NS_NATIVE_APP:en,IN_QQ_MINI_APP:Je,IN_RN_APP:Ro,IN_TT_MINI_APP:pt,IN_TT_MINI_GAME:$t,IN_UNI_APP:Vi,IN_UNI_NATIVE_APP:ao,IN_WX_MINI_APP:Xe,IN_WX_MINI_APP_DESK:et,IN_WX_MINI_GAME:ae,IN_WX_MINI_PLUGIN:oo,IOS_VERSION:Ct,IS_ANDROID:ei,IS_CHROME:Tt,IS_EDGE:it,IS_FIREFOX:Le,IS_IE:Gt,IS_IOS:ct,IS_IPAD:ue,IS_IPHONE:He,IS_IPOD:Lt,IS_MAC:Zi,IS_SAFARI:po,IS_WECHAT:pn,IS_WIN:To,IS_WORKER_AVAILABLE:wo,MINI_APP_NAMESPACE:no,USER_AGENT:Ri,base16EncodeBinaryString:cA,deepCopyWithMethods:Ks,deepMerge:J,generatePromise:Is,getPlatformType:Vo,getType:I,httpRequest:qi,isArray:C,isArrayOrObject:R,isEmpty:tn,isH5:Cn,isIOSWebView:an,isNumber:s=>s!==null&&(typeof s=="number"&&!Number.isNaN(s-0)||typeof s=="object"&&s.constructor===Number),isObject:m,isPlainObject:T,isString:c,isUndefined:n,isUniIOSApp:function(){return ao&&uni.getDeviceInfo().platform.toLocaleLowerCase()==="ios"},isValidRequestKey:_,platform:jA,randomInt:b,randomString:function(){const s="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";let r="";for(let g=32;g>0;--g)r+=s[Math.floor(62*Math.random())];return r},safeStringify:_n});class Ls{constructor(){this.listeners={}}on(r,g,u){this.listeners[r]||(this.listeners[r]=[]),this.listeners[r].push({fn:g,context:u})}off(r,g,u){var E;g&&(this.listeners[r]=(E=this.listeners[r])===null||E===void 0?void 0:E.filter(f=>{const D=f.fn===g,v=!u||f.context===u;return!(D&&v)}))}emit(r,...g){const u=this.listeners[r];u&&u.forEach(E=>{const{fn:f,context:D}=E;try{f.apply(D,g)}catch(v){console.warn(`Error in event handler for ${r} error: ${_n(v)}`)}})}once(r,g,u){const E=(...f)=>{g.apply(u,f),this.off(r,E)};this.on(r,E)}}(function(s){s.BUSINESS_COMMAND="business_command",s.C2C_REALTIME_MESSAGE="c2c_realtime_message",s.C2C_MESSAGE_MODIFIED="c2c_message_modified",s.C2C_REVOKED_MESSAGE="c2c_message_revoked",s.GROUP_REALTIME_MESSAGE="group_realtime_message",s.GROUP_MESSAGE_MODIFIED="group_message_modified",s.GROUP_MESSAGE_REVOKED="group_message_revoked",s.C2C_MESSAGE_READ_RECEIPT="c2c_message_read_receipt",s.MESSAGE_REACTION_UPDATED="message_reaction_updated",s.MESSAGE_REACTION_UPDATED_SYNC="message_reaction_updated_sync",s.GROUP_AT_TIPS="group_at_tips",s.USER_STATUS_UPDATE="user_status_update",s.FRIEND_LIST_MODIFIED="friend_list_modified",s.PROFILE_MODIFIED="profile_modified",s.CONV_MODIFIED="conversation_modified",s.GROUP_TIPS_NOTIFICATION="group_tips_notification",s.GROUP_MESSAGE_READ_RECEIPT="group_message_read_receipt",s.GROUP_MESSAGE_READ_SYNC="group_message_read_sync",s.GROUP_SYSTEM_NOTIFICATION="group_system_notification",s.C2C_MESSAGE_PEER_READ="c2c_message_peer_read",s.C2C_MESSAGE_READ_SYNC="c2c_message_read_sync",s.C2C_REMIND_TYPE_SYNC="c2c_remind_type_sync",s.FOLLOW_LIST_UPDATED="follow_list_updated",s.MESSAGE_EXTENSIONS_UPDATED="message_extensions_updated",s.ALL_MESSAGE_READ="all_message_read",s.CONVERSATION_MARK_UPDATED="conversation_mark_updated",s.CONVERSATION_GROUP_ADD="conversation_group_add",s.CONVERSATION_GROUP_DELETED="conversation_group_deleted",s.CONVERSATION_GROUP_UPDATED="conversation_group_updated",s.ALL_RECEIVE_MESSAGE_OPTION="all_receive_message_option",s.TOPIC_AT_TIPS="topic_at_tips",s.TOPIC_TIPS_NOTIFICATION="topic_tips_notification",s.TOPIC_SYSTEM_NOTIFICATION="topic_system_notification",s.TOPIC_MESSAGE_READ_SYNC="topic_message_read_sync",s.TOPIC_LATEST_MESSAGE="topic_latest_message",s.GROUP_MESSAGE_PINNED="group_message_pinned"})(qt||(qt={}));const Bs=[16,17];function Un(s){var r;const g=[];return(r=s?.GroupTips)===null||r===void 0||r.forEach(u=>{var E;u.GroupInfo.MillionGroupFlag===2?g.push(qt.TOPIC_TIPS_NOTIFICATION):Bs.includes((E=u?.MsgBody)===null||E===void 0?void 0:E.OpType)?g.push(qt.GROUP_MESSAGE_PINNED):g.push(qt.GROUP_TIPS_NOTIFICATION)}),g}const Ir=[{conditions:[{type:"event",value:100}],subType:qt.BUSINESS_COMMAND},{conditions:[{type:"event",value:24}],subType:qt.ALL_RECEIVE_MESSAGE_OPTION},{conditions:[{type:"event",value:26}],subType:qt.TOPIC_LATEST_MESSAGE},{conditions:[{type:"hasKey",value:"C2cMsgArray"}],subType:qt.C2C_REALTIME_MESSAGE},{conditions:[{type:"hasKey",value:"C2cMsgModNotifys"}],subType:qt.C2C_MESSAGE_MODIFIED},{conditions:[{type:"hasKey",value:"ProfileDataMod"}],subType:qt.PROFILE_MODIFIED},{conditions:[{type:"hasKey",value:"UserStatusList"}],subType:qt.USER_STATUS_UPDATE},{conditions:[{type:"hasKey",value:"FriendListMod"}],subType:qt.FRIEND_LIST_MODIFIED},{conditions:[{type:"hasKey",value:"GroupMsgArray"}],subType:qt.GROUP_REALTIME_MESSAGE},{conditions:[{type:"hasKey",value:"GroupMsgModNotifys"}],subType:qt.GROUP_MESSAGE_MODIFIED},{conditions:[{type:"hasKey",value:"C2cNotifyMsgArray"}],subTypeParser:function(s){var r;const g=[];return(r=s?.C2cNotifyMsgArray)===null||r===void 0||r.forEach(u=>{u.WithdrawC2cMsgNotify&&g.push(qt.C2C_REVOKED_MESSAGE),u.C2cReadedReceipt&&g.push(qt.C2C_MESSAGE_PEER_READ),u.ReadC2cMsgNotify&&g.push(qt.C2C_MESSAGE_READ_SYNC),u.MuteNotificationsSync&&g.push(qt.C2C_REMIND_TYPE_SYNC)}),g}},{conditions:[{type:"hasKey",value:"GroupTips"},{type:"event",value:4}],subTypeParser:Un},{conditions:[{type:"hasKey",value:"GroupTips"},{type:"event",value:5}],subTypeParser:function(s){var r;const g=[];return(r=s?.GroupTips)===null||r===void 0||r.forEach(u=>{Array.isArray(u.MsgBody.GroupWithdrawInfoArray)?g.push(qt.GROUP_MESSAGE_REVOKED):Array.isArray(u.MsgBody.GroupMsgReceiptList)?g.push(qt.GROUP_MESSAGE_READ_RECEIPT):Array.isArray(u.MsgBody.GroupReadInfoArray)?u.MsgBody.GroupReadInfoArray[0].TopicId?g.push(qt.TOPIC_MESSAGE_READ_SYNC):g.push(qt.GROUP_MESSAGE_READ_SYNC):u.GroupInfo.MillionGroupFlag===2?g.push(qt.TOPIC_SYSTEM_NOTIFICATION):g.push(qt.GROUP_SYSTEM_NOTIFICATION)}),g}},{conditions:[{type:"hasKey",value:"GroupTips"},{type:"event",value:6}],subTypeParser:Un},{conditions:[{type:"hasKey",value:"GroupTips"},{type:"event",value:12}],subTypeParser:function(s){var r;const g=[];return(r=s?.GroupTips)===null||r===void 0||r.forEach(u=>{const{GroupAtTips:{TopicId:E}}=u;E?g.push(qt.TOPIC_AT_TIPS):g.push(qt.GROUP_AT_TIPS)}),g}},{conditions:[{type:"hasKey",value:"RecentContactMod"}],subTypeParser:function(s){var r;const g=[];return(r=s?.RecentContactMod)===null||r===void 0||r.forEach(u=>{switch(u.PushType){case Pe.CONV_MARK_UPDATED:g.push(qt.CONVERSATION_MARK_UPDATED);break;case Pe.CONV_GROUP_ADDED:g.push(qt.CONVERSATION_GROUP_ADD);break;case Pe.CONV_GROUP_DELETED:g.push(qt.CONVERSATION_GROUP_DELETED);break;case Pe.CONV_GROUP_UPDATED:g.push(qt.CONVERSATION_GROUP_UPDATED);break;default:g.push(qt.CONV_MODIFIED)}}),g}},{conditions:[{type:"hasKey",value:"MsgReactionNotifyList"}],subType:qt.MESSAGE_REACTION_UPDATED},{conditions:[{type:"hasKey",value:"MsgReactionNotify"}],subType:qt.MESSAGE_REACTION_UPDATED_SYNC},{conditions:[{type:"hasKey",value:"C2cMsgInfo"}],subType:qt.C2C_MESSAGE_READ_RECEIPT},{conditions:[{type:"hasKey",value:"FollowChangeList"}],subType:qt.FOLLOW_LIST_UPDATED},{conditions:[{type:"hasKey",value:"MsgExtensionNotify"}],subType:qt.MESSAGE_EXTENSIONS_UPDATED},{conditions:[{type:"hasKey",value:"C2CReadAllMsg"}],subType:qt.ALL_MESSAGE_READ}];var Fn;function rr(s){var r;const g=Array.isArray((r=s?.body)===null||r===void 0?void 0:r.EventArray)?s.body.EventArray:[],u=[];return g.forEach(E=>{E.Flag=s.body.Flag;const f=Ir.find(v=>v.conditions.every(N=>{switch(N.type){case"event":return E.Event===N.value;case"hasKey":return Object.prototype.hasOwnProperty.call(E,N.value);default:return!1}}));if(!f)return null;let D=[];typeof f.subTypeParser=="function"?D=f.subTypeParser(E):f.subType&&(D=f.subType),Array.isArray(D)?D.forEach(v=>{u.push({type:`${Fn.SERVER_PUSH_MESSAGE}:${v}`,data:E})}):u.push({type:`${Fn.SERVER_PUSH_MESSAGE}:${D}`,data:E})}),u}(function(s){s.SERVER_PUSH_MESSAGE="im_open_push.msg_push",s.SERVER_PUSH_MESSAGE_MULTIPLE="im_open_push.multi_msg_push_ws",s.ERROR="error"})(Fn||(Fn={}));const fo={[Fn.SERVER_PUSH_MESSAGE]:rr,[Fn.SERVER_PUSH_MESSAGE_MULTIPLE]:rr,[Fn.ERROR]:function(s){const{errorCode:r}=s;return[{type:`error:${r}`,data:s}]}},es=new class{constructor(){this._outerEventEmitter=null,this._innerEventEmitter=null,this._filteredCallbackMap=new Map,this._outerEventEmitter=new Ls,this._innerEventEmitter=new Ls,this.InnerEventSubType=qt}subscribeInnerEvent(s,r,g,u,E){var f;let D,v,N,P;["string","number"].includes(typeof r)?(N=`${s}:${r}`,P=g,v=u,D=E):(N=s,P=r,v=g,D=typeof u=="function"?u:void 0),D?this._subscribeWithFilter(N,P,v,D):(f=this._innerEventEmitter)===null||f===void 0||f.on(N,P,v)}emitInnerEvent(s,r){var g,u;if((g=this._innerEventEmitter)===null||g===void 0||g.emit(s,r),Object.keys(fo).includes(s)){const E=(u=fo[s])===null||u===void 0?void 0:u.call(fo,r);E?.forEach(f=>{var D;f&&((D=this._innerEventEmitter)===null||D===void 0||D.emit(f.type,f.data))})}}subscribeOuterEvent(s,r,g){var u;(u=this._outerEventEmitter)===null||u===void 0||u.on(s,r,g)}unSubscribeOuterEvent(s,r,g){var u;(u=this._outerEventEmitter)===null||u===void 0||u.off(s,r,g)}unSubscribeInnerEvent(s,r,g,u){if(["string","number"].includes(typeof r)){const E=g,f=`${s}:${r}`;this._unsubscribeEvent(f,E,u)}else{const E=r;this._unsubscribeEvent(s,E,g)}}emitOuterEvent(s,r){var g;(g=this._outerEventEmitter)===null||g===void 0||g.emit(s,r)}getOuterEventEmitter(){return this._outerEventEmitter}rest(){this._outerEventEmitter=null,this._innerEventEmitter=null}_subscribeWithFilter(s,r,g,u){var E;const f=D=>{u.call(g,D)&&r.call(g,D)};this._filteredCallbackMap.has(s)||this._filteredCallbackMap.set(s,[]),this._filteredCallbackMap.get(s).push({originalCallback:r,filteredCallback:f,filter:u,context:g}),(E=this._innerEventEmitter)===null||E===void 0||E.on(s,f,g)}_unsubscribeEvent(s,r,g){var u,E;const f=this._filteredCallbackMap.get(s);if(f){const D=f.findIndex(v=>v.originalCallback===r&&v.context===g);if(D!==-1){const{filteredCallback:v}=f[D];return(u=this._innerEventEmitter)===null||u===void 0||u.off(s,v,g),f.splice(D,1),void(f.length===0&&this._filteredCallbackMap.delete(s))}}(E=this._innerEventEmitter)===null||E===void 0||E.off(s,r,g)}};class vc{constructor(){this._socket=null}connectSocket(r){return this._socket=new WebSocket(r),this._socket}send(r){var g,u;try{(g=this._socket)===null||g===void 0||g.send(r)}catch(E){(u=this._onSendFail)===null||u===void 0||u.call(this,E)}}bindSocketHandlers(r){const{onOpen:g,onMessage:u,onClose:E,onError:f,onSendFail:D}=r;this._socket&&(this._socket.binaryType="arraybuffer",this._socket.onopen=g,this._socket.onmessage=u,this._socket.onclose=E,this._socket.onerror=f,this._onSendFail=D)}unbindSocketHandlers(){this._socket&&(this._socket.onopen=null,this._socket.onmessage=null,this._socket.onclose=null,this._socket.onerror=null)}disconnect(){this._socket&&(this._socket.close(),this._socket=null)}}class ts{constructor(r){this._onError=r.onError}connectSocket(r){const g=this;return this._socket=no.connectSocket({url:r,header:{"content-type":"application/json"},complete:()=>{},fail:u=>g._onError(u)}),this._socket}send(r){var g;(g=this._socket)===null||g===void 0||g.send({data:r,fail:this._onSendFail})}bindSocketHandlers(r){const{onOpen:g,onMessage:u,onClose:E,onError:f,onSendFail:D}=r;this._socket&&(this._socket.onClose(E),this._socket.onOpen(g),this._socket.onMessage(u),this._socket.onError(f),this._onSendFail=D)}unbindSocketHandlers(){this._socket&&(this._socket.onClose(()=>{}),this._socket.onOpen(()=>{}),this._socket.onMessage(()=>{}),this._socket.onError(()=>{}))}disconnect(){this._socket&&(this._socket.close(),this._socket=null)}}const ur="CONNECT",On="SEND",vg="DISCONNECT",yn="OPEN",ce="MESSAGE",ot="CLOSE",Zt="ERROR",Ho="SEND_FAIL";class Ba{constructor(){this._worker=null,this._blobUrl=null}connectSocket(r){const g=new Blob([`
let _socket = null;
self.onmessage = (event) => {
@@ -95,26 +95,26 @@
_socket = null;
}
}
-`],{type:"application/javascript"});this._worker=new Worker(URL.createObjectURL(g)),this._worker.postMessage({type:ur,url:r})}send(r){var g,u;try{(g=this._worker)===null||g===void 0||g.postMessage({type:Ds,data:r})}catch(E){(u=this._onSendFail)===null||u===void 0||u.call(this,E)}}bindSocketHandlers(r){const{onOpen:g,onMessage:u,onClose:E,onError:m,onSendFail:D}=r;if(this._worker){const v={[fs]:g,[re]:u,[At]:E,[Zt]:m,[Jo]:D};this._onSendFail=D,this._worker.onmessage=T=>{var P;const{type:W}=T?.data||{};typeof v[W]=="function"&&((P=v[W])===null||P===void 0||P.call(v,T?.data))}}}unbindSocketHandlers(){this._worker&&(this._worker.onmessage=null)}disconnect(){this._worker&&(this._worker.postMessage({type:Sg}),this._worker.terminate(),this._worker=null),this._blobUrl&&(URL.revokeObjectURL(this._blobUrl),this._blobUrl=null)}}class WI{}var as,ro=new class{constructor(){this._store=new Map}get(n){return this._store.get(n)}getStorage(n){return Ui?ii?my.getStorageSync({key:n}).data:so.getStorageSync(n):this._canUseLocalStorage()?localStorage.getItem(n):{}}set(n,r){const g=this._store.get(n)||{};r instanceof Map?this._store.set(n,r):this._store.set(n,Object.assign(Object.assign({},g),r))}setStorage(n,r){Ui?ii?my.setStorageSync({key:n,data:JSON.stringify(r)}):so.setStorageSync(n,JSON.stringify(r)):this._canUseLocalStorage()&&localStorage.setItem(n,JSON.stringify(r))}clear(n){typeof n=="string"?this._store.set(n,{}):this._store.clear()}clearLocalStorage(n){this._canUseLocalStorage()&&(typeof n=="string"?localStorage.setItem(n,""):localStorage.clear())}reset(){this.clear()}_canUseLocalStorage(){return typeof window<"u"&&navigator&&navigator.cookieEnabled&&localStorage}};class vc{connectSocket(r){return this._socket=so.connectSocket({url:r,header:{"content-type":"application/json"},multiple:!0,complete:()=>{}}),this._socket}send(r){var g;(g=this._socket)===null||g===void 0||g.send({data:r,fail:this._onSendFail})}bindSocketHandlers(r){const{onOpen:g,onMessage:u,onClose:E,onError:m,onSendFail:D}=r;this._socket&&(this._socket.onClose(E),this._socket.onOpen(g),this._socket.onMessage(v=>u(v?.data)),this._socket.onError(()=>m),this._onSendFail=D)}unbindSocketHandlers(){this._socket&&(this._socket.onClose(()=>{}),this._socket.onOpen(()=>{}),this._socket.onMessage(()=>{}),this._socket.onError(()=>{}))}disconnect(){this._socket&&(this._socket.close(),this._socket=null)}}(function(n){n[n.CONNECTED=0]="CONNECTED",n[n.CONNECTING=1]="CONNECTING",n[n.DISCONNECTED=2]="DISCONNECTED"})(as||(as={}));class ag{constructor(r){this._url="",this._readyState=as.DISCONNECTED,this._url=r,this._id=L(),this._emitter=new Ln,ii?this._socket=new vc:ze||ao||Qt||Ve||bi||Pt?this._socket=new An({onError:this._onError.bind(this)}):Hs?this._socket=new WI:this._canUseWebWorker()?this._socket=new ha:this._socket=new Sc,this.connect()}connect(){this.doOpen(),this._bindSocketHandlers()}doOpen(){[as.CONNECTED,as.CONNECTING].includes(this._readyState)||(this._readyState=as.CONNECTING,this._ws=this._socket.connectSocket(this._url))}send(r){this._readyState!==as.CONNECTED?this.reconnect():this._socket.send(r)}reconnect(){[as.CONNECTED,as.CONNECTING].includes(this._readyState)||(this.disconnect(),this.doOpen())}getId(){return this._id}on(r,g,u){this._emitter.on(r,g,u)}off(r,g,u){this._emitter.off(r,g,u)}isConnected(){return this._readyState===as.CONNECTED}disconnect(){this._readyState=as.DISCONNECTED,this._unbindSocketHandlers(),this._socket.disconnect()}_onOpen(r){this._readyState===as.CONNECTING&&(this._readyState=as.CONNECTED,this._emitter.emit("connect",{socketId:this._id,event:r}))}_onMessage(r){this._emitter.emit("message",r)}_onClose(r){this._readyState=as.DISCONNECTED,this._emitter.emit("close",{socketId:this._id,event:r})}_onError(r){this._readyState=as.DISCONNECTED,this._emitter.emit("error",{socketId:this._id,error:r})}_onSendFail(r){this._readyState=as.DISCONNECTED,this._emitter.emit("sendFail",{socketId:this._id,error:r})}_bindSocketHandlers(){this._socket.bindSocketHandlers({onOpen:this._onOpen.bind(this),onMessage:this._onMessage.bind(this),onClose:this._onClose.bind(this),onError:this._onError.bind(this),onSendFail:this._onSendFail.bind(this)})}_unbindSocketHandlers(){this._socket.unbindSocketHandlers()}_canUseWebWorker(){const r=ro.get("cloudConfig")||{};return(s(r.isWorkerEnabled)||r.isWorkerEnabled==="1")&&wo}}const vg={[st.SINGAPORE]:[[2e7,3e7],[172e7,173e7]],[st.KOREA]:[[3e7,4e7],[173e7,174e7]],[st.GERMANY]:[[4e7,5e7],[174e7,175e7]],[st.IND]:[[5e7,6e7],[175e7,176e7]],[st.JPN]:[[6e7,7e7],[176e7,177e7]],[st.USA]:[[7e7,8e7],[177e7,178e7]],[st.INDONESIA]:[[8e7,9e7],[178e7,179e7]],[st.KSA]:[[9e7,1e8],[179e7,18e8]]};function Ba(n){var r;if(!((r=ro.get("instance"))===null||r===void 0)&&r.oversea)return st.OVERSEA;for(const g of Object.keys(vg))for(const[u,E]of vg[g])if(n>=u&&n`${oA}=${W[oA]}`).join("&"));var W;return g?`${n}/binfo?${P}&compress=gzip`:`${n}/info?${P}`}function en(n){const r=ro.get("instance"),{sdkAppId:g,testEnv:u,proxyServer:E}=r,m=Ba(g);if(u)return Xn(Ct.TEST[m].DEFAULT,{isBinary:n});if(!ts(E))return Xn(E,{isBinary:n});const D=Ct.PRODUCTION[m],v=$t&&D.ANYCAST,T=$t,P=!!D.BACKUP_CN;return Xn({[Fo.INITIAL]:()=>(Uo=Fo.DEFAULT,D.DEFAULT),[Fo.DEFAULT]:()=>(Uo=Fo.IPV6,D.IPV6),[Fo.IPV6]:()=>(Uo=Fo.BACKUP,D.BACKUP),[Fo.BACKUP]:()=>T?(Uo=Fo.BACKUP_WEB_ONLY,function(W){const oA=Math.floor(10001*Math.random())+1e4;return W.replace("*",String(oA))}(D.BACKUP_WEB_ONLY)):P?(Uo=Fo.BACKUP_CN,D.BACKUP_CN):v?(Uo=Fo.ANYCAST,D.ANYCAST):D.DEFAULT,[Fo.BACKUP_WEB_ONLY]:()=>P?(Uo=Fo.BACKUP_CN,D.BACKUP_CN):v?(Uo=Fo.ANYCAST,D.ANYCAST):D.DEFAULT,[Fo.BACKUP_CN]:()=>(Uo=v?Fo.ANYCAST:Fo.DEFAULT,D[Uo]),[Fo.ANYCAST]:()=>(Uo=Fo.DEFAULT,D.ANYCAST="",D.DEFAULT)}[Uo](),{isBinary:n})}var Mg=new class{constructor(){this._timeOffsetWithServer=0}getServerTimeMs(){return Date.now()+this._timeOffsetWithServer}getServerTimeSeconds(){return Math.floor(this.getServerTimeMs()/1e3)}getTimeOffsetWithServer(){return this._timeOffsetWithServer}calculateTimeOffsetWithServer(n,r){const g=Date.now(),u=g-n;this._timeOffsetWithServer=r+u-g}};const Mc=16;var Rn=new class{constructor(){this._tasks=[],this._timer=null,this._taskMap=new Map}_addTaskToScheduler(n){const{id:r}=n;this.removeTask(r),this._tasks.push(n),this._taskMap.set(r,n),this._sort(),this._scheduleNextTask()}_createTask(n){const{id:r,callback:g,context:u,isOnce:E=!1,intervalMs:m=Mc}=n,D=Math.max(m,Mc);return{id:r,nextExecuteTime:Date.now()+D,intervalMs:m,callback:g,context:u,isOnce:E}}addTask(n){const r=this._createTask(n);this._addTaskToScheduler(r)}addOnceTask(n){const r=this._createTask(Object.assign(Object.assign({},n),{isOnce:!0}));this._addTaskToScheduler(r)}removeTask(n){const r=this._tasks.findIndex(g=>g.id===n);r>-1&&(this._tasks.splice(r,1),this._taskMap.delete(n),this._scheduleNextTask())}updateTaskInterval(n,r){const g=this._taskMap.get(n);g&&(g.intervalMs=r,g.nextExecuteTime=Date.now()+r,this._sort(),this._scheduleNextTask())}clearAllTasks(){this._tasks=[],this._taskMap.clear(),this._timer&&(clearTimeout(this._timer),this._timer=null)}dispose(){this.clearAllTasks()}_sort(){this._tasks.sort((n,r)=>n.nextExecuteTime-r.nextExecuteTime)}_scheduleNextTask(){this._timer&&(clearTimeout(this._timer),this._timer=null);const n=this._tasks[0];if(n){const r=Math.max(0,n.nextExecuteTime-Date.now());this._timer=setTimeout(()=>this._execute(),r)}}_execute(){const n=Date.now();for(;this._tasks.length&&this._tasks[0].nextExecuteTime<=n;){const r=this._tasks[0];try{r.context?r.callback.call(r.context):r.callback(),r.isOnce?this.removeTask(r.id):(r.nextExecuteTime=n+r.intervalMs,this._sort())}catch(g){console.warn(`Task ${r.id} execution failed:`,g),r.isOnce&&this.removeTask(r.id)}}this._scheduleNextTask()}};function Ua(n){const r=[];for(let g=0;g=55296&&u<=56319){const E=n.charCodeAt(++g)-56320+(u-55296<<10)+65536;r.push(240|E>>18,128|E>>12&63,128|E>>6&63,128|63&E)}else u<=127?r.push(u):u<=2047?r.push(192|u>>6,128|63&u):r.push(224|u>>12,128|u>>6&63,128|63&u)}return new Uint8Array(r)}function Bn(n){const r=Array.isArray(n)?[]:Object.create(null);for(const g in n)Object.prototype.hasOwnProperty.call(n,g)&&_(g)&&n[g]!=null&&(n[g]===null||typeof n[g]!="object"?r[g]=n[g]:r[g]=Bn(n[g]));return r}function Ts(n,r){if(BA.includes(n))return 0;const g=Ua(JSON.stringify(r));let u=4294967295;const{length:E}=g;for(let m=0;m>>=1:u=u>>>1^3988292384}return(4294967295^u)>>>0}function Qa(n){const{servcmd:r,data:g}=n,u=function(m){const D=ro.get("login")||{},v=ro.get("instance")||{};return{servcmd:m,ver:"v4",platform:HA,websdkappid:537048168,websdkversion:"1.7.3",a2:D.a2Key||void 0,tinyid:D.tinyID||void 0,status_instid:D.statusInstanceId||0,sdkappid:v.sdkAppId,contenttype:"json",reqtime:Math.floor(Date.now()/1e3),identifier:D.a2Key?void 0:D.userId,usersig:D.a2Key?void 0:D.userSig,sdkability:478343027,sdkability_ext:lA(""),cappid:v.applicationID||0,tjgID:"",seq:_a(),cs:0}}(r),E=Bn(g);return u.cs=Ts(r,E),{head:u,body:E}}function wn(n){const{servcmd:r,data:g}=n,u=function(m){const D=ro.get("login")||{},v=ro.get("instance")||{};return{servcmd:m,ver:"v4",platform:HA,websdkappid:537048168,websdkversion:"1.7.3",sdkappid:v.sdkAppId,contenttype:"",reqtime:Math.floor(Date.now()/1e3),identifier:"",usersig:"",status_instid:D.statusInstanceId||0,sdkability:478343027,sdkability_ext:lA(""),cappid:v.applicationID||0,seq:_a(),cs:0}}(r),E=Bn(g);return u.cs=Ts(r,E),{head:u,body:E}}let Fa=L();function _a(){return Fa=Fa<2415919103?Fa+1:L(),Fa}function $(){var n;const r=ro.get("login")||{},g=ro.get("instance")||{};return{sdk_type:30,sdk_app_id:g.sdkAppId,sdk_version:"1.6.18",tiny_id:Number(r.tinyID),user_id:r.userId||((n=ro.get("webPush"))===null||n===void 0?void 0:n.userId),platform:HA,instance_id:g.instanceId,trace_id:new Date().getTime()}}var j,MA=Object.freeze({__proto__:null,calcBodyCRC:Ts,filterProtocolDataInvalidFields:Bn,generateCosSpecifiedData:function(n){const{servcmd:r,data:g}=n,u=function(m){const D=ro.get("login")||{},v=ro.get("instance")||{};return{servcmd:m,ver:"v4",platform:HA,websdkappid:537048168,websdkversion:"1.7.3",sdkappid:v.sdkAppId,contenttype:"json",reqtime:Math.floor(Date.now()/1e3),identifier:D.userId,usersig:D.userSig,status_instid:D.statusInstanceId||0,sdkability:478343027,sdkability_ext:lA(""),cappid:v.applicationID||0,seq:_a(),cs:0}}(r),E=Bn(g);return u.cs=Ts(r,E),{head:u,body:E}},generateProtocolData:Qa,generateSSOLogProtocolData:wn,generateSequence:_a,getCommonHead:$,getHostSite:Ba,taskScheduler:Rn,timeManager:Mg});(function(n){n[n.info=4]="info",n[n.warning=5]="warning",n[n.error=6]="error"})(j||(j={}));const zA={method:"extension",networkType:"network_type",eventType:"event_type",code:"error_code",message:"error_message",moreMessage:"more_message",duplicate:"duplicate",costTime:"cost_time",level:"level",uiPlatform:"ui_platform",timestamp:"timestamp"};class oe{constructor(r){this.level=j.info,this._canSendLog=!0,this._logCreatedAt=Mg.getServerTimeMs(),this.timestamp=0,this.networkType=8,this.code=0,this.moreMessage="",this.method="",this.message="",this.costTime=0,this.duplicate=!1,this.eventType=0,this.uiPlatform=this._getUiPlatform(),this._sdkEdition=this._getSDKEdition();const{method:g,eventType:u=0,message:E="",costTime:m=0,error:D,uiPlatform:v,moreMessage:T="",code:P=0,startTime:W=0}=r||{};this.eventType=u,this.method=g,this.message=E,this.costTime=m,this.moreMessage=`${T} startTime:${W}`,this.code=P,D&&this.setError(D),ts(v)||(this.uiPlatform=v)}setMoreMessage(r){this.moreMessage=`${this.moreMessage} ${r}`}updateLogCreatedAtByTimeOffset(){this._logCreatedAt+=Mg.getTimeOffsetWithServer()}end(r=!1){this._canSendLog&&(this._canSendLog=!1,this.timestamp=Mg.getServerTimeMs(),this._ssoLogModule.pushToLogQueue(this._convertSSOLogDataKeyToServe()),r&&this._ssoLogModule.uploadSSOLogData())}setError(r){var g;return r instanceof Error?this._canSendLog?(!((g=ro.get("netWorkMonitor"))===null||g===void 0)&&g.isNetworkOnline&&(r.errorCode&&(this.code=r.errorCode),r.errorMessage&&this.setMoreMessage(r.errorMessage)),this.level=j.error,this):this:(console.warn("SSOLogData.setError value not instanceof Error, please check!"),this)}setLogInfo(r){return Object.keys(r).forEach(g=>{Object.keys(zA).includes(g)&&(this[g]=r[g])}),this}setSSOLogModule(r){this._ssoLogModule=r}_convertSSOLogDataKeyToServe(){const r={};return Object.keys(this).forEach(g=>{const u=g;zA[u]&&(r[zA[u]]=this[u])}),r}_getUiPlatform(){var r;const g=(r=ro.get("instance"))===null||r===void 0?void 0:r.scene;if(typeof g=="string"){const u=Number(g);return isNaN(u)?void 0:u}}_getSDKEdition(){var r;return(r=ro.get("instance"))===null||r===void 0?void 0:r.sdkEdition}}var ye;(function(n){n.RECONNECTED="reconnected",n.CLOUD_CONFIG_UPDATE="cloud_config_update",n.SOCKET_DISCONNECTED="socket_disconnected"})(ye||(ye={}));var He=ye;const Je=20,It=6e4,mt=[4,5,6],Nt="report-logger";var Kt=new class{constructor(){this._sdkAppIdBlackList=[],this._tinyIdWhiteList=[],this._reportLevel=[4,5,6],this._minThreshold=Je,this._maxThreshold=100,this._waitingTime=It,this._lastReportAt=Date.now(),this._ssoLogMap=new Map,this._logLevel=IA.DEBUG,this._throttleConfig={global:{throttleTime:Qe,maxCount:ae},single:{throttleTime:$A,maxCount:jA}},this._globalThrottle={count:0,startTime:Date.now()},this._singleThrottleMap=new Map,$s.subscribeInnerEvent(He.CLOUD_CONFIG_UPDATE,this._handleCloudConfigUpdate,this),Rn.addTask({id:Nt,intervalMs:1e3,callback:this._checkAndReportIfDue,context:this}),this._logQueue=[],this._savePlatFormInfo()}_handleCloudConfigUpdate(n){const{evt_rpt_threshold:r=Je,evt_rpt_waiting:g=It,evt_rpt_level:u=mt,evt_rpt_sdkappid_bl:E="",evt_rpt_tinyid_wl:m="",evt_rpt_global_throttle_time:D=Qe,evt_rpt_global_throttle_count:v=ae,evt_rpt_single_throttle_time:T=$A,evt_rpt_single_throttle_count:P=jA}=n||{};this._sdkAppIdBlackList=E.split(",").map(W=>Number(W)),this._waitingTime=Number(g),this._minThreshold=r,this._reportLevel=u,this._tinyIdWhiteList=m.split(","),this._throttleConfig={global:{throttleTime:D,maxCount:v},single:{throttleTime:T,maxCount:P}}}createSSOLogData(n){const r=new oe(n);return r.setSSOLogModule(this),this._ssoLogMap.set(n.method,r),r}getSSOLogData(n){return this._ssoLogMap.get(n)||{}}pushToLogQueue(n){n&&(this._logQueue.push(n),this._shouldUploadImmediately()&&this.uploadSSOLogData())}setLogLevel(n){[IA.DEBUG,IA.ERROR,IA.INFO,IA.NONE,IA.WARN].includes(n)&&(this._logLevel=n)}debug(n,r="",g){this._log(IA.DEBUG,n,r,g)}info(n,r="",g){this._log(IA.INFO,n,r,g)}warn(n,r="",g){this._log(IA.WARN,n,r,g)}error(n,r="",g){this._log(IA.ERROR,n,r,g)}_shouldUploadImmediately(){return this._logQueue.length>=this._minThreshold}_isReportDue(){return Date.now()>=this._lastReportAt+this._waitingTime}_checkAndReportIfDue(){this._isReportDue()&&this._logQueue.length>0&&this.uploadSSOLogData()}uploadSSOLogData(){return mA(this,void 0,void 0,function*(){if(this._logQueue.length===0)return;const n=this._logQueue.slice();this._logQueue=[];try{const r=this._filterLogs(n);if(r.length===0)return void(this._lastReportAt=Date.now());const g={Header:$(),Event:r};ts(g.Header.user_id)||(yield function(u){const E="imopenstat.tim_web_report_v2",m=wn({servcmd:E,data:u}),D=`${m.head.seq}${E}`;return Se.sendPacket(m,{requestId:D})}(g))}catch(r){this._requeueFailedLogs(n),this.debug("uploadSSOLogData",_s(r))}finally{this._lastReportAt=Date.now()}})}_requeueFailedLogs(n){this._logQueue=n.concat(this._logQueue);const r=this._logQueue.length-200;r>0&&(this._logQueue.splice(0,r),this.debug("uploadSSOLogData",`log queue overflow, dropped ${r} oldest logs`))}_savePlatFormInfo(){var n,r;if(ze){const g=(r=(n=wx.getAccountInfoSync)===null||n===void 0?void 0:n.call(wx))===null||r===void 0?void 0:r.miniProgram;if(g){const{appId:u,envVersion:E}=g;ro.set("instance",{appId:u,envVersion:E})}}else $t&&ro.set("instance",{href:window.location.href})}_filterLogs(n){const{tinyID:r}=ro.get("login")||{},{sdkAppId:g}=ro.get("instance")||{};return this._sdkAppIdBlackList.includes(g)&&!this._tinyIdWhiteList.includes(r)?[]:n.filter(u=>this._reportLevel.includes(u.level))}_checkThrottle(n){return!!this._checkGlobalThrottle()||this._checkSingleThrottle(n)}_checkGlobalThrottle(){const n=Date.now();if(n-this._globalThrottle.startTime>=this._throttleConfig.global.throttleTime)this._globalThrottle.count=1,this._globalThrottle.startTime=n;else if(this._globalThrottle.count++,this._globalThrottle.count>this._throttleConfig.global.maxCount)return!0;return!1}_checkSingleThrottle(n){const r=Date.now(),g=this._singleThrottleMap.get(n);return g?r-g.startTime>=this._throttleConfig.single.throttleTime?(g.count=1,g.startTime=r,!1):g.count>=this._throttleConfig.single.maxCount||(g.count++,!1):(this._singleThrottleMap.set(n,{count:1,startTime:r}),!1)}_shouldLog(n){return n>=this._logLevel&&this._logLevel!==IA.NONE}_shouldReport(n){return this._reportLevel.includes(KA[n])}_formatLog(n,r,g,u){const E=new Date,m=`${E.getHours()}:${E.getMinutes()}:${E.getSeconds()}:${E.getMilliseconds()}`,D=`<${IA[n]}>`;return Gt||Ui?[`${gA} [${m}] ${D} [${r}] ${g}`]:["%c%s%c%s","background:#0abf5b; padding:1px; border-radius:3px; color: #fff",gA,"",`[${m}] ${D} [${r}] ${g} params: ${_s(u)}`]}_log(n,r,g,u){if(this._shouldLog(n)){const E=this._formatLog(n,r,g,u);RA[n].apply(console,E)}if(this._shouldReport(n)){const E=this._getThrottleKey(r,g,u);this._checkThrottle(E)||this.createSSOLogData(Object.assign(Object.assign({message:g},u),{method:r})).end()}}_getThrottleKey(n,r,g){const u=`${n}${r}${_s(Object.assign(Object.assign({},g),{costTime:""}))}`,E=Ua(JSON.stringify(u));let m=4294967295;const{length:D}=E;for(let v=0;v>>=1:m=m>>>1^3988292384}return`${(4294967295^m)>>>0}`}reset(){console.log("SSO_LOG_MODULE.reset"),Rn.removeTask(Nt),$s.unSubscribeInnerEvent(He.CLOUD_CONFIG_UPDATE,this._handleCloudConfigUpdate,this),this._lastReportAt=0,this.uploadSSOLogData(),this._sdkAppIdBlackList=[],this._tinyIdWhiteList=[],this._minThreshold=Je,this._maxThreshold=100,this._waitingTime=It,this._logQueue=[],this._logLevel=IA.DEBUG,this._globalThrottle={count:0,startTime:Date.now()},this._singleThrottleMap.clear()}};const di=15e3,dt="Channel",Ht="channel_schedule_task",$i="channel_reconnect_task",eo="connected",tn="connecting",_i="disconnected",is=1e3,Rg="network_status_change",Er="activity_status_change",Mr="send_fail",jn="reconnect_failed",Tl="socket_error",on="socket_close";function uI(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}function $g(n){return $g=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(r){return typeof r}:function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},$g(n)}function Rc(n){throw new Error('Could not dynamically require "'+n+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Tu,Ta={exports:{}},Nl=(Tu||(Tu=1,function(n){n.exports=function r(g,u,E){function m(T,P){if(!u[T]){if(!g[T]){if(!P&&Rc)return Rc(T);if(D)return D(T,!0);var W=new Error("Cannot find module '"+T+"'");throw W.code="MODULE_NOT_FOUND",W}var oA=u[T]={exports:{}};g[T][0].call(oA.exports,function(EA){return m(g[T][1][EA]||EA)},oA,oA.exports,r,g,u,E)}return u[T].exports}for(var D=Rc,v=0;v>>6:(EA<65536?oA[xA++]=224|EA>>>12:(oA[xA++]=240|EA>>>18,oA[xA++]=128|EA>>>12&63),oA[xA++]=128|EA>>>6&63),oA[xA++]=128|63&EA);return oA},u.buf2binstring=function(W){return P(W,W.length)},u.binstring2buf=function(W){for(var oA=new E.Buf8(W.length),EA=0,wA=oA.length;EA>10&1023,SA[wA++]=56320|1023&kA)}return P(SA,wA)},u.utf8border=function(W,oA){var EA;for((oA=oA||W.length)>W.length&&(oA=W.length),EA=oA-1;0<=EA&&(192&W[EA])==128;)EA--;return EA<0||EA===0?oA:EA+v[W[EA]]>oA?EA:oA}},{"./common":1}],3:[function(r,g,u){g.exports=function(E,m,D,v){for(var T=65535&E,P=E>>>16&65535,W=0;D!==0;){for(D-=W=2e3>>1:m>>>1;D[v]=m}return D}();g.exports=function(m,D,v,T){var P=E,W=T+v;m^=-1;for(var oA=T;oA>>8^P[255&(m^D[oA])];return-1^m}},{}],6:[function(r,g,u){g.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}},{}],7:[function(r,g,u){g.exports=function(E,m){var D,v,T,P,W,oA,EA,wA,kA,xA,LA,SA,OA,WA,ue,le,ki,Li,Yt,Fi,hs,Re,Mt,UA,ci;D=E.state,v=E.next_in,UA=E.input,T=v+(E.avail_in-5),P=E.next_out,ci=E.output,W=P-(m-E.avail_out),oA=P+(E.avail_out-257),EA=D.dmax,wA=D.wsize,kA=D.whave,xA=D.wnext,LA=D.window,SA=D.hold,OA=D.bits,WA=D.lencode,ue=D.distcode,le=(1<>>=Yt=Li>>>24,OA-=Yt,(Yt=Li>>>16&255)==0)ci[P++]=65535&Li;else{if(!(16&Yt)){if(!(64&Yt)){Li=WA[(65535&Li)+(SA&(1<>>=Yt,OA-=Yt),OA<15&&(SA+=UA[v++]<>>=Yt=Li>>>24,OA-=Yt,!(16&(Yt=Li>>>16&255))){if(!(64&Yt)){Li=ue[(65535&Li)+(SA&(1<>>=Yt,OA-=Yt,(Yt=P-W)>3,SA&=(1<<(OA-=Fi<<3))-1,E.next_in=v,E.next_out=P,E.avail_in=v>>24&255)+(Re>>>8&65280)+((65280&Re)<<8)+((255&Re)<<24)}function SA(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new E.Buf16(320),this.work=new E.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function OA(Re){var Mt;return Re&&Re.state?(Mt=Re.state,Re.total_in=Re.total_out=Mt.total=0,Re.msg="",Mt.wrap&&(Re.adler=1&Mt.wrap),Mt.mode=wA,Mt.last=0,Mt.havedict=0,Mt.dmax=32768,Mt.head=null,Mt.hold=0,Mt.bits=0,Mt.lencode=Mt.lendyn=new E.Buf32(kA),Mt.distcode=Mt.distdyn=new E.Buf32(xA),Mt.sane=1,Mt.back=-1,oA):EA}function WA(Re){var Mt;return Re&&Re.state?((Mt=Re.state).wsize=0,Mt.whave=0,Mt.wnext=0,OA(Re)):EA}function ue(Re,Mt){var UA,ci;return Re&&Re.state?(ci=Re.state,Mt<0?(UA=0,Mt=-Mt):(UA=1+(Mt>>4),Mt<48&&(Mt&=15)),Mt&&(Mt<8||15=Oi.wsize?(E.arraySet(Oi.window,Mt,UA-Oi.wsize,Oi.wsize,0),Oi.wnext=0,Oi.whave=Oi.wsize):(ci<(Os=Oi.wsize-Oi.wnext)&&(Os=ci),E.arraySet(Oi.window,Mt,UA-ci,Os,Oi.wnext),(ci-=Os)?(E.arraySet(Oi.window,Mt,UA-ci,ci,0),Oi.wnext=ci,Oi.whave=Oi.wsize):(Oi.wnext+=Os,Oi.wnext===Oi.wsize&&(Oi.wnext=0),Oi.whave>>8&255,UA.check=D(UA.check,hg,2,0),Ft=Ut=0,UA.mode=2;break}if(UA.flags=0,UA.head&&(UA.head.done=!1),!(1&UA.wrap)||(((255&Ut)<<8)+(Ut>>8))%31){Re.msg="incorrect header check",UA.mode=30;break}if((15&Ut)!=8){Re.msg="unknown compression method",UA.mode=30;break}if(Ft-=4,Ka=8+(15&(Ut>>>=4)),UA.wbits===0)UA.wbits=Ka;else if(Ka>UA.wbits){Re.msg="invalid window size",UA.mode=30;break}UA.dmax=1<>8&1),512&UA.flags&&(hg[0]=255&Ut,hg[1]=Ut>>>8&255,UA.check=D(UA.check,hg,2,0)),Ft=Ut=0,UA.mode=3;case 3:for(;Ft<32;){if(ji===0)break A;ji--,Ut+=ci[Oi++]<>>8&255,hg[2]=Ut>>>16&255,hg[3]=Ut>>>24&255,UA.check=D(UA.check,hg,4,0)),Ft=Ut=0,UA.mode=4;case 4:for(;Ft<16;){if(ji===0)break A;ji--,Ut+=ci[Oi++]<>8),512&UA.flags&&(hg[0]=255&Ut,hg[1]=Ut>>>8&255,UA.check=D(UA.check,hg,2,0)),Ft=Ut=0,UA.mode=5;case 5:if(1024&UA.flags){for(;Ft<16;){if(ji===0)break A;ji--,Ut+=ci[Oi++]<>>8&255,UA.check=D(UA.check,hg,2,0)),Ft=Ut=0}else UA.head&&(UA.head.extra=null);UA.mode=6;case 6:if(1024&UA.flags&&(ji<(Do=UA.length)&&(Do=ji),Do&&(UA.head&&(Ka=UA.head.extra_len-UA.length,UA.head.extra||(UA.head.extra=new Array(UA.head.extra_len)),E.arraySet(UA.head.extra,ci,Oi,Do,Ka)),512&UA.flags&&(UA.check=D(UA.check,ci,Do,Oi)),ji-=Do,Oi+=Do,UA.length-=Do),UA.length))break A;UA.length=0,UA.mode=7;case 7:if(2048&UA.flags){if(ji===0)break A;for(Do=0;Ka=ci[Oi+Do++],UA.head&&Ka&&UA.length<65536&&(UA.head.name+=String.fromCharCode(Ka)),Ka&&Do>9&1,UA.head.done=!0),Re.adler=UA.check=0,UA.mode=12;break;case 10:for(;Ft<32;){if(ji===0)break A;ji--,Ut+=ci[Oi++]<>>=7&Ft,Ft-=7&Ft,UA.mode=27;break}for(;Ft<3;){if(ji===0)break A;ji--,Ut+=ci[Oi++]<>>=1)){case 0:UA.mode=14;break;case 1:if(Fi(UA),UA.mode=20,Mt!==6)break;Ut>>>=2,Ft-=2;break A;case 2:UA.mode=17;break;case 3:Re.msg="invalid block type",UA.mode=30}Ut>>>=2,Ft-=2;break;case 14:for(Ut>>>=7&Ft,Ft-=7&Ft;Ft<32;){if(ji===0)break A;ji--,Ut+=ci[Oi++]<>>16^65535)){Re.msg="invalid stored block lengths",UA.mode=30;break}if(UA.length=65535&Ut,Ft=Ut=0,UA.mode=15,Mt===6)break A;case 15:UA.mode=16;case 16:if(Do=UA.length){if(ji>>=5,Ft-=5,UA.ndist=1+(31&Ut),Ut>>>=5,Ft-=5,UA.ncode=4+(15&Ut),Ut>>>=4,Ft-=4,286>>=3,Ft-=3}for(;UA.have<19;)UA.lens[ES[UA.have++]]=0;if(UA.lencode=UA.lendyn,UA.lenbits=7,kI={bits:UA.lenbits},Kl=T(0,UA.lens,0,19,UA.lencode,0,UA.work,kI),UA.lenbits=kI.bits,Kl){Re.msg="invalid code lengths set",UA.mode=30;break}UA.have=0,UA.mode=19;case 19:for(;UA.have>>16&255,bI=65535&Jg,!((Gr=Jg>>>24)<=Ft);){if(ji===0)break A;ji--,Ut+=ci[Oi++]<>>=Gr,Ft-=Gr,UA.lens[UA.have++]=bI;else{if(bI===16){for(sE=Gr+2;Ft>>=Gr,Ft-=Gr,UA.have===0){Re.msg="invalid bit length repeat",UA.mode=30;break}Ka=UA.lens[UA.have-1],Do=3+(3&Ut),Ut>>>=2,Ft-=2}else if(bI===17){for(sE=Gr+3;Ft>>=Gr)),Ut>>>=3,Ft-=3}else{for(sE=Gr+7;Ft>>=Gr)),Ut>>>=7,Ft-=7}if(UA.have+Do>UA.nlen+UA.ndist){Re.msg="invalid bit length repeat",UA.mode=30;break}for(;Do--;)UA.lens[UA.have++]=Ka}}if(UA.mode===30)break;if(UA.lens[256]===0){Re.msg="invalid code -- missing end-of-block",UA.mode=30;break}if(UA.lenbits=9,kI={bits:UA.lenbits},Kl=T(P,UA.lens,0,UA.nlen,UA.lencode,0,UA.work,kI),UA.lenbits=kI.bits,Kl){Re.msg="invalid literal/lengths set",UA.mode=30;break}if(UA.distbits=6,UA.distcode=UA.distdyn,kI={bits:UA.distbits},Kl=T(W,UA.lens,UA.nlen,UA.ndist,UA.distcode,0,UA.work,kI),UA.distbits=kI.bits,Kl){Re.msg="invalid distances set",UA.mode=30;break}if(UA.mode=20,Mt===6)break A;case 20:UA.mode=21;case 21:if(6<=ji&&258<=Br){Re.next_out=Yr,Re.avail_out=Br,Re.next_in=Oi,Re.avail_in=ji,UA.hold=Ut,UA.bits=Ft,v(Re,Cn),Yr=Re.next_out,Os=Re.output,Br=Re.avail_out,Oi=Re.next_in,ci=Re.input,ji=Re.avail_in,Ut=UA.hold,Ft=UA.bits,UA.mode===12&&(UA.back=-1);break}for(UA.back=0;Vg=(Jg=UA.lencode[Ut&(1<>>16&255,bI=65535&Jg,!((Gr=Jg>>>24)<=Ft);){if(ji===0)break A;ji--,Ut+=ci[Oi++]<>Ic)])>>>16&255,bI=65535&Jg,!(Ic+(Gr=Jg>>>24)<=Ft);){if(ji===0)break A;ji--,Ut+=ci[Oi++]<>>=Ic,Ft-=Ic,UA.back+=Ic}if(Ut>>>=Gr,Ft-=Gr,UA.back+=Gr,UA.length=bI,Vg===0){UA.mode=26;break}if(32&Vg){UA.back=-1,UA.mode=12;break}if(64&Vg){Re.msg="invalid literal/length code",UA.mode=30;break}UA.extra=15&Vg,UA.mode=22;case 22:if(UA.extra){for(sE=UA.extra;Ft>>=UA.extra,Ft-=UA.extra,UA.back+=UA.extra}UA.was=UA.length,UA.mode=23;case 23:for(;Vg=(Jg=UA.distcode[Ut&(1<>>16&255,bI=65535&Jg,!((Gr=Jg>>>24)<=Ft);){if(ji===0)break A;ji--,Ut+=ci[Oi++]<>Ic)])>>>16&255,bI=65535&Jg,!(Ic+(Gr=Jg>>>24)<=Ft);){if(ji===0)break A;ji--,Ut+=ci[Oi++]<>>=Ic,Ft-=Ic,UA.back+=Ic}if(Ut>>>=Gr,Ft-=Gr,UA.back+=Gr,64&Vg){Re.msg="invalid distance code",UA.mode=30;break}UA.offset=bI,UA.extra=15&Vg,UA.mode=24;case 24:if(UA.extra){for(sE=UA.extra;Ft>>=UA.extra,Ft-=UA.extra,UA.back+=UA.extra}if(UA.offset>UA.dmax){Re.msg="invalid distance too far back",UA.mode=30;break}UA.mode=25;case 25:if(Br===0)break A;if(Do=Cn-Br,UA.offset>Do){if((Do=UA.offset-Do)>UA.whave&&UA.sane){Re.msg="invalid distance too far back",UA.mode=30;break}Do>UA.wnext?(Do-=UA.wnext,Bl=UA.wsize-Do):Bl=UA.wnext-Do,Do>UA.length&&(Do=UA.length),GC=UA.window}else GC=Os,Bl=Yr-UA.offset,Do=UA.length;for(Brki?(Yt=Bl[GC+xA[Mt]],Fi=Ft[oE+xA[Mt]]):(Yt=96,Fi=0),SA=1<>Yr)+(OA-=SA)]=Li<<24|Yt<<16|Fi,OA!==0;);for(SA=1<>=1;if(SA!==0?(Ut&=SA-1,Ut+=SA):Ut=0,Mt++,--Cn[Re]==0){if(Re===ci)break;Re=W[oA+xA[Mt]]}if(Os{const v=new Uint8Array(D).slice(4);let T;try{T=Nl.inflate(v,{to:"string"})}catch(P){console.error("inflate error",P)}return T})(n.data):function(D){const v=new Uint8Array(D);let T="",P=0;const{length:W}=v;for(;P0)for(let kA=0;kA{var u;const{uplinkData:E,canResend:m,resolve:D,reject:v,timeout:T}=r;if(m){this._pendingRequests.set(g,{resolve:D,reject:v,timestamp:Date.now(),uplinkData:E,timeout:T,canResend:m});const P=this._isBinarySupported?Ua(E).buffer:E;(u=this._socketAdapter)===null||u===void 0||u.send(P)}else this._pendingRequests.delete(g)})}_onConnect(n){const{socketId:r,event:g={}}=n||{};this._connectionId=r,this._connectionEstablishedTime=Date.now();const u=Date.now()-this._connectionStartTime,E=`${dt}.onConnect cost:${u} ms. socketID:${r} res:${JSON.stringify(g)}`;if(this._ssoLog({method:"onConnect",message:E}),this._checkPendingRequestsAndResend(),this._sendHeartbeatIfReady(),this._isReconnecting){const m=`${dt}.reconnect success`;this._ssoLog({method:"reconnectSuccess",message:m}),$s.emitInnerEvent(He.RECONNECTED),this._isReconnecting=!1}this._resetReconnectDelay(),this._handleConnectStateChange({state:eo,shouldEmitEvent:!0,shouldAttemptReconnect:!1})}_sendAck(n){const r=Qa({servcmd:"openim.ws_msg_push_ack",data:{SessionData:n}});this.sendPacket(r)}_executeScheduledTaskIfReady(){return mA(this,void 0,void 0,function*(){this._clearTimeoutRequest(),this._sendHeartbeatIfReady()})}_canSendHeartbeat(){var n;return((n=this._socketAdapter)===null||n===void 0?void 0:n.isConnected())&&Date.now()>=this._nextHeartbeatAt&&!this._isHeartbeatInProgress}_sendHeartbeat(){return mA(this,void 0,void 0,function*(){var n;const r=Qa({servcmd:"heartbeat.alive",data:{}});try{const g=`${r.head.seq}${r.head.servcmd}`;yield this.sendPacket(r,{requestId:g,timeout:3e3})}catch(g){const u=(n=ro.get("netWorkMonitor"))===null||n===void 0?void 0:n.isNetworkOnline,E=`${dt}.sendHeartbeat failed. isNetWorkOnline:${u} error: ${_s(g)}`;this._ssoLog({method:"sendHeartbeatError",message:E}),this._handleConnectStateChange({state:_i,shouldEmitEvent:!0,shouldAttemptReconnect:!0})}})}_sendHeartbeatIfReady(){return mA(this,void 0,void 0,function*(){this._canSendHeartbeat()&&(this._isHeartbeatInProgress=!0,yield this._sendHeartbeat(),this._isHeartbeatInProgress=!1)})}_updateHeartbeatTime(){this._nextHeartbeatAt=ao?Date.now()+5e3:Date.now()+1e4}_handleNetworkStatusChange(n){const r=`${dt}.networkStatusChange ${JSON.stringify(n)}`;this._ssoLog({method:"networkStatusChange",message:r});const{isNetworkOnline:g,networkType:u}=n;g&&u!=="none"?this._handleConnectStateChange({state:eo,shouldEmitEvent:!1,shouldAttemptReconnect:!0,reason:Rg}):this._handleConnectStateChange({state:_i,shouldEmitEvent:!1,shouldAttemptReconnect:!0,reason:Rg})}isPrivateNetWork(){const n=ro.get("instance")||{};return n.proxyServer&&!n.fileDownloadProxy}_handleConnectStateChange(n){const{state:r,shouldAttemptReconnect:g,shouldEmitEvent:u,reason:E}=n,m=`${dt}._handleConnectStateChange currentConnectState: ${this._currentConnectState} shouldAttemptReconnect: ${g} shouldEmitEvent: ${u} reason: ${E}`;this._currentConnectState!==r&&(this._ssoLog({method:"handleConnectStateChange",message:m}),u&&(Kt.info("_handleConnectStateChange",` from ${this._currentConnectState} to ${r}`),$s.emitOuterEvent("netStateChange",{name:"netStateChange",data:{state:r}}),this._currentConnectState=r,r===_i&&$s.emitInnerEvent(He.SOCKET_DISCONNECTED)),g&&(this._resetReconnectDelay(),Rn.addTask({id:$i,intervalMs:this._intendedDelay,callback:this._scheduleReconnectWithBackoff,context:this})))}_handleActivityStatusChange(n){var r,g;const u=(g=(r=this._socketAdapter)===null||r===void 0?void 0:r._ws)===null||g===void 0?void 0:g.readyState,E=`${dt}.activityStatusChange ${JSON.stringify(n)} readyState: ${u}`;Kt.debug("activityStatusChange",E),u===3&&this._handleConnectStateChange({state:_i,shouldEmitEvent:!0,shouldAttemptReconnect:!0,reason:Er})}_resetReconnectDelay(){var n;Kt.debug(`${dt}._resetReconnectDelay`),Rn.removeTask($i);const r=(n=ro.get("activityMonitor"))===null||n===void 0?void 0:n.isActive;this._intendedDelay=r?is:1e3}_scheduleReconnectWithBackoff(){var n;const r=(n=ro.get("activityMonitor"))===null||n===void 0?void 0:n.isActive;this._intendedDelay=r?Math.min(5e3,Math.max(is,1.5*this._intendedDelay)):Math.min(3e5,Math.max(1e3,1.5*this._intendedDelay));const g=new Date().toTimeString().slice(0,8),u=`${dt}.scheduleReconnectWithBackoff timeStr: ${g} intendedDelay: ${this._intendedDelay}`;Kt.debug(u),this.reconnect(),Rn.updateTaskInterval($i,this._intendedDelay)}_ssoLog(n){const{method:r,message:g}=n;Kt.info(r,g)}_diagnose(){this.isPrivateNetWork()||(this._lastDiagnoseAt=Date.now(),function(n){mA(this,void 0,void 0,function*(){const r=n.split("/")[2];if(!r.startsWith("ws"))return;const g=`https://${r}/v3/netcheck/getconninfo?${n.slice(n.indexOf("info?")+5)}&reqtime=${Date.now()}`;try{yield qi({method:"GET",url:g,data:{}})}catch(u){Kt.warn("diagnoseBySSO",`diagnoseBySSO failed. error:${u.message}`)}})}(this._url),function(n){mA(this,void 0,void 0,function*(){const r=`https://boce-cdn.my-imcloud.com/v3/netcheck/getconninfo?${n.slice(n.indexOf("info?")+5)}&reqtime=${Date.now()}`;try{yield qi({method:"GET",url:r,data:{}})}catch(g){Kt.warn(`diagnoseByCDN', 'diagnoseByCDN failed. error:${g.message}`)}})}(this._url),this._beforeSendInterceptors=[])}_clearTimeoutRequest(){for(const[n,r]of this._pendingRequests.entries()){const{reject:g,timestamp:u,timeout:E}=r;Date.now()-u>=E&&(this._pendingRequests.delete(n),Date.now()-this._lastDiagnoseAt>=3e4&&this._diagnose(),g({errorCode:Zn,errorInfo:"NETWORK_TIMEOUT",data:{requestId:n}}))}}_updateIsBinarySupported(){var n;if(!((n=ro.get("instance"))===null||n===void 0)&&n.devMode)return void(this._isBinarySupported=!1);const r=Vo();if((ii||ze&&r==="windows"||ws)&&(this._isBinarySupported=!1),ao){const{uniRuntimeVersion:g=""}=so.getSystemInfoSync();(function(u){const E=u.split(".").map(Number),[m=0,D=0,v=0]=E;return m>2||!(m<2)&&(D>2||!(D<2)&&v>=6)})(g)||(this._isBinarySupported=!1)}}_isCompressedData(n){const r=new Uint8Array(n);return r[0]===67&&r[1]===79&&r[2]===77&&r[3]===80}};const De={init:function(n){ro.set("instance",n),Se.init()},destroy:function(){Se.dispose(),ro.clear(),Rn.dispose()},notificationCenter:$s,channel:Se,store:ro,ssoLog:Kt,utils:Xa,common:MA,constants:Te},wg=n=>typeof n=="function";function gg(n,r,g){const u=g||[];if(!n||!r)return!1;const E=Object.keys(n).filter(D=>!u.includes(D)),m=Object.keys(r).filter(D=>!u.includes(D));return E.length===m.length&&E.every(D=>!!r.hasOwnProperty(D)&&(typeof n[D]=="object"&&n[D]!==null?gg(n[D],r[D],g):n[D]===r[D]))}var _g;(function(n){n.SDK_READY="sdkStateReady",n.SDK_NOT_READY="sdkStateNotReady",n.SDK_DESTROY="sdkDestroy",n.MESSAGE_RECEIVED="onMessageReceived",n.ROOM_CUSTOM_DATA_RECEIVED="onRoomCustomDataReceived",n.MESSAGE_MODIFIED="onMessageModified",n.MESSAGE_REVOKED="onMessageRevoked",n.MESSAGE_READ_BY_PEER="onMessageReadByPeer",n.MESSAGE_READ_RECEIPT_RECEIVED="onMessageReadReceiptReceived",n.MESSAGE_EXTENSIONS_UPDATED="onMessageExtensionsUpdated",n.MESSAGE_EXTENSIONS_DELETED="onMessageExtensionsDeleted",n.MESSAGE_REACTIONS_UPDATED="onMessageReactionsUpdated",n.CONVERSATION_LIST_UPDATED="onConversationListUpdated",n.TOTAL_UNREAD_MESSAGE_COUNT_UPDATED="onTotalUnreadMessageCountUpdated",n.CONVERSATION_GROUP_LIST_UPDATED="onConversationGroupListUpdated",n.CONVERSATION_IN_GROUP_UPDATED="onConversationInGroupUpdated",n.GROUP_LIST_UPDATED="onGroupListUpdated",n.GROUP_ATTRIBUTES_UPDATED="groupAttributesUpdated",n.GROUP_COUNTER_UPDATED="onGroupCounterUpdated",n.TOPIC_CREATED="onTopicCreated",n.TOPIC_DELETED="onTopicDeleted",n.TOPIC_UPDATED="onTopicUpdated",n.PROFILE_UPDATED="onProfileUpdated",n.USER_STATUS_UPDATED="onUserStatusUpdated",n.BLACKLIST_UPDATED="blacklistUpdated",n.FRIEND_LIST_UPDATED="onFriendListUpdated",n.FRIEND_GROUP_LIST_UPDATED="onFriendGroupListUpdated",n.FRIEND_APPLICATION_LIST_UPDATED="onFriendApplicationListUpdated",n.MY_FOLLOWERS_LIST_UPDATED="onMyFollowersListUpdated",n.MY_FOLLOWING_LIST_UPDATED="onMyFollowingListUpdated",n.MUTUAL_FOLLOWERS_LIST_UPDATED="onMutualFollowersListUpdated",n.KICKED_OUT="kickedOut",n.ERROR="error",n.NET_STATE_CHANGE="netStateChange",n.ALL_RECEIVE_MESSAGE_OPT_UPDATED="onAllReceiveMessageOptUpdated",n.SERVER_CONFIG_UPDATED="onServerConfigUpdated",n.PINNED_GROUP_MESSAGE_UPDATED="onPinnedGroupMessageUpdated",n.WEB_PUSH_MESSAGE_RECEIVED="onWebPushMessageReceived",n.GROUP_ONLINE_MEMBER_COUNT_CHANGED="onGroupOnlineMemberCountChanged",n.RICH_STATUS_CHANGED="onRichStatusChanged"})(_g||(_g={}));var _n,Rr=_g;(function(n){n.LOGOUT="logout",n.DESTROY="destroy",n.CLOUD_CONFIG_UPDATE="cloud_config_update",n.PROFILE_UPDATE="profile_updated",n.ERROR="error",n.RECONNECTED="reconnected",n.FORCE_OFFLINE="im_open_status.stat_forceoffline",n.COMMERCIAL_CONFIG_PUSH="im_sdk_config_mgr.push_imsdk_purchase_bitsv2",n.OVERLOAD_PUSH="OverLoadPush.notify2",n.NEW_MESSAGE="new_message",n.MESSAGE_PUSH="im_open_push.msg_push",n.MESSAGE_DELETED="message_deleted",n.MESSAGE_REVOKED="message_revoked",n.MESSAGE_MODIFIED="message_modified",n.SOCKET_DISCONNECTED="socket_disconnected",n.CONVERSATION_UPDATED="conversation_updated",n.TOPIC_MESSAGE_DELETED="topic_message_deleted",n.TOPIC_MESSAGE_REVOKED="topic_message_revoked",n.TOPIC_MESSAGE_MODIFIED="topic_message_modified",n.TOPIC_NEW_MESSAGE="topic_new_message",n.QUALITY_STAT="quality_stat",n.SYNC_CONVERSATION_LIST="sync_conversation_list",n.HISTORY_MESSAGE_FETCHED="history_message_fetched"})(_n||(_n={}));var Ci,lo=_n;(function(n){n.NEW_INVITATION_RECEIVED="newInvitationReceived",n.INVITEE_ACCEPTED="ts_invitee_accepted",n.INVITEE_REJECTED="ts_invitee_rejected",n.INVITATION_CANCELLED="ts_invitation_cancelled",n.INVITATION_TIMEOUT="ts_invitation_timeout",n.INVITATION_MODIFIED="ts_invitation_modified"})(Ci||(Ci={}));var Xc=Ci;const Ac=Object.assign({},{KICKED_OUT_MULT_ACCOUNT:"multipleAccount",KICKED_OUT_MULT_DEVICE:"multipleDevice",KICKED_OUT_USERSIG_EXPIRED:"userSigExpired",KICKED_OUT_REST_API:"REST_API_Kick"}),Tg={MSG_TEXT:"TIMTextElem",MSG_IMAGE:"TIMImageElem",MSG_AUDIO:"TIMSoundElem",MSG_FILE:"TIMFileElem",MSG_FACE:"TIMFaceElem",MSG_VIDEO:"TIMVideoFileElem",MSG_LOCATION:"TIMLocationElem",MSG_GRP_TIP:"TIMGroupTipElem",MSG_GRP_SYS_NOTICE:"TIMGroupSystemNoticeElem",MSG_CUSTOM:"TIMCustomElem",MSG_MERGER:"TIMRelayElem",MSG_STREAM:"TIMStreamElem"};var qr;(function(n){n.UNSENT="unSend",n.SUCCESS="success",n.FAIL="fail"})(qr||(qr={}));const wc={modify:lo.MESSAGE_MODIFIED,delete:lo.MESSAGE_DELETED,revoke:lo.MESSAGE_REVOKED};var $c;(function(n){n[n.FORWARD=0]="FORWARD",n[n.BACKWARD=1]="BACKWARD"})($c||($c={}));const cg=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},Tg),{MSG_PRIORITY_HIGH:"High",MSG_PRIORITY_NORMAL:"Normal",MSG_PRIORITY_LOW:"Low",MSG_PRIORITY_LOWEST:"Lowest"}),{RECEIVE_WITH_OFFLINE_PUSH_EXCEPT_AT:"AcceptNotNotifyExceptAt",NOT_RECEIVE_OFFLINE_PUSH_EXCEPT_AT:"AcceptNotNotifyExceptAt",NOT_RECEIVE_MSG_EXCEPT_AT:"NotReceiveMsgExceptAt",MSG_AT_ALL:"__kImSDK_MesssageAtALL__"}),{MSG_REMIND_ACPT_AND_NOTE:"AcceptAndNotify",MSG_REMIND_ACPT_NOT_NOTE:"AcceptNotNotify",MSG_REMIND_DISCARD:"Discard"}),{MessageStatus:qr,Direction:$c}),Nu={[wc.modify]:lo.TOPIC_MESSAGE_MODIFIED,[wc.delete]:lo.TOPIC_MESSAGE_DELETED,[wc.revoke]:lo.TOPIC_MESSAGE_REVOKED},SE={GENDER_UNKNOWN:"Gender_Type_Unknown",GENDER_FEMALE:"Gender_Type_Female",GENDER_MALE:"Gender_Type_Male",USER_STATUS_UNKNOWN:0,USER_STATUS_ONLINE:1,USER_STATUS_OFFLINE:2,USER_STATUS_UNLOGINED:3,USER_NOT_FOUND:"@TLS#NOT_FOUND"},Ng=Object.assign({},SE),Oa={CONV_C2C:"C2C",CONV_GROUP:"GROUP",CONV_TOPIC:"TOPIC",CONV_SYSTEM:"@TIM#SYSTEM"},_c=Object.assign(Object.assign(Object.assign(Object.assign({},Oa),{CONV_AT_ME:1,CONV_AT_ALL:2,CONV_AT_ALL_AT_ME:3}),{CONV_MARK_TYPE_STAR:1,CONV_MARK_TYPE_UNREAD:2,CONV_MARK_TYPE_FOLD:4,CONV_MARK_TYPE_HIDE:8}),{READ_ALL_C2C_MSG:"readAllC2CMessage",READ_ALL_GROUP_MSG:"readAllGroupMessage",READ_ALL_MSG:"readAllMessage"}),vE=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},{SNS_TYPE_NO_RELATION:"CheckResult_Type_NoRelation",SNS_TYPE_A_WITH_B:"CheckResult_Type_AWithB",SNS_TYPE_B_WITH_A:"CheckResult_Type_BWithA",SNS_TYPE_BOTH_WAY:"CheckResult_Type_BothWay"}),{ALLOW_TYPE_ALLOW_ANY:"AllowType_Type_AllowAny",ALLOW_TYPE_NEED_CONFIRM:"AllowType_Type_NeedConfirm",ALLOW_TYPE_DENY_ANY:"AllowType_Type_DenyAny"}),{SNS_ADD_TYPE_SINGLE:"Add_Type_Single",SNS_ADD_TYPE_BOTH:"Add_Type_Both"}),{SNS_DELETE_TYPE_SINGLE:"Delete_Type_Single",SNS_DELETE_TYPE_BOTH:"Delete_Type_Both"}),{SNS_APPLICATION_TYPE_BOTH:"Pendency_Type_Both",SNS_APPLICATION_SENT_TO_ME:"Pendency_Type_ComeIn",SNS_APPLICATION_SENT_BY_ME:"Pendency_Type_SendOut",SNS_APPLICATION_AGREE:"Response_Action_Agree",SNS_APPLICATION_AGREE_AND_ADD:"Response_Action_AgreeAndAdd"}),{SNS_CHECK_TYPE_BOTH:"CheckResult_Type_Both",SNS_CHECK_TYPE_SINGLE:"CheckResult_Type_Single"}),{FORBID_TYPE_NONE:"AdminForbid_Type_None",FORBID_TYPE_SEND_OUT:"AdminForbid_Type_SendOut"}),Pa={GRP_WORK:"Private",GRP_PUBLIC:"Public",GRP_MEETING:"ChatRoom",GRP_AVCHATROOM:"AVChatRoom",GRP_COMMUNITY:"Community",GRP_ROOM:"Room",GRP_LIVE:"Live"},ga={COMMUNITY:"@TGS#_",TOPIC:"@TOPIC#_"},Gg={JOINED:1,QUITTED:2,KICKED:3,ADMIN_SET:4,ADMIN_CANCELED:5,GROUP_PROFILE_UPDATED:6,GROUP_MEMBER_PROFILE_UPDATED:7,TOPIC_PROFILE_UPDATED:8},EI=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},Pa),{GRP_MBR_ROLE_OWNER:"Owner",GRP_MBR_ROLE_ADMIN:"Admin",GRP_MBR_ROLE_MEMBER:"Member",GRP_MBR_ROLE_CUSTOM:"Custom"}),{GRP_TIP_MBR_JOIN:1,GRP_TIP_MBR_QUIT:2,GRP_TIP_MBR_KICKED_OUT:3,GRP_TIP_MBR_SET_ADMIN:4,GRP_TIP_MBR_CANCELED_ADMIN:5,GRP_TIP_GRP_PROFILE_UPDATED:6,GRP_TIP_MBR_PROFILE_UPDATED:7,GRP_TIP_BAN_AVCHATROOM_MEMBER:10,GRP_TIP_UNBAN_AVCHATROOM_MEMBER:11}),{JOIN_OPTIONS_FREE_ACCESS:"FreeAccess",JOIN_OPTIONS_NEED_PERMISSION:"NeedPermission",JOIN_OPTIONS_DISABLE_APPLY:"DisableApply",JOIN_STATUS_SUCCESS:"JoinedSuccess",JOIN_STATUS_ALREADY_IN_GROUP:"AlreadyInGroup",JOIN_STATUS_WAIT_APPROVAL:"WaitAdminApproval"}),{INVITE_OPTIONS_DISABLE_INVITE:"DisableInvite",INVITE_OPTIONS_NEED_PERMISSION:"NeedPermission",INVITE_OPTIONS_FREE_ACCESS:"FreeAccess"}),{GRP_PROFILE_OWNER_ID:"ownerID",GRP_PROFILE_CREATE_TIME:"createTime",GRP_PROFILE_LAST_INFO_TIME:"lastInfoTime",GRP_PROFILE_MEMBER_NUM:"memberNum",GRP_PROFILE_MAX_MEMBER_NUM:"maxMemberNum",GRP_PROFILE_JOIN_OPTION:"joinOption",GRP_PROFILE_INVITE_OPTION:"inviteOption",GRP_PROFILE_INTRODUCTION:"introduction",GRP_PROFILE_NOTIFICATION:"notification",GRP_PROFILE_MUTE_ALL_MBRS:"muteAllMembers"}),{GROUP_ID_PREFIX:ga,GROUP_TIPS_OPERATION_TYPE:Gg}),Ss={IOS_OFFLINE_PUSH_NO_SOUND:"push.no_sound",IOS_OFFLINE_PUSH_DEFAULT_SOUND:"default"},Po=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},Ac),cg),Ng),_c),vE),EI),Ss),{NET_STATE_CONNECTING:"connecting",NET_STATE_DISCONNECTED:"disconnected",NET_STATE_CONNECTED:"connected"}),pa={NO_SDKAPPID:2e3,NO_TINYID:2022,NO_A2KEY:2023,USER_NOT_LOGGED_IN:2024,REPEAT_LOGIN:2025,MSG_SEND_FAIL:2100,MSG_SEND_FAIL_NOT_IN_AV:2101,MSG_SEND_GRP_WITH_TOPIC_FAIL:2115,MSG_INSTANCE_REQUIRED:2105,MSG_INVALID_CONV_TYPE:2106,MSG_REVOKE_FAIL:2110,MSG_DELETE_FAIL:2111,MSG_UNREAD_ALL_FAIL:2112,READ_RECEIPT_MSG_LIST_EMPTY:2114,CANNOT_DELETE_GRP_SYSTEM_NOTICE:2116,NOT_MY_FRIEND:2700,NETWORK_ERROR:2800,NETWORK_TIMEOUT:2801,NO_NETWORK:2805,UNCAUGHT_ERROR:2903,INVALID_OPERATION:2905,SDK_IS_NOT_READY:2999,LOGGING_IN:3e3,LOGIN_FAILED:3001,KICKED_OUT_MULT_DEVICE:3002,KICKED_OUT_MULT_ACCOUNT:3003,KICKED_OUT_USERSIG_EXPIRED:3004,LOGGED_OUT:3005,KICKED_OUT_REST_API:3006,NO_USE:3122,OPTIONS_IS_EMPTY:3153,MSG_A2KEY_EXPIRED:20002,ACCOUNT_A2KEY_EXPIRED:70001,HELLO_ANSWER_KICKED_OUT:1002,OPEN_SERVICE_OVERLOAD_ERROR:60022},dr={BASIC:"1",STANDARD:"2",PROFESSIONAL:"3",NODE:"4"},jt={SYNC_SERVER_INFO_AFTER_RE_ONLINE:"sync-server-info-after-re-online",SYNC_SERVER_INFO_AFTER_LOGIN:"sync-server-info-after-login",RECEIVE_C2C_NEW_MESSAGE:"receive-c2c-new-message",RECEIVE_GROUP_NEW_MESSAGE:"receive-group-new-message",RECEIVE_GROUP_TIPS_NOTIFICATION:"receive-group-tips-notification"},Xt={USER_STATUS_UPDATE:"user-status-update",CONVERSATION_RECOVER:"conversation-recover",HISTORY_MESSAGE_RECOVER:"history-message-recover",BLACKLIST_RECOVER:"blacklist-recover",FRIEND_RECOVER:"friend-recover",GROUP_ATTRIBUTE_CACHE_CLEAR:"group-attribute-cache-clear",UNREAD_MESSAGE_RECOVER:"unread-message-recover",HANDLE_NEW_MESSAGE:"handle-new-message",HANDLE_CONVERSATION_PROFILE_UPDATED:"handle-conversation-profile-updated",COMMERCIAL_CONFIG_UPDATE:"commercial-config-update",UNREAD_MESSAGE_SYNC:"unread-message-sync",FRIEND_AND_BLACKLIST_SYNC:"friend-and-blacklist-sync",SIGNALING_MESSAGE_RECOVER:"signaling-message-recover",GROUP_LIST_SYNC:"group-list-sync",CONVERSATION_LIST_SYNC:"conversation-list-sync",USER_PROFILE_SYNC:"user-profile-sync",CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED:"conversation-update-after-unread-sync-finished",CONVERSATION_UPDATE_AFTER_GROUP_LIST_SYNC_FINISHED:"conversation-update-after-group-list-sync-finished",HANDLE_C2C_NEW_MESSAGE:"handle-c2c-new-message",HANDLE_GROUP_NEW_MESSAGE:"handle-group-new-message",CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE:"create-or-update-conversation-by-receive-new-message",HANDLE_GROUP_TIPS_FROM_SYNC_UNREAD:"handle-group-tips-from-sync-unread",HANDLE_C2C_REVOKED_MESSAGE_FROM_SYNC_UNREAD:"handle-c2c-revoked-message-from-sync-unread",GROUP_REVOKED_NOTICE_RECOVER:"group-revoked-notice-recover",CLOUD_CONFIG_SYNC:"cloud-config-sync",UPDATE_GROUP_NEXT_SEQUENCE:"update-group-next-sequence",EMIT_C2C_MESSAGE_EVENT:"emit-c2c-message-event",EMIT_GROUP_MESSAGE_EVENT:"emit-group-message-event",CONVERSATION_GROUP_LIST_SYNC:"conversation-group-list-sync",CONVERSATION_GROUP_UPDATE:"conversation-group-update",UPDATE_TOPIC_AFTER_UNREAD_SYNC_FINISHED:"update-topic-after-unread-sync-finished",UPDATE_TOPIC_BY_RECEIVE_NEW_MESSAGE:"update-topic-by-received-new-message",TOPIC_REQUEST_INFO_RESET:"topic-request-info-reset",QUALITY_REPORT:"quality-report",GROUP_TIPS_RECOVER:"group-tips-recover",HANDLE_GROUP_TIPS_NOTIFICATION:"handle-group-tips-notification",C2C_HISTORY_MESSAGE_RECOVER:"c2c-history-message-recover",FRIEND_APPLICATION_LIST_RECOVER:"friend-application-list-recover",EMIT_GROUP_TIPS_EVENT:"emit-group-tips-event",STREAM_MESSAGE_RECOVER:"stream-message-recover"},bg={[jt.SYNC_SERVER_INFO_AFTER_RE_ONLINE]:[{stepId:Xt.USER_STATUS_UPDATE},{stepId:Xt.GROUP_ATTRIBUTE_CACHE_CLEAR},{stepId:Xt.UNREAD_MESSAGE_SYNC,dependency:Xt.C2C_HISTORY_MESSAGE_RECOVER},{stepId:Xt.CONVERSATION_RECOVER},{stepId:Xt.HISTORY_MESSAGE_RECOVER,dependency:Xt.CONVERSATION_RECOVER},{stepId:Xt.BLACKLIST_RECOVER},{stepId:Xt.FRIEND_RECOVER},{stepId:Xt.FRIEND_APPLICATION_LIST_RECOVER},{stepId:Xt.GROUP_REVOKED_NOTICE_RECOVER,dependency:Xt.HISTORY_MESSAGE_RECOVER},{stepId:Xt.GROUP_TIPS_RECOVER,dependency:Xt.HISTORY_MESSAGE_RECOVER},{stepId:Xt.TOPIC_REQUEST_INFO_RESET},{stepId:Xt.HANDLE_C2C_REVOKED_MESSAGE_FROM_SYNC_UNREAD,dependency:Xt.UNREAD_MESSAGE_SYNC},{stepId:Xt.HANDLE_GROUP_TIPS_FROM_SYNC_UNREAD,dependency:Xt.UNREAD_MESSAGE_SYNC},{stepId:Xt.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,dependency:[Xt.UNREAD_MESSAGE_SYNC,Xt.CONVERSATION_RECOVER]},{stepId:Xt.EMIT_C2C_MESSAGE_EVENT,dependency:[Xt.UNREAD_MESSAGE_SYNC,Xt.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED],skipIfDependencyMissing:!1},{stepId:Xt.C2C_HISTORY_MESSAGE_RECOVER,dependency:Xt.CONVERSATION_RECOVER},{stepId:Xt.STREAM_MESSAGE_RECOVER}],[jt.SYNC_SERVER_INFO_AFTER_LOGIN]:[{stepId:Xt.COMMERCIAL_CONFIG_UPDATE},{stepId:Xt.CLOUD_CONFIG_SYNC},{stepId:Xt.USER_PROFILE_SYNC},{stepId:Xt.UNREAD_MESSAGE_SYNC},{stepId:Xt.FRIEND_AND_BLACKLIST_SYNC},{stepId:Xt.GROUP_LIST_SYNC},{stepId:Xt.CONVERSATION_LIST_SYNC},{stepId:Xt.SIGNALING_MESSAGE_RECOVER,dependency:Xt.UNREAD_MESSAGE_SYNC},{stepId:Xt.UPDATE_TOPIC_AFTER_UNREAD_SYNC_FINISHED,dependency:[Xt.UNREAD_MESSAGE_SYNC]},{stepId:Xt.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,dependency:[Xt.UNREAD_MESSAGE_SYNC,Xt.CONVERSATION_LIST_SYNC]},{stepId:Xt.CONVERSATION_UPDATE_AFTER_GROUP_LIST_SYNC_FINISHED,dependency:[Xt.GROUP_LIST_SYNC,Xt.CONVERSATION_LIST_SYNC]},{stepId:Xt.CONVERSATION_GROUP_LIST_SYNC},{stepId:Xt.CONVERSATION_GROUP_UPDATE,dependency:[Xt.CONVERSATION_LIST_SYNC,Xt.CONVERSATION_GROUP_LIST_SYNC]},{stepId:Xt.QUALITY_REPORT}],[jt.RECEIVE_C2C_NEW_MESSAGE]:[{stepId:Xt.HANDLE_C2C_NEW_MESSAGE},{stepId:Xt.UNREAD_MESSAGE_SYNC},{stepId:Xt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,dependency:Xt.HANDLE_C2C_NEW_MESSAGE},{stepId:Xt.EMIT_C2C_MESSAGE_EVENT,dependency:[Xt.HANDLE_C2C_NEW_MESSAGE,Xt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE],skipIfDependencyMissing:!1},{stepId:Xt.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,dependency:[Xt.UNREAD_MESSAGE_SYNC]}],[jt.RECEIVE_GROUP_NEW_MESSAGE]:[{stepId:Xt.HANDLE_GROUP_NEW_MESSAGE},{stepId:Xt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,dependency:Xt.HANDLE_GROUP_NEW_MESSAGE},{stepId:Xt.UPDATE_GROUP_NEXT_SEQUENCE,dependency:Xt.HANDLE_GROUP_NEW_MESSAGE},{stepId:Xt.UPDATE_TOPIC_BY_RECEIVE_NEW_MESSAGE,dependency:Xt.HANDLE_GROUP_NEW_MESSAGE},{stepId:Xt.EMIT_GROUP_MESSAGE_EVENT,dependency:[Xt.HANDLE_GROUP_NEW_MESSAGE,Xt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE],skipIfDependencyMissing:!1}],[jt.RECEIVE_GROUP_TIPS_NOTIFICATION]:[{stepId:Xt.HANDLE_GROUP_TIPS_NOTIFICATION},{stepId:Xt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,dependency:Xt.HANDLE_GROUP_TIPS_NOTIFICATION},{stepId:Xt.EMIT_GROUP_TIPS_EVENT,dependency:[Xt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,Xt.HANDLE_GROUP_TIPS_NOTIFICATION],skipIfDependencyMissing:!1}]},dI={MESSAGE_SEND_SUCCESS_RATE:"messageSendSuccessRate"},Cr={TOTAL_COUNT:"sendMessageTotalCount",SUCCESS_COUNT:"sendMessageSuccessCount",FAILED_COUNT:"sendMessageFailedCount",SEND_COST:"sendMessageCost"},zI=["login","getMyProfile","getUserProfile","updateMyProfile","setSelfStatus","getUserStatus","subscribeUserStatus","unsubscribeUserStatus","modifyMessage","deleteGroupMember","dismissGroup","getGroupMemberList","getGroupOnlineMemberCount","joinGroup","markGroupMemberList","quitGroup","searchCloudMessages","searchCloudGroups","searchCloudGroupMembers","searchCloudUsers","getMyFollowingList","getMyFollowersList","getMutualFollowersList","followUser","unfollowUser","getUserFollowInfo","checkFollowType","getFriendProfile","addFriend","deleteFriend","updateFriend","checkFriend","setFriendApplicationRead","createFriendGroup","deleteFriendGroup","addToFriendGroup","removeFromFriendGroup","renameFriendGroup","changeGroupOwner","createGroup","dismissGroup","getGroupList","getGroupOnlineMemberCount","getGroupProfile","searchGroupByID","updateGroupProfile","handleGroupApplication","deleteGroupAttributes","getGroupAttributes","initGroupAttributes","setGroupAttributes","addGroupMember","deleteGroupMember","getGroupMemberList","getGroupMemberProfile","setGroupMemberMuteTime","setGroupMemberNameCard","setGroupMemberRole","deleteMessage","revokeMessage","setMessageExtensions","getMessageExtensions","deleteMessageExtensions","getMessageList","addMessageReaction","removeMessageReaction","clearHistoryMessage","sendMessageReadReceipt","getMessageReadReceiptList","getGroupMessageReadMemberList","createMergerMessage","invite","accept","cancel","reject","modifyInvitation","deleteConversation","pinConversation","setMessageRead","setAllMessageRead","getConversationList","getTotalUnreadMessageCount","renameConversationGroup","deleteConversationGroup","markConversation","setConversationCustomData","deleteConversationsFromGroup","addConversationsToGroup","createConversationGroup"];var $a=Object.freeze({__proto__:null,ERROR_CODE:pa,InnerEvent:lo,NEED_LOG_API:zI,OuterConstant:Po,OuterEvent:Rr,PUSH:Ss,QUALITY_METRICS:dI,SDK_EDITION:dr,SDK_INFO:{VERSION:"1.7.3",APPID:537048168},SEND_MESSAGE_STAT:Cr,SignalingEvent:Xc,WEB_PUSH_ACCOUNT_TYPE:1,WORKFLOW_DEFINITIONS:bg,WORKFLOW_NAME:jt,WORKFLOW_STEP:Xt}),ca,Qn,Tn;(function(n){n[n.USER_INITIATED=0]="USER_INITIATED",n[n.KICKED_OUT=1]="KICKED_OUT"})(ca||(ca={})),function(n){n[n.multipleAccount=1]="multipleAccount",n[n.multipleDevice=2]="multipleDevice",n[n.restApi=3]="restApi"}(Qn||(Qn={})),function(n){n[n.multipleDevice=3002]="multipleDevice",n[n.multipleAccount=3003]="multipleAccount",n[n.usersigExpired=70001]="usersigExpired",n[n.restApi=20002]="restApi"}(Tn||(Tn={}));const Gu={[Qn.multipleAccount]:"multipleAccount",[Qn.multipleDevice]:"multipleDevice",[Qn.restApi]:"REST_API_Kick",[Tn.multipleAccount]:"multipleAccount",[Tn.multipleDevice]:"multipleDevice",[Tn.restApi]:"REST_API_Kick",[Tn.usersigExpired]:"userSigExpired"},kg="login_online_presence_task",{ERROR:xa,DESTROY:Al,FORCE_OFFLINE:ZI}=lo,{KICKED_OUT_MULT_ACCOUNT:ME,KICKED_OUT_MULT_DEVICE:CI,KICKED_OUT_REST_API:bu,ACCOUNT_A2KEY_EXPIRED:Gl,MSG_A2KEY_EXPIRED:Tc}=pa;class ku{init(){const{notificationCenter:r}=De;r.subscribeInnerEvent(ZI,this._handleForceOfflineFromServerPush,this),r.subscribeInnerEvent(xa,Tc,this._handleForceOfflineFromResponse,this,this._isChatLoginEvent),r.subscribeInnerEvent(xa,Gl,this._handleForceOfflineFromResponse,this,this._isChatLoginEvent),r.subscribeInnerEvent(xa,ME,this._handleForceOfflineFromResponse,this),r.subscribeInnerEvent(xa,CI,this._handleForceOfflineFromResponse,this),r.subscribeInnerEvent(xa,bu,this._handleForceOfflineFromResponse,this),r.subscribeInnerEvent(Al,this._dispose,this)}_handleForceOfflineFromServerPush(r){var g;if(((g=De.store.get("login"))===null||g===void 0?void 0:g.isLoggedIn)===!0){const{EventArray:u=[]}=r?.body||{};this._extractKickedOutMessages(u).forEach(E=>{const{KickoutMsgNotify:{KickType:m,NewInstInfo:D,Instid:v}}=E;this._isCurrentInstanceKickedOut(v)&&this._processKickedOutReasonInfo({kickedOutReasonCode:m,newInstanceInfo:D})})}}_extractKickedOutMessages(r){return r.reduce((g,u)=>[...g,...u.C2cNotifyMsgArray||[]],[]).filter(g=>{var u;return this._isKickedOut((u=g?.KickoutMsgNotify)===null||u===void 0?void 0:u.KickType)})}_handleForceOfflineFromResponse(r){const{errorCode:g}=r;this._processKickedOutReasonInfo({kickedOutReasonCode:g})}_processKickedOutReasonInfo(r){return mA(this,void 0,void 0,function*(){const{kickedOutReasonCode:g}=r,{ssoLog:u,utils:{safeStringify:E}}=De;try{this._logKickedOutEvent(r),this._shouldLogoutAfterKickedOut(g)?yield De.login.loginAction.logout(ca.KICKED_OUT):De.login.loginAction.handleLogoutCompleted()}catch(m){u.debug("_processKickedOutReasonInfo",` fail ${E(m)}`)}finally{De.notificationCenter.emitOuterEvent(Rr.KICKED_OUT,{data:{type:Gu[g]},name:Rr.KICKED_OUT})}})}_logKickedOutEvent(r){const{kickedOutReasonCode:g,newInstanceInfo:u={}}=r,E=`type:${Gu[g]} newInstanceInfo: ${JSON.stringify(u)}`;De.ssoLog.warn("kickedOut",E)}_isKickedOut(r){return[Qn.multipleAccount,Qn.multipleDevice,Qn.restApi].includes(r)}_isChatLoginEvent(r){const{requestHead:g}=r||{};return g?.idtype!==1}_shouldLogoutAfterKickedOut(r){return![Tn.usersigExpired,Qn.restApi].includes(r)}_isCurrentInstanceKickedOut(r){const{isLoggedIn:g,statusInstanceId:u}=De.store.get("login")||{};return g===!0&&r===u}_dispose(){const{notificationCenter:r}=De;r.unSubscribeInnerEvent(ZI,this._handleForceOfflineFromServerPush,this),r.unSubscribeInnerEvent(xa,Gl,this._handleForceOfflineFromResponse,this),r.unSubscribeInnerEvent(xa,Tc,this._handleForceOfflineFromResponse,this),r.unSubscribeInnerEvent(xa,ME,this._handleForceOfflineFromResponse,this),r.unSubscribeInnerEvent(xa,CI,this._handleForceOfflineFromResponse,this),r.unSubscribeInnerEvent(xa,bu,this._handleForceOfflineFromResponse,this),r.unSubscribeInnerEvent(Al,this._dispose,this)}}function Lu(n){return mA(this,void 0,void 0,function*(){const r="im_open_status.wslogin",g=De.common.generateProtocolData({servcmd:r,data:{State:"Online",is_web_uniapp:0,InstType:0,CustomInfo:n}}),u=`${g.head.seq}${r}`,E=yield De.channel.sendPacket(g,{timeout:9e4,requestId:u});if(E){const{HelloInterval:m,InstId:D,TinyId:v,TimeStamp:T,CustomStatus:P,PurchaseBits:W,A2Key:oA,RichMsgAuthKey:EA,ErrorCode:wA,ErrorInfo:kA,ActionStatus:xA}=E;return{helloInterval:m,instanceID:D,tinyID:v,timeStamp:T,customStatus:P,purchaseBits:W,a2Key:oA,authKey:EA,errorCode:wA,errorInfo:kA,actionStatus:xA}}})}function bl(){const{store:n}=De;return Ba(n.get("instance").sdkAppId)!==st.CHINA}function Es(n){var r;try{const g=ro.getStorage("errorMessage");if(!n||!g)return"";const u=((r=JSON.parse(g))===null||r===void 0?void 0:r.errorMessage)||{},{code:E,replacement1:m="",replacement2:D=""}=n;if(!E)return"";const v=bl()?`${E}_en`:`${E}_cn`;let T=u[u[v]?v:E]||"";return T&&(m&&(T=T.replace("$replacement1",m)),D&&(T=T.replace("$replacement2",D))),T}catch(g){return console.warn("Error parsing stored error messages:",g),""}}class Cs extends Error{constructor(r={}){r.code=r.code||r.errorCode;let{functionName:g="Unknown",code:u,message:E="",data:m="",moreMessage:D="",errorMessage:v=""}=r;v=(u?Es(r):"")||v||E;let T=u?`${g} failed. error: {"message": ${v}, "code": ${u}}`:`${g} failed. error: {"message": ${v}}`;T=`${T} ${D}`,super(),this.code=u,this.errorCode=u,this.errorMessage=v,this.message=T,this.data=m}}function Ed(n,r){var g;if(n&&((g=De.store.get("login"))===null||g===void 0?void 0:g.isLoggedIn)!==!0)throw new Cs({code:pa.USER_NOT_LOGGED_IN,functionName:r})}function hI(n,r,g){if(Array.isArray(n))for(let u=0;u{return P===(W=u,Object.prototype.toString.call(W).match(/^\[object (.*)\]$/)[1].toLowerCase());var W})){for(let W=0;W{const{interceptor:E,context:m}=u;E.apply(m,[g])})}(n)}function Nc(n,r){RE.push({interceptor:n,context:r})}function el(n){const{params:r,auth:g}=n;r&&typeof r=="object"&&Object.assign(kl,r),g&&typeof g=="object"&&Object.assign(dd,g)}function In(n){return De.store.get("commercialConfig").get(n)}class Fs{constructor(){this._handlers=new Map,this._activeWorkflows=new Map,this._stepStartTimes=new Map,this._logHandlers={start:(r,g)=>{const u=Date.now();g?(this._stepStartTimes.set(`${r}-${g}`,u),De.ssoLog.debug("_executeWorkflowStep",`[Workflow ${r}] Step ${g} started at ${new Date(u).toISOString()}`)):(this._workflowStartTimes.set(r,u),De.ssoLog.debug("_executeWorkflowStep",`[Workflow ${r}] started at ${new Date(u).toISOString()}`))},success:(r,g)=>{const u=Date.now();if(g){const E=this._stepStartTimes.get(`${r}-${g}`),m=E?u-E:0;this._stepStartTimes.delete(`${r}-${g}`),De.ssoLog.debug("_executeWorkflowStep",`[Workflow ${r}] Step ${g} completed successfully at ${new Date(u).toISOString()} (${m}ms)`)}else{const E=this._workflowStartTimes.get(r),m=E?u-E:0;this._workflowStartTimes.delete(r),De.ssoLog.debug("_executeWorkflowStep",`[Workflow ${r}] completed successfully at ${new Date(u).toISOString()} (${m}ms)`)}},error:(r,g,u)=>{const{ssoLog:E,utils:{safeStringify:m}}=De,D=Date.now();if(g){const v=this._stepStartTimes.get(`${r}-${g}`),T=v?D-v:0;this._stepStartTimes.delete(`${r}-${g}`),E.error("_executeWorkflowStep",`[Workflow ${r}] Step ${g} failed at ${new Date(D).toISOString()} (${T}ms) ${m(u)}`,{error:u})}else{const v=this._workflowStartTimes.get(r),T=v?D-v:0;this._workflowStartTimes.delete(r),E.error("_executeWorkflowStep",`[Workflow ${r}] failed at ${new Date(D).toISOString()} (${T}ms) ${m(u)}`,{error:u})}}}}static getInstance(){return Fs._instance||(Fs._instance=new Fs),Fs._instance}static setInstance(r){Fs._instance=r}init(){this._initializeWorkflows()}registerWorkflowStep(r,g,u,E){if(!this._handlers.has(r))return void De.ssoLog.debug("registerWorkflowStep",`Workflow '${r}' not defined in core`);if(!bg[r].find(D=>D.stepId===g))return void De.ssoLog.debug("registerWorkflowStep",`Step '${g}' not defined in workflow '${r}'`);const m=this._handlers.get(r);m.has(g)||m.set(g,E?u.bind(E):u)}executeWorkflow(r,g){return mA(this,void 0,void 0,function*(){if(!this._validateWorkflow(r))return;De.ssoLog.debug("executeWorkflow",`[Workflow ${r}] Started execution at ${new Date().toISOString()}`);const u=bg[r],E={},m={cancelled:!1};this._activeWorkflows.set(r,{cancelToken:m});try{const D=new Map;u.forEach(T=>{D.set(T.stepId,T)});const v={workflowName:r,pendingSteps:new Set(u.map(T=>T.stepId)),completedSteps:new Set,runningSteps:new Set,stepMap:D,stepResults:E,data:g,cancelToken:m};yield new Promise((T,P)=>{const W=()=>{if(m.cancelled)return void T();this._getExecutableSteps({pendingSteps:v.pendingSteps,completedSteps:v.completedSteps,stepMap:v.stepMap,workflowName:r}).filter(oA=>!v.runningSteps.has(oA)).forEach(oA=>{v.completedSteps.has(oA)||v.runningSteps.has(oA)||this._executeWorkflowStep(oA,v,{onComplete:()=>{if(v.pendingSteps.size===0)return void T();this._getExecutableSteps({pendingSteps:v.pendingSteps,completedSteps:v.completedSteps,stepMap:v.stepMap,workflowName:r}).filter(EA=>!v.runningSteps.has(EA)).length===0&&v.runningSteps.size===0&&(De.ssoLog.debug("executeWorkflow",`Workflow ${r} completed with some steps skipped due to dependency failures`),T())},onError:P,onStepComplete:W})})};W()}),De.ssoLog.debug("executeWorkflow",`[Workflow ${r}] Completed execution at ${new Date().toISOString()}`)}catch(D){De.ssoLog.error("executeWorkflow",`[Workflow ${r}] Failed execution at ${new Date().toISOString()}`,{error:D})}finally{this._activeWorkflows.delete(r)}})}_executeWorkflowStep(r,g,u){return mA(this,void 0,void 0,function*(){const{workflowName:E,runningSteps:m,stepMap:D,stepResults:v,data:T}=g;m.add(r),this._logWorkflowExecution(E,r,"start");try{const P=D.get(r);let W=null;P?.dependency&&(c(P.dependency)?W=v[P.dependency]:Array.isArray(P.dependency)&&(W={},P.dependency.forEach(EA=>{W[EA]=v[EA]})));const oA=this._handlers.get(E).get(r);if(oA){const EA=yield Promise.resolve(oA({data:T,result:W}));v[r]=EA,this._logWorkflowExecution(E,r,"success")}g.completedSteps.add(r)}catch(P){const W=`[Workflow].${E}.${r}`,{errorCode:oA,errorInfo:EA=`${W} failed`}=P||{},wA=new Cs({functionName:W,code:oA,message:EA});De.ssoLog.error(W,EA,{error:wA}),this._logWorkflowExecution(E,r,"error",P),u.onError(P)}finally{m.delete(r),g.pendingSteps.delete(r),u.onStepComplete(),u.onComplete()}})}reset(){this._cancelAllWorkflows()}destroy(){this.reset(),this._handlers.clear()}_initializeWorkflows(){Object.keys(bg).forEach(r=>{this._handlers.has(r)||this._handlers.set(r,new Map)})}_cancelWorkFlow(r){const g=this._activeWorkflows.get(r);if(!g)return;const{cancelToken:u}=g;u.cancelled=!0,this._activeWorkflows.delete(r)}_cancelAllWorkflows(){Object.keys(bg).forEach(r=>{this._cancelWorkFlow(r)})}_validateWorkflow(r){return bg[r]?!!this._handlers.get(r):!1}_getExecutableSteps(r){const{pendingSteps:g,completedSteps:u,stepMap:E,workflowName:m}=r;return Array.from(g).filter(D=>{const v=E.get(D)||{},{dependency:T,skipIfDependencyMissing:P=!0}=v;if(!T)return!0;if(c(T))return this._isStepRegistered({workflowName:m,stepId:T})?u.has(T):!P;if(C(T)){if(T.filter(W=>!this._isStepRegistered({workflowName:m,stepId:W})).length>0&&P)return!1;for(const W of T)if(!u.has(W))return!1;return!0}return!1})}_isStepRegistered(r){var g;const{workflowName:u,stepId:E}=r;return(g=this._handlers.get(u))===null||g===void 0?void 0:g.has(E)}_logWorkflowExecution(r,g,u,E){this._logHandlers[u](r,g)}}const ma=new Map,ea=({type:n,groupID:r})=>n===Po.GRP_COMMUNITY||`${r}`.startsWith(ga.COMMUNITY)&&!`${r}`.includes(ga.TOPIC),tl=(n="")=>{const r=n.startsWith("GROUP")?n.replace("GROUP",""):n;return r.startsWith(ga.COMMUNITY)&&`${r}`.includes(ga.TOPIC)},Cd="openim",ec="million_group_open_http_svc";function lg(n){return mA(this,void 0,void 0,function*(){const{servcmd:r,data:g}=function(m){const{data:D}=m;return wE(D)||tc(D)}(n)?function(m){let{servcmd:D,data:v}=m;return tc(v)?function(T){const{servcmd:P,data:W}=T;let{GroupId:oA=""}=W;const EA=oA;return[oA]=EA.split(ga.TOPIC),{servcmd:$n(P),data:Object.assign(Object.assign({},W),{GroupId:oA,TopicId:EA})}}(m):(wE(v)&&(D=$n(D)),{servcmd:D,data:v})}(n):n,u=De.common.generateProtocolData({servcmd:r,data:g}),E=`${u.head.seq}${r}`;return De.channel.sendPacket(u,{requestId:E,timeout:n.timeout})})}function wE(n){const{Type:r,GroupId:g,GroupIdList:u=[]}=n,E=g||u[0]||"";return ea({type:r,groupID:E})}function tc(n){const{GroupId:r=""}=n;return tl(r)}function $n(n){if(n.includes(Cd))return n;const r=n.split(".")[1];return`${ec}.${r}`}function ar(){var n;return(n=De.store.get("login"))===null||n===void 0?void 0:n.userId}const Ya=n=>C(n)||f(n),hd=(n,r,g,u)=>{if(!Ya(n)||!Ya(r))return 0;let E=0;const m=Object.keys(r);let D;for(let v=0,T=m.length;v{if(s(r))return"";if(n===Po.MSG_TEXT)return r.text||"";const g=XI[n];return g?Uu(g):""},ol=[{cmd:"ws_get_user_status",interval:5,count:20},{cmd:"ws_status_subscribe",interval:5,count:20},{cmd:"ws_status_unsubscribe",interval:5,count:20},{cmd:"get_group_self_member_info",interval:5,count:20},{cmd:"modify_group_base_info",interval:1,count:8},{cmd:"get_pendency",interval:1,count:15},{cmd:"set_group_attr",interval:5,count:10},{cmd:"modify_group_attr",interval:5,count:10},{cmd:"delete_group_attr",interval:5,count:10},{cmd:"clear_group_attr",interval:5,count:10},{cmd:"get_group_attr",interval:5,count:20},{cmd:"update_group_counter",interval:5,count:20},{cmd:"get_group_counter",interval:5,count:20},{cmd:"get_topic",interval:1,count:10},{cmd:"read_all_unread_msg",interval:1,count:1},{cmd:"query",interval:5,count:20}],$I="im_sdk_config_mgr.fetch_config",QI="im_sdk_config_mgr.push_configv2",sl="cloud-config",nl=2996,Na=new class{init(n){this.core=n}};function Lg(n){return mA(this,void 0,void 0,function*(){const{sdkAppId:r}=Na.core.store.get("instance")||{},g=Na.core.helper.generateProtocolData({servcmd:$I,data:{uint32_sdkappid:r,uint64_version:n}}),u=`${g.head.seq}${$I}`;return Na.core.channel.sendPacket(g,{requestId:u})})}var Ns=new class{constructor(){this._core=null,this._expirationTime=0,this._version=0,this._isFetching=!1,this._cmdFrequencyLimitMap=new Map,this._methodCallFrequencyMap=new Map}install(n){this._core=n;const{notificationCenter:r,InnerEvent:g,helper:u,constants:{WORKFLOW_NAME:E,WORKFLOW_STEP:m},channel:D}=n;r.subscribeInnerEvent(QI,this._handlePushedConfig,this),u.registerWorkflowStep(E.SYNC_SERVER_INFO_AFTER_LOGIN,m.CLOUD_CONFIG_SYNC,this._handleLoginSuccess,this),r.subscribeInnerEvent(g.LOGOUT,this._reset,this),r.subscribeInnerEvent(g.DESTROY,this._dispose,this),u.registerExperimentalAPI("getServerConfig",this),this._updateCmdFreqLimitMap(ol),D.registerBeforeSendInterceptor(this.checkMethodCallOverLimit,this)}getServerConfig(n){return mA(this,void 0,void 0,function*(){var r;const g={code:0,data:""};return n&&(g.data=((r=this._core.store.get("cloudConfig"))===null||r===void 0?void 0:r[n])||""),g})}checkMethodCallOverLimit(n){if(!this._cmdFrequencyLimitMap.has(n))return;if(!this._methodCallFrequencyMap.has(n))return void this._methodCallFrequencyMap.set(n,{startTime:Date.now(),methodCallCounter:1});const{count:r,interval:g}=this._cmdFrequencyLimitMap.get(n);let{startTime:u,methodCallCounter:E}=this._methodCallFrequencyMap.get(n);if(Date.now()-u>1e3*g)this._methodCallFrequencyMap.set(n,{startTime:Date.now(),methodCallCounter:1});else if(E+=1,this._methodCallFrequencyMap.set(n,{startTime:u,methodCallCounter:E}),E>r)throw new this._core.helper.ChatError({code:nl,replacement1:n})}_handlePushedConfig(n){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g}}=this._core;r.info("_handlePushedConfig",g(n)),yield this._updateCloudConfig(n)})}_handleLoginSuccess(){return mA(this,void 0,void 0,function*(){const{ssoLog:n,utils:{safeStringify:r}}=this._core;try{if(this._canFetch()){const g=yield Lg(this._version);n.info("_fetchCloudConfigIfLogin",r(g)),yield this._updateCloudConfig(g)}this._core.helper.taskScheduler.addTask({id:sl,intervalMs:1e3,callback:this._fetchCloudConfigIfReady,context:this})}catch(g){n.debug("_fetchCloudConfigIfLogin",r(g))}})}_fetchCloudConfigIfReady(){return mA(this,void 0,void 0,function*(){const{ssoLog:n,utils:{safeStringify:r}}=this._core;if(this._canFetch())try{const g=yield Lg(this._version);n.info("_fetchCloudConfigIfReady",r(g)),yield this._updateCloudConfig(g)}catch(g){n.error("_fetchCloudConfigIfReady",r(g))}})}_updateCloudConfig(n){return mA(this,void 0,void 0,function*(){const r=this._parseCloudConfig(n);r&&(this._core.store.set("cloudConfig",r),yield this._parseCmdFreqLimit(),this._core.notificationCenter.emitInnerEvent(this._core.InnerEvent.CLOUD_CONFIG_UPDATE,r),this._core.notificationCenter.emitOuterEvent(this._core.OuterEvent.SERVER_CONFIG_UPDATED,{name:this._core.OuterEvent.SERVER_CONFIG_UPDATED,data:{config:r}}))})}_canFetch(){const{isLoggedIn:n}=this._core.store.get("login")||{};return n&&!this._isFetching&&Date.now()>=this._expirationTime}_parseCloudConfig(n){const{int32_error_code:r,str_error_message:g,str_json_config:u,uint32_expired_time:E,uint32_sdkappid:m,uint64_version:D}=n;let v=null;if(r===0){if(this._version!==D)try{v=JSON.parse(u),this._version=D}catch{}this._expirationTime=Date.now()+1e3*E}else this._expirationTime=r===void 0?Date.now()+36e5:Date.now()+12e4;return v}_parseCmdFreqLimit(){return mA(this,void 0,void 0,function*(){var n;let r=(n=yield this.getServerConfig("cmd_frequency_limit"))===null||n===void 0?void 0:n.data;const{isEmpty:g}=this._core.utils;if(!g(r))try{r=JSON.parse(r),this._updateCmdFreqLimitMap(r)}catch(u){console.warn(u)}})}_updateCmdFreqLimitMap(n){n.forEach(r=>{this._cmdFrequencyLimitMap.set(r.cmd,{interval:r.interval,count:r.count})})}_reset(){this._core.helper.taskScheduler.removeTask(sl),this._core.store.clear("cloudConfig"),this._updateCmdFreqLimitMap(ol),this._methodCallFrequencyMap.clear(),this._expirationTime=0,this._version=0,this._isFetching=!1}_dispose(){const{notificationCenter:n,InnerEvent:r}=this._core;n.unSubscribeInnerEvent(QI,this._handlePushedConfig,this),n.unSubscribeInnerEvent(r.LOGOUT,this._reset,this),n.unSubscribeInnerEvent(r.DESTROY,this._dispose,this),this._reset()}};class Ar{constructor(r=0,g=0){this.high=r,this.low=g}equal(r){return r!==null&&this.low===r.low&&this.high===r.high}toString(){const r=Number(this.high).toString(16);let g=Number(this.low).toString(16);if(g.length<8){let u=8-g.length;for(;u;)g=`0${g}`,u--}return r+g}}const Gc={SEARCH_GRP_SNS:new Ar(0,Math.pow(2,1)).toString(),AV_HISTORY_MSG:new Ar(0,Math.pow(2,2)).toString(),GRP_COMMUNITY:new Ar(0,Math.pow(2,3)).toString(),MSG_TO_SPECIFIED_GRP_MBR:new Ar(0,Math.pow(2,4)).toString(),AV_MBR_LIST:new Ar(0,Math.pow(2,6)).toString(),USER_STATUS:new Ar(0,Math.pow(2,7)).toString(),CONV_MARK:new Ar(0,Math.pow(2,9)).toString(),CONV_GROUP:new Ar(0,Math.pow(2,10)).toString(),AV_BAN_MBR:new Ar(0,Math.pow(2,11)).toString(),MSG_EXT:new Ar(0,Math.pow(2,13)).toString(),GRP_COUNTER:new Ar(0,Math.pow(2,15)).toString(),PLUGIN_TRANSLATE:new Ar(Math.pow(2,6)).toString(),PLUGIN_VOICE_TO_TEXT:new Ar(Math.pow(2,7)).toString(),PLUGIN_CS:new Ar(Math.pow(2,8)).toString(),PLUGIN_PUSH:new Ar(Math.pow(2,9)).toString(),PLUGIN_BOT:new Ar(Math.pow(2,10)).toString(),MSG_REACTION:new Ar(Math.pow(2,16)).toString(),FOLLOW:new Ar(Math.pow(2,20)).toString()},Au="CommercialConfig",eu="commercial-config";var _E=new class{constructor(){this._core=null,this._expirationTime=0,this._isFetching=!1,this._featureMap=new Map,this._methodKeyMap=new Map,this._purchaseBits="0"}install(n){this._core=n;const{helper:r,notificationCenter:g,constants:{WORKFLOW_NAME:u,WORKFLOW_STEP:E,InnerEvent:m}}=n;g.subscribeInnerEvent(m.COMMERCIAL_CONFIG_PUSH,this._handlePushedConfig,this),g.subscribeInnerEvent(m.LOGOUT,this._handleLogout,this),g.subscribeInnerEvent(m.DESTROY,this._dispose,this),r.registerWorkflowStep(u.SYNC_SERVER_INFO_AFTER_LOGIN,E.COMMERCIAL_CONFIG_UPDATE,this._syncCommercialConfig,this),n.helper.registerExperimentalAPI("isCommercialAbilityEnabled",this),n.helper.registerExperimentalAPI("queryCommercialAbility",this)}isCommercialAbilityEnabled(n){return mA(this,void 0,void 0,function*(){const r=parseInt(n,10).toString(2),{length:g}=r;let u,E=!0;for(let m=g-1,D=0;m>=0;m--,D++)if(r.charAt(m)==="1"&&(u=D<32?new Ar(0,2**D).toString():new Ar(2**(D-32),0).toString(),!this._featureMap.get(u))){E=!1;break}return this._core.ssoLog.debug("isFeatureEnabled",`${Au}.isFeatureEnabled decimalNumber:${n} key:${u} ret:${E}`),{code:0,data:{enabled:E}}})}queryCommercialAbility(){return this._purchaseBits}_fetchAndParseCommercialConfig(){return mA(this,void 0,void 0,function*(){var n;const{ssoLog:r,utils:{safeStringify:g},common:{buildAndSendPacket:u}}=this._core;try{this._isFetching=!0;const E=yield u({servcmd:"im_sdk_config_mgr.fetch_imsdk_purchase_bitsv2",data:{uint32_sdkappid:(n=this._core.store.get("instance"))===null||n===void 0?void 0:n.sdkAppId}});E&&(this._parseCommercialConfig(E),this._core.store.set("commercialConfig",this._methodKeyMap))}catch(E){r.error("_fetchAndParseCommercialConfig",g(E))}finally{this._isFetching=!1}})}_syncCommercialConfig(n){return mA(this,void 0,void 0,function*(){const{purchaseBits:r}=n?.data||{};r&&(this._parsePurchaseBits(r),this._core.store.set("commercialConfig",this._methodKeyMap)),this._canFetch()&&(yield this._fetchAndParseCommercialConfig()),this._core.helper.taskScheduler.addTask({id:eu,intervalMs:1e3,callback:this._fetchCommercialConfigIfReady,context:this})})}_canFetch(){var n;const r=(n=this._core.store.get("login"))===null||n===void 0?void 0:n.isLoggedIn,g=Date.now()>=this._expirationTime;return r&&!this._isFetching&&g}_handlePushedConfig(n){n?.body&&(this._parseCommercialConfig(n.body),this._core.store.set("commercialConfig",this._methodKeyMap))}_fetchCommercialConfigIfReady(){return mA(this,void 0,void 0,function*(){this._canFetch()&&(yield this._fetchAndParseCommercialConfig())})}_parseCommercialConfig(n){const{ssoLog:r}=this._core;if(typeof n!="object")return;const{int32_error_code:g,str_error_message:u,str_purchase_bits:E,uint32_expired_time:m}=n;g===0?(this._parsePurchaseBits(E),this._expirationTime=Date.now()+1e3*m):g===void 0?(r.warn("_parseCommercialConfig",`${Au}._parseCommercialConfig failed. Invalid message format:`,n),this._expirationTime=Date.now()+36e5):(r.warn("_parseCommercialConfig",`${Au}._parseCommercialConfig errorCode:${g} errorMessage:${u}`),this._expirationTime=Date.now()+12e4)}_isValidPurchaseBits(n){return n&&typeof n=="string"&&n.length>=1&&n.length<=64&&/[01]{1,64}/.test(n)}_parsePurchaseBits(n){const{ssoLog:r,utils:{safeStringify:g}}=this._core;if(this._isValidPurchaseBits(n)){this._purchaseBits=n,this._featureMap.clear(),this._methodKeyMap.clear();let u=null;for(let E=n.length-1,m=0;E>=0;E--,m++)if(u=m<32?new Ar(0,2**m).toString():new Ar(2**(m-32),0).toString(),n[E]==="1"){this._featureMap.set(u,!0);const D=this._getKeyByValue(Gc,u);D&&this._methodKeyMap.set(D,!0)}else{this._featureMap.set(u,!1);const D=this._getKeyByValue(Gc,u);D&&this._methodKeyMap.set(D,!1)}}else r.warn("_parsePurchaseBits",`${Au}.parsePurchaseBits invalid purchases:${g(n)}`)}_getKeyByValue(n,r){const g=Object.entries(n).find(([u,E])=>E===r);return g?g[0]:void 0}_handleLogout(){this._reset()}_dispose(){this._reset(),this._core.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.COMMERCIAL_CONFIG_PUSH,this._handlePushedConfig,this),this._core.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.LOGOUT,this._reset,this),this._core.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.DESTROY,this._dispose,this)}_reset(){this._core.helper.taskScheduler.removeTask(eu),this._core.store.set("commercialConfig",{}),this._expirationTime=0,this._isFetching=!1,this._featureMap.clear(),this._purchaseBits="0"}},ch=new class{constructor(){this._core=null,this._serverOverloadInfoMap=new Map}install(n){this._core=n;const{notificationCenter:r,InnerEvent:g,channel:u}=this._core;r.subscribeInnerEvent(g.OVERLOAD_PUSH,this._handleOverLoadPush,this),r.subscribeInnerEvent(g.LOGOUT,this._reset,this),r.subscribeInnerEvent(g.DESTROY,this._dispose,this),u.registerBeforeSendInterceptor(this.checkServerOverload,this)}checkServerOverload(n){if(!this._serverOverloadInfoMap.has(n))return;const{overloadStartTimestamp:r,delaySeconds:g}=this._serverOverloadInfoMap.get(n);if(Date.now()-r<=1e3*g)throw new this._core.helper.ChatError({functionName:n,message:"service is busy, please try again later"});this._serverOverloadInfoMap.delete(n)}_handleOverLoadPush(n){const{OverLoadServCmd:r,DelaySecs:g}=n;this._serverOverloadInfoMap.set(r,{overloadStartTimestamp:Date.now(),delaySeconds:g})}_reset(){this._serverOverloadInfoMap.clear()}_dispose(){this._reset();const{notificationCenter:n,InnerEvent:r}=this._core;n.unSubscribeInnerEvent(r.OVERLOAD_PUSH,this._handleOverLoadPush,this),n.unSubscribeInnerEvent(r.LOGOUT,this._reset,this),n.unSubscribeInnerEvent(r.DESTROY,this._dispose,this)}},dC=new class{constructor(){this.name="ConfigCenter"}install(n){Na.init(n),Ns.install(n),_E.install(n),ch.install(n)}},lh=new class{constructor(){this.name="ErrorMessage",this._core=null}install(n){return mA(this,void 0,void 0,function*(){if(this._core=n,this._canFetch()){const r=yield this._fetchErrorMessage();if(!r)return;const g=this._parseResponse(r);this._saveErrorMessage(g)}})}_canFetch(){const n=this._core.store.getStorage("errorMessage");return!n||this._isExpired(n)}_saveErrorMessage(n){this._core.store.setStorage("errorMessage",{errorMessage:n,errorMessageSavedTime:new Date().getTime()})}_fetchErrorMessage(){return mA(this,void 0,void 0,function*(){try{return yield this._core.helper.httpRequest({method:"GET",url:"https://web.sdk.qcloud.com/im/download/error-message/v3/0.0.6/tim-error-message.txt"})}catch(n){console.error(n)}})}_isExpired(n){if(!n)return!0;const{errorMessageSavedTime:r}=n;return r&&new Date().getTime()-r>=6048e5}_parseResponse(n){if(typeof n=="string"){const r=n.split(`;
-`),g={},u=new RegExp(/'/g);for(let E=0;E{var WA,ue,le;const ki=function(Li,Yt){const{From_Account:Fi,From_AccountHeadurl:hs,From_AccountNick:Re,IsNeedReadReceipt:Mt,MsgBody:UA,MsgClientTime:ci,MsgRandom:Os,MsgSeq:Oi,MsgTimeStamp:Yr,SendMsgControl:ji,SupportMessageExtension:Br,To_Account:Ut,TinyId:Ft,MsgCheckResult:oE,CloudCustomData:Cn,IsPeerRead:Do,MsgFlagBits:Bl,MsgVersion:GC,EventArray:Gr}=Li;return{from:Fi,avatar:hs,nick:Re,needReadReceipt:Mt===1,readReceiptSentByPeer:Do,clientTime:ci,messageFlagBits:Bl,random:Os,sequence:Oi,time:Yr,messageControlInfo:ji,isSupportExtension:Br,to:Ut,tinyID:Ft,checkResult:oE,cloudCustomData:Cn,messageVersion:GC,eventArray:Gr,elements:Yt.message.messageHelper.parseServerPushMessageElement(UA)}}(OA,xA);if(!((le=(ue=(WA=OA?.EventArray)===null||WA===void 0?void 0:WA[0])===null||ue===void 0?void 0:ue.hasOwnProperty)===null||le===void 0)&&le.call(ue,"C2cNotifyMsgArray"))SA.push(...function(Li){var Yt;const Fi=[];return(Yt=Li.EventArray)===null||Yt===void 0||Yt.forEach(hs=>{var Re,Mt;const{C2cNotifyMsgArray:UA}=hs,ci=(Mt=(Re=UA?.[0])===null||Re===void 0?void 0:Re.WithdrawC2cMsgNotify)===null||Mt===void 0?void 0:Mt.C2cWithdrawInfoArray;Array.isArray(ci)&&Fi.push(...ci)}),Fi}(OA));else{const Li=xA.message.messageFactory.createMessage(Object.assign(Object.assign({},ki),{conversationType:"C2C",flow:"in"})),{elements:Yt}=ki;Li.setElement(Yt),LA.push(Li)}}),{unreadMessageList:LA,revokedMessageList:SA}}(T.MsgList,r);return{syncFlag:T?.SyncFlag,unreadMessageList:EA,revokedMessageList:wA,unreadCountList:P,overflowUnreadCountList:W,cookie:T?.Cookie,groupTipList:oA}}catch(T){console.warn(T)}})}var Ug,Io;(function(n){n[n.START_SYNC=0]="START_SYNC",n[n.SYNCING=1]="SYNCING",n[n.SYNC_COMPLETE=2]="SYNC_COMPLETE"})(Ug||(Ug={})),function(n){n[n.LOGIN_SUCCESS=0]="LOGIN_SUCCESS",n[n.NEW_MESSAGE_RECEIVED=1]="NEW_MESSAGE_RECEIVED"}(Io||(Io={}));var CC=new class{constructor(){this.name="UnreadMessageSynchronizer",this._unreadDBMessageMap=new Map,this._cookie="",this._localConversationIDListBeforeDisconnect=[]}install(n){this._core=n;const{constants:r}=n;n.helper.registerWorkflowStep(r.WORKFLOW_NAME.SYNC_SERVER_INFO_AFTER_RE_ONLINE,r.WORKFLOW_STEP.UNREAD_MESSAGE_SYNC,this._syncUnreadDBMessageAfterReOnline,this),n.helper.registerWorkflowStep(r.WORKFLOW_NAME.RECEIVE_C2C_NEW_MESSAGE,r.WORKFLOW_STEP.UNREAD_MESSAGE_SYNC,this._syncUnreadDBMessageAfterNewMessageReceived,this),n.helper.registerWorkflowStep(r.WORKFLOW_NAME.SYNC_SERVER_INFO_AFTER_LOGIN,r.WORKFLOW_STEP.UNREAD_MESSAGE_SYNC,this._syncUnreadDBMessageAfterLogin,this),n.notificationCenter.subscribeInnerEvent(n.InnerEvent.SOCKET_DISCONNECTED,this._handleDisconnect,this),n.notificationCenter.subscribeInnerEvent(n.InnerEvent.LOGOUT,this._reset,this),n.notificationCenter.subscribeInnerEvent(n.InnerEvent.DESTROY,this._dispose,this)}_syncUnreadMessage(n){return mA(this,void 0,void 0,function*(){const{isAfterReOnline:r=!1,isAfterNewMessageReceived:g=!1,isAfterLogin:u=!1}=n||{};let E=Ug.START_SYNC;const m=[],D=[],v=[],T=[];for(;this._canContinueSync({cookie:this._cookie,syncFlag:E});){const P=yield this._fetchUnreadDBMessage({cookie:this._cookie,syncFlag:E,syncTriggerEvent:g?Io.NEW_MESSAGE_RECEIVED:Io.LOGIN_SUCCESS});if(!P)break;const{unreadMessageList:W=[],revokedMessageList:oA=[],overflowUnreadCountList:EA,unreadCountList:wA,groupTipList:kA}=P;if(this._cookie=P?.cookie||"",E=P?.syncFlag,this._parseAndSaveUnreadMessageList(W),v.push(...oA),this._updateConversationUnreadOptions({unreadCountList:wA,overflowUnreadCountList:EA,conversationUpdateFieldList:m}),Array.isArray(kA)&&D.push(...kA),r){const{messages:xA}=this._handleNewMessageList(W);T.push(...xA)}}return r?{conversationUpdateFieldList:m,revokedMessageList:v,unreadMessageMap:this._unreadDBMessageMap,groupTipList:D,messages:T,isUnreadC2CMessage:!0}:{conversationUpdateFieldList:m,isInstantMessage:!u,isUnreadC2CMessage:!0,revokedMessageList:v,unreadMessageMap:this._unreadDBMessageMap,groupTipList:D}})}_syncUnreadDBMessageAfterLogin(){return mA(this,void 0,void 0,function*(){return this._cookie="",this._syncUnreadMessage({isAfterLogin:!0})})}_syncUnreadDBMessageAfterNewMessageReceived(n){return mA(this,void 0,void 0,function*(){if(n.data.Flag===1)return this._syncUnreadMessage({isAfterNewMessageReceived:!0})})}_updateConversationUnreadOptions(n){const{unreadCountList:r,overflowUnreadCountList:g,conversationUpdateFieldList:u}=n,{constants:{OuterConstant:{CONV_C2C:E,CONV_SYSTEM:m}}}=this._core;r?.forEach(D=>{const{From_Account:v,UnreadCount:T}=D;if(v!==m){const P=u.find(({conversationID:W})=>W===`${E}${v}`);P?P.unreadCount=T:u.push({conversationID:`${E}${v}`,unreadCount:T,type:E})}}),g?.forEach(D=>{const{From_Account:v,LastMsgTime:T}=D;v!==m&&(u.find(({conversationID:P})=>P===`${E}${v}`)||u.push({conversationID:`${E}${v}`,type:E,lastMsgTime:T}))})}_syncUnreadDBMessageAfterReOnline(){return mA(this,void 0,void 0,function*(){return this._syncUnreadMessage({isAfterReOnline:!0})})}_updateMessageProfile(n){var r;const{messageDataHandler:g}=this._core.message||{},u=(r=this._core.store.get("login"))===null||r===void 0?void 0:r.userId,{from:E,nick:m,avatar:D,conversationID:v=""}=n;if(E!==u){const T=g.getLatestMsgSentByPeer(v);if(T){const{nick:P,avatar:W}=T;m&&D?m===P&&D===W||g.updateNickAndAvatarOfSentMessage({conversationID:v,latestNick:m,latestAvatar:D,isSentByMe:!1}):(n.nick=P,n.avatar=W)}}else{const T=g.getLatestMsgSentByMe(v);!T||m===T.nick&&D===T.avatar||g.updateNickAndAvatarOfSentMessage({conversationID:v,latestNick:m,latestAvatar:D,isSentByMe:!0})}}_handleNewMessageList(n){const{messageDataHandler:r}=this._core.message||{},g=new Map,u=[];return n.forEach(E=>{this._updateMessageProfile(E);let m=E.isModified===1;if(r.isMessageSentByCurrentInstance(E)?E.isModified=m:m=!1,E.isOnlineMessage())E._onlineOnlyFlag=!0,r.isMessageSentByCurrentInstance(E)||u.push(E);else if(this._shouldStoreUnreadMessage(E)){if(r.storeConversationMessage(E)){const{conversationID:D,conversationType:v,conversationSubType:T,flow:P,_isExcludedFromUnreadCount:W,_isExcludedFromLastMessage:oA}=E,EA=oA?"":E;g.has(D)?(g.get(D).lastMessage=EA,P==="in"&&(W||g.get(D).unreadCount++)):g.set(D,{conversationID:D,type:v,subType:T,unreadCount:W||P!=="in"?0:1,lastMessage:EA})}r.isMessageSentByCurrentInstance(E)&&!m||u.push(E)}}),{messages:u,conversationOptions:g}}_shouldStoreUnreadMessage(n){var r;const{conversationID:g}=n,{message:u,appStore:E,utils:{isEmpty:m}}=this._core||{},D=Array.from(((r=E.conversationStore.getConversationMap())===null||r===void 0?void 0:r.keys())||[]),v=this._getLocalLastMessageTime(g);return!u.messageDataHandler.isInMessageList(n)&&D.includes(g)&&this._localConversationIDListBeforeDisconnect.includes(g)&&!m(v)}_fetchUnreadDBMessage(n){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g}}=this._core;try{r.debug("_fetchUnreadDBMessage",`unread-message-synchronizer._fetchUnreadDBMessage options:${g(n)}`);const E=yield rl(n,this._core);if(!E)return null;const{syncFlag:m,unreadMessageList:D,revokedMessageList:v,cookie:T,unreadCountList:P,overflowUnreadCountList:W,groupTipList:oA}=E;return this._parseAndSaveUnreadMessageList(D),{syncFlag:m,cookie:T,unreadMessageList:D,revokedMessageList:v,unreadCountList:P,overflowUnreadCountList:W,groupTipList:oA}}catch(u){console.log(u)}})}_canContinueSync({cookie:n,syncFlag:r}){var g;return r===Ug.START_SYNC||r===Ug.SYNCING&&!(!((g=this._core)===null||g===void 0)&&g.helper.isEmpty(n))}_parseAndSaveUnreadMessageList(n){n.forEach(r=>{const{ID:g}=r;this._unreadDBMessageMap.set(g,r)})}_handleDisconnect(){var n;const{appStore:r}=this._core;this._localConversationIDListBeforeDisconnect=Array.from(((n=r.conversationStore.getConversationMap())===null||n===void 0?void 0:n.keys())||[])}_getLocalLastMessageTime(n){const{message:r}=this._core,g=r.messageDataHandler.getLocalMessageList(n),u=g[g.length-1];return u?.time}_reset(){this._cookie="",this._unreadDBMessageMap.clear()}_dispose(){var n,r;(n=this._core)===null||n===void 0||n.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.LOGOUT,this._reset,this),(r=this._core)===null||r===void 0||r.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.DESTROY,this._dispose,this),this._reset()}},TE=new class{init(n){var r;this._core=n,this._visibilityChangeHandler=this._handleVisibilityChange.bind(this),n.notificationCenter.subscribeInnerEvent(n.InnerEvent.DESTROY,this._dispose,this),document?.addEventListener("visibilitychange",this._visibilityChangeHandler),(r=this._core)===null||r===void 0||r.store.set("activityMonitor",{isActive:!0})}_handleVisibilityChange(){var n,r;const g=document?.visibilityState==="visible";(n=this._core)===null||n===void 0||n.store.set("activityMonitor",{isActive:g}),(r=this._core)===null||r===void 0||r.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:g})}_reset(){var n;(n=this._core)===null||n===void 0||n.store.clear("activityMonitor")}_dispose(){document?.removeEventListener("visibilitychange",this._visibilityChangeHandler);const{notificationCenter:n,InnerEvent:r}=this._core;n.unSubscribeInnerEvent(r.DESTROY,this._dispose,this),this._reset()}},NE=new class{init(n){var r;this._core=n,this._bindAppActivityEvent(),n.notificationCenter.subscribeInnerEvent(n.InnerEvent.DESTROY,this._dispose,this),(r=this._core)===null||r===void 0||r.store.set("activityMonitor",{isActive:!0})}_bindAppActivityEvent(){var n,r,g,u,E;const{MINI_APP_NAMESPACE:m,IN_TT_MINI_GAME:D,IN_WX_MINI_GAME:v}=((n=this._core)===null||n===void 0?void 0:n.utils)||{};D||v?((r=m?.onShow)===null||r===void 0||r.call(m,()=>{var T,P;(T=this._core)===null||T===void 0||T.store.set("activityMonitor",{isActive:!0}),(P=this._core)===null||P===void 0||P.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:!0})}),(g=m?.onHide)===null||g===void 0||g.call(m,()=>{var T,P;(T=this._core)===null||T===void 0||T.store.set("activityMonitor",{isActive:!1}),(P=this._core)===null||P===void 0||P.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:!1})})):((u=m?.onAppShow)===null||u===void 0||u.call(m,()=>{var T,P;(T=this._core)===null||T===void 0||T.store.set("activityMonitor",{isActive:!0}),(P=this._core)===null||P===void 0||P.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:!0})}),(E=m?.onAppHide)===null||E===void 0||E.call(m,()=>{var T,P;(T=this._core)===null||T===void 0||T.store.set("activityMonitor",{isActive:!1}),(P=this._core)===null||P===void 0||P.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:!1})}))}_reset(){var n;(n=this._core)===null||n===void 0||n.store.clear("activityMonitor")}_dispose(){const{notificationCenter:n,InnerEvent:r}=this._core;n.unSubscribeInnerEvent(r.DESTROY,this._dispose,this),this._reset()}},Bd=new class{init(n){const{IN_MINI_APP:r,IN_WX_MINI_PLUGIN:g}=n.helper;g||(r?NE.init(n):TE.init(n))}};const GE="none",al="online";var pI=new class{init(n){this._core=n,this._activateNetworkMonitoring(),n.notificationCenter.subscribeInnerEvent(n.InnerEvent.DESTROY,this._dispose,this)}_activateNetworkMonitoring(){return mA(this,void 0,void 0,function*(){navigator.onLine?this._onOnline():this._onOffline(),this._onOnlineCallback=this._onOnline.bind(this),this._onOfflineCallback=this._onOffline.bind(this),window.addEventListener("online",this._onOnlineCallback),window.addEventListener("offline",this._onOfflineCallback)})}_deactivateNetworkMonitoring(){this._onOnlineCallback!==null&&(window.removeEventListener("online",this._onOnlineCallback),this._onOnlineCallback=null),this._onOfflineCallback!==null&&(window.removeEventListener("offline",this._onOfflineCallback),this._onOfflineCallback=null)}_onNetworkStatusChange(n){var r,g;const{isConnected:u,networkType:E}=n;(r=this._core)===null||r===void 0||r.store.set("netWorkMonitor",{isNetworkOnline:u,networkType:E}),(g=this._core)===null||g===void 0||g.notificationCenter.emitInnerEvent("networkStatusChange",{isNetworkOnline:u,networkType:E})}_onOnline(){this._onNetworkStatusChange({isConnected:!0,networkType:al})}_onOffline(){this._onNetworkStatusChange({isConnected:!1,networkType:GE})}_reset(){var n;this._deactivateNetworkMonitoring(),(n=this._core)===null||n===void 0||n.store.clear("netWorkMonitor")}_dispose(){var n,r;(n=this._core)===null||n===void 0||n.notificationCenter.unSubscribeInnerEvent((r=this._core)===null||r===void 0?void 0:r.InnerEvent.DESTROY,this._dispose,this),this._reset()}},Fu=new class{init(n){this._core=n,this._activateNetworkMonitoring(),n.notificationCenter.subscribeInnerEvent(n.InnerEvent.DESTROY,this._dispose,this)}_activateNetworkMonitoring(){return mA(this,void 0,void 0,function*(){try{const{utils:{MINI_APP_NAMESPACE:n}}=this._core;this._mpNetworkStatusCallback=this._onNetworkStatusChange.bind(this),n.onNetworkStatusChange(this._onNetworkStatusChange.bind(this))}catch(n){console.error(n)}})}_deactivateNetworkMonitoring(){if(this._mpNetworkStatusCallback!==null){const{utils:{MINI_APP_NAMESPACE:n}}=this._core;n.offNetworkStatusChange&&n.offNetworkStatusChange(this._mpNetworkStatusCallback),this._mpNetworkStatusCallback=null}}_onNetworkStatusChange(n){var r,g;const{isConnected:u,networkType:E}=n;(r=this._core)===null||r===void 0||r.store.set("netWorkMonitor",{isNetworkOnline:u,networkType:E}),(g=this._core)===null||g===void 0||g.notificationCenter.emitInnerEvent("networkStatusChange",{isNetworkOnline:u,networkType:E})}_reset(){var n;this._deactivateNetworkMonitoring(),(n=this._core)===null||n===void 0||n.store.clear("netWorkMonitor")}_dispose(){var n,r;(n=this._core)===null||n===void 0||n.notificationCenter.unSubscribeInnerEvent((r=this._core)===null||r===void 0?void 0:r.InnerEvent.DESTROY,this._dispose,this),this._reset()}},Ou=new class{init(n){const{IN_MINI_APP:r}=n.utils;r?Fu.init(n):pI.init(n)}},hC=new class{constructor(){this.name="SystemStateMonitor"}install(n){Bd.init(n),Ou.init(n)}};const Tr=new Set(["tui_room_svr.*","callkit_records_svr.*","room_engine_srv.*","room_engine_http_srv.*","room_engine_mic.*","live_engine_srv.*","live_engine_http_srv.*","live_engine_pk.*","trtc_ai_service.*","call_engine_srv.*"]),Ig="tui_room_svr.*";var bc=new class{constructor(){this.name="BusinessCommandTransfer",this._transferredCommands=Tr}install(n){this._core=n;const{notificationCenter:r,InnerEvent:g,helper:u}=n;r.subscribeInnerEvent(g.CLOUD_CONFIG_UPDATE,this._onCloudConfigUpdate,this),r.subscribeInnerEvent(g.LOGOUT,this._reset,this),r.subscribeInnerEvent(g.DESTROY,this._dispose,this),r.subscribeInnerEvent("im_open_push.msg_push",r.InnerEventSubType.BUSINESS_COMMAND,this._onServerPushBusinessCommand,this),u.registerExperimentalAPI("sendTRTCCustomData",this,"transferBusinessCommand"),u.registerExperimentalAPI("sendRoomCustomData",this,"transferBusinessCommand")}transferBusinessCommand(n){return mA(this,void 0,void 0,function*(){const r="transferBusinessCommand";try{const{serviceCommand:g=Ig}=n||{};if(!this._isValidTransferredCommand(g))throw new this._core.helper.ChatError({code:2995,functionName:r});return{code:0,data:(yield function(E,m){return mA(this,void 0,void 0,function*(){const{helper:D,channel:v}=m,{serviceCommand:T=Ig,data:P}=E||{};let W={};try{W=typeof P=="string"?JSON.parse(P):P}catch(wA){console.warn(wA)}const oA=D.generateProtocolData({servcmd:T,data:W}),EA=`${oA.head.seq}${T}`;return v.sendPacket(oA,{requestId:EA,shouldRejectOnError:!1})})}(n,this._core))||{}}}catch(g){throw console.warn(g),new this._core.helper.ChatError({code:g?.errorCode,message:g?.errorInfo,data:{},functionName:r})}})}_onCloudConfigUpdate(n={}){try{if(typeof n.rtc_cmd!="string")return;const r=JSON.parse(n.rtc_cmd);Array.isArray(r)&&(this._transferredCommands=new Set([...this._transferredCommands,...r]))}catch(r){console.log(r)}}_isValidTransferredCommand(n=""){const r=`${n?.split(".")[0]}.*`;return this._transferredCommands.has(r)}_onServerPushBusinessCommand(n){const{OuterEvent:r,notificationCenter:g}=this._core,{MsgContent:u}=n||{},{ROOM_CUSTOM_DATA_RECEIVED:E}=r;g.emitOuterEvent(E,{name:E,data:u})}_reset(){this._transferredCommands=Tr}_dispose(){const{notificationCenter:n,InnerEvent:r}=this._core;this._reset(),n.unSubscribeInnerEvent(r.CLOUD_CONFIG_UPDATE,this._onCloudConfigUpdate,this),n.unSubscribeInnerEvent(r.LOGOUT,this._reset,this),n.unSubscribeInnerEvent(r.DESTROY,this._dispose,this),n.unSubscribeInnerEvent("im_open_push.msg_push",n.InnerEventSubType.BUSINESS_COMMAND,this._onServerPushBusinessCommand,this)}};const Pu=1,Ll=2,Qd=3,ta=4,mI=5,Un="TIMCustomElem",BC="C2C",gl="GROUP",pd="invite",fI="accept",Va="cancel",QC="reject",Ja="modifyInvitation",fr="signaling",md=8010,xu="signaling-timeout";function yr(n){return n.filter(r=>{if(r.type===Un){const{cloudCustomData:g="",payload:{data:u=""}={}}=r,E=g.match(/"type":"tsignaling"/),m=u.match(/inviteID/),D=u.match(/actionType/);return E||m&&D}return!1})}function kc(n){const{data:r}=n.payload;try{return JSON.parse(r)}catch(g){return console.error(g),null}}function cl(n,r){return n.toString(16).padStart(r,"0")}function Fg(n){if(n<0||n>53)throw new Error("Number of digits must be between 0 and 53");if(n<=30)return Math.floor(Math.random()*(1<0;const v=this._core.common.getCurrentUserID();return D.includes(v)}return!0}updateSignaling(n){const r=`${fr}.updateSignaling`,{inviteID:g,inviter:u,inviteeList:E,groupID:m}=n;if(console.log(`${r} inviteID:${g} inviter:${u} groupID:${m}`),m&&this.hasSignaling(g)){const D=E[0],{inviteeList:v}=this._onlineSignalingMap.get(g);v.includes(D)&&(v.splice(v.indexOf(D),1),console.log(`${r} remove ${D}. localInviteeList.length:${v.length}`)),v.length===0&&this.removeSignaling(g)}else this.removeSignaling(g)}setSignalingListenStatus(n){this._isSignalingListening=n}getSignalingListenStatus(){return this._isSignalingListening}_dispose(){var n,r;this._reset(),(n=this._core)===null||n===void 0||n.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.DESTROY,this._dispose,this),(r=this._core)===null||r===void 0||r.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.LOGOUT,this._reset,this),this._isSignalingListening=!1}_reset(){this._onlineSignalingMap.clear()}},ic=new class{init(n){this._core=n}createInviteSignaling(n){const r=this._generateInviteID(),g=this._createInviteSignalingData(Object.assign(Object.assign({},n),{inviteID:r})),{groupID:u,inviteeList:E}=g,m=u||E[0];return{signaling:this._createSignaling(g,m),signalingData:g,signalingExtensionOptions:this._createSignalingExtensionOptions(n)}}createAcceptSignaling(n){const r=this._createAcceptSignalingData(n),{groupID:g,inviter:u}=r,E=g||u;return{signaling:this._createSignaling(r,E),signalingData:r,signalingExtensionOptions:this._createSignalingExtensionOptions(n)}}createCancelSignaling(n){const r=this._createCancelSignalingData(n),{groupID:g,inviteeList:u}=r,E=g||u[0];return{signaling:this._createSignaling(r,E),signalingData:r,signalingExtensionOptions:this._createSignalingExtensionOptions(n)}}createRejectSignaling(n){const r=this._createRejectSignalingData(n),{groupID:g,inviter:u}=r,E=g||u;return{signaling:this._createSignaling(r,E),signalingData:r,signalingExtensionOptions:this._createSignalingExtensionOptions(n)}}createTimeoutSignaling(n){const{isInviter:r=!1}=n,g=this._createTimeoutSignalingData(n),{groupID:u,inviteeList:E,inviter:m}=g,D=u||(r?E[0]:m);return{signaling:this._createSignaling(g,D),signalingData:g,signalingExtensionOptions:this._createSignalingExtensionOptions(g)}}_createSignalingExtensionOptions(n){var r,g;const{data:u="",onlineUserOnly:E,inviteID:m="",offlinePushInfo:D,actionType:v}=n,T=((g=(r=Ho.getSignaling(m))===null||r===void 0?void 0:r.signaling)===null||g===void 0?void 0:g._onlineOnlyFlag)||!1;return{onlineUserOnly:E||T,offlinePushInfo:D,messageControlInfo:this._createMessageControlInfo(u,v)}}_createMessageControlInfo(n,r){const g=r===mI&&!!n.match(/excludeTimeoutSignalingFromHistoryMessage/),u=!!n.match(/excludeFromHistoryMessage/)||!!n.match(/excludeOriginalSignalingFromHistoryMessage/);return{excludedFromContentModeration:!0,excludedFromUnreadCount:g||u,excludedFromLastMessage:g||u}}_createInviteSignalingData(n){const r=`${fr}._createInviteSignalingData`,{userID:g,timeout:u=0,groupID:E="",inviteeList:m=[]}=n,D=this._core.common.getCurrentUserID(),v=Object.assign(Object.assign({},this._generateBaseSignalData(n)),{actionType:Pu,inviter:D,inviteeList:E?m:[g],timeout:u});return console.log(`${r} signalingData:`,v),v}_createAcceptSignalingData(n){const r=`${fr}._createAcceptSignalingData`,{inviteID:g}=n,u=this._core.common.getCurrentUserID(),{inviter:E,groupID:m}=Ho.getSignaling(g),D=Object.assign(Object.assign({},this._generateBaseSignalData(n)),{actionType:Qd,groupID:m,inviter:E,inviteeList:[u]});return console.log(`${r} signalingData:`,D),D}_createCancelSignalingData(n){const r=`${fr}._createCancelSignalingData`,{inviteID:g}=n,u=this._core.common.getCurrentUserID(),{inviteeList:E,groupID:m}=Ho.getSignaling(g),D=Object.assign(Object.assign({},this._generateBaseSignalData(n)),{actionType:Ll,groupID:m,inviter:u,inviteeList:E});return console.log(`${r} signalingData:`,D),D}_createRejectSignalingData(n){const r=`${fr}._createRejectSignalingData`,{inviteID:g}=n,u=this._core.common.getCurrentUserID(),{inviter:E,groupID:m}=Ho.getSignaling(g),D=Object.assign(Object.assign({},this._generateBaseSignalData(n)),{actionType:ta,groupID:m,inviter:E,inviteeList:[u]});return console.log(`${r} signalingData:`,D),D}_createTimeoutSignalingData(n){const r=`${fr}._createTimeoutSignalingData`,{isInviter:g=!1,inviteID:u}=n,{inviteeList:E,inviter:m}=Ho.getSignaling(u),D=this._core.common.getCurrentUserID(),v=Object.assign(Object.assign({},this._generateBaseSignalData(n)),{actionType:mI,inviter:m,inviteeList:g?E:[D]});return console.log(`${r} signalingData:`,v),v}_createSignaling(n,r){var g,u,E;const{groupID:m=""}=n,D={to:r,conversationType:m?gl:BC,priority:"High",payload:{data:JSON.stringify(n)}};return(E=(u=(g=this._core)===null||g===void 0?void 0:g.message)===null||u===void 0?void 0:u.messageFactory)===null||E===void 0?void 0:E.createCustomMessage(D)}_generateInviteID(){return[cl(Fg(32),8),cl(Fg(16),4),cl(16384|Fg(12),4),cl(32768|Fg(14),4),cl(Fg(48),12)].join("-")}_generateBaseSignalData(n){const{data:r="",inviteID:g="",groupID:u=""}=n;return{businessID:1,timeout:0,data:r,inviteID:g,groupID:u}}},Ag=new class{constructor(){this._isProcessingSignaling=!1}init(n){this._core=n,n.helper.registerApi({apiName:"invite",context:this}),n.helper.registerApi({apiName:"accept",context:this}),n.helper.registerApi({apiName:"cancel",context:this}),n.helper.registerApi({apiName:"reject",context:this}),n.helper.registerApi({apiName:"modifyInvitation",context:this}),n.helper.registerApi({apiName:"getSignalingInfo",context:this}),n.helper.registerApi({apiName:"addSignalingListener",context:this}),n.helper.registerApi({apiName:"removeSignalingListener",context:this}),n.notificationCenter.subscribeInnerEvent(n.InnerEvent.DESTROY,this._dispose,this),n.notificationCenter.subscribeInnerEvent(n.InnerEvent.LOGOUT,this._reset,this)}invite(n){return mA(this,void 0,void 0,function*(){var r;try{this._validateBeforeInvite(n);const{signaling:g,signalingData:u,signalingExtensionOptions:E}=ic.createInviteSignaling(n),m=yield this._sendSignaling(g,E);if(m?.code===0){const{inviteID:D,timeout:v}=u;return Ho.saveSignaling(D,Object.assign(Object.assign({},u),{signaling:g})),v>0&&((r=this._core)===null||r===void 0||r.helper.taskScheduler.addOnceTask({id:`${xu}-${D}`,intervalMs:1e3*(v+5),callback:this.handleInvitationExpiryTimer.bind(this,D)})),Object.assign(Object.assign({},m),{inviteID:D})}return m}catch(g){throw g}})}accept(n){return mA(this,void 0,void 0,function*(){try{const{inviteID:r}=n;this._validateBeforeAccept(r),this._isProcessingSignaling=!0;const{signaling:g,signalingData:u,signalingExtensionOptions:E}=ic.createAcceptSignaling(n),m=yield this._sendSignaling(g,E);return m?.code===0?(Ho.updateSignaling(u),Object.assign(Object.assign({},m),{inviteID:r})):m}catch(r){throw r}finally{this._isProcessingSignaling=!1}})}cancel(n){return mA(this,void 0,void 0,function*(){try{const{inviteID:r}=n;this._validateBeforeCancel(r),this._isProcessingSignaling=!0;const{signaling:g,signalingExtensionOptions:u}=ic.createCancelSignaling(n),E=yield this._sendSignaling(g,u);return E?.code===0?(Ho.removeSignaling(r),Object.assign(Object.assign({},E),{inviteID:r})):E}catch(r){throw r}finally{this._isProcessingSignaling=!1}})}reject(n){return mA(this,void 0,void 0,function*(){try{const{inviteID:r}=n;this._validateBeforeReject(r),this._isProcessingSignaling=!0;const{signaling:g,signalingExtensionOptions:u}=ic.createRejectSignaling(n),E=yield this._sendSignaling(g,u);return E?.code===0?(Ho.removeSignaling(r),Object.assign(Object.assign({},E),{inviteID:r})):E}catch(r){throw r}finally{this._isProcessingSignaling=!1}})}modifyInvitation(n){return mA(this,void 0,void 0,function*(){var r,g;const{inviteID:u,data:E}=n;let m="";try{this._validateBeforeModifyInvitation(u);const D=Ho.getSignaling(u),{signaling:v}=D,T=vo(D,["signaling"]);m=v.payload.data,T.data=E,v.payload.data=JSON.stringify(T);const P=yield(g=(r=this._core)===null||r===void 0?void 0:r.message.messageAction)===null||g===void 0?void 0:g.modifyMessage(v);return Ho.hasSignaling(u)&&Ho.saveSignaling(u,Object.assign(Object.assign({},T),{signaling:v})),P}catch(D){if(m){const{signaling:v}=Ho.getSignaling(u);v.payload.data=m}throw D}})}getSignalingInfo(n){const{ssoLog:r,utils:{safeStringify:g}}=this._core;if(yr([n]).length===0)return;const u=kc(n),E={businessID:u.businessID||1,inviteID:u.inviteID,groupID:u.groupID||"",inviter:u.inviter||"",inviteeList:u.inviteeList||[],data:u.data||"",actionType:u.actionType||Pu,timeout:u.timeout||0};return r.debug(`${fr} getSignalingInfo ${g(E)}`),E}addSignalingListener(n,r,g){var u,E;n===((u=this._core)===null||u===void 0?void 0:u.SignalingEvent.NEW_INVITATION_RECEIVED)&&Ho.setSignalingListenStatus(!0),(E=this._core)===null||E===void 0||E.notificationCenter.subscribeOuterEvent(n,r,g)}removeSignalingListener(n,r,g){var u,E;n===((u=this._core)===null||u===void 0?void 0:u.SignalingEvent.NEW_INVITATION_RECEIVED)&&Ho.setSignalingListenStatus(!1),(E=this._core)===null||E===void 0||E.notificationCenter.unSubscribeOuterEvent(n,r,g)}handleInvitationExpiryTimer(n){const r=Ho.getOnlineSignalingMap(),g=this._core.common.getCurrentUserID();if(!r.has(n))return;const u=r.get(n).inviter===g;this._sendTimeoutNotice({inviteID:n,isInviter:u})}_sendSignaling(n,r){return mA(this,void 0,void 0,function*(){var g,u,E;return(E=(u=(g=this._core)===null||g===void 0?void 0:g.message)===null||u===void 0?void 0:u.messageSender)===null||E===void 0?void 0:E.sendMessage(n,r)})}_sendTimeoutNotice(n){return mA(this,void 0,void 0,function*(){var r,g,u;this._core.ssoLog.debug("_sendTimeoutNotice",`${fr}._sendTimeoutNotice params:${JSON.stringify(n)}`);const{isInviter:E,inviteID:m}=n,{signaling:D,signalingData:v,signalingExtensionOptions:T}=ic.createTimeoutSignaling(n),P=yield this._sendSignaling(D,T);if(P?.code===0){const{data:W,groupID:oA,inviteeList:EA,inviter:wA}=v;(r=this._core)===null||r===void 0||r.notificationCenter.emitOuterEvent((g=this._core)===null||g===void 0?void 0:g.SignalingEvent.INVITATION_TIMEOUT,{name:(u=this._core)===null||u===void 0?void 0:u.SignalingEvent.INVITATION_TIMEOUT,data:{data:W,groupID:oA,inviteID:m,inviteeList:EA,inviter:wA,isSelfTimeout:!0,message:D}}),E?Ho.removeSignaling(m):Ho.updateSignaling(v)}})}_validateInviteId(n,r){if(!Ho.hasSignaling(r))throw new this._core.helper.ChatError({functionName:n,code:md})}_validateProcessStatus(n){if(this._isProcessingSignaling)throw new this._core.helper.ChatError({functionName:n,message:"processing other signaling operations"})}_validateBeforeInvite(n){const r=pd,{userID:g}=n,u=this._core.common.getCurrentUserID();if(g===u)throw new this._core.helper.ChatError({functionName:r,message:`cannot invite yourself, currentUserId:${u}, inviteeId:${g}`})}_validateBeforeAccept(n){const r=fI;this._validateInviteId(r,n),this._validateProcessStatus(r);const g=this._core.common.getCurrentUserID(),{inviteeList:u}=Ho.getSignaling(n);if(!u.includes(g)){const E=`userID:${g} not in inviteeList. inviteID:${n}`;throw new this._core.helper.ChatError({functionName:r,message:E})}}_validateBeforeCancel(n){const r=Va;this._validateInviteId(r,n),this._validateProcessStatus(r);const g=this._core.common.getCurrentUserID(),{inviter:u}=Ho.getSignaling(n);if(u!==g){const E=`unmatched inviter:${u} and my userID:${g}`;throw new this._core.helper.ChatError({functionName:r,message:E})}}_validateBeforeReject(n){const r=QC;this._validateInviteId(r,n),this._validateProcessStatus(r);const g=this._core.common.getCurrentUserID(),{inviteeList:u}=Ho.getSignaling(n);if(!u.includes(g)){const E=`userID:${g} not in inviteeList. inviteID:${n}`;throw new this._core.helper.ChatError({functionName:r,message:E})}}_validateBeforeModifyInvitation(n){const r=Ja;this._validateInviteId(r,n)}_dispose(){var n,r;this._reset(),(n=this._core)===null||n===void 0||n.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.DESTROY,this._dispose,this),(r=this._core)===null||r===void 0||r.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.LOGOUT,this._reset,this)}_reset(){this._isProcessingSignaling=!1}},Ul=new class{constructor(){this._actionProcessor=new Map([[Pu,this._onNewInvitationReceived.bind(this)],[ta,this._onInviteeRejected.bind(this)],[Qd,this._onInviteeAccepted.bind(this)],[Ll,this._onInvitationCancelled.bind(this)],[mI,this._onInvitationTimeout.bind(this)]])}init(n){this._core=n,n.notificationCenter.subscribeOuterEvent(n.OuterEvent.MESSAGE_RECEIVED,this._handleMessageReceived,this),n.notificationCenter.subscribeOuterEvent(n.OuterEvent.MESSAGE_MODIFIED,this._handleMessageModified,this),n.notificationCenter.subscribeInnerEvent(n.InnerEvent.DESTROY,this._dispose,this)}handleActionSignaling(n){n.forEach(r=>{const g=kc(r);if(g){const u=this._actionProcessor.get(g.actionType);u?.(g,r)}})}_handleMessageReceived(n){if(!Ho.getSignalingListenStatus())return;const r=yr(n.data);r.length!==0&&this.handleActionSignaling(r)}_handleMessageModified(n){if(!Ho.getSignalingListenStatus())return;const r=yr(n.data);r.length>0&&r.forEach(g=>{const u=kc(g);u&&this._onInvitationModified(u,g)})}_onNewInvitationReceived(n,r){var g,u;const E=`${fr}._onNewInvitationReceived`,{inviteID:m,inviteeList:D,groupID:v}=n,T=this._core.common.getCurrentUserID();if(this._core.ssoLog.debug("_onNewInvitationReceived",`${E} signalingData:${JSON.stringify(n)}}`),v&&!D.includes(T))return;let{timeout:P}=n;const W=Date.now()/1e3-r.time;P>0&&W>0&&P>W&&(P-=W);const oA=Ho.getSignaling(m);oA!==n&&(oA||Ho.saveSignaling(m,Object.assign(Object.assign({},n),{signaling:r})),P>0&&((g=this._core)===null||g===void 0||g.helper.taskScheduler.addOnceTask({id:`${xu}-${m}`,intervalMs:1e3*P,callback:Ag.handleInvitationExpiryTimer.bind(Ag,m)})),this._emitEvent({name:(u=this._core)===null||u===void 0?void 0:u.SignalingEvent.NEW_INVITATION_RECEIVED,data:Object.assign(Object.assign({},this._generateBaseEmitData(n)),{inviteeList:D})}))}_onInviteeRejected(n){var r;const g=`${fr}._onInviteeRejected`,{inviteID:u,inviter:E,groupID:m,inviteeList:D}=n,v=Ho.hasSignaling(u);this._core.ssoLog.debug("_onInviteeRejected",`${g} inviteID:${u} hasInviteID:${v} inviter:${E} groupID:${m}`),v&&(Ho.updateSignaling(n),this._emitEvent({name:(r=this._core)===null||r===void 0?void 0:r.SignalingEvent.INVITEE_REJECTED,data:Object.assign(Object.assign({},this._generateBaseEmitData(n)),{invitee:D[0]})}))}_onInviteeAccepted(n){var r;const g=`${fr}._onInviteeAccepted`,{inviteID:u,inviter:E,groupID:m,inviteeList:D}=n,v=Ho.hasSignaling(u);this._core.ssoLog.debug("_onInviteeAccepted",`${g} inviteID:${u} hasInviteID:${v} inviter:${E} groupID:${m}`),v&&(Ho.updateSignaling(n),this._emitEvent({name:(r=this._core)===null||r===void 0?void 0:r.SignalingEvent.INVITEE_ACCEPTED,data:Object.assign(Object.assign({},this._generateBaseEmitData(n)),{invitee:D[0]})}))}_onInvitationCancelled(n){var r;const g=`${fr}._onInvitationCancelled`,{inviteID:u,inviter:E,groupID:m}=n,D=Ho.hasSignaling(u);this._core.ssoLog.debug("_onInvitationCancelled",`${g} inviteID:${u} hasInviteID:${D} inviter:${E} groupID:${m}`),D&&(Ho.removeSignaling(u),this._emitEvent({name:(r=this._core)===null||r===void 0?void 0:r.SignalingEvent.INVITATION_CANCELLED,data:this._generateBaseEmitData(n)}))}_onInvitationTimeout(n){var r;const g=`${fr}._onInvitationTimeout`,{inviteID:u,inviteeList:E}=n,m=Ho.hasSignaling(u);this._core.ssoLog.debug("_onInvitationTimeout",`${g} inviteID:${u} hasInviteID:${m} data:${n.data}`),m&&(Ho.updateSignaling(n),this._emitEvent({name:(r=this._core)===null||r===void 0?void 0:r.SignalingEvent.INVITATION_TIMEOUT,data:Object.assign(Object.assign({},this._generateBaseEmitData(n)),{inviteeList:E,isSelfTimeout:!1})}))}_onInvitationModified(n,r){var g;const u=`${fr}._onInvitationModified`,{inviteID:E,data:m}=n,D=Ho.hasSignaling(E);this._core.ssoLog.debug("_onInvitationModified",`${u} inviteID:${E} data:${m}`),D&&(Ho.saveSignaling(E,Object.assign(Object.assign({},n),{signaling:r})),this._emitEvent({name:(g=this._core)===null||g===void 0?void 0:g.SignalingEvent.INVITATION_MODIFIED,data:{inviteID:E,data:m}}))}_emitEvent(n){var r;(r=this._core)===null||r===void 0||r.notificationCenter.emitOuterEvent(n.name,n)}_generateBaseEmitData(n){const{inviteID:r,inviter:g,groupID:u,data:E}=n;return{inviteID:r,inviter:g,groupID:u,data:E||""}}_dispose(){var n,r,g;(n=this._core)===null||n===void 0||n.notificationCenter.unSubscribeOuterEvent(this._core.OuterEvent.MESSAGE_RECEIVED,this._handleMessageReceived,this),(r=this._core)===null||r===void 0||r.notificationCenter.unSubscribeOuterEvent(this._core.OuterEvent.MESSAGE_MODIFIED,this._handleMessageModified,this),(g=this._core)===null||g===void 0||g.notificationCenter.unSubscribeOuterEvent(this._core.InnerEvent.DESTROY,this._dispose,this)}},ia=new class{constructor(){this._offlineSignalingMap=new Map}init(n){this._core=n;const{notificationCenter:r,helper:g,constants:{InnerEvent:u,WORKFLOW_STEP:E,WORKFLOW_NAME:m}}=n;r.subscribeInnerEvent(u.DESTROY,this._dispose,this),r.subscribeInnerEvent(u.LOGOUT,this._reset,this),g.registerWorkflowStep(m.SYNC_SERVER_INFO_AFTER_LOGIN,E.SIGNALING_MESSAGE_RECOVER,this._handleC2COfflineMessage,this)}_handleC2COfflineMessage(n){const{result:{unreadMessageMap:r}={}}=n||{};if(!(r?.size!==0&&Ho.getSignalingListenStatus()))return;const g=yr([...r.values()]);if(g.length!==0&&(g.forEach(u=>{this._handleC2CActionType(u)}),this._offlineSignalingMap.size>0)){const u=this._sortOfflineSignalingByTime();Ul.handleActionSignaling(u)}}_handleC2CActionType(n){const r=kc(n);if(!r)return;const{actionType:g}=r;g===Pu?this._saveValidOfflineInvite(r,n):this._removeOfflineInvite(r)}_saveValidOfflineInvite(n,r){const{inviteID:g,inviteeList:u=[],timeout:E=0}=n,m=this._core.common.getCurrentUserID();if(!u.includes(m))return;const D=Date.now()/1e3-r.time;E>0&&D>E&&E!==0||this._offlineSignalingMap.set(g,Object.assign(Object.assign({},n),{signalingList:[r]}))}_removeOfflineInvite(n){const{inviteID:r=""}=n;this._offlineSignalingMap.has(r)&&this._offlineSignalingMap.delete(r)}_sortOfflineSignalingByTime(){let n=[];return this._offlineSignalingMap.forEach(r=>{n=[...n,...r.signalingList]}),n.sort((r,g)=>r.time-g.time)}_dispose(){var n,r;this._reset(),(n=this._core)===null||n===void 0||n.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.LOGOUT,this._reset,this),(r=this._core)===null||r===void 0||r.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.DESTROY,this._dispose,this)}_reset(){this._offlineSignalingMap.clear()}};const Ih={invite:{userID:{required:!0,rules:["string"],allowEmpty:!1},data:{required:!1,rules:["string"],allowEmpty:!0},timeout:{required:!1,rules:["number"],allowEmpty:!1},onlineUserOnly:{required:!1,rules:["boolean"],allowEmpty:!1},offlinePushInfo:{required:!1,rules:["object"],allowEmpty:!1}},cancel:{inviteID:{required:!0,rules:["string"],allowEmpty:!1},data:{required:!1,rules:["string"],allowEmpty:!0}},accept:{inviteID:{required:!0,rules:["string"],allowEmpty:!1},data:{required:!1,rules:["string"],allowEmpty:!0}},reject:{inviteID:{required:!0,rules:["string"],allowEmpty:!1},data:{required:!1,rules:["string"],allowEmpty:!0}},modifyInvitation:{inviteID:{required:!0,rules:["string"],allowEmpty:!1},data:{required:!1,rules:["string"],allowEmpty:!0}}},sn={invite:!0,cancel:!0,accept:!0,reject:!0,modifyInvitation:!0};var tu=new class{constructor(){this.name="Signaling"}install(n){Ag.init(n),Ul.init(n),ic.init(n),Ho.init(n),ia.init(n),n.helper.registerValidateConfig({auth:sn,params:Ih})}};const qs=new class{init(n){this.core=n}};function Lc(n){let r;const{message:g}=qs.core,{conversationID:u,messageID:E}=n;return r=g.messageDataHandler.getLocalMessageList(u).find(m=>m.ID===E),!r&&(r=g.messageDataHandler.getSparseMessageList(u).find(m=>m.ID===E)),r}function oc(n){return n.map(r=>{const{from:g,to:u,cloudCustomData:E,avatar:m,nick:D,ID:v,clientSequence:T,clientTime:P,messageRandom:W,messageSequence:oA,time:EA}=r;return{ClientSeq:T,CloudCustomData:E,From_Account:g,From_AccountHeadurl:m,From_AccountNick:D,Id:v,MsgBody:JSON.parse(JSON.stringify(r.transformElementsToServerFormat())),MsgClientTime:P,MsgRandom:W,Random:W,MsgSeq:oA,MsgTimeStamp:EA,ReceiverId:u,SenderId:g,To_Account:u}})}function Dr(n){var r;const{From_Account:g,From_AccountHeadurl:u,From_AccountNick:E,GroupId:m,MsgClientTime:D,ClientSeq:v,To_Account:T,MsgTimeStamp:P,TinyId:W,MsgRandom:oA,MsgSeq:EA}=n;return{from:g,avatar:u,nick:E,clientTime:D,time:P,tinyID:W,random:oA,sequence:EA,to:T,groupID:m,clientSequence:v,_elements:(r=n.MsgBody)===null||r===void 0?void 0:r.map(wA=>{const{MsgType:kA}=wA;return qs.core.message.messageFactory.getElementClass(kA).parseServerPushElement(wA)})}}var Kr,eg;(function(n){n.MSG_TEXT="TIMTextElem",n.MSG_CUSTOM="TIMCustomElem",n.MSG_LOCATION="TIMLocationElem",n.MSG_FACE="TIMFaceElem",n.MSG_STREAM="TIMStreamElem"})(Kr||(Kr={})),function(n){n[n.FORWARD=0]="FORWARD",n[n.BACKWARD=1]="BACKWARD"}(eg||(eg={}));const bE="MSG_REACTION",pC="MSG_EXT",uh=0,uo=1,Uc={ZH_CN:"zh (cmn-Hans-CN)",EN_US:"en-US",YUE_HK:"yue-Hant-HK",JA_JP:"ja-JP",ZH_PY:"zh-PY"},Fl="16k_zh",mC="16k_en",fC="16k_yue",Ol="16k_ja",iu="16k_zh-PY",yI={[Uc.ZH_CN]:Fl,[Uc.EN_US]:mC,[Uc.YUE_HK]:fC,[Uc.JA_JP]:Ol,[Uc.ZH_PY]:iu},DI=/\.(wav|pcm|ogg-opus|speex|silk|mp3|m4a|aac|amr)/,kE={READ:0,UNREAD:1},Pl=1,xl=2,Og=3;var sc;(function(n){n.IN="in",n.OUT="out"})(sc||(sc={}));const fd=16,LE=17;var Fc;(function(n){n[n.DATA=0]="DATA",n[n.REVOKED=1]="REVOKED"})(Fc||(Fc={}));var ou;(function(n){n[n.NORMAL=0]="NORMAL",n[n.TIMEOUT=1]="TIMEOUT"})(ou||(ou={}));const ho="StreamMsg.PushStreamHttp";var UE=new class{constructor(){this._reactionsMap=new Map}init(n){this._core=n;const{helper:r,notificationCenter:g,InnerEvent:{MESSAGE_PUSH:u},InnerEventSubType:{MESSAGE_REACTION_UPDATED:E,MESSAGE_REACTION_UPDATED_SYNC:m}}=n;r.registerApi({apiName:"addMessageReaction",context:this}),r.registerApi({apiName:"removeMessageReaction",context:this}),r.registerApi({apiName:"getMessageReactions",context:this}),r.registerApi({apiName:"getAllUserListOfMessageReaction",context:this}),g.subscribeInnerEvent(u,E,this._handleReactionUpdated,this),g.subscribeInnerEvent(u,m,this._handleReactionSync,this)}addMessageReaction(n,r){return mA(this,void 0,void 0,function*(){const{OuterConstant:g,ssoLog:u,helper:E}=this._core;this._validateMessageReactionBusinessCapability();const{conversationID:m,ID:D,conversationType:v,from:T,to:P,clientSequence:W,random:oA,time:EA,sequence:wA}=n,kA=`conversationID:${m} messageID:${D} reactionID:${r}`;try{return this._recordMessageReactedByMe(D,r),v===g.CONV_C2C?yield function(xA,LA){return mA(this,void 0,void 0,function*(){var SA;const{from:OA,to:WA,clientSequence:ue,random:le,time:ki,reactionID:Li}=xA,Yt={From_Account:OA,To_Account:WA,MsgKey:`${ue}_${le}_${ki}`,Reaction:Li,Add_Account:[(SA=LA.store.get("login"))===null||SA===void 0?void 0:SA.userId]};return qs.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.reaction_add",data:Yt})})}({from:T,to:P,clientSequence:W,random:oA,time:EA,reactionID:r},this._core):v===g.CONV_GROUP&&(yield function(xA,LA){return mA(this,void 0,void 0,function*(){var SA;const{to:OA,reactionID:WA,sequence:ue}=xA,le={GroupId:OA,MsgSeq:ue,Reaction:WA,Add_Account:[(SA=LA.store.get("login"))===null||SA===void 0?void 0:SA.userId]};return qs.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.group_reaction_add",data:le})})}({to:P,reactionID:r,sequence:wA},this._core)),{code:0,successLog:{message:kA}}}catch(xA){this._removeMyReactionRecord(D,r);const{errorCode:LA}=xA||{};throw new E.ChatError({functionName:"addMessageReaction",code:LA,moreMessage:kA})}})}removeMessageReaction(n,r){return mA(this,void 0,void 0,function*(){const{OuterConstant:g,helper:u}=this._core;this._validateMessageReactionBusinessCapability();const{conversationID:E,ID:m,conversationType:D,from:v,to:T,clientSequence:P,random:W,time:oA,sequence:EA}=n,wA=`conversationID:${E} messageID:${m} reactionID:${r}`;try{return this._removeMyReactionRecord(m,r),D===g.CONV_C2C?yield function(kA,xA){return mA(this,void 0,void 0,function*(){var LA;const{from:SA,to:OA,clientSequence:WA,random:ue,time:le,reactionID:ki}=kA,Li={From_Account:SA,To_Account:OA,MsgKey:`${WA}_${ue}_${le}`,Reaction:ki,Del_Account:[(LA=xA.store.get("login"))===null||LA===void 0?void 0:LA.userId]};return qs.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.reaction_del",data:Li})})}({from:v,to:T,clientSequence:P,random:W,time:oA,reactionID:r},this._core):D===g.CONV_GROUP&&(yield function(kA,xA){return mA(this,void 0,void 0,function*(){var LA;const{to:SA,reactionID:OA,sequence:WA}=kA,ue={GroupId:SA,MsgSeq:WA,Reaction:OA,Del_Account:[(LA=xA.store.get("login"))===null||LA===void 0?void 0:LA.userId]};return qs.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.group_reaction_del",data:ue},xA)})}({to:T,reactionID:r,sequence:EA},this._core)),{code:0,successLog:{message:wA}}}catch(kA){const{errorCode:xA}=kA||{};throw new u.ChatError({functionName:"removeMessageReaction",code:xA,moreMessage:wA})}})}getAllUserListOfMessageReaction(n){return mA(this,void 0,void 0,function*(){this._validateMessageReactionBusinessCapability();const{message:r,reactionID:g,nextSeq:u=0}=n,E=n.count>100?100:n.count,{conversationID:m}=r,{ssoLog:D,helper:v,constants:T}=this._core;try{let P=null;if(P=m.startsWith(T.OuterConstant.CONV_C2C)?yield function(W){return mA(this,void 0,void 0,function*(){const{message:oA,nextSeq:EA,reactionID:wA,count:kA}=W,{from:xA,to:LA,clientSequence:SA,random:OA,time:WA}=oA,ue={Reaction:wA,NextSeq:EA,Count:kA,From_Account:xA,To_Account:LA,MsgKey:`${SA}_${OA}_${WA}`};return qs.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.reaction_iterate",data:ue})})}({message:r,reactionID:g,nextSeq:u,count:E}):yield function(W){return mA(this,void 0,void 0,function*(){const{message:oA,nextSeq:EA,reactionID:wA,count:kA}=W,{sequence:xA,to:LA}=oA,SA={Reaction:wA,NextSeq:EA,GroupId:LA,Count:kA,MsgSeq:xA};return qs.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.group_reaction_iterate",data:SA})})}({message:r,reactionID:g,nextSeq:u,count:E}),P){const{Reaction_Account:W,NextSeq:oA}=P,EA=yield this._getUserProfileList(W);return{code:0,data:{nextSeq:oA,isCompleted:u===0,userList:EA}}}}catch(P){const{errorCode:W}=P||{};throw new v.ChatError({functionName:"getAllUserListOfMessageReaction",code:W})}})}getMessageReactions(n){return mA(this,void 0,void 0,function*(){const{constants:r}=this._core;this._validateMessageReactionBusinessCapability();const{messageList:g,maxUserCountPerReaction:u=10}=n,E=g[0];let m=null;const D=new Map,{from:v,to:T,conversationType:P}=E,W=this._generateMessageKeyList(g,D);P===r.OuterConstant.CONV_C2C?m=yield function(kA){return mA(this,void 0,void 0,function*(){const{from:xA,to:LA,messageKeyList:SA,maxUserCountPerReaction:OA}=kA,WA={From_Account:xA,To_Account:LA,MsgKeyList:SA,Count:OA};return qs.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.reaction_multi_stat",data:WA})})}({from:v,to:T,messageKeyList:W,maxUserCountPerReaction:u}):P===r.OuterConstant.CONV_GROUP&&(m=yield function(kA){return mA(this,void 0,void 0,function*(){const{groupId:xA,messageSequenceList:LA,maxUserCountPerReaction:SA}=kA,OA={GroupId:xA,MsgSeqList:LA,Count:SA};return qs.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.group_reaction_multi_stat",data:OA})})}({groupId:T,messageSequenceList:W,maxUserCountPerReaction:u}));const{Results:oA=[]}=m||{},EA=this._extractUserIDsFromReactionResults(oA),wA=yield this._getUserProfileMap(EA);return{code:0,data:{resultList:oA.map(kA=>{const{ReactionList:xA,MsgSeq:LA,MsgKey:SA}=kA;return{messageID:this._generateMessageID({messageSequence:LA,messageKey:SA,messageIDMap:D}),reactionList:xA.map(OA=>{const{Reaction:WA,Count:ue,Reaction_Account:le,ReactedByMe:ki}=OA;return{reactionID:WA,totalUserCount:ue,partialUserList:this._generatePartialUserInfo({userIDList:le,userProfileMap:wA}),reactedByMyself:ki===1}})}})}}})}dispose(){this._reactionsMap.clear()}_extractUserIDsFromReactionResults(n){const r=[];return n?.forEach(g=>{const{ReactionList:u=[]}=g;u.forEach(E=>{E.Reaction_Account&&r.push(...E.Reaction_Account)})}),r}_getUserProfileList(n){return mA(this,void 0,void 0,function*(){var r;try{const g=yield(r=this._core.user.userProfile)===null||r===void 0?void 0:r.getUserProfile({userIDList:n});return g?g.data:[]}catch{return[]}})}_getUserProfileMap(n){return mA(this,void 0,void 0,function*(){const r=new Map;return(yield this._getUserProfileList(n)).forEach(g=>{const{nick:u,avatar:E,userID:m}=g;r.set(m,{nick:u,avatar:E,userID:m})}),r})}_recordMessageReactedByMe(n,r){const g=`${n}-${r}`;this._reactionsMap.has(g)?this._reactionsMap.get(g).reactedByMe=!0:this._reactionsMap.set(g,{reactedByMe:!0})}_removeMyReactionRecord(n,r){const g=`${n}-${r}`;this._reactionsMap.has(g)&&(this._reactionsMap.get(g).reactedByMe=!1)}_recordMessageReactionInfo(n){const{messageID:r,reactionID:g,reactionInfo:u}=n,E=`${r}-${g}`,m=this._reactionsMap.get(E)||{};this._reactionsMap.set(E,Object.assign(Object.assign({},m),u))}_validateMessageReactionBusinessCapability(){const{helper:n,constants:r}=this._core;if(!n.checkBusinessCapabilityBits(bE))throw new n.ChatError({functionName:"addMessageReaction",code:r.ERROR_CODE.NO_USE,replacement1:"addMessageReaction"})}_handleReactionUpdated(n){const{MsgReactionNotifyList:r}=n,{notificationCenter:g,constants:u}=this._core;r.forEach(E=>mA(this,void 0,void 0,function*(){const{C2CMsgInfo:m,GroupMsgInfo:D,MsgReactionSummary:v}=E,{TinyId:T,MsgClientTime:P,MsgRandom:W}=Object.assign(Object.assign({},m),D),oA=`${T}-${P}-${W}`,EA=this._extractUserIDsFromReactionResults([{ReactionList:v}]),wA=yield this._getUserProfileMap(EA),kA=v.map(xA=>{var LA;const{Reaction:SA,Reaction_Account:OA}=xA,WA=this._generatePartialUserInfo({userIDList:OA,userProfileMap:wA}),ue=OA?xA.Count:0,le=((LA=this._reactionsMap.get(`${oA}-${SA}`))===null||LA===void 0?void 0:LA.reactedByMe)||!1;return this._recordMessageReactionInfo({messageID:oA,reactionID:SA,reactionInfo:{reactionID:SA,totalUserCount:ue,partialUserList:WA}}),{reactionID:SA,totalUserCount:ue,partialUserList:WA,reactedByMyself:le}});g.emitOuterEvent(u.OuterEvent.MESSAGE_REACTIONS_UPDATED,{name:u.OuterEvent.MESSAGE_REACTIONS_UPDATED,data:{messageID:oA,reactionList:kA}})}))}_handleReactionSync(n){var r;const{notificationCenter:g,constants:u}=this._core,{C2CMsgInfo:E={},GroupMsgInfo:m={},Reaction:D,OperateType:v}=n.MsgReactionNotify,{TinyId:T="",MsgClientTime:P=0,MsgRandom:W=0}=Object.assign(Object.assign({},E),m),oA=`${T}-${P}-${W}`,EA=`${oA}-${D}`;if(v===1?this._recordMessageReactedByMe(oA,D):this._removeMyReactionRecord(oA,D),(r=this._reactionsMap.get(EA))===null||r===void 0?void 0:r.reactionID){const wA=this._reactionsMap.get(EA);wA.reactedByMyself=v===1,g.emitOuterEvent(u.OuterEvent.MESSAGE_REACTIONS_UPDATED,{name:u.OuterEvent.MESSAGE_REACTIONS_UPDATED,data:{messageID:oA,reactionList:[wA]}})}}_generatePartialUserInfo({userIDList:n,userProfileMap:r}){const g=[];return n?.forEach(u=>{r.has(u)&&g.push(r.get(u))}),g}_generateMessageID(n){const{messageSequence:r,messageKey:g,messageIDMap:u}=n;return g?u.get(g):u.get(r)}_generateMessageKeyList(n,r){const{constants:g}=this._core,u=n[0],{conversationType:E}=u;let m=[];return E===g.OuterConstant.CONV_C2C?m=n.map(D=>{const{clientSequence:v,random:T,time:P,ID:W}=D,oA=`${v}_${T}_${P}`;return r.set(oA,W),oA}):E===g.OuterConstant.CONV_GROUP&&(m=n.map(D=>{const{ID:v,sequence:T}=D;return r.set(T,v),T})),m}},tg=new class{init(n){this._core=n;const{helper:r,InnerEvent:{MESSAGE_PUSH:g},InnerEventSubType:{C2C_MESSAGE_READ_RECEIPT:u,GROUP_MESSAGE_READ_RECEIPT:E},notificationCenter:m}=n;r.registerApi({apiName:"sendMessageReadReceipt",context:this}),r.registerApi({apiName:"getMessageReadReceiptList",context:this}),r.registerApi({apiName:"getGroupMessageReadMemberList",context:this}),m.subscribeInnerEvent(g,u,this._handleC2CMessageReadReceipt,this),m.subscribeInnerEvent(g,E,this._handleGroupMessageReadReceipt,this)}sendMessageReadReceipt(n){return mA(this,void 0,void 0,function*(){var r;const{common:g,constants:u}=this._core,E=this._filterValidMessageSendByOther(n);if(E.length===0)throw new g.ChatError({code:u.ERROR_CODE.READ_RECEIPT_MSG_LIST_EMPTY});try{const{conversationType:m}=E[0];return m===u.OuterConstant.CONV_C2C?yield function(D){return mA(this,void 0,void 0,function*(){const{common:v,constants:T}=qs.core,P=D[0].conversationID.replace(T.OuterConstant.CONV_C2C,""),W=D.map(EA=>{const{from:wA,to:kA,sequence:xA,random:LA,time:SA,clientTime:OA}=EA;return{From_Account:wA,To_Account:kA,MsgSeq:xA,MsgRandom:LA,MsgTime:SA,MsgClientTime:OA}}),oA={Peer_Account:P,C2CMsgInfo:W};return v.buildAndSendPacket({servcmd:"openim.c2c_msg_read_receipt",data:oA})})}(E):yield function(D){return mA(this,void 0,void 0,function*(){const{common:v,constants:T}=qs.core,P={GroupId:D[0].conversationID.replace(T.OuterConstant.CONV_GROUP,""),MsgSeqList:D.map(W=>({MsgSeq:W.sequence}))};return v.buildAndSendPacket({servcmd:"group_open_http_svc.group_msg_receipt",data:P})})}(E),{code:0,data:{}}}catch(m){const{errorCode:D,errorInfo:v}=m;throw new g.ChatError({code:D,message:v,moreMessage:`peerAccount:${(r=E?.[0])===null||r===void 0?void 0:r.conversationID}`})}})}getMessageReadReceiptList(n){return mA(this,void 0,void 0,function*(){const{common:r,constants:g}=this._core;try{const{conversationType:u}=n[0];if(u===g.OuterConstant.CONV_GROUP){const E=this._filterValidMessageSendByMe(n);if(E?.length>0){const m=yield function(v){return mA(this,void 0,void 0,function*(){const{common:T,constants:P}=qs.core,W={GroupId:v[0].conversationID.replace(P.OuterConstant.CONV_GROUP,""),MsgSeqList:v.map(oA=>({MsgSeq:oA.sequence}))};return T.buildAndSendPacket({servcmd:"group_open_http_svc.get_group_msg_receipt",data:W})})}(E),{GroupMsgReceiptList:D}=m||{};this._updateGroupMessagesReadReceiptInfo({messageList:n,readReceiptList:D})}}return{code:0,data:{messageList:n}}}catch(u){const{errorCode:E,errorInfo:m}=u;throw new r.ChatError({code:E,message:m})}})}getGroupMessageReadMemberList(n){return mA(this,void 0,void 0,function*(){const{constants:r,common:g}=this._core,{message:u,filter:E=kE.READ,cursor:m=""}=n,{conversationID:D,sequence:v,ID:T}=u,P=D.replace(r.OuterConstant.CONV_GROUP,""),W=n.count>=100?100:n.count;try{const oA=yield function(EA){return mA(this,void 0,void 0,function*(){const{sequence:wA,groupID:kA,filter:xA,cursor:LA,count:SA}=EA,OA={MsgSeq:wA,GroupId:kA,Filter:xA,Cursor:LA,Num:SA};return qs.core.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_group_msg_receipt_detail",data:OA})})}({groupID:P,sequence:v,filter:E,cursor:m,count:W});if(oA){const{Cursor:EA,IsFinish:wA,UnreadList:kA,ReadList:xA}=oA,LA={cursor:EA,isCompleted:wA===1,messageID:T,unreadUserIDList:[],readUserIDList:[]};return E===kE.READ?LA.readUserIDList=xA.map(SA=>SA.Read_Account):E===kE.UNREAD&&(LA.unreadUserIDList=kA.map(SA=>SA.Unread_Account)),{code:0,data:LA}}}catch(oA){const{errorCode:EA,errorInfo:wA}=oA;throw new g.ChatError({code:EA,message:wA})}})}_handleC2CMessageReadReceipt(n){const r=[],{constants:g,helper:u}=this._core,{C2cMsgInfo:E,PeerReadTime:m,Peer_Account:D}=n;if(u.isEmpty(E))return;const v=`${g.OuterConstant.CONV_C2C}${D}`;E?.forEach(T=>{const{TinyId:P,MsgClientTime:W,MsgRandom:oA}=T,EA=`${P}-${W}-${oA}`,wA=Lc({conversationID:v,messageID:EA});wA&&!wA.readReceiptInfo.isPeerRead&&(wA.readReceiptInfo.isPeerRead=!0,wA.readReceiptInfo.timestamp=m,r.push({userID:D,messageID:EA,isPeerRead:!0,timestamp:m}))}),this._emitReadReceiptEventIfNeed(r)}_updateGroupMessagesReadReceiptInfo(n){const{messageList:r,readReceiptList:g}=n,u=new Map;r.forEach(E=>{u.set(E.sequence,E)}),g?.forEach(E=>{if(E.Code===0){const{MsgSeq:m,ReadNum:D,UnreadNum:v}=E,T=u.get(m);T&&(T.readReceiptInfo.readCount=D,T.readReceiptInfo.unreadCount=v)}})}_handleGroupMessageReadReceipt(n){const r=[],{constants:g}=this._core,{GroupTips:u}=n;u.forEach(E=>{const{MsgBody:{GroupMsgReceiptList:m},GroupInfo:{GroupId:D}}=E,v=`${g.OuterConstant.CONV_GROUP}${D}`;m?.forEach(T=>{const{TinyId:P,MsgClientTime:W,MsgRandom:oA,ReadNum:EA,UnreadNum:wA}=T,kA=`${P}-${W}-${oA}`,xA=Lc({conversationID:v,messageID:kA}),LA={groupID:D,messageID:kA,readCount:0,unreadCount:0};xA&&(typeof EA=="number"&&(xA.readReceiptInfo.readCount=EA,LA.readCount=EA),typeof wA=="number"&&(xA.readReceiptInfo.unreadCount=wA,LA.unreadCount=wA),r.push(LA))})}),this._emitReadReceiptEventIfNeed(r)}_emitReadReceiptEventIfNeed(n){const{notificationCenter:r,OuterEvent:g}=this._core;n.length>0&&r.emitOuterEvent(g.MESSAGE_READ_RECEIPT_RECEIVED,{name:g.MESSAGE_READ_RECEIPT_RECEIVED,data:n})}_filterValidMessageSendByOther(n){return this._filterNeedReadReceiptMessages(n).filter(r=>{const{from:g}=r;return g!==this._core.common.getCurrentUserID()})}_filterValidMessageSendByMe(n){const{OuterConstant:r}=this._core.constants;return this._filterNeedReadReceiptMessages(n).filter(g=>{const{from:u,status:E}=g;return u===this._core.common.getCurrentUserID()&&E===r.MessageStatus.SUCCESS})}_filterNeedReadReceiptMessages(n){return n.filter(r=>r.needReadReceipt===!0)}dispose(){const{InnerEvent:{MESSAGE_PUSH:n},InnerEventSubType:{C2C_MESSAGE_READ_RECEIPT:r,GROUP_MESSAGE_READ_RECEIPT:g},notificationCenter:u}=this._core;u.unSubscribeInnerEvent(n,r,this._handleC2CMessageReadReceipt,this),u.unSubscribeInnerEvent(n,g,this._handleGroupMessageReadReceipt,this)}};function su(n,r,g){return mA(this,void 0,void 0,function*(){const{common:{buildAndSendPacket:u}}=qs.core,{from:E,to:m,clientSequence:D,random:v,time:T}=n;return u({servcmd:"openim_msg_ext_http_svc.set_key_values",data:{From_Account:E,To_Account:m,MsgKey:`${D}_${v}_${T}`,OperateType:g,ExtensionList:r}})})}function Yu(n,r,g){return mA(this,void 0,void 0,function*(){const{common:{buildAndSendPacket:u}}=qs.core,{to:E,sequence:m}=n;return u({servcmd:"openim_msg_ext_http_svc.group_set_key_values",data:{GroupId:E,MsgSeq:m,OperateType:g,ExtensionList:r}})})}var Oc=new class{constructor(){this._messageExtensionsMap=new Map,this._extensionsLatestSequenceMap=new Map,this._completedFetchExtensions=new Set}init(n){this._core=n;const{notificationCenter:r,helper:{registerApi:g},InnerEvent:{MESSAGE_PUSH:u,LOGOUT:E},InnerEventSubType:{MESSAGE_EXTENSIONS_UPDATED:m}}=n;g({apiName:"setMessageExtensions",context:this}),g({apiName:"getMessageExtensions",context:this}),g({apiName:"deleteMessageExtensions",context:this}),r.subscribeInnerEvent(u,m,this._handleMessageExtensionsNotify,this),r.subscribeInnerEvent(E,this.reset,this)}setMessageExtensions(n,r){return mA(this,void 0,void 0,function*(){this._validateMessageExtensionBusinessCapability("setMessageExtensions");const{constants:{OuterConstant:g},ssoLog:u}=this._core,{ID:E,conversationID:m,sequence:D,time:v,conversationType:T}=n;let P=r;r.length>20&&(P=r.slice(0,20),u.warn("setMessageExtensions","the length of extensions cannot exceed 20"));const W=this._generateServerExtensions(n,P),oA=`convID:${m} messageID:${E} sequence:${D} time:${v} count:${P.length}`;try{let EA;if(T===g.CONV_C2C?EA=yield su(n,W,Pl):T===g.CONV_GROUP&&(EA=yield Yu(n,W,Pl)),EA){const{resultList:wA,successCount:kA,failureCount:xA}=this._handleModifyMessageExtensions(n,EA);return{code:0,data:{extensions:wA},successLog:{message:`${oA} successCount:${kA} failCount:${xA}`}}}return{code:0,data:{extensions:[]}}}catch(EA){const{errorCode:wA}=EA;throw new this._core.helper.ChatError({functionName:"setMessageExtensions",code:wA,moreMessage:oA})}})}getMessageExtensions(n){return mA(this,void 0,void 0,function*(){const{utils:{isUndefined:r}}=this._core;this._validateMessageExtensionBusinessCapability("getMessageExtensions");const{conversationID:g,ID:u,sequence:E,time:m}=n,D=`convID:${g} messageID:${u} sequence:${E} time:${m}`;try{let v;this._completedFetchExtensions.has(u)&&(v=this._extensionsLatestSequenceMap.get(u));const T=yield this._fetchMessageExtensions(n,v);return r(v)&&T.length>1&&this._completedFetchExtensions.add(u),{code:0,data:{extensions:T},successLog:{message:D}}}catch(v){const{errorCode:T,errorInfo:P=""}=v||{};throw new this._core.common.ChatError({code:T,message:P,moreMessage:D})}})}deleteMessageExtensions(n,r){return mA(this,void 0,void 0,function*(){this._validateMessageExtensionBusinessCapability("deleteMessageExtensions");const{utils:{isEmpty:g},constants:{OuterConstant:u}}=this._core,{conversationType:E,conversationID:m,sequence:D,ID:v,time:T}=n;let P=Og;const W=[];g(r)||(P=xl,r?.forEach(wA=>{W.push({key:wA,value:"",seq:0})}));const oA=`convID:${m} messageID:${v} sequence:${D} time:${T} operateType:${P}`,EA=this._generateServerExtensions(n,W);try{let wA;if(E===u.CONV_C2C?wA=yield su(n,EA,P):E===u.CONV_GROUP&&(wA=yield Yu(n,EA,P)),wA){const{resultList:kA,successCount:xA,failureCount:LA}=this._handleModifyMessageExtensions(n,wA);return{code:0,data:{extensions:kA},successLog:{message:`${oA}successCount:${xA} failCount:${LA}`}}}return{code:0,data:{extensions:[]}}}catch(wA){const{errorCode:kA}=wA;throw new this._core.helper.ChatError({functionName:"deleteMessageExtensions",code:kA,moreMessage:oA})}})}reset(){this._messageExtensionsMap.clear(),this._extensionsLatestSequenceMap.clear(),this._completedFetchExtensions.clear()}dispose(){this.reset();const{notificationCenter:n,InnerEvent:{MESSAGE_PUSH:r,LOGOUT:g},InnerEventSubType:{MESSAGE_EXTENSIONS_UPDATED:u}}=this._core;n.unSubscribeInnerEvent(r,u,this._handleMessageExtensionsNotify,this),n.subscribeInnerEvent(g,this.reset,this)}_handleModifyMessageExtensions(n,r){const{ID:g}=n,{Seq:u}=r,E=r.ExtensionList||[],m=[];let D=0,v=0,T=[];return E.forEach(P=>{const{ErrorCode:W,Extension:oA}=P,{Key:EA,Value:wA,Seq:kA}=oA;m.push({code:W,key:EA,value:wA}),W===0?D++:v++,T.push({key:EA,value:wA,seq:kA})}),this._extensionsLatestSequenceMap.set(g,u),T.length>0&&this._updateLocalExtensions(n.ID,T),{resultList:m,successCount:D,failureCount:v}}_updateLocalExtensions(n,r){this._messageExtensionsMap.has(n)||this._messageExtensionsMap.set(n,new Map);const g=this._messageExtensionsMap.get(n);r?.forEach(u=>{const{key:E,seq:m,value:D=""}=u;g?.set(E,{value:D,seq:m})})}_fetchMessageExtensions(n,r){return mA(this,void 0,void 0,function*(){const{constants:{OuterConstant:g},utils:{isEmpty:u}}=this._core;try{let E;const{conversationType:m,ID:D}=n;if(m===g.CONV_C2C?E=yield function(v,T){const{common:{buildAndSendPacket:P}}=qs.core,{from:W,to:oA,clientSequence:EA,random:wA,time:kA}=v;return P({servcmd:"openim_msg_ext_http_svc.get_key_values",data:{From_Account:W,To_Account:oA,MsgKey:`${EA}_${wA}_${kA}`,StartSeq:T}})}(n,r):m===g.CONV_GROUP&&(E=yield function(v,T){const{common:{buildAndSendPacket:P}}=qs.core,{to:W,sequence:oA}=v;return P({servcmd:"openim_msg_ext_http_svc.group_get_key_values",data:{GroupId:W,MsgSeq:oA,StartSeq:T}})}(n,r)),E){const{LatestSeq:v,ClearSeq:T,CompleteFlag:P}=E,W=(E.ExtensionList||[]).map(EA=>({key:EA.Key,value:EA.Value,seq:EA.Seq}));if(this._updateLocalExtensions(D,W),this._clearLocationExtensions(D,T),this._extensionsLatestSequenceMap.set(D,v),P!==1){const EA=W[W.length-1].seq+1;return this._fetchMessageExtensions(n,EA)}const oA=[];if(this._messageExtensionsMap.has(D)){const EA=this._messageExtensionsMap.get(D);EA?.forEach((wA,kA)=>{const{value:xA}=wA;u(xA)||oA.push({key:kA,value:xA})})}return oA}}catch(E){throw E}})}_clearLocationExtensions(n,r){if(!(r<=0)&&this._messageExtensionsMap.has(n)){const g=this._messageExtensionsMap.get(n);g?.forEach((u,E)=>{u.seq<=r&&g.delete(E)})}}_generateServerExtensions(n,r){const{ID:g}=n;if(this._messageExtensionsMap.has(g)){const u=this._messageExtensionsMap.get(g);return r.map(E=>{var m;const{key:D,value:v}=E;let T=0;return u?.has(D)&&(T=(m=u.get(D))===null||m===void 0?void 0:m.seq),{Key:D,Value:v,Seq:T}})}return r.map(u=>({Key:u.key,Value:u.value,Seq:0}))}_validateMessageExtensionBusinessCapability(n){const{helper:r,constants:g}=this._core;if(!r.checkBusinessCapabilityBits(pC))throw new r.ChatError({functionName:n,code:g.ERROR_CODE.NO_USE,replacement1:n})}_handleMessageExtensionsNotify(n){const{SetKVInfo:r,DeleteKVInfo:g,ClearKVInfo:u,MsgOptType:E,TinyId:m,MsgLastSeq:D,ExtensionC2cMsgInfo:v,ExtensionGroupMsgInfo:T}=n?.MsgExtensionNotify||{},P=v||T||{},{MsgClientTime:W,MsgRandom:oA}=P,EA=`${m}-${W}-${oA}`;this._extensionsLatestSequenceMap.set(EA,D),E===Pl?this._handleMessageExtensionsUpdated({messageID:EA,updateMessageExtensionsInfo:r}):E===xl?this._handleMessageExtensionsDeleted({messageID:EA,deleteMessageExtensionsInfo:g}):E===Og&&this._handleMessageExtensionsCleared({messageID:EA,clearMessageExtensionsInfo:u})}_handleMessageExtensionsUpdated(n){const{notificationCenter:r,OuterEvent:g}=this._core,{messageID:u,updateMessageExtensionsInfo:E=[]}=n,m=[];E.forEach(D=>{const{MsgKeyValue:v=[]}=D,T=v.map(P=>(m.push({key:P.Key,value:P.Value}),{key:P.Key,value:P.Value,seq:P.Seq}));this._updateLocalExtensions(u,T)}),r.emitOuterEvent(g.MESSAGE_EXTENSIONS_UPDATED,{name:g.MESSAGE_EXTENSIONS_UPDATED,data:{messageID:u,extensions:m}})}_handleMessageExtensionsDeleted(n){const{notificationCenter:r,OuterEvent:g}=this._core,{messageID:u,deleteMessageExtensionsInfo:E=[]}=n,m=[];E.forEach(D=>{const{MsgKeyValue:v=[]}=D,T=v.map(P=>(m.push(P.Key),{key:P.Key,seq:P.Seq}));this._updateLocalExtensions(u,T)}),r.emitOuterEvent(g.MESSAGE_EXTENSIONS_DELETED,{name:g.MESSAGE_EXTENSIONS_DELETED,data:{messageID:u,keyList:m}})}_handleMessageExtensionsCleared(n){const{notificationCenter:r,OuterEvent:{MESSAGE_EXTENSIONS_DELETED:g},utils:{isEmpty:u}}=this._core,{messageID:E,clearMessageExtensionsInfo:m=[]}=n,D=[];m.forEach(v=>{const{ClearMsgSeq:T}=v;this._messageExtensionsMap.has(E)&&(this._messageExtensionsMap.get(E)||[]).forEach((P,W)=>{P.seq<=T&&!u(P.value)&&D.push(W)}),this._clearLocationExtensions(E,T)}),r.emitOuterEvent(g,{name:g,data:{messageID:E,keyList:D}})}};const SI={key:"message",required:!0,rules:["object"],allowEmpty:!1,customValidator:n=>{const{constants:{OuterConstant:r}}=qs.core;return n.status!==r.MessageStatus.SUCCESS?"message is not success":n.isSupportExtension===!0||"message is not support extension"}},ll={setMessageExtensions:[SI,{key:"extensions",required:!0,rules:["array"],allowEmpty:!1}],getMessageExtensions:[SI],deleteMessageExtensions:[SI]},Il=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({deleteMessage:[{required:!0,rules:["array"],allowEmpty:!1}],revokeMessage:[{required:!0,rules:["object"],allowEmpty:!1}],resendMessage:[{key:"message",required:!0,rules:["object"],allowEmpty:!1},{key:"options",required:!1,rules:["object"],allowEmpty:!1}],getMessageList:{conversationID:{required:!0,rules:["string"],allowEmpty:!1},nextReqMessageID:{required:!1,rules:["string"],allowEmpty:!0},count:{required:!1,rules:["number"],allowEmpty:!0}},getMessageListHopping:{conversationID:{required:!0,rules:["string"],allowEmpty:!1},sequence:{required:!1,rules:["number"],allowEmpty:!0},direction:{required:!1,rules:["number"],allowEmpty:!0},count:{required:!1,rules:["number"],allowEmpty:!0}},createTextAtMessage:{to:{required:!0,rules:["string"],allowEmpty:!1},conversationType:{required:!0,rules:["string"],allowEmpty:!1},payload:{required:!0,rules:["object"],allowEmpty:!1,customValidator:n=>{const r=function(g){var u;return typeof g?.text!="string"||typeof g.text=="string"&&((u=g?.text)===null||u===void 0?void 0:u.length)===0?"payload.text is invalid.":!0}(n);return r!==!0?r:!(n?.atUserList&&!Array.isArray(n.atUserList))||"atUserList should be an array or undefind."}}},findMessage:[{required:!0,rules:["string"],allowEmpty:!1}],translateText:{sourceTextList:{required:!0,rules:["array"],allowEmpty:!1},sourceLanguage:{required:!0,rules:["string"],allowEmpty:!1},targetLanguage:{required:!0,rules:["string"],allowEmpty:!1}},createForwardMessage:{to:{required:!0,rules:["string"],allowEmpty:!1},conversationType:{required:!0,rules:["string"],allowEmpty:!1,customValidator:n=>!(!n.startsWith("C2C")&&!n.startsWith("GROUP"))||"conversationType is invalid."},payload:{required:!0,rules:["object"],allowEmpty:!1}},createLocationMessage:{to:{required:!0,rules:["string"],allowEmpty:!1},conversationType:{required:!0,rules:["string"],allowEmpty:!1},payload:{required:!0,rules:["object"],allowEmpty:!1,customValidator:n=>{const{utils:{isString:r,isNumber:g}}=qs.core;return r(n?.description)?g(n?.longitude)?!!g(n?.latitude)||"payload.latitude must be a number.":"payload.longitude must be a number.":"payload.description must be a string."}}}},{addMessageReaction:[{key:"message",required:!0,rules:["object"],allowEmpty:!1},{key:"reactionID",required:!0,rules:["string"],allowEmpty:!1}],removeMessageReaction:[{key:"message",required:!0,rules:["object"],allowEmpty:!1},{key:"reactionID",required:!0,rules:["string"],allowEmpty:!1}],getMessageReactions:{messageList:{required:!0,rules:["array"],allowEmpty:!1},maxUserCountPerReaction:{required:!1,rules:["number"],allowEmpty:!0,customValidator:n=>typeof n!="number"?"maxUserCountPerReaction is invalid.":!(n<0||n>10)||"maxUserCountPerReaction should between [0, 10]."}},getAllUserListOfMessageReaction:{message:{required:!0,rules:["object"],allowEmpty:!1,customValidator:n=>n.status==="success"||"message is invalid."},reactionID:{required:!0,rules:["string"],allowEmpty:!1},nextSeq:{required:!1,rules:["number"],allowEmpty:!0},count:{required:!1,rules:["number"],allowEmpty:!0}}}),{sendMessageReadReceipt:[{required:!0,rules:["array"],allowEmpty:!1}],getMessageReadReceiptList:[{required:!0,rules:["array"],allowEmpty:!1}],getGroupMessageReadMemberList:{message:{required:!0,rules:["object"],allowEmpty:!1},filter:{required:!1,rules:["number"],allowEmpty:!0},count:{required:!1,rules:["number"],allowEmpty:!0},cursor:{required:!1,rules:["string"],allowEmpty:!0}}}),ll),{pinGroupMessage:{groupID:{required:!0,rules:["string"],allowEmpty:!1},message:{required:!0,rules:["object"],allowEmpty:!1},isPinned:{required:!0,rules:["boolean"],allowEmpty:!1}},getPinnedGroupMessageList:[{key:"groupID",required:!0,rules:["string"],allowEmpty:!1}]}),{createQuoteMessage:[{key:"message",required:!0,rules:["object"],allowEmpty:!1},{key:"quotedMessage",required:!0,rules:["object"],allowEmpty:!1}]}),Ha=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({deleteMessage:!0,revokeMessage:!0,resendMessage:!0,getMessageList:!0,getMessageListHopping:!0,createTextAtMessage:!0,findMessage:!0,translateText:!0,createForwardMessage:!0,createLocationMessage:!0},{addMessageReaction:!0,removeMessageReaction:!0,getMessageReactions:!0,getAllUserListOfMessageReaction:!0}),{sendMessageReadReceipt:!0,getMessageReadReceiptList:!0,getGroupMessageReadMemberList:!0}),{setMessageExtensions:!0,getMessageExtensions:!0,deleteMessageExtensions:!0}),{pinGroupMessage:!0,getPinnedGroupMessageList:!0}),{createQuoteMessage:!0});class FE{constructor(r){this._core=r}deleteMessage(r){return mA(this,void 0,void 0,function*(){const{to:g,messageIdentifiers:u}=r,E={From_Account:this._core.common.getCurrentUserID(),To_Account:g,MsgKeyList:u};return this._core.common.buildAndSendPacket({servcmd:"openim.delete_c2c_msg_ramble",data:E})})}revokeMessage(r){return mA(this,void 0,void 0,function*(){const{to:g,from:u,sequence:E,time:m,random:D}=r,v={MsgInfo:{From_Account:u,To_Account:g,MsgSeq:E,MsgRandom:D,MsgTimeStamp:m}};return this._core.common.buildAndSendPacket({servcmd:"openim.msgwithdraw",data:v})})}}class la{constructor(r){this._core=r}deleteMessage(r){return mA(this,void 0,void 0,function*(){const{to:g,messageIdentifiers:u}=r,E={GroupId:g,Deleter_Account:this._core.common.getCurrentUserID(),Seqs:u};return this._core.common.buildAndSendPacket({servcmd:"group_open_http_svc.delete_group_ramble_msg_by_seq",data:E})})}revokeMessage(r){return mA(this,void 0,void 0,function*(){const{to:g,sequence:u}=r,E={GroupId:g,MsgSeqList:[{MsgSeq:u}]};return this._core.common.buildAndSendPacket({servcmd:"group_open_http_svc.group_msg_recall",data:E})})}}const Nn=2116;class Fr{constructor(r){this._core=r}generateRevokeMessage(r){const{conversationID:g,sequence:u,random:E,tinyID:m,clientTime:D,revokeReason:v,revoker:T}=r;let P={};const{messageDataHandler:W}=this._core.message;return P=W.revokeMessage({conversationID:g,sequence:u,random:E,revoker:T}),P||(P={conversationID:g,sequence:u},m&&D&&E&&(P.ID=`${m}-${D}-${E}`)),P.revoker=T,P.revokeReason=v,P.revokerInfo={userID:T,nick:"",avatar:""},P}updateRevokerInfo(r){return mA(this,void 0,void 0,function*(){const g=r.map(u=>u.revoker);try{const u=yield this._fetchUserInfos(g);u&&r.forEach(E=>{const{revoker:m}=E;u[m]&&(E.revokerInfo.nick=u[m].nick||"",E.revokerInfo.avatar=u[m].avatar||"",E.revokerInfo.userID=m)})}catch(u){console.debug(u)}})}_fetchUserInfos(r){return mA(this,void 0,void 0,function*(){var g,u;const E=yield(g=this._core.user.userProfile)===null||g===void 0?void 0:g.getUserProfile({userIDList:r});return E?.data?(u=E.data)===null||u===void 0?void 0:u.reduce((m,{userID:D,nick:v,avatar:T})=>(m[D]={nick:v||"",avatar:T||""},m),{}):null})}}var ul=new class{constructor(){this._core=null,this._c2cMessageAction=null,this._groupMessageAction=null}init(n){this._core=n,this._groupMessageAction=new la(n),this._c2cMessageAction=new FE(n),this._messageHelper=new Fr(n);const{helper:r}=n;r.registerApi({apiName:"deleteMessage",context:this}),r.registerApi({apiName:"revokeMessage",context:this}),r.registerApi({apiName:"resendMessage",context:this}),r.registerApi({apiName:"findMessage",context:this}),r.registerApi({apiName:"createQuoteMessage",context:this})}deleteMessage(n){return mA(this,void 0,void 0,function*(){let r=[],g=[];const{conversationID:u,conversationType:E}=n[0],m=u.replace(E,"");if(E==="@TIM#SYSTEM")throw new this._core.helper.ChatError({code:Nn});if(n.forEach(D=>{const{conversationID:v,conversationType:T,status:P,_onlineOnlyFlag:W,sequence:oA,random:EA,time:wA}=D||{};if(P==="success"&&v===u&&T===E){if(!W){const kA=T==="C2C"?`${oA}_${EA}_${wA}`:String(oA);r.push(kA)}g.push(D)}}),r.length===0)return this._handleDeleteMessageSuccess(g),{code:0,data:{messageList:g}};r.length>30&&(r=r.slice(0,30),g=g.slice(0,30));try{return E==="C2C"?yield this._c2cMessageAction.deleteMessage({to:m,messageIdentifiers:r}):yield this._groupMessageAction.deleteMessage({to:m,messageIdentifiers:r}),this._handleDeleteMessageSuccess(g),{code:0,data:{messageList:g}}}catch(D){const{utils:{safeStringify:v}}=this._core,{errorCode:T,errorInfo:P}=D;throw new this._core.helper.ChatError({functionName:"deleteMessage",code:T,message:P,moreMessage:`messageIdentifiers: ${v(r)}`})}})}revokeMessage(n){return mA(this,void 0,void 0,function*(){var r;const{conversationType:g,isRevoked:u,ID:E,type:m,from:D,to:v}=n;let T=null;const P=`type:${m} from:${D} to:${v} ID:${E}`;if(g==="@TIM#SYSTEM")throw new this._core.helper.ChatError({message:"system message cannot be revoked"});if(u)throw new this._core.helper.ChatError({message:"message has been revoked",moreMessage:P});try{if(T=g==="C2C"?yield this._c2cMessageAction.revokeMessage(n):yield this._groupMessageAction.revokeMessage(n),T){const{RecallRetList:W}=T,oA=((r=W?.[0])===null||r===void 0?void 0:r.RetCode)||0;if(oA!==0)throw new this._core.helper.ChatError({code:oA,moreMessage:P});return n.isRevoked=!0,yield this._handleRevokeMessageSuccess(n),{code:0,data:{message:n},successLog:{message:P}}}}catch(W){const{errorCode:oA}=W;throw new this._core.helper.ChatError({functionName:"revokeMessage",code:oA,moreMessage:P})}})}resendMessage(n,r){return mA(this,void 0,void 0,function*(){var g,u;return n.isResend=!0,n.status="unSend",(u=(g=this._core)===null||g===void 0?void 0:g.apiMap)===null||u===void 0?void 0:u.sendMessage(n,r)})}findMessage(n){return this._core.message.messageDataHandler.findMessage(n)}createQuoteMessage(n,r){const{ID:g,time:u,sequence:E}=r;return n.quoteInfo={msgID:g,messageTime:u,messageSequence:E},n}_handleDeleteMessageSuccess(n){if(n.length===0)return;const{message:{messageDataHandler:r},common:{isTopic:g},notificationCenter:u,InnerEvent:E}=this._core;n.forEach(D=>{D.isDeleted=!0;const v=r.getLocalMessageList(D.conversationID);v?.forEach(T=>{T.ID===D.ID&&(T.isDeleted=!0)})});const{conversationID:m=""}=n[0];g(m)?u.emitInnerEvent(E.TOPIC_MESSAGE_DELETED,m):u.emitInnerEvent(E.MESSAGE_DELETED,m)}_handleRevokeMessageSuccess(n){return mA(this,void 0,void 0,function*(){var r;const g=(r=this._core.store.get("login"))===null||r===void 0?void 0:r.userId,{conversationID:u,sequence:E,random:m}=n;this._core.message.messageDataHandler.revokeMessage({conversationID:u,sequence:E,random:m,revoker:g}),yield this._messageHelper.updateRevokerInfo([n])})}};class Yl{static parseServerPushElement(r){const{MsgContent:g={}}=r,{Index:u,Data:E}=g;return new Yl({index:u,data:E})}constructor(r){this.type=Kr.MSG_FACE;const{index:g,data:u}=r;this.content={index:g,data:u}}validateBeforeSend(){var r,g;return typeof((r=this.content)===null||r===void 0?void 0:r.index)=="number"&&typeof((g=this.content)===null||g===void 0?void 0:g.data)=="string"?{isValid:!0}:{isValid:!1,error:{message:"content is invalid"}}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{index:E,data:m}=u;return{MsgType:this.type,MsgContent:{Index:E,Data:m}}}}class Pc{static parseServerPushElement(r){const{MsgContent:g={}}=r,{Desc:u,Longitude:E,Latitude:m}=g;return new Pc({description:u,longitude:E,latitude:m})}constructor(r){this.type=Kr.MSG_LOCATION;const{description:g,longitude:u,latitude:E}=r;this.content={description:g,longitude:u,latitude:E}}validateBeforeSend(){return{isValid:!0}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{description:E,longitude:m,latitude:D}=u;return{MsgType:this.type,MsgContent:{Desc:E,Longitude:m,Latitude:D}}}}class OE{static parseServerPushElement(r){const{MsgContent:g={}}=r,{StreamMsgID:u,CompatibleText:E,Markdown:m,BinaryData:D,ErrorCode:v,ErrorMsg:T}=g;return new OE({streamMessageID:u,compatibleText:E,markdown:m,binaryData:D,errorCode:v,errorMessage:T})}constructor(r){this.type=Kr.MSG_STREAM,this.content={streamMessageID:"",compatibleText:"",errorCode:0,errorMessage:"",isStreamEnded:!1},this._chunks=[],this._latestIndex=0;const{streamMessageID:g,compatibleText:u,markdown:E,binaryData:m,errorCode:D=0,errorMessage:v="",isStreamEnded:T=!1,chunks:P=[],latestIndex:W=0}=r;this.content.streamMessageID=g,this.content.compatibleText=u,this.content.markdown=E,this.content.binaryData=m,this.content.errorCode=D,this.content.errorMessage=v,this.content.isStreamEnded=T,this.content.chunks=P,this.content.latestIndex=W}updateChunks(r){if(!r||r.length===0)return;const g=r.sort((m,D)=>m.index-D.index),u=this._getMaxRevokedChunkIndex(g);u>=0&&(this._chunks=[],this._latestIndex=u,this._updateContent());const E=this._getValidChunks(g);if(E.length!==0&&(this._mergeAndSortChunks(E),this._chunks.length>0)){const m=this._chunks[this._chunks.length-1];this._latestIndex=m.index,this._updateContent(),this.content.isStreamEnded=m.isLast}}getLatestIndex(){return this._latestIndex}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{streamMessageID:E,chunks:m}=u,D=m?.map(v=>({EventType:v.eventType||"data",Index:v.index,Markdown:v.markdown,IsLast:v.isLast}));return{MsgType:this.type,MsgContent:{StreamMsgID:E,Chunks:D}}}validateBeforeSend(){var r,g;return((g=(r=this.content)===null||r===void 0?void 0:r.chunks)===null||g===void 0?void 0:g.length)>0?{isValid:!0}:{isValid:!1,error:{message:"content is invalid"}}}_filterContinuousChunks(r,g){if(r.length===0)return[];const u=[];let E=g;for(const m of r){if(m.index>E)break;m.index===E&&(u.push(m),E++)}return u}_mergeAndSortChunks(r){const g=new Map;this._chunks.forEach(u=>{g.set(u.index,u)}),r.forEach(u=>{g.set(u.index,u)}),this._chunks=Array.from(g.values()).sort((u,E)=>u.index-E.index)}_updateContent(){this.content.markdown=this._chunks.map(g=>g.markdown).join("");const r=this._chunks.map(g=>g.binaryData).filter(g=>g?.length>0);if(r.length===0)this.content.binaryData=new Uint8Array(0);else if(r.length===1)this.content.binaryData=r[0];else{const g=r.reduce((m,D)=>m+D.length,0),u=new Uint8Array(g);let E=0;for(const m of r)u.set(m,E),E+=m.length;this.content.binaryData=u}}_getMaxRevokedChunkIndex(r){let g=-1;for(let u=0;ug&&(g=E.index)}return g}_getValidChunks(r){const g=r.filter(u=>u.eventType===Fc.DATA&&u.index>this._latestIndex);return this._filterContinuousChunks(g,this._latestIndex+1)}}var xc=new class{init(n){this._core=n,n.message.messageFactory.registerElementClass(Kr.MSG_FACE,Yl),n.message.messageFactory.registerElementClass(Kr.MSG_LOCATION,Pc),n.message.messageFactory.registerElementClass(Kr.MSG_STREAM,OE),n.helper.registerApi({apiName:"createFaceMessage",context:this}),n.helper.registerApi({apiName:"createTextAtMessage",context:this}),n.helper.registerApi({apiName:"createForwardMessage",context:this}),n.helper.registerApi({apiName:"createLocationMessage",context:this})}createFaceMessage(n){if(!n)return null;const{index:r,data:g}=n?.payload||{},u=new Yl({index:r,data:g}),E=this._core.common.getCurrentUserID(),m=this._core.message.messageFactory.createMessage(Object.assign(Object.assign({},n),{from:E}));return m.setElement(u),m}createTextAtMessage(n){const{atUserList:r}=n?.payload||{},g=this._core.apiMap.createTextMessage(n),{OuterConstant:u}=this._core;if(!g)return null;if(Array.isArray(r)){const E=[],m=[];r.forEach(D=>{D!==u.MSG_AT_ALL?(E.push({GroupAtAllFlag:uh,GroupAt_Account:D}),m.push(D)):(E.push({GroupAtAllFlag:uo}),m.push(u.MSG_AT_ALL))}),g._groupAtInfoList=E,g.atUserList=m}return g}createForwardMessage(n){const{helper:r,OuterConstant:g}=this._core,{to:u,conversationType:E,priority:m,payload:D,needReadReceipt:v,receiverList:T,cloudCustomData:P="",isSupportExtension:W=!1}=n;if(!Array.isArray(D._elements))throw new r.ChatError({functionName:"createForwardMessage",code:2454});if(D.type===g.MSG_GRP_TIP)throw new r.ChatError({functionName:"createForwardMessage",code:2453});const oA=this._core.common.getCurrentUserID(),EA=this._core.message.messageFactory.createMessage({to:u,from:oA,conversationType:E,isPlaceMessage:0,priority:m,payload:D,needReadReceipt:v,isSupportExtension:W,cloudCustomData:P,receiverList:T});return EA.setRelayFlag(!0),EA.setElement(D._elements[0]),EA}createLocationMessage(n){if(!n)return null;const{description:r,longitude:g,latitude:u}=n?.payload||{},E=new Pc({description:r,longitude:g,latitude:u}),m=this._core.common.getCurrentUserID(),D=this._core.message.messageFactory.createMessage(Object.assign(Object.assign({},n),{from:m}));return D.setElement(E),D}};let Vu=class{init(n){this._messageHelper=new Fr(n),this._core=n;const{notificationCenter:r,InnerEvent:{MESSAGE_PUSH:g},InnerEventSubType:{C2C_REVOKED_MESSAGE:u},helper:{registerWorkflowStep:E},constants:{WORKFLOW_NAME:m,WORKFLOW_STEP:D}}=n;r.subscribeInnerEvent(g,u,this._handleC2CNotifyMessage,this),E(m.SYNC_SERVER_INFO_AFTER_RE_ONLINE,D.HANDLE_C2C_REVOKED_MESSAGE_FROM_SYNC_UNREAD,this._handleC2CRevokeMessagesFromUnreadMessageSync,this)}_handleC2CNotifyMessage(n){const{C2cNotifyMsgArray:r}=n;r?.forEach(g=>{Object.keys(g).includes("WithdrawC2cMsgNotify")&&this._handleC2CRevokeMessage(g)})}_handleC2CRevokeMessage(n){return mA(this,void 0,void 0,function*(){try{const{WithdrawC2cMsgNotify:{C2cWithdrawInfoArray:r}}=n;yield this._parseAndEmitC2CRevokedMessages(r)}catch(r){console.debug(r)}})}_parseAndEmitC2CRevokedMessages(n){return mA(this,void 0,void 0,function*(){const r=[],{notificationCenter:g,OuterEvent:u,common:{getCurrentUserID:E}}=this._core;n.forEach(m=>{var D;const{MsgRand:v,MsgSeq:T,To_Account:P,From_Account:W,RevokerInfo:{Revoker_Account:oA,Revoke_Reason:EA}}=m,wA=E()===W?`C2C${P}`:`C2C${W}`,kA=((D=m?.RevokerInfo)===null||D===void 0?void 0:D.Reason)||EA,xA=this._messageHelper.generateRevokeMessage({conversationID:wA,sequence:T,random:v,revoker:oA,revokeReason:kA});r.push(xA)}),r.length>0&&(yield this._messageHelper.updateRevokerInfo(r),g.emitOuterEvent(u.MESSAGE_REVOKED,{name:u.MESSAGE_REVOKED,data:r}))})}_handleC2CRevokeMessagesFromUnreadMessageSync(n){return mA(this,void 0,void 0,function*(){const{revokedMessageList:r}=n.result;yield this._parseAndEmitC2CRevokedMessages(r)})}dispose(){const{notificationCenter:n,InnerEvent:{MESSAGE_PUSH:r},InnerEventSubType:{C2C_REVOKED_MESSAGE:g}}=this._core;n.unSubscribeInnerEvent(r,g,this._handleC2CNotifyMessage,this)}},yC=class{init(n){this._messageHelper=new Fr(n),this._core=n;const{notificationCenter:r,InnerEvent:{MESSAGE_PUSH:g},InnerEventSubType:{GROUP_MESSAGE_REVOKED:u}}=n;r.subscribeInnerEvent(g,u,this._handleGroupNotifyMessage,this)}_handleGroupNotifyMessage(n){const{GroupTips:r}=n;r?.forEach(g=>{var u;Array.isArray((u=g?.MsgBody)===null||u===void 0?void 0:u.GroupWithdrawInfoArray)&&this._handleGroupRevokeMessage(g)})}_handleGroupRevokeMessage(n){return mA(this,void 0,void 0,function*(){try{const{RevokerInfo:r,MsgBody:{GroupWithdrawInfoArray:g},GroupInfo:u}=n,E=[],m=[],{notificationCenter:D,OuterEvent:v,utils:{isEmpty:T},common:{isCommunity:P}}=this._core;let W=!1;u&&(W=P({groupID:u.GroupId})||!T(u.TopicId)),g.forEach(oA=>{const{Random:EA,MsgSeq:wA,GroupId:kA,MsgClientTime:xA,TinyId:LA,TopicId:SA,RevokerInfo:{Revoker_Account:OA=r?.Revoker_Account||"",Reason:WA=r?.Reason||""}}=oA,ue=SA?`GROUP${SA}`:`GROUP${kA}`,le=this._messageHelper.generateRevokeMessage({conversationID:ue,sequence:wA,random:EA,tinyID:LA,clientTime:xA,revoker:OA,revokeReason:WA});W?(le.revokerInfo.nick=u.From_AccountNick,le.revokerInfo.avatar=u.From_AccountHeadurl,E.push(le)):m.push(le)}),m.length>0&&(yield this._messageHelper.updateRevokerInfo(m),E.push(...m)),E.length!==0&&D.emitOuterEvent(v.MESSAGE_REVOKED,{name:v.MESSAGE_REVOKED,data:E})}catch(r){console.debug(r)}})}dispose(){const{notificationCenter:n,InnerEvent:{MESSAGE_PUSH:r},InnerEventSubType:{GROUP_MESSAGE_REVOKED:g}}=this._core;n.unSubscribeInnerEvent(r,g,this._handleGroupNotifyMessage,this)}};var nu=new class{constructor(){this._c2cMessageReceiver=new Vu,this._groupMessageReceiver=new yC}init(n){this._c2cMessageReceiver.init(n),this._groupMessageReceiver.init(n)}dispose(){this._c2cMessageReceiver.dispose(),this._groupMessageReceiver.dispose()}},Eh=new class{constructor(){this._core=null}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"translateText",context:this})}translateText(n){return mA(this,void 0,void 0,function*(){try{const{sourceLanguage:r,sourceTextList:g,targetLanguage:u}=n,E=yield function(m,D){return mA(this,void 0,void 0,function*(){var v,T;const{sourceTextList:P,sourceLanguage:W,targetLanguage:oA}=m,{store:EA,common:wA}=D,kA={SourceText:P,Source:W,Target:oA,FromAccount:(v=EA.get("login"))===null||v===void 0?void 0:v.tinyID,SDKAppID:(T=EA.get("instance"))===null||T===void 0?void 0:T.sdkAppId},xA=yield wA.buildAndSendPacket({servcmd:"im_open_translate.ws_batch_trans_text",data:kA});if(xA){const{CmdErrorCode:LA,TargetText:SA}=xA;return{cmdErrorCode:LA,translatedTextList:SA}}})}({sourceLanguage:r,sourceTextList:g,targetLanguage:u},this._core);if(E){const{cmdErrorCode:{ErrorCode:m,ErrorInfo:D},translatedTextList:v}=E;if(m===0)return{code:0,data:{translatedTextList:v}};throw{errorCode:m,errorInfo:D,message:D}}}catch(r){const{errorCode:g,errorInfo:u}=r||{};throw new this._core.helper.ChatError({functionName:"translateText",code:g,message:u})}})}},Ju=new class{init(n){this._core=n,n.helper.registerApi({apiName:"convertVoiceToText",context:this})}convertVoiceToText(n){return mA(this,void 0,void 0,function*(){var r;const{message:g,language:u=Uc.ZH_PY}=n;let{url:E}=g.payload||{};const m=this._core.common.getCurrentUserID();g.from===m&&g.flow==="out"&&(E=g.payload.remoteAudioUrl),this._validateVoiceFormat(E);const D=((r=DI.exec(E))===null||r===void 0?void 0:r[1])||"mp3",v=yI[u]||iu;try{const T=yield function(P){var W;const{store:oA,common:EA}=qs.core,{url:wA,format:kA,serverLanguageType:xA}=P,LA={BytesUrl:wA,BytesEngServiceType:xA,BytesVoiceFormat:kA,Uint32Sdkappid:(W=oA.get("instance"))===null||W===void 0?void 0:W.sdkAppId,Uint64SourceType:0};return EA.buildAndSendPacket({servcmd:"im_open_speech.ws_sentence_recognition",data:LA})}({url:E,format:D,serverLanguageType:v});if(T){const{CmdErrorCode:P,BytesResult:W}=T;if(P.ErrorCode===0)return{code:0,data:{result:W}};throw{code:P.ErrorCode,message:P.ErrorInfo}}}catch(T){const{code:P,message:W}=T||{};throw new this._core.common.ChatError({functionName:"convertVoiceToText",code:P,message:W})}})}_validateVoiceFormat(n){if(!DI.test(n))throw new this._core.common.ChatError({code:2119})}};class vI{constructor(r){const{constants:g,common:u,utils:E}=qs.core,{CONV_C2C:m,CONV_GROUP:D}=g.OuterConstant,{ID:v,tinyID:T,from:P,to:W,clientTime:oA=u.timeManager.getServerTimeSeconds()||0,random:EA,sequence:wA,cloudCustomData:kA="",nick:xA="",avatar:LA="",clientSequence:SA,conversationType:OA,groupID:WA,_elements:ue,time:le}=r;this.ID=v||`${T}-${oA}-${EA}`,this.messageRandom=EA,this.from=P,this.messageSender=P,this.time=le,this.messageSequence=wA,this.clientSequence=SA||wA,this.clientTime=oA,this.cloudCustomData=kA,this.messageReceiver=W,this.avatar=LA,this.nick=xA;const ki=E.deepCopyWithMethods(ue);ki.forEach(Li=>{Li.payload=Li.content,delete Li.content}),this.messageBody=ki,v?OA.startsWith(m)?this.receiverUserID=W:OA.startsWith(D)&&(this.receiverGroupID=W):WA?(this.receiverGroupID=WA,this.messageReceiver=WA):W&&(this.receiverUserID=W,this.messageReceiver=W)}transformElementsToServerFormat(){return this.messageBody?Array.isArray(this.messageBody)?this.messageBody.map(r=>r.transformToServerFormat({isMergerMessage:!0})):this.messageBody.transformToServerFormat({isMergerMessage:!0}):null}}class El{static parseServerPushElement(r){const{MsgContent:g}=r,{MsgList:u=[],CompatibleText:E,AbstractList:m,Title:D,PbMsgKey:v,JsonMsgKey:T}=g||{},P=u.map(W=>Dr(W));return new El({messageList:P,title:D,abstractList:m,compatibleText:E,pbDownloadKey:v,downloadKey:T})}constructor(r){this.type=qs.core.constants.OuterConstant.MSG_MERGER;const{messageList:g,title:u,abstractList:E,compatibleText:m,pbDownloadKey:D="",downloadKey:v="",version:T=0,layersOverLimit:P=!1}=r,W=[];g.forEach(oA=>{if(oA){const EA=new vI(oA);W.push(EA)}}),this.content={messageList:W,title:u,abstractList:E,compatibleText:m,version:T,downloadKey:v,pbDownloadKey:D,layersOverLimit:P}}validateBeforeSend(){const{isEmpty:r}=qs.core.helper;return r(this.content.messageList)?{isValid:!1,error:{message:"content is invalid"}}:{isValid:!0}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{abstractList:E,compatibleText:m,downloadKey:D,layersOverLimit:v,pbDownloadKey:T,title:P,version:W,messageList:oA}=u;return{MsgType:this.type,MsgContent:{AbstractList:E,CompatibleText:m,JsonMsgKey:D,LayersOverLimit:v,PbMsgKey:T,Title:P,Version:W,MsgList:oc(oA)}}}}var DC=new class{init(n){this._core=n;const{message:r,helper:g,constants:{OuterConstant:u}}=n;r.messageFactory.registerElementClass(u.MSG_MERGER,El),g.registerApi({apiName:"createMergerMessage",context:this}),g.registerApi({apiName:"sendMessage",context:this,matcher:E=>E[0].type===u.MSG_MERGER}),g.registerApi({apiName:"downloadMergerMessage",context:this})}createMergerMessage(n){const{common:r}=this._core;if(!n)return null;const g=new El(n.payload),u=r.getCurrentUserID(),E=this._core.message.messageFactory.createMessage(Object.assign(Object.assign({},n),{from:u}));return E.setRelayFlag(!0),E.setElement(g),E}sendMessage(n,r){return mA(this,void 0,void 0,function*(){var g,u,E;try{const m=function(P){let W="utf-8";qs.core.helper.IN_BROWSER&&document&&(W=document.charset.toLowerCase());let oA,EA=0,wA=0;if(wA=P.length,W==="utf-8"||W==="utf8")for(let kA=0;kA11264){D=this._core.utils.deepCopyWithMethods(n);try{const{JsonMsgKey:P,PbMsgKey:W}=yield function(EA){return mA(this,void 0,void 0,function*(){const{payload:{messageList:wA}}=EA,kA={MsgList:oc(wA)};return qs.core.common.buildAndSendPacket({servcmd:"im_long_msg.save_relay_json_msg",data:kA})})}(D),{payload:oA}=D;v=new El(Object.assign(Object.assign({},oA),{messageList:[],downloadKey:P,pbDownloadKey:W})),D.setElement(v)}catch(P){console.error(P)}}const{data:{message:T}}=yield(E=(u=(g=this._core)===null||g===void 0?void 0:g.message)===null||u===void 0?void 0:u.messageSender)===null||E===void 0?void 0:E.sendMessage(D,r);return v&&T.setElement(n._elements),{code:0,data:{message:T}}}catch(m){const{errorCode:D}=m;throw new this._core.helper.ChatError({code:D})}})}downloadMergerMessage(n){return mA(this,void 0,void 0,function*(){const{ssoLog:r}=this._core,g=n.payload,{downloadKey:u,pbDownload:E,type:m,messageList:D}=g,v=vo(g,["downloadKey","pbDownload","type","messageList"]);try{const T=yield function(oA){return mA(this,void 0,void 0,function*(){return qs.core.common.buildAndSendPacket({servcmd:"im_long_msg.get_relay_json_msg",data:{JsonMsgKey:oA}})})}(u),{MsgList:P}=T||{},W=P?.map(oA=>{const EA=Dr(oA);return new vI(EA)});return typeof n.isOnlineMessage=="function"?n.setElement({type:n.type,content:Object.assign({messageList:W},v)}):(n.payload.messageList=W,n.payload.downloadKey="",n.payload.pbDownloadKey=""),r.info("downloadMergerMessage",` success downloadKey:${u}`),n}catch(T){const{errorCode:P}=T;throw new this._core.helper.ChatError({functionName:"downloadMergerMessage",code:P,moreMessage:u})}})}},Ia=new class{init(n){this._core=n,this._core.helper.registerExperimentalAPI("sendComboMessage",this)}sendComboMessage(n){return mA(this,void 0,void 0,function*(){const{appStore:r,message:g,common:{getCurrentUserID:u},utils:{isArray:E}}=this._core,{GroupId:m,To_Account:D}=n;n.From_Account=n.From_Account||u();let v=null;if(m){v=this._generateGroupMessage(Object.assign(Object.assign({},n),{ToGroupId:m}));const T=r.userStore.getUserProfile(u());v.level=T?.level||0,E(D)&&D.length>0&&(v._receiverList=D)}else D&&(v=this._generateC2CMessage(n));return g.messageSender.sendMessage(v,n)})}_generateC2CMessage(n){const{message:r,OuterConstant:{CONV_C2C:g}}=this._core,u=g,E=r.messageHelper.parseServerPushMessage(n),m=r.messageFactory.createMessage(Object.assign(Object.assign({},E),{conversationType:u,flow:sc.OUT})),{elements:D}=E;return m.setElement(D),m}_generateGroupMessage(n){const{message:r,OuterConstant:{CONV_GROUP:g}}=this._core,u=g,E=r.messageHelper.parseServerGroupMessage(n),m=r.messageFactory.createMessage(Object.assign(Object.assign({},E),{conversationType:u,flow:sc.OUT})),{elements:D}=E;return m.setElement(D),m}},nc=new class{init(n){this._core=n;const{helper:r,notificationCenter:g,InnerEvent:{MESSAGE_PUSH:u},InnerEventSubType:{GROUP_MESSAGE_PINNED:E}}=n;g.subscribeInnerEvent(u,E,this._handleGroupMessagePinned,this),r.registerApi({apiName:"pinGroupMessage",context:this}),r.registerApi({apiName:"getPinnedGroupMessageList",context:this})}pinGroupMessage(n){return mA(this,void 0,void 0,function*(){const{ssoLog:r,common:{isTopic:g},OuterConstant:{GROUP_ID_PREFIX:u},helper:{ChatError:E}}=this._core;let{groupID:m,message:D,isPinned:v}=n;const{sequence:T}=D;try{return yield function(P){return mA(this,void 0,void 0,function*(){const{common:{buildAndSendPacket:W,getCurrentUserID:oA}}=qs.core,{groupID:EA,sequence:wA,isPinned:kA}=P,xA=oA(),LA=kA?"group_open_http_svc.pin_message":"group_open_http_svc.unpin_message",SA={GroupId:EA,MsgSeq:wA};return kA?SA.Pinner_Account=xA:SA.UnPinner_Account=xA,W({servcmd:LA,data:SA})})}({groupID:m,sequence:T,isPinned:v}),{code:0,data:{}}}catch(P){const{errorCode:W,errorInfo:oA}=P||{};throw new E({code:W,message:oA})}})}getPinnedGroupMessageList(n){return mA(this,void 0,void 0,function*(){let r=[];try{const g=yield function(u){return mA(this,void 0,void 0,function*(){const{groupID:E}=u,{common:{buildAndSendPacket:m}}=qs.core;return m({servcmd:"group_open_http_svc.get_pinned_messages",data:{GroupId:E}})})}({groupID:n});if(g){const{PinnedMsgList:u=[]}=g;r=yield this._updatePinnedMessageInfo({serverPinnedMessageList:u,groupID:n})}return{code:0,data:{messageList:r}}}catch(g){throw g}})}_handleGroupMessagePinned(n){const{message:{messageHelper:r,messageFactory:g},notificationCenter:u,OuterEvent:E,OuterConstant:m}=this._core;n.GroupTips.forEach(D=>{const{ToGroupId:v,MsgBody:{PinnedMsg:T,OpType:P,MsgOperatorMemberExtraInfo:W,SdkGroupMessageId:oA}}=D,{UserId:EA,NickName:wA="",ImageUrl:kA=""}=W;let xA=null,LA=!1;if(P===fd){LA=!0;const SA=r.parseServerGroupMessage(T);xA=g.createMessage(Object.assign(Object.assign({},SA),{conversationType:m.CONV_GROUP,flow:"in"})),xA.setElement(SA.elements),xA.pinnerInfo={userID:EA,nick:wA,avatar:kA}}else if(P===LE){const{ClientTime:SA,Random:OA,SenderTinyId:WA,ServerTime:ue,MsgSeq:le}=oA;xA={ID:`${WA}-${SA}-${OA}`,sequence:le,random:OA,time:ue,clientTime:SA}}xA&&u.emitOuterEvent(E.PINNED_GROUP_MESSAGE_UPDATED,{name:E.PINNED_GROUP_MESSAGE_UPDATED,data:{groupID:v,message:xA,isPinned:LA,operatorInfo:{userID:EA,nick:wA,avatar:kA}}})})}_findMessageBySequence(n,r){const{message:{messageDataHandler:g}}=this._core;return[...g.getLocalMessageList(n),...g.getSparseMessageList(n)].find(u=>u.sequence===r)}_updatePinnedMessageInfo(n){return mA(this,arguments,void 0,function*({serverPinnedMessageList:r,groupID:g}){const{OuterConstant:{CONV_GROUP:u},utils:{isEmpty:E}}=this._core,m=[],D=[],v=[],T=new Map,P=`${u}${g}`;for(let oA=0;oA{const{sequence:kA}=wA,xA=T.get(kA),LA=oA[xA]||{userID:xA,nick:"",avatar:""};wA.pinnerInfo=LA}),m.sort((wA,kA)=>wA.sequence-kA.sequence),m}return[]})}_fetchPinnedMessageInfo(n){return mA(this,void 0,void 0,function*(){var r,g;const{message:{messageHistory:u},user:{userProfile:E},utils:{isArray:m}}=this._core,{conversationID:D,messageSequenceList:v,pinnerIDList:T}=n,P=yield Promise.all([this._fetchMessageBySequence({conversationID:D,messageSequenceList:v}),E?.getUserProfile({userIDList:T})]);if(m(P)){const W={};return(((r=P[1])===null||r===void 0?void 0:r.data)||[]).forEach(oA=>{const{userID:EA,nick:wA="",avatar:kA=""}=oA;W[EA]={userID:EA,nick:wA,avatar:kA}}),{messageList:((g=P[0])===null||g===void 0?void 0:g.messageList)||[],pinnerInfoMap:W}}})}_fetchMessageBySequence(n){return mA(this,void 0,void 0,function*(){const{utils:{isEmpty:r},message:{messageHistory:g}}=this._core,{conversationID:u,messageSequenceList:E}=n;return r(E)?[]:g.getGroupRoamingMessagesByAnchor({conversationID:u,messageSequenceList:E,getType:3})})}};class ug{constructor(r){this.eventType=Fc.DATA,this.index=0,this.markdown="",this.isLast=!1,this.binaryData=null;const{EventType:g,Index:u,Markdown:E,IsLast:m,BinaryData:D}=r;this.eventType=g,this.index=u,this.markdown=E,this.isLast=m,this.binaryData=D}}var MI=new class{constructor(){this._messageMap=new Map,this._retryCountMap=new Map}init(n){this._core=n;const{notificationCenter:r,OuterEvent:{MESSAGE_RECEIVED:g},InnerEvent:{HISTORY_MESSAGE_FETCHED:u},common:{workflowManager:E},constants:{WORKFLOW_NAME:m,WORKFLOW_STEP:D}}=n;r.subscribeInnerEvent(ho,this._handleStreamMessageChunkPush,this),r.subscribeOuterEvent(g,this._handleMessageReceived,this),r.subscribeInnerEvent(u,this.processHistoryMessage,this),E.registerWorkflowStep(m.SYNC_SERVER_INFO_AFTER_RE_ONLINE,D.STREAM_MESSAGE_RECOVER,this._recoverStreamMessage,this)}processHistoryMessage(n){const{utils:{isEmpty:r,safeStringify:g},ssoLog:u}=this._core;try{n?.forEach(E=>{var m;if(this._isValidStreamMessage(E)){const D=(m=E?._elements)===null||m===void 0?void 0:m[0],{streamMessageID:v,markdown:T,binaryData:P}=D?.content||{};r(T)&&r(P)?(this._messageMap.set(v,E),this._fetchStreamMessageChunks(E)):D.content.isStreamEnded=!0}})}catch(E){u.error("processHistoryMessage.error",g(E))}}_handleMessageReceived(n){const r=n.data;r?.forEach(g=>{var u,E;if(this._isValidStreamMessage(g)){const{streamMessageID:m}=((E=(u=g?._elements)===null||u===void 0?void 0:u[0])===null||E===void 0?void 0:E.content)||{};m&&(this._messageMap.set(m,g),this._fetchStreamMessageChunks(g))}})}_isValidStreamMessage(n){var r,g;const{utils:{isEmpty:u}}=this._core,{streamMessageID:E}=((g=(r=n?._elements)===null||r===void 0?void 0:r[0])===null||g===void 0?void 0:g.content)||{};return n.type===Kr.MSG_STREAM&&!u(E)}_fetchStreamMessageChunks(n){return mA(this,void 0,void 0,function*(){var r,g;const{constants:{ERROR_CODE:u},ssoLog:E,utils:{safeStringify:m}}=this._core,D=(r=n._elements)===null||r===void 0?void 0:r[0],v=(g=D?.content)===null||g===void 0?void 0:g.streamMessageID;try{const{from:T,to:P}=n,W=D.getLatestIndex();if(D.content.isStreamEnded)return;const oA=yield function(EA){return mA(this,void 0,void 0,function*(){const{from:wA,to:kA,streamMessageID:xA,index:LA}=EA,SA={From_Account:wA,To_Account:kA,StreamMsgID:xA,AckIndex:LA};return qs.core.common.buildAndSendPacket({servcmd:"StreamMsg.GetStreamHttp",data:SA,timeout:5e3})})}({from:T,to:P,streamMessageID:v,index:W});if(oA){const{ErrorCode:EA,ErrorInfo:wA}=oA;if(EA!==0)throw D.content.errorCode=EA,D.content.errorMessage=wA,{errorCode:EA,errorMessage:wA}}}catch(T){if(T.errorCode===u.NETWORK_TIMEOUT&&this._shouldRetryFetch(v)){const P=this._retryCountMap.get(v)||0;E.debug("_fetchStreamMessageChunks.timeout",`error: ${m(T)} retried: ${P}`),this._retryCountMap.set(v,P+1),this._fetchStreamMessageChunks(n)}else E.error("_fetchStreamMessageChunks.error",m(T))}})}_shouldRetryFetch(n){const{utils:{isNumber:r}}=this._core;if(!this._retryCountMap.has(n))return this._retryCountMap.set(n,1),!0;const g=this._retryCountMap.get(n);return!!(r(g)&&g<=3)}_onStreamEnded(n,r,g){const{ssoLog:u}=this._core;g.content.isStreamEnded=!0,g.stopReason=r,this._messageMap.delete(n),u.debug("_onStreamEnded",`streamMessage end, StopReason: ${r}`)}_handleStreamMessageChunkPush(n){var r;const{ssoLog:g}=this._core,{StopReason:u,Chunks:E,StreamID:m}=n?.body||{},D=this._messageMap.get(m);if(!D)return void g.warn(`_handleStreamMessageChunkPush, unfounded message: ${m}`);const v=(r=D._elements)===null||r===void 0?void 0:r[0];if(v&&this._validateExpectedChunk(v,E)){if(E.length>0){const T=E.map(P=>new ug(P));v.updateChunks(T)}this._emitMessageModify(D),function(T,P){mA(this,void 0,void 0,function*(){const{common:{generateProtocolData:W},utils:{safeStringify:oA},ssoLog:EA,channel:wA}=qs.core,kA={StreamMsgID:T,AckIndex:P};try{const xA=W({servcmd:"StreamMsg.AckHttp",data:kA});wA.sendPacket(xA)}catch(xA){EA.debug("sendStreamChunkAck",oA(xA))}})}(m,v.getLatestIndex()),v.content.isStreamEnded&&this._onStreamEnded(m,u,v)}}_emitMessageModify(n){const{notificationCenter:r,OuterEvent:{MESSAGE_MODIFIED:g}}=this._core;r.emitOuterEvent(g,{name:g,data:[n]})}_validateExpectedChunk(n,r){const g=n.getLatestIndex()+1;let u=!1;for(let E=0;Em.Index).join(", ")}]`),!1}return!0}_recoverStreamMessage(){this._retryCountMap.clear();const{ssoLog:n,utils:{safeStringify:r}}=this._core;try{const g=Array.from(this._messageMap.entries());for(let u=Math.max(0,g.length-300);u{const LA=this._getResponseBody(kA,E,oA&&EA),SA=this._buildResponse(kA,LA);if(kA.status===200)r(null,SA);else{if(EA&&!wA.includes(EA))return n.url=this._domainName2IP(wA,EA),n.uploadByIP=!0,this.request(n,r);r({code:kA.status,message:JSON.stringify(kA.responseText)},SA)}},kA.onerror=()=>{const LA=this._getResponseBody(kA,E,oA&&EA),SA=this._buildResponse(kA,LA),OA={code:kA.status,message:kA.status===0?"CORS blocked or network error":JSON.stringify(kA.responseText)};r(OA,SA)},n.onProgress&&kA.upload&&(kA.upload.onprogress=LA=>{const{total:SA,loaded:OA}=LA,WA=Math.min(Math.floor(100*OA/SA),100);n.onProgress({total:SA,loaded:OA,percent:WA/100})}),kA.send(P),kA})}_buildResponse(n,r){const g={};return n.getAllResponseHeaders().trim().split(`
-`).forEach(u=>{if(u){const[E,m]=u.split(":").map(D=>D.trim());g[E.toLowerCase()]=m}}),{statusCode:n.status,statusMessage:n.statusText,headers:g,data:r}}_getResponseBody(n,r,g){return n.status===200&&r?{location:r,uploadIP:g}:{response:n.responseText,uploadIP:g}}_queryString(n,r="&",g="="){var u;const{isEmpty:E,isPlainObject:m}=(u=this._core)===null||u===void 0?void 0:u.utils;return E(n)?"":m(n)?Object.keys(n).map(D=>{const v=encodeURIComponent(D)+g;return Array.isArray(n[D])?n[D].map(T=>v+encodeURIComponent(T)).join(r):v+encodeURIComponent(n[D])}).filter(Boolean).join(r):void 0}_domainName2IP(n,r){return n.replace(/^http(s)?:\/\/(.*?)\//,`https://${r}/`)}};const qu=["unknown","image","video","audio","log"];var RI=new class{init(n){this._core=n}request(n,r){var g;const{MINI_APP_NAMESPACE:u,IN_ALIPAY_MINI_APP:E,isUniIOSApp:m}=(g=this._core)===null||g===void 0?void 0:g.utils,{resources:D="",headers:v={},url:T,downloadUrl:P=""}=n;let W=T,oA=null;const EA=P?P.match(/^(https?:\/\/[^/]+\/)([^/]*\/?)(.*)$/):null;if(!EA)return void console.warn("message Invalid download URL format");const wA=decodeURIComponent(EA[3]),kA=wA.includes("?")?wA.split("?")[0]:wA||"",xA={key:n.fileKey||kA,success_action_status:200,"Content-Type":""},LA={};if(m()){const[OA,WA]=T.split("?sign=");WA&&(W=`${OA}?sign=${encodeURIComponent(WA)}`,LA.sign=decodeURIComponent(WA),LA.signature=decodeURIComponent(WA))}let SA={url:W,header:v,name:"file",filePath:D,formData:Object.assign(Object.assign({},xA),LA),timeout:n.timeout||3e5};if(E){const{name:OA}=SA,WA=vo(SA,["name"]);SA=Object.assign(Object.assign({},WA),{fileName:"file",fileType:n.fileType?qu[n.fileType]:"image"})}return oA=u.uploadFile(Object.assign(Object.assign({},SA),{success:OA=>{this._handleResponse({response:OA,downloadUrl:P,callback:r})},fail:OA=>{this._handleResponse({response:OA,downloadUrl:P,callback:r})}})),oA.onProgressUpdate&&oA.onProgressUpdate(OA=>{n.onProgress&&n.onProgress({total:OA.totalBytesExpectedToSend||0,loaded:OA.totalBytesSent||0,percent:OA.progress?Math.floor(OA.progress)/100:0})}),oA}_handleResponse(n){const{downloadUrl:r,response:g,callback:u}=n,E={};if(g.header)for(const D in g.header)g.header.hasOwnProperty(D)&&(E[D.toLowerCase()]=g.header[D]);const m=+g.statusCode;m===200?u(null,{statusCode:m,headers:E,data:Object.assign(Object.assign({},g.data),{location:r})}):u({code:m,message:JSON.stringify(g.data)},{statusCode:m,headers:E,data:void 0})}};function dl(n){return function(r){return Object.prototype.toString.call(r).match(/^\[object (.*)\]$/)[1].toLowerCase()}(n)==="file"}function Or(n){const r=n||99999999;return Math.round(Math.random()*r)}function Pr(n,r=!0,g=!0){const u=Date.now();return r?g?u-n+" ms":`${Math.round((u-n)/1e3)} s`:g?u-n:Math.round((u-n)/1e3)}function Eg(n){return`${Array.from({length:8},()=>Math.floor(65536*(1+Math.random())).toString(16).substring(1)).join("")}-${n}`}function hr(n,r){return Math.round(Number(n)*10**r)/10**r}function Nr(n){return n<=1048576?`${hr(n/1024,1)}KB/s`:`${hr(n/1048576,1)}MB/s`}const rc="TIMImageElem",Pg="TIMSoundElem",qa="TIMFileElem",Vl="TIMVideoFileElem",fa="RichMediaMessagePlugin",wI=["rich.my-imcloud.com","imrich.qcloud.com"],ru=1,ya=2,Cl=3,xE=255;var au;(function(n){n.UNSENT="unSend",n.SUCCESS="success",n.FAIL="fail"})(au||(au={}));const YE={wechat:/^(wxfile:\/\/tmp_|http:\/\/temp\/|cloud:\/\/temp-)/,alipay:/^(https:\/\/resource\/|alipayfile:\/\/tmp\/)/,baidu:/^(http:\/\/tmp\/|swanfile:\/\/tmp_)/,bytedance:/^(ttfile:\/\/tmp_|\/(var|tmp)\/|tttemp:\/\/)/,qq:/^(qqfile:\/\/tmp_|http:\/\/qtemp\/)/},jr=Symbol("isCustomUpload");var gu,Vt=new class{init(n){this._core=n}addAuthToUrl(n=""){if(this._isMiniProgramTempFile(n))return n;const r=function(g){return g?g.startsWith("https://")?g:g.startsWith("http://")?g.replace("http://","https://"):g:""}(n);return this.processResourceUrl(r)}removeAuthToUrl(n){return function(r,g){const[u,E]=r.split("?");if(!E)return u;const m=E.split("&").reduce((v,T)=>{const[P,W]=T.split("=");return P&&P!==g&&(v[P]=W||""),v},{}),D=Object.keys(m).map(v=>`${v}${m[v]?`=${m[v]}`:""}`).join("&");return D?`${u}?${D}`:u}(n,"authKey")}_isMiniProgramTempFile(n){return!!this.getPlatformFlags().IN_MINI_APP&&Object.values(YE).some(r=>r.test(n))}extractFileFromInput(n){const{utils:{isArray:r}}=this._core;return dl(n)?n:function(g){if(typeof g!="object"||g===null)return!1;const u=Object.getPrototypeOf(g);if(u===null)return!0;let E=u;for(;Object.getPrototypeOf(E)!==null;)E=Object.getPrototypeOf(E);return u===E}(n)&&typeof uni<"u"?r(n.tempFiles)&&n.tempFiles.length>0?n.tempFiles[0]:r(n.files)?n.files[0]:n.tempFile?n.tempFile:null:n instanceof HTMLInputElement&&n.files&&n.files.length>0?n.files[0]:null}probeImageWidthHeight(n){return mA(this,void 0,void 0,function*(){var r;const{IN_MINI_APP:g,IN_BROWSER:u}=((r=this._core)===null||r===void 0?void 0:r.utils)||{};return this._shouldSkipProbing()?{width:0,height:0}:u?this._probeImageDimensionsWeb(n):g?this._probeImageDimensionsMiniApp(n):void 0})}isSimpleCos(){var n;const r=((n=this._core)===null||n===void 0?void 0:n.store.get("cloudConfig"))||{},{simple_cos:g}=r;return g!=="0"}getFileDNList(){var n;let r=wI;const g=((n=this._core)===null||n===void 0?void 0:n.store.get("cloudConfig"))||{},{file_dn_list:u}=g;if(u===void 0)return r;try{JSON.parse(u).forEach(E=>{r.includes(E)||r.push(E)})}catch(E){console.warn(E),r=wI}return r}getPlatform(){var n;return(n=this._core)===null||n===void 0?void 0:n.utils.platform}generateUUID(n,r){var g;let u=`${this.getSDKAppID()}-${this.getCurrentUserID()}-${(g=this._core)===null||g===void 0?void 0:g.utils.randomString()}`;if(r)return`${u}.${r}`;const E=n.name||n.value||n.url||n.tempFilePath,m=E&&E.slice(E.lastIndexOf(".")+1);return m&&(u=`${u}.${m}`),u}processResourceUrl(n){if(!n)return"";let r=n;const g=this.getFileDownloadProxy(),u=this.getAuthKey(),E=this.getFileDNList();return g&&(n.startsWith("http://")?r=n.replace(/^http:\/\/[^/]+/,g):n.startsWith("https://")&&(r=n.replace(/^https:\/\/[^/]+/,g))),u&&r.indexOf("authKey=")===-1&&function(D,v){let T=!1;if(D){const P=D.match(/:\/\/([0-9]?\.)?(.[^/:]+)/),W=P&&P[2]||"";if(W.includes("rich-dev"))return!0;for(let oA=0;oA-1?`${r}&authKey=${u}`:`${r}?authKey=${u}`),r}getCurrentUserID(){var n,r;return(r=(n=this._core)===null||n===void 0?void 0:n.store.get("login"))===null||r===void 0?void 0:r.userId}getSDKAppID(){var n,r;return(r=(n=this._core)===null||n===void 0?void 0:n.store.get("instance"))===null||r===void 0?void 0:r.sdkAppId}getFileDownloadProxy(){var n,r;return((r=(n=this._core)===null||n===void 0?void 0:n.store.get("instance"))===null||r===void 0?void 0:r.fileDownloadProxy)||""}getFileUploadProxy(){var n,r;return((r=(n=this._core)===null||n===void 0?void 0:n.store.get("instance"))===null||r===void 0?void 0:r.fileUploadProxy)||""}getAuthKey(){var n,r;return((r=(n=this._core)===null||n===void 0?void 0:n.store.get("login"))===null||r===void 0?void 0:r.authKey)||""}isPrivateNetWork(){var n,r;return(r=(n=this._core)===null||n===void 0?void 0:n.store.get("instance"))===null||r===void 0?void 0:r.proxyServer}getPlatformFlags(){var n;const{IN_BROWSER:r,IN_MINI_APP:g,IN_RN_APP:u,IN_UNI_NATIVE_APP:E}=(n=this._core)===null||n===void 0?void 0:n.utils;return{IN_BROWSER:r,IN_MINI_APP:g,IN_RN_APP:u,IN_UNI_NATIVE_APP:E}}isEmpty(n){var r;const{isEmpty:g}=(r=this._core)===null||r===void 0?void 0:r.utils;return g(n)}generateURL(n,r){const{needAddAuthToUrl:g=!0}=r||{};return g?this.addAuthToUrl(n):n}_probeImageDimensionsMiniApp(n){var r;const{MINI_APP_NAMESPACE:g}=((r=this._core)===null||r===void 0?void 0:r.utils)||{};return new Promise(u=>{g.getImageInfo({src:n,success:E=>u({width:E.width,height:E.height}),fail:()=>u({width:0,height:0})})})}_shouldSkipProbing(){var n;const{IN_RN_APP:r,IS_IE:g,IE_VERSION:u,IN_WX_MINI_GAME:E}=((n=this._core)===null||n===void 0?void 0:n.utils)||{};return r||g&&u===9||E}_probeImageDimensionsWeb(n){return new Promise(r=>{const g=new Image,u=()=>{g.onload=null,g.onerror=null,g.src=""};g.onload=()=>{r({width:g.width,height:g.height}),u()},g.onerror=()=>{r({width:0,height:0}),u()},g.src=n})}},Ku={exports:{}},ju=(gu||(gu=1,function(n){n.exports=function(r){var g=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];function u(LA,SA){var OA=LA[0],WA=LA[1],ue=LA[2],le=LA[3];WA=((WA+=((ue=((ue+=((le=((le+=((OA=((OA+=(WA&ue|~WA&le)+SA[0]-680876936|0)<<7|OA>>>25)+WA|0)&WA|~OA&ue)+SA[1]-389564586|0)<<12|le>>>20)+OA|0)&OA|~le&WA)+SA[2]+606105819|0)<<17|ue>>>15)+le|0)&le|~ue&OA)+SA[3]-1044525330|0)<<22|WA>>>10)+ue|0,WA=((WA+=((ue=((ue+=((le=((le+=((OA=((OA+=(WA&ue|~WA&le)+SA[4]-176418897|0)<<7|OA>>>25)+WA|0)&WA|~OA&ue)+SA[5]+1200080426|0)<<12|le>>>20)+OA|0)&OA|~le&WA)+SA[6]-1473231341|0)<<17|ue>>>15)+le|0)&le|~ue&OA)+SA[7]-45705983|0)<<22|WA>>>10)+ue|0,WA=((WA+=((ue=((ue+=((le=((le+=((OA=((OA+=(WA&ue|~WA&le)+SA[8]+1770035416|0)<<7|OA>>>25)+WA|0)&WA|~OA&ue)+SA[9]-1958414417|0)<<12|le>>>20)+OA|0)&OA|~le&WA)+SA[10]-42063|0)<<17|ue>>>15)+le|0)&le|~ue&OA)+SA[11]-1990404162|0)<<22|WA>>>10)+ue|0,WA=((WA+=((ue=((ue+=((le=((le+=((OA=((OA+=(WA&ue|~WA&le)+SA[12]+1804603682|0)<<7|OA>>>25)+WA|0)&WA|~OA&ue)+SA[13]-40341101|0)<<12|le>>>20)+OA|0)&OA|~le&WA)+SA[14]-1502002290|0)<<17|ue>>>15)+le|0)&le|~ue&OA)+SA[15]+1236535329|0)<<22|WA>>>10)+ue|0,WA=((WA+=((ue=((ue+=((le=((le+=((OA=((OA+=(WA&le|ue&~le)+SA[1]-165796510|0)<<5|OA>>>27)+WA|0)&ue|WA&~ue)+SA[6]-1069501632|0)<<9|le>>>23)+OA|0)&WA|OA&~WA)+SA[11]+643717713|0)<<14|ue>>>18)+le|0)&OA|le&~OA)+SA[0]-373897302|0)<<20|WA>>>12)+ue|0,WA=((WA+=((ue=((ue+=((le=((le+=((OA=((OA+=(WA&le|ue&~le)+SA[5]-701558691|0)<<5|OA>>>27)+WA|0)&ue|WA&~ue)+SA[10]+38016083|0)<<9|le>>>23)+OA|0)&WA|OA&~WA)+SA[15]-660478335|0)<<14|ue>>>18)+le|0)&OA|le&~OA)+SA[4]-405537848|0)<<20|WA>>>12)+ue|0,WA=((WA+=((ue=((ue+=((le=((le+=((OA=((OA+=(WA&le|ue&~le)+SA[9]+568446438|0)<<5|OA>>>27)+WA|0)&ue|WA&~ue)+SA[14]-1019803690|0)<<9|le>>>23)+OA|0)&WA|OA&~WA)+SA[3]-187363961|0)<<14|ue>>>18)+le|0)&OA|le&~OA)+SA[8]+1163531501|0)<<20|WA>>>12)+ue|0,WA=((WA+=((ue=((ue+=((le=((le+=((OA=((OA+=(WA&le|ue&~le)+SA[13]-1444681467|0)<<5|OA>>>27)+WA|0)&ue|WA&~ue)+SA[2]-51403784|0)<<9|le>>>23)+OA|0)&WA|OA&~WA)+SA[7]+1735328473|0)<<14|ue>>>18)+le|0)&OA|le&~OA)+SA[12]-1926607734|0)<<20|WA>>>12)+ue|0,WA=((WA+=((ue=((ue+=((le=((le+=((OA=((OA+=(WA^ue^le)+SA[5]-378558|0)<<4|OA>>>28)+WA|0)^WA^ue)+SA[8]-2022574463|0)<<11|le>>>21)+OA|0)^OA^WA)+SA[11]+1839030562|0)<<16|ue>>>16)+le|0)^le^OA)+SA[14]-35309556|0)<<23|WA>>>9)+ue|0,WA=((WA+=((ue=((ue+=((le=((le+=((OA=((OA+=(WA^ue^le)+SA[1]-1530992060|0)<<4|OA>>>28)+WA|0)^WA^ue)+SA[4]+1272893353|0)<<11|le>>>21)+OA|0)^OA^WA)+SA[7]-155497632|0)<<16|ue>>>16)+le|0)^le^OA)+SA[10]-1094730640|0)<<23|WA>>>9)+ue|0,WA=((WA+=((ue=((ue+=((le=((le+=((OA=((OA+=(WA^ue^le)+SA[13]+681279174|0)<<4|OA>>>28)+WA|0)^WA^ue)+SA[0]-358537222|0)<<11|le>>>21)+OA|0)^OA^WA)+SA[3]-722521979|0)<<16|ue>>>16)+le|0)^le^OA)+SA[6]+76029189|0)<<23|WA>>>9)+ue|0,WA=((WA+=((ue=((ue+=((le=((le+=((OA=((OA+=(WA^ue^le)+SA[9]-640364487|0)<<4|OA>>>28)+WA|0)^WA^ue)+SA[12]-421815835|0)<<11|le>>>21)+OA|0)^OA^WA)+SA[15]+530742520|0)<<16|ue>>>16)+le|0)^le^OA)+SA[2]-995338651|0)<<23|WA>>>9)+ue|0,WA=((WA+=((le=((le+=(WA^((OA=((OA+=(ue^(WA|~le))+SA[0]-198630844|0)<<6|OA>>>26)+WA|0)|~ue))+SA[7]+1126891415|0)<<10|le>>>22)+OA|0)^((ue=((ue+=(OA^(le|~WA))+SA[14]-1416354905|0)<<15|ue>>>17)+le|0)|~OA))+SA[5]-57434055|0)<<21|WA>>>11)+ue|0,WA=((WA+=((le=((le+=(WA^((OA=((OA+=(ue^(WA|~le))+SA[12]+1700485571|0)<<6|OA>>>26)+WA|0)|~ue))+SA[3]-1894986606|0)<<10|le>>>22)+OA|0)^((ue=((ue+=(OA^(le|~WA))+SA[10]-1051523|0)<<15|ue>>>17)+le|0)|~OA))+SA[1]-2054922799|0)<<21|WA>>>11)+ue|0,WA=((WA+=((le=((le+=(WA^((OA=((OA+=(ue^(WA|~le))+SA[8]+1873313359|0)<<6|OA>>>26)+WA|0)|~ue))+SA[15]-30611744|0)<<10|le>>>22)+OA|0)^((ue=((ue+=(OA^(le|~WA))+SA[6]-1560198380|0)<<15|ue>>>17)+le|0)|~OA))+SA[13]+1309151649|0)<<21|WA>>>11)+ue|0,WA=((WA+=((le=((le+=(WA^((OA=((OA+=(ue^(WA|~le))+SA[4]-145523070|0)<<6|OA>>>26)+WA|0)|~ue))+SA[11]-1120210379|0)<<10|le>>>22)+OA|0)^((ue=((ue+=(OA^(le|~WA))+SA[2]+718787259|0)<<15|ue>>>17)+le|0)|~OA))+SA[9]-343485551|0)<<21|WA>>>11)+ue|0,LA[0]=OA+LA[0]|0,LA[1]=WA+LA[1]|0,LA[2]=ue+LA[2]|0,LA[3]=le+LA[3]|0}function E(LA){var SA,OA=[];for(SA=0;SA<64;SA+=4)OA[SA>>2]=LA.charCodeAt(SA)+(LA.charCodeAt(SA+1)<<8)+(LA.charCodeAt(SA+2)<<16)+(LA.charCodeAt(SA+3)<<24);return OA}function m(LA){var SA,OA=[];for(SA=0;SA<64;SA+=4)OA[SA>>2]=LA[SA]+(LA[SA+1]<<8)+(LA[SA+2]<<16)+(LA[SA+3]<<24);return OA}function D(LA){var SA,OA,WA,ue,le,ki,Li=LA.length,Yt=[1732584193,-271733879,-1732584194,271733878];for(SA=64;SA<=Li;SA+=64)u(Yt,E(LA.substring(SA-64,SA)));for(OA=(LA=LA.substring(SA-64)).length,WA=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],SA=0;SA>2]|=LA.charCodeAt(SA)<<(SA%4<<3);if(WA[SA>>2]|=128<<(SA%4<<3),SA>55)for(u(Yt,WA),SA=0;SA<16;SA+=1)WA[SA]=0;return ue=(ue=8*Li).toString(16).match(/(.*?)(.{0,8})$/),le=parseInt(ue[2],16),ki=parseInt(ue[1],16)||0,WA[14]=le,WA[15]=ki,u(Yt,WA),Yt}function v(LA){var SA,OA,WA,ue,le,ki,Li=LA.length,Yt=[1732584193,-271733879,-1732584194,271733878];for(SA=64;SA<=Li;SA+=64)u(Yt,m(LA.subarray(SA-64,SA)));for(OA=(LA=SA-64>2]|=LA[SA]<<(SA%4<<3);if(WA[SA>>2]|=128<<(SA%4<<3),SA>55)for(u(Yt,WA),SA=0;SA<16;SA+=1)WA[SA]=0;return ue=(ue=8*Li).toString(16).match(/(.*?)(.{0,8})$/),le=parseInt(ue[2],16),ki=parseInt(ue[1],16)||0,WA[14]=le,WA[15]=ki,u(Yt,WA),Yt}function T(LA){var SA,OA="";for(SA=0;SA<4;SA+=1)OA+=g[LA>>8*SA+4&15]+g[LA>>8*SA&15];return OA}function P(LA){var SA;for(SA=0;SA"u"||ArrayBuffer.prototype.slice||function(){function LA(SA,OA){return(SA=0|SA||0)<0?Math.max(SA+OA,0):Math.min(SA,OA)}ArrayBuffer.prototype.slice=function(SA,OA){var WA,ue,le,ki,Li=this.byteLength,Yt=LA(SA,Li),Fi=Li;return OA!==r&&(Fi=LA(OA,Li)),Yt>Fi?new ArrayBuffer(0):(WA=Fi-Yt,ue=new ArrayBuffer(WA),le=new Uint8Array(ue),ki=new Uint8Array(this,Yt,WA),le.set(ki),ue)}}(),xA.prototype.append=function(LA){return this.appendBinary(W(LA)),this},xA.prototype.appendBinary=function(LA){this._buff+=LA,this._length+=LA.length;var SA,OA=this._buff.length;for(SA=64;SA<=OA;SA+=64)u(this._hash,E(this._buff.substring(SA-64,SA)));return this._buff=this._buff.substring(SA-64),this},xA.prototype.end=function(LA){var SA,OA,WA=this._buff,ue=WA.length,le=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(SA=0;SA>2]|=WA.charCodeAt(SA)<<(SA%4<<3);return this._finish(le,ue),OA=P(this._hash),LA&&(OA=kA(OA)),this.reset(),OA},xA.prototype.reset=function(){return this._buff="",this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},xA.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash.slice()}},xA.prototype.setState=function(LA){return this._buff=LA.buff,this._length=LA.length,this._hash=LA.hash,this},xA.prototype.destroy=function(){delete this._hash,delete this._buff,delete this._length},xA.prototype._finish=function(LA,SA){var OA,WA,ue,le=SA;if(LA[le>>2]|=128<<(le%4<<3),le>55)for(u(this._hash,LA),le=0;le<16;le+=1)LA[le]=0;OA=(OA=8*this._length).toString(16).match(/(.*?)(.{0,8})$/),WA=parseInt(OA[2],16),ue=parseInt(OA[1],16)||0,LA[14]=WA,LA[15]=ue,u(this._hash,LA)},xA.hash=function(LA,SA){return xA.hashBinary(W(LA),SA)},xA.hashBinary=function(LA,SA){var OA=P(D(LA));return SA?kA(OA):OA},xA.ArrayBuffer=function(){this.reset()},xA.ArrayBuffer.prototype.append=function(LA){var SA,OA=wA(this._buff.buffer,LA),WA=OA.length;for(this._length+=LA.byteLength,SA=64;SA<=WA;SA+=64)u(this._hash,m(OA.subarray(SA-64,SA)));return this._buff=SA-64>2]|=WA[SA]<<(SA%4<<3);return this._finish(le,ue),OA=P(this._hash),LA&&(OA=kA(OA)),this.reset(),OA},xA.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},xA.ArrayBuffer.prototype.getState=function(){var LA=xA.prototype.getState.call(this);return LA.buff=EA(LA.buff),LA},xA.ArrayBuffer.prototype.setState=function(LA){return LA.buff=oA(LA.buff,!0),xA.prototype.setState.call(this,LA)},xA.ArrayBuffer.prototype.destroy=xA.prototype.destroy,xA.ArrayBuffer.prototype._finish=xA.prototype._finish,xA.ArrayBuffer.hash=function(LA,SA){var OA=P(v(new Uint8Array(LA)));return SA?kA(OA):OA},xA}()}(Ku)),Ku.exports),SC=uI(ju),K=new class{constructor(){this.uploadFileTryCount=0,this.maxRetries=1,this.systemClockOffset=0,this.httpRequest=null,this.uploadFileType="",this.duration=900,this.fetchCosTryCount=0}init(n){var r;this._core=n;const{IN_MINI_APP:g}=n.utils;this.httpRequest=g?RI:Hu,(r=this.httpRequest)===null||r===void 0||r.init(n)}uploadToCOS(n){return mA(this,void 0,void 0,function*(){const r=`${fa} uploadToCOS`,{ssoLog:g,utils:{safeStringify:u}}=this._core,{file:E}=n;this.uploadFileType=n.uploadFileType,g.debug("uploadToCOS",`${r} options:${u(n)}`);try{const m=Date.now(),D=yield this._createCosOptions(n),v=D.fileExistsInCOS?{data:{location:D.downloadUrl}}:yield this._uploadFile(D);this._handleUploadError(v,n);const T=this._createUploadResult(E,v),P=Date.now()-m,W=function(EA){return EA<1024?`${EA}B`:EA<1048576?`${Math.floor(EA/1024)}KB`:`${Math.floor(EA/1048576)}MB`}(E.size),oA=`size:${W} time:${P}ms speed:${Nr(1e3*E.size/P)}`;return g.debug("uploadToCOS",`${r} ok. name:${E.name} ${oA}`),{uploadOptions:D,response:T}}catch(m){throw g.warn("uploadToCOS",`${r} failed, error:${u(m)}`),m}})}_handleUploadError(n,r){var g,u;const{ChatError:E}=(g=this._core)===null||g===void 0?void 0:g.helper;if(n.statusCode===403)throw r.url,!((u=n?.data)===null||u===void 0)&&u.uploadIP&&n.data.uploadIP,new E({message:"Upload failed with status 403"})}_createUploadResult(n,r){return{fileName:n.name,fileSize:n.size,fileType:n.type.slice(n.type.indexOf("/")+1).toLowerCase(),location:r.data.location||"",uploadTime:Pr(Date.now(),!1),uploadSpeed:Nr(1e3*n.size/Pr(Date.now(),!1))}}_createCosOptions(n){return mA(this,void 0,void 0,function*(){const{fileName:r,resources:g,uploadMethod:u}=yield this._prepareUploadParams(n),E=this._isC2CConversation(n.message.conversationID)?1:2;try{const m=yield this._fetchCosSignatureUrl({fileType:this.uploadFileType,fileName:r,uploadMethod:u,duration:this.duration,userID:n.message.from,conversationType:E}),{uploadUrl:D,downloadUrl:v,requestSnapshotUrl:T,thumbUrl:P,largeUrl:W,fileKey:oA,existFlag:EA}=m,wA=!Vt.isPrivateNetWork()&&m.uploadIP;return{url:this._getRawOrUploadProxyUrl(D),fileType:this.uploadFileType,fileName:r,resources:g,downloadUrl:v,requestSnapshotUrl:T,thumbUrl:P,largeUrl:W,fileKey:oA,uploadIP:wA||"",fileExistsInCOS:EA===1,onProgress:kA=>this._handleUploadProgress(kA,n)}}catch(m){throw console.error("Failed to create COS pre-signed URL options:",m),m}})}_prepareUploadParams(n){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g,isEmpty:u}}=this._core;r.debug("_prepareUploadParams",` prepareUploadParams:${g(n)}`);const{file:E}=n,{IN_MINI_APP:m,IN_RN_APP:D}=Vt.getPlatformFlags(),v=m||D,T=v&&n.message.type!==qa,{name:P}=E,W=P.slice(P.lastIndexOf(".")),oA=`${Or(999999)}${W}`,EA=T?E.name:oA,wA=yield this._generateHashFileName(E);return{fileName:u(wA)?Eg(EA):`${wA}${W}`,resources:v?E.url:E,uploadMethod:v?1:0}})}_generateHashFileName(n){return mA(this,void 0,void 0,function*(){const{utils:{IN_MINI_APP:r,IN_BROWSER:g,IN_UNI_NATIVE_APP:u,isArray:E},ssoLog:m}=this._core,D=Date.now();let v="";return g&&(v=yield this._generateHashFileNameInWeb(n)),r&&(E(n.tempFiles)&&(n=n.tempFiles[0]),u||(v=yield this._generateFileNameInMiniProgram(n)),u&&(v=yield this._generateFileNameInUNINativeApp(n))),m.info("_generateHashFileName",`hashFileName:${v} costTime:${Date.now()-D}`),v})}_generateHashFileNameInWeb(n){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g}}=this._core;let u="";try{u=yield new Promise((E,m)=>{const D=File.prototype.slice||File.prototype.mozSlice||File.prototype.webkitSlice;D||(r.warn("_generateHashFileNameInWeb","Browser does not support file slicing"),E(""));const v=10485760,T=Math.ceil(n.size/v);let P=0;const W=new SC.ArrayBuffer,oA=new FileReader,EA=setTimeout(()=>{oA.abort(),r.warn("_generateHashFileNameInWeb","File hash generation timeout"),E("")},2e3);function wA(){const kA=P*v,xA=kA+v>=n.size?n.size:kA+v;oA.readAsArrayBuffer(D.call(n,kA,xA))}oA.onload=kA=>{r.debug("_generateHashFileNameInWeb",`read chunk nr ${P+1} of ${T}`),W.append(kA.target.result),P++,P{clearTimeout(EA),m(kA)},wA()})}catch(E){r.warn("_generateHashFileNameInWeb",g(E))}return u})}_generateFileNameInMiniProgram(n){return mA(this,void 0,void 0,function*(){const{utils:{MINI_APP_NAMESPACE:r,safeStringify:g,isEmpty:u},ssoLog:E}=this._core;let m="";if(u(n.url))return E.warn("_generateFileNameInMiniProgram","file.url is empty"),m;if(typeof r?.getFileSystemManager!="function")return E.warn("_generateFileNameInUNINativeApp","getFileSystemManager is not a function"),m;try{m=yield new Promise((D,v)=>{r.getFileSystemManager().getFileInfo({filePath:n.url,success:T=>{D(T.digest)},fail:T=>{v(T)}})})}catch(D){E.warn("_generateFileNameInMiniProgram",g(D))}return m})}_generateFileNameInUNINativeApp(n){return mA(this,void 0,void 0,function*(){var r;const{utils:{safeStringify:g,isEmpty:u},ssoLog:E}=this._core;let m="";if(u(n.url))return E.warn("_generateFileNameInUNINativeApp","file.url is empty"),m;if(typeof((r=plus==null?void 0:plus.io)===null||r===void 0?void 0:r.getFileInfo)!="function")return E.warn("_generateFileNameInUNINativeApp","plus.io.getFileInfo is not a function"),m;try{m=yield new Promise((D,v)=>{plus.io.getFileInfo({filePath:n.url,success:T=>{D(T.digest)},fail:T=>{v(T)}})})}catch(D){E.warn("_generateFileNameInMiniProgram",g(D))}return m})}_handleUploadProgress(n,r){if(typeof r.onProgress=="function")try{r.onProgress(n.percent)}catch(g){throw console.warn("Upload progress callback error:",g),g}}_fetchCosSignatureUrl(n){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g}}=this._core,u=Vt.isSimpleCos(),E=this._prepareCosRequestData(n),m=u?"im_cos_msg.simple_sig":"im_cos_msg.pre_sig";try{const D=yield function(T,P,W){return mA(this,void 0,void 0,function*(){try{const{helper:oA,channel:EA}=W,wA=oA.generateCosSpecifiedData({servcmd:T,data:P}),kA=`${wA.head.seq}${T}`;return yield EA.sendPacket(wA,{requestId:kA})}catch(oA){throw console.warn("getCosSig error:",oA),oA}})}(m,E,this._core);this.fetchCosTryCount=0;const v=this._processResponse(D);return r.debug("_fetchCosSignatureUrl",` ok. isSimpleCos:${u} data:${g(v)}`),v||{}}catch(D){if(this.fetchCosTryCount<1)return this.fetchCosTryCount++,this._fetchCosSignatureUrl(n);throw this.fetchCosTryCount=0,D}})}_processResponse(n){var r;const g=Vt.isSimpleCos(),u=g?(r=n?.rpt_pre_sig)===null||r===void 0?void 0:r[0]:n;if(!u)return{};if(g){const{str_final_ip:W,rpt_pre_sig:oA,uint32_file_id:EA,uint32_exist_flag:wA,str_download_url:kA,str_upload_url:xA,str_snapshot_url:LA,str_file_key:SA}=u;return{uploadIP:W,preSig:oA,fileID:EA,existFlag:wA,downloadUrl:kA,uploadUrl:xA,requestSnapshotUrl:LA,fileKey:SA}}const{upload_url:E,download_url:m,snapshot_url:D,thumb_url:v,large_url:T,file_key:P}=u;return{uploadUrl:E,downloadUrl:m,requestSnapshotUrl:D,thumbUrl:v,largeUrl:T,fileKey:P}}_prepareCosRequestData(n){return Vt.isSimpleCos()?{uint32_upload_method:n.uploadMethod,uint32_platform:Vt.getPlatform(),uint32_sdkappid:Vt.getSDKAppID(),str_user_id:n.userID,uint32_scene:n.conversationType,rpt_upload_object:[{uint32_file_id:1,uint32_file_type:n.fileType,str_file_name:n.fileName}]}:{file_type:n.fileType,file_name:n.fileName,upload_method:n.uploadMethod,Duration:n.duration}}_uploadFile(n){return mA(this,void 0,void 0,function*(){return new Promise((r,g)=>{this.httpRequest.request(n,(u,E)=>{u&&this.uploadFileTryCount=3e4}_syncSystemClock(n){var r,g,u;const E=((r=n.headers)===null||r===void 0?void 0:r.date)||((g=n.headers)===null||g===void 0?void 0:g.Date)||((u=n.error)===null||u===void 0?void 0:u.ServerTime);if(E){const m=Date.now(),D=Date.parse(E);this.systemClockOffset=D-m}}_getRawOrUploadProxyUrl(n){const r=Vt.getFileUploadProxy();let g=n;return r&&(g=n.replace(/^https:\/\/[^/]+/,r)),g}_isC2CConversation(n){return n.slice(0,3)==="C2C"}};const U=2108,sA=2251,b=2252,x=2253,iA=["jpg","jpeg","gif","png","bmp","image","webp"],uA={JPG:1,JPEG:1,GIF:2,PNG:3,BMP:4,UNKNOWN:255},_A=1,te=2;class fe{constructor(r,g){this.instanceID=Or(9999999),this.sizeType=r.type||0,this.type=0,this.size=r.size||0,this.width=r.width||0,this.height=r.height||0,this.imageUrl=Vt.addAuthToUrl(r.imageUrl||r.url||""),this.url=Vt.addAuthToUrl(r.url||g)}setSizeType(r){this.sizeType=r}setType(r){this.type=r}setImageUrl(r){r&&(this.imageUrl=Vt.addAuthToUrl(r))}getImageUrl(){return this.imageUrl}}function p(n){const{originUrl:r,originWidth:g,originHeight:u,min:E=198}=n,m=parseInt(g)||0,D=parseInt(u)||0,v={url:void 0,width:0,height:0};if((m<=D?m:D)<=E)v.url=r,v.width=m,v.height=D;else{D<=m?(v.width=Math.ceil(m*E/D),v.height=E):(v.width=E,v.height=Math.ceil(D*E/m));const T=r&&r.indexOf("?")>-1?`${r}&`:`${r}?`;v.url=E===198?`${T}imageView2/3/w/198/h/198`:`${T}imageView2/3/w/720/h/720`}if(r===void 0){const{url:T}=v;return vo(v,["url"])}return v}class B{constructor(r){this._imageMemoryURL="",this._percent=0,this.type=rc;const{uuid:g,file:u,imageFormat:E,imageInfoArray:m=[],isCustomUpload:D=!1}=r;this._imageMemoryURL=this.createImageDataAsURL(u),this.content={imageFormat:E,uuid:g,imageInfoArray:[]},this[jr]=D,this.initImageInfoArray(m),this.autoFixUrl()}static parseServerPushElement(r){const{MsgContent:g}=r,{ImageFormat:u,ImageInfoArray:E,UUID:m}=g,D=function(v){return v.map(T=>({size:T.Size,type:T.Type,width:T.Width,height:T.Height,url:T.URL}))}(E);return new B({imageFormat:u,imageInfoArray:D,uuid:m})}createImageDataAsURL(r){let g="";const{IN_MINI_APP:u,IN_RN_APP:E,IN_BROWSER:m}=Vt.getPlatformFlags();return r&&((u||E)&&(g=r.url),m&&(g=window.URL.createObjectURL(r))),g}initImageInfoArray(r=[]){const g={type:0,size:0,width:0,height:0,url:""};for(let u=0;u<3;u++){const E=r[u]||Object.assign({},g),m=new fe(E,this._imageMemoryURL);m.setSizeType(u+1),m.setType(u),this.addImageInfo(m)}this.updateAccessSideImageInfoArray()}autoFixUrl(){const r=["http","https"];this.content.imageInfoArray.forEach(g=>{if(!g.url||g.imageUrl==="")return;const[u,...E]=g.imageUrl.split("://"),m=E.join("://");r.includes(u)||g.setImageUrl(`https://${m}`)})}updatePercent(r){this._percent=Math.min(r,1)}updateImageFormat(r){this.content.imageFormat=uA[r.toUpperCase()]||uA.UNKNOWN}addImageInfo(r){this.content.imageInfoArray.length>=3||this.content.imageInfoArray.push(r)}updateImageInfoArray(r){const g=this.content.imageInfoArray.length;let u;for(let E=0;E({InstanceId:g.instanceID,Type:g.sizeType,MsgType:g.type,Size:g.size,Width:g.width,Height:g.height,URL:Vt.removeAuthToUrl(g.imageUrl)}))}}const M=new class{init(n){this.core=n}},G={[ru]:"i",[Cl]:"a",[ya]:"v",[xE]:"f"};let O=null,z=null;function X(n){var r;const{store:g,utils:{isNumber:u,safeStringify:E},ssoLog:m}=M.core;try{const D=((r=g.get("cloudConfig"))===null||r===void 0?void 0:r.upload_size_limit)||"";D!==z&&(z=D,O=JSON.parse(D)||{});const v=O?.[G[n]];if(u(v))return 1024*v*1024}catch(D){m.debug("getCloudControlUploadSizeLimit",E(D))}return null}var rA=new class{constructor(){this._messageOptionsMap=new Map}init(n){var r;this._core=n;const{notificationCenter:g,helper:u,InnerEvent:E,message:m}=n;u.registerApi({apiName:"createImageMessage",context:this}),u.registerExperimentalAPI("createImageMessage",this,"createCustomUploadImageMessage"),(r=m?.messageFactory)===null||r===void 0||r.registerElementClass(rc,B),g.subscribeInnerEvent(E.DESTROY,this._dispose,this)}createImageMessage(n){var r,g,u;try{const E=(r=this._core.store.get("login"))===null||r===void 0?void 0:r.userId,m=(u=(g=this._core)===null||g===void 0?void 0:g.message.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},n),{from:E})),D=this._processImage(n);n.payload.file=D;const v={imageFormat:uA.UNKNOWN,uuid:Vt.generateUUID(D),file:D,imageInfoArray:[]},T=new B(v);return m.setElement(T),this._messageOptionsMap.set(m.clientSequence,n),m}catch(E){throw E}}createCustomUploadImageMessage(n){var r,g,u,E;const{store:m,utils:{isEmpty:D}}=this._core,v=(r=m.get("login"))===null||r===void 0?void 0:r.userId,T=(u=(g=this._core)===null||g===void 0?void 0:g.message.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},n),{from:v})),{largeImageUuid:P,largeFileSize:W,largeImageWidth:oA,largeImageHeight:EA,largeImageUrl:wA,originImageUuid:kA,originFileSize:xA,originImageWidth:LA,originImageHeight:SA,originImageUrl:OA,thumbImageUuid:WA,thumbFileSize:ue,thumbImageWidth:le,thumbImageHeight:ki,thumbImageUrl:Li}=((E=n?.payload)===null||E===void 0?void 0:E.file)||{};if(D(OA)||D(kA))throw new Error("createImageMessageExperimental originImageUrl or originImageUuid is empty");const Yt=new B({imageFormat:uA.UNKNOWN,uuid:kA,imageInfoArray:[{instanceID:kA,size:xA,width:LA,height:SA,imageUrl:OA,url:OA},{instanceID:P,size:W,width:oA,height:EA,imageUrl:wA,url:wA},{instanceID:WA,size:ue,width:le,height:ki,imageUrl:Li,url:Li}],isCustomUpload:!0});return T.setElement(Yt),this._messageOptionsMap.set(T.clientSequence,n),T._skipUpload=!0,T}upload(n){return mA(this,void 0,void 0,function*(){const r=n.getElements()[0],{file:g}=this._messageOptionsMap.get(n.clientSequence).payload;this._validateBeforeUploadImage(g);const u=yield this._performImageUpload(r,n,g),E=this._generateImageInfo(u);return r.updateImageFormat(u?.fileType),r.updateImageInfoArray(E),this._updateImageType(r.content.imageInfoArray),n})}_performImageUpload(n,r,g){return mA(this,void 0,void 0,function*(){const{to:u}=r,E={uploadFileType:ru,file:g,to:u,message:r,onProgress:v=>{var T,P;n.updatePercent(v),(P=(T=this._messageOptionsMap.get(r.clientSequence))===null||T===void 0?void 0:T.onProgress)===null||P===void 0||P.call(T,v)}},{uploadOptions:m,response:D}=yield K.uploadToCOS(E);return this._parseResponse(m,D)})}_generateImageInfo(n){const{location:r,fileSize:g,width:u,height:E,smallImageUrl:m,smallImageWidth:D,smallImageHeight:v,largeImageUrl:T,largeImageWidth:P,largeImageHeight:W,imageInfoArray:oA}=n,EA=Vt.addAuthToUrl(r),wA={size:g,url:EA,width:u,height:E};return oA?.length>0?this._processImageInfoArray(oA,g):m&&T?[Object.assign({},wA),{largeImageUrl:T,largeImageWidth:P,largeImageHeight:W},{smallImageUrl:m,smallImageWidth:D,smallImageHeight:v}]:[Object.assign({},wA),this._generateThumbInfo(EA,u,E,720),this._generateThumbInfo(EA,u,E,198)]}_generateThumbInfo(n,r,g,u){return p({originUrl:n,originWidth:r,originHeight:g,min:u})}_processImageInfoArray(n,r){let g,u,E;for(const m of n)m.type===1?(u=m,u.size=r):m.type===2?(E=m,E.size=r):(g=m,g.size=r);return[Object.assign({},g),Object.assign({},E),Object.assign({},u)]}_parseResponse(n,r){return mA(this,void 0,void 0,function*(){try{const{thumbUrl:g,largeUrl:u,downloadUrl:E}=n;if(g&&u&&(yield this._getImageInfoByUrl(g,r,"thumb"),yield this._getImageInfoByUrl(u,r,"large")),Vt.isSimpleCos()&&!Vt.isPrivateNetWork()&&(yield this._getImageInfoArray(E,r),r?.uploadIP)){const m=this._extractDomainFromUrl(E);m&&(yield this._getDownloadIP(m,r))}return r}catch(g){throw g}})}_extractDomainFromUrl(n){var r;try{const g=n.match(/:\/\/([^\/]+)/);return g?g[1]:null}catch(g){return(r=this._core)===null||r===void 0||r.ssoLog.warn("_extractDomainFromUrl",`Failed to extract domain from URL:${g.message}`),null}}_getImageInfoByUrl(n,r,g){return mA(this,void 0,void 0,function*(){var u;try{const E=Vt.addAuthToUrl(n),{width:m=0,height:D=0}=yield Vt.probeImageWidthHeight(E);r.width=m,r.height=D,g==="thumb"?(r.smallImageUrl=n,r.smallImageWidth=m,r.smallImageHeight=D):(r.largeImageUrl=n,r.largeImageWidth=m,r.largeImageHeight=D)}catch(E){(u=this._core)===null||u===void 0||u.ssoLog.warn("_getImageInfoByUrl",`Failed to get ${g} image info:${E.message}`)}})}_validateBeforeUploadImage(n){var r;const{ChatError:g}=(r=this._core)===null||r===void 0?void 0:r.helper;if(!n)throw new g({code:sA});this._checkImageType(n),this._checkImageSize(n)}_processImage(n){var r;try{const{IN_MINI_APP:g}=(r=this._core)===null||r===void 0?void 0:r.utils;let{file:u}=n.payload;return u=g?this._processMiniAppImageFile(u):this._processWebImageFile(u),u}catch(g){throw g}}_processMiniAppImageFile(n){dl(n)&&console.warn("FileUnsupportedInMiniApp","createImageMessage");const r=n.tempFiles[0].path||n.tempFiles[0].tempFilePath;return{url:r,name:r.slice(r.lastIndexOf("/")+1),size:n.tempFiles&&n.tempFiles[0].size||1,type:r.slice(r.lastIndexOf(".")+1).toLowerCase()}}_processWebImageFile(n){var r;const{ChatError:g}=(r=this._core)===null||r===void 0?void 0:r.helper,u=Vt.extractFileFromInput(n);if(!u)throw new g({message:"Invalid file. Pass either `e.target` (from file input) or a File object"});return u}_getDownloadIP(n,r){return mA(this,void 0,void 0,function*(){const g=`${fa} getDownloadIP domainName: ${n}`;try{const u=yield function(m,D){return mA(this,void 0,void 0,function*(){try{const{helper:v,channel:T}=D,P="im_cos_msg.get_final_ip",W={str_domain:m},oA=v.generateProtocolData({servcmd:P,data:W}),EA=`${oA.head.seq}${P}`;return yield T.sendPacket(oA,{requestId:EA})}catch(v){throw console.warn("getFinalIP error:",v),v}})}(n,this._core);if(!u||!u.str_final_ip)return;console.log(`${g} ok. downloadIP:${u}`);const E=r.location.split("/");E[0]=u.str_final_ip,r.location=E.join("/")}catch(u){console.warn(u)}})}_getImageInfoArray(n,r){return mA(this,void 0,void 0,function*(){try{const g=yield function(u,E){return mA(this,void 0,void 0,function*(){try{const{helper:m,channel:D}=E,v="im_cos_msg.get_imageinfo",T={str_image_url:u},P=m.generateProtocolData({servcmd:v,data:T}),W=`${P.head.seq}${v}`;return yield D.sendPacket(P,{requestId:W})}catch(m){throw console.warn("getImageInfo error:",m),m}})}(n,this._core);return r.imageInfoArray=this._processImageInfoResponse(g),r}catch(g){throw r.imageInfoArray=void 0,g}})}_processImageInfoResponse(n){if(!n)return[];const{rpt_msg_image_info:r}=n;return r.map(g=>({type:g.uint32_image_type,url:g.str_url,width:g.uint32_width,height:g.uint32_height,imageFormat:g.str_image_format}))}_checkImageType(n){const{utils:r,helper:g}=this._core;let u="";if(r.IN_MINI_APP&&(u=n.url.slice(n.url.lastIndexOf(".")+1)),r.IN_BROWSER&&(u=n.name.slice(n.name.lastIndexOf(".")+1)),iA.indexOf(u.toLowerCase())<0)throw new g.ChatError({code:b})}_checkImageSize(n){const{utils:r,helper:g,store:u}=this._core;let E=0;if(E=(r.IN_MINI_APP,n.size),E===0)throw new g.ChatError({code:U});if(E>=(X(ru)||20971520))throw new g.ChatError({code:x})}_updateImageType(n){n[1].type=te,n[2].type=_A}_reset(){this._messageOptionsMap.clear()}_dispose(){this._reset();const{notificationCenter:n,InnerEvent:r}=this._core;n.unSubscribeInnerEvent(r.DESTROY,this._dispose,this)}};const DA=2108,GA=2401,JA=2402,se="2.5.0",he="1.18.0";function Xe(n,r){const g=n.split("."),u=r.split("."),E=Math.max(g.length,u.length);for(;g.lengthv)return 1;if(D0;return{isValid:r,error:r?null:{message:"content can not be empty"}}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{uuid:E,downloadFlag:m,fileUrl:D,fileName:v,fileSize:T}=u;return{MsgType:this.type,MsgContent:{Download_Flag:m,Url:Vt.removeAuthToUrl(D),FileName:v,FileSize:T,UUID:E}}}_getFileInfo(r){const{utils:{IN_UNI_NATIVE_APP:g}}=M.core;if(r.fileName&&r.fileSize)return{size:r.fileSize,name:r.fileName};const{file:u}=r;return u?(g&&this._processNativeAppFile(u),{size:u.size,name:u.name}):{size:0,name:""}}_processNativeAppFile(r){if(r.path&&r.path.includes(".")){const g=r.path.slice(r.path.lastIndexOf(".")+1).toLowerCase();r.type=g,r.name||(r.name=`${Or(999999)}.${g}`)}r.name||(r.type="",r.name=r.path.slice(r.path.lastIndexOf("/")+1).toLowerCase()),r.suffix&&(r.type=r.suffix),r.url||(r.url=r.path)}}ct=jr;var xt=new class{constructor(){this._messageOptionsMap=new Map}init(n){var r;this._core=n;const{notificationCenter:g,helper:u,InnerEvent:E,message:m}=n;u.registerApi({apiName:"createFileMessage",context:this}),u.registerExperimentalAPI("createFileMessage",this,"createCustomUploadFileMessage"),(r=m?.messageFactory)===null||r===void 0||r.registerElementClass(qa,ut),g.subscribeInnerEvent(E.DESTROY,this._dispose,this)}createFileMessage(n){var r,g,u;try{this._checkVersion();const E=this._processFile(n.payload.file);n.payload.file=E;const m=(r=this._core.store.get("login"))===null||r===void 0?void 0:r.userId,D=(u=(g=this._core)===null||g===void 0?void 0:g.message.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},n),{from:m})),v={uuid:Vt.generateUUID(E),file:E},T=new ut(v);return D.setElement(T),this._messageOptionsMap.set(D.clientSequence,n),D}catch(E){throw E}}createCustomUploadFileMessage(n){var r,g,u;try{const{store:E,message:m,utils:{isEmpty:D}}=this._core,v=(r=E.get("login"))===null||r===void 0?void 0:r.userId,{url:T,uuid:P,fileSize:W,fileName:oA=""}=((g=n?.payload)===null||g===void 0?void 0:g.file)||{};if(D(T))throw new Error("url is required");const EA=(u=m.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},n),{from:v})),wA=new ut({url:T,uuid:P,file:{size:W,name:oA},isCustomUpload:!0});return EA.setElement(wA),EA}catch(E){throw E}}upload(n){return mA(this,void 0,void 0,function*(){const{file:r}=this._messageOptionsMap.get(n.clientSequence).payload;this._validateBeforeUploadFile(r);const g=n.getElements()[0],u=yield this._performFileUpload(g,n,r),E=Vt.addAuthToUrl(u?.location);return g.updateFileUrl(E),n})}_validateBeforeUploadFile(n){const{helper:{ChatError:r}}=this._core;if(!n)throw new r({code:GA});const g=X(xE)||104857600;if(n.size>g)throw new r({code:JA});if(n.size===0)throw new r({code:DA})}_performFileUpload(n,r,g){return mA(this,void 0,void 0,function*(){const{to:u}=r,E={uploadFileType:xE,file:g,to:u,message:r,onProgress:D=>{var v,T;n.updatePercent(D),(T=(v=this._messageOptionsMap.get(r.clientSequence))===null||v===void 0?void 0:v.onProgress)===null||T===void 0||T.call(v,D)}},{response:m}=yield K.uploadToCOS(E);return m})}_processFile(n){var r,g;const{IN_BROWSER:u,IN_RN_APP:E,IN_WX_MINI_APP:m,IN_QQ_MINI_APP:D,IN_UNI_NATIVE_APP:v}=(r=this._core)===null||r===void 0?void 0:r.utils,{ChatError:T}=(g=this._core)===null||g===void 0?void 0:g.helper;if(u||v){const P=Vt.extractFileFromInput(n);if(!P)throw new T({message:"Invalid file. Pass either `e.target` (from file input) or a File object"});return P}if(m||D){const{tempFiles:P}=n;return Object.assign(Object.assign({},P[0]),{url:P[0].path})}return E?Object.assign(Object.assign({},n),{url:n.uri}):n}_checkVersion(){var n,r;const{MINI_APP_NAMESPACE:g,IN_MINI_APP:u,IN_WX_MINI_APP:E,IN_QQ_MINI_APP:m,IN_UNI_NATIVE_APP:D}=(n=this._core)===null||n===void 0?void 0:n.utils,{ChatError:v}=(r=this._core)===null||r===void 0?void 0:r.helper;if(u){if(!(E||m||D))throw new v({message:"Unsupported mini app environment"});const T=g.getSystemInfoSync().SDKVersion;if(E&&Xe(T,se)<0)throw new v({message:`WXChooseMessageFile requires SDK version ${se} or higher`});if(m&&Xe(T,he)<0)throw new v({message:`QQChooseMessageFile requires SDK version ${he} or higher`})}}_reset(){this._messageOptionsMap.clear()}_dispose(){this._reset();const{notificationCenter:n,InnerEvent:r}=this._core;n.unSubscribeInnerEvent(r.DESTROY,this._dispose,this)}};const Wt=2108,Ki=2351,Eo=2352,no=["mp4","quicktime","mov","video"];var hi;class qo{constructor(r){this.type=Vl,this.uploadProgress=0,this[hi]=!1;const g=typeof r?.videoSecond=="number"?r?.videoSecond:0;this[jr]=r.isCustomUpload||!1,this.content={remoteVideoUrl:Vt.addAuthToUrl(r.remoteVideoUrl||r.videoUrl||""),videoFormat:r.videoFormat,videoSecond:parseInt(g?.toString(),10),videoSize:r.videoSize,videoUrl:Vt.addAuthToUrl(r.videoUrl),videoDownloadFlag:2,videoUUID:r.videoUUID,thumbUUID:r.thumbUUID,thumbFormat:r.thumbFormat,thumbWidth:r.thumbWidth,snapshotWidth:r.thumbWidth,thumbHeight:r.thumbHeight,snapshotHeight:r.thumbHeight,thumbSize:r.thumbSize,snapshotSize:r.thumbSize,thumbDownloadFlag:2,thumbUrl:Vt.addAuthToUrl(r.thumbUrl),snapshotUrl:Vt.addAuthToUrl(r.thumbUrl)}}static parseServerPushElement(r){const{MsgContent:g}=r,{VideoUrl:u,VideoFormat:E,VideoSecond:m,VideoSize:D,VideoDownloadFlag:v,VideoUUID:T,ThumbUUID:P,ThumbFormat:W,ThumbWidth:oA,SnapshotWidth:EA,ThumbHeight:wA,SnapshotHeight:kA,ThumbSize:xA,SnapshotSize:LA,ThumbDownloadFlag:SA,ThumbUrl:OA,SnapshotUrl:WA}=g;return new qo({videoUrl:u,videoFormat:E,videoSecond:m,videoSize:D,videoDownloadFlag:v,videoUUID:T,thumbUUID:P,thumbFormat:W,thumbWidth:oA,snapshotWidth:EA,thumbHeight:wA,snapshotHeight:kA,thumbSize:xA,snapshotSize:LA,thumbDownloadFlag:SA,thumbUrl:OA,snapshotUrl:WA})}updatePercent(r){this.uploadProgress=Math.min(r,1)}updateVideoUrl(r){r&&(this.content.remoteVideoUrl=r)}updateSnapshotInfo(r){const{snapshotUrl:g,snapshotWidth:u,snapshotHeight:E}=r;Vt.isEmpty(g)||(this.content.thumbUrl=this.content.snapshotUrl=g),Vt.isEmpty(u)||(this.content.thumbWidth=this.content.snapshotWidth=Number(u)),Vt.isEmpty(E)||(this.content.thumbHeight=this.content.snapshotHeight=Number(E))}validateBeforeSend(){if(this[jr])return{isValid:!0};const r=this.content.remoteVideoUrl!=="";return{isValid:r,error:r?null:{message:"content can not be empty"}}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{remoteVideoUrl:E,videoFormat:m,videoSecond:D,videoSize:v,videoDownloadFlag:T,videoUUID:P,thumbUUID:W,thumbFormat:oA,thumbWidth:EA,snapshotWidth:wA,thumbHeight:kA,snapshotHeight:xA,thumbSize:LA,snapshotSize:SA,thumbDownloadFlag:OA,thumbUrl:WA,snapshotUrl:ue}=u;return{MsgType:this.type,MsgContent:{VideoUrl:Vt.removeAuthToUrl(E),VideoFormat:m,VideoSecond:D,VideoSize:v,VideoDownloadFlag:T,VideoUUID:P,ThumbUUID:W,ThumbFormat:oA,ThumbWidth:EA,SnapshotWidth:wA,ThumbHeight:kA,SnapshotHeight:xA,ThumbSize:LA,SnapshotSize:SA,ThumbDownloadFlag:OA,ThumbUrl:Vt.removeAuthToUrl(WA),SnapshotUrl:Vt.removeAuthToUrl(ue)}}}}hi=jr;var gs,yi=new class{constructor(){this._messageOptionsMap=new Map}init(n){var r;this._core=n;const{notificationCenter:g,helper:u,InnerEvent:E,message:m}=n;u.registerApi({apiName:"createVideoMessage",context:this}),u.registerExperimentalAPI("createVideoMessage",this,"createCustomUploadVideoMessage"),(r=m?.messageFactory)===null||r===void 0||r.registerElementClass(Vl,qo),g.subscribeInnerEvent(E.DESTROY,this._dispose,this)}createVideoMessage(n){var r,g,u;try{const E=this._processVideo(n);n.payload.file=E;const m=(r=this._core.store.get("login"))===null||r===void 0?void 0:r.userId,D=(u=(g=this._core)===null||g===void 0?void 0:g.message.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},n),{from:m})),v={videoFormat:E.videoFile.type,videoSecond:hr(E.videoFile.second,0),videoSize:E.videoFile.size,remoteVideoUrl:"",videoUrl:E.videoFile.url,videoUUID:Vt.generateUUID(E.videoFile),thumbUUID:Vt.generateUUID(E.videoFile,"jpg"),thumbWidth:E.width||200,thumbHeight:E.height||200,thumbUrl:E.thumbUrl,thumbSize:E.thumbSize,thumbFormat:"jpg"},T=new qo(v);return D.setElement(T),this._messageOptionsMap.set(D.clientSequence,n),D}catch(E){throw E}}createCustomUploadVideoMessage(n){var r,g,u;try{const{store:E,message:m}=this._core;this._validateCustomUploadVideoMessage(n);const D=(r=E.get("login"))===null||r===void 0?void 0:r.userId,{videoUrl:v,videoUuid:T,duration:P,snapshotUrl:W,snapshotUuid:oA,videoFileSize:EA,videoType:wA,snapshotWidth:kA,snapshotHeight:xA,snapshotFileSize:LA,snapshotType:SA="jpg"}=((g=n?.payload)===null||g===void 0?void 0:g.file)||{},OA=(u=m.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},n),{from:D})),WA=new qo({videoFormat:wA,videoSecond:P||0,videoSize:EA,remoteVideoUrl:v,videoUrl:v,videoUUID:T,thumbUUID:oA,thumbWidth:kA||200,thumbHeight:xA||200,thumbUrl:W,thumbSize:LA,thumbFormat:SA,isCustomUpload:!0});return OA.setElement(WA),this._messageOptionsMap.set(OA.clientSequence,n),OA}catch(E){throw E}}upload(n){return mA(this,void 0,void 0,function*(){const r=n.getElements()[0],{file:g}=this._messageOptionsMap.get(n.clientSequence).payload;this._validateBeforeUploadVideo(g);const u=yield this._performVideoUpload(r,n,g),{location:E,snapshotInfo:m}=u,D=Vt.addAuthToUrl(E);return r.updateVideoUrl(D),Vt.isEmpty(m)||r.updateSnapshotInfo(m),n})}_validateBeforeUploadVideo(n){const{helper:{ChatError:r}}=this._core,g=X(ya)||104857600;if(n.videoFile.size>g)throw new r({code:Ki});if(n.videoFile.size===0)throw new r({code:Wt});if(no.indexOf(n.videoFile.type)===-1)throw new r({code:Eo})}_validateCustomUploadVideoMessage(n){var r;const{utils:{isEmpty:g,isNumber:u}}=this._core,{videoUrl:E,videoUuid:m,duration:D,snapshotUrl:v,snapshotUuid:T}=((r=n?.payload)===null||r===void 0?void 0:r.file)||{};if(g(E)||g(m)||!u(D)||g(v)||g(T))throw new Error("Invalid video message options: missing required fields (videoUrl, videoUuid, duration, snapshotUrl, snapshotUuid)")}_performVideoUpload(n,r,g){return mA(this,void 0,void 0,function*(){const{to:u}=r,E={uploadFileType:ya,file:g,to:u,message:r,onProgress:v=>{var T,P;n.updatePercent(v),(P=(T=this._messageOptionsMap.get(r.clientSequence))===null||T===void 0?void 0:T.onProgress)===null||P===void 0||P.call(T,v)}},{response:m,uploadOptions:D}=yield K.uploadToCOS(E);return{snapshotInfo:yield this._getSnapshotInfoByUrl(D.requestSnapshotUrl),location:m.location}})}_processVideo(n){var r,g;try{const{ChatError:u}=(r=this._core)===null||r===void 0?void 0:r.helper,{IN_MINI_APP:E,IN_BROWSER:m}=(g=this._core)===null||g===void 0?void 0:g.utils;let{file:D}=n.payload,v={};if(E&&(v=this._processMiniVideoFile(D),D.name=v.name,D.url=v.url,D.type=v.type),m){const T=Vt.extractFileFromInput(D);if(!T)throw new u({message:"Invalid file. Pass either `e.target` (from file input) or a File object"});D=T,v=this._processWebVideoFile(D)}return D.videoFile=v,D.thumbUrl="",D.thumbSize=0,D}catch(u){throw console.warn(`${fa} _processFile error:`,u),u}}_processMiniVideoFile(n){const{utils:{IN_UNI_NATIVE_APP:r},helper:{ChatError:g}}=this._core;if(dl(n))throw new g({message:"FileUnsupportedInMiniApp"});Array.isArray(n.tempFiles)&&(n=n.tempFiles[0]);let u=n.tempFilePath.slice(n.tempFilePath.lastIndexOf(".")+1).toLowerCase();return r&&(u=n.fileType||u),{url:n.tempFilePath,name:n.tempFilePath.slice(n.tempFilePath.lastIndexOf("/")+1),size:n.size||1,second:n.duration||0,type:u}}_processWebVideoFile(n){const{name:r,size:g=1,duration:u=0,type:E}=n,m=E.split("/")[1];return{url:window.URL.createObjectURL(n),name:r,size:g,second:u,type:m}}_getSnapshotInfoByUrl(n){return mA(this,void 0,void 0,function*(){const{ssoLog:r}=this._core;try{r.debug("_getSnapshotInfoByUrl",`${fa} _getSnapshotInfoByUrl url:${n}`);const g={version:1,platform:Vt.getPlatform(),cover_name:Eg(Or(99999)),snapshot_url:n},u=yield function(T,P){return mA(this,void 0,void 0,function*(){try{const W="im_cos_msg.video_cover",{helper:oA,channel:EA}=P,wA=oA.generateCosSpecifiedData({servcmd:W,data:T}),kA=`${wA.head.seq}${W}`;return yield EA.sendPacket(wA,{requestId:kA})}catch(W){throw console.warn("getSnapshotInfo error:",W),W}})}(g,this._core),{download_url:E}=u||{};if(r.debug("_getSnapshotInfoByUrl",`${fa} _getSnapshotInfoByUrl OK snapshotUrl:${E}`),Vt.isEmpty(E))return{};const m=Vt.addAuthToUrl(E),{width:D=0,height:v=0}=yield Vt.probeImageWidthHeight(m);return{snapshotUrl:m,snapshotWidth:D,snapshotHeight:v}}catch(g){throw g}})}_reset(){this._messageOptionsMap.clear()}_dispose(){this._reset();const{notificationCenter:n,InnerEvent:r}=this._core;n.unSubscribeInnerEvent(r.DESTROY,this._dispose,this)}};class to{constructor(r){this.uploadProgress=0,this.type=Pg,this[gs]=!1,this[jr]=r.isCustomUpload||!1,this.content={downloadFlag:2,second:r.second,size:r.size,url:Vt.generateURL(r.url,{needAddAuthToUrl:!this[jr]}),remoteAudioUrl:Vt.addAuthToUrl(r.url||""),uuid:r.uuid}}static parseServerPushElement(r){const{MsgContent:g}=r,{Url:u,Download_Flag:E,Second:m,Size:D,UUID:v}=g;return new to({url:u,downloadFlag:E,second:m,size:D,uuid:v})}updatePercent(r){this.uploadProgress=Math.min(r,1)}updateAudioUrl(r){this.content.remoteAudioUrl=r}validateBeforeSend(){if(this[jr])return{isValid:!0};const r=this.content.remoteAudioUrl!=="";return{isValid:r,error:r?null:{message:"content can not be empty"}}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{uuid:E,downloadFlag:m,remoteAudioUrl:D,size:v,second:T}=u;return{MsgType:this.type,MsgContent:{Url:Vt.removeAuthToUrl(D),Download_Flag:m,Second:T,Size:v,UUID:E}}}}gs=jr;const nn=2108,be=2300,bt=2301;var FA=new class{constructor(){this._messageOptionsMap=new Map}init(n){var r;this._core=n;const{notificationCenter:g,helper:u,InnerEvent:E,message:m}=n;u.registerApi({apiName:"createAudioMessage",context:this}),u.registerExperimentalAPI("createAudioMessage",this,"createCustomUploadAudioMessage"),(r=m?.messageFactory)===null||r===void 0||r.registerElementClass(Pg,to),g.subscribeInnerEvent(E.DESTROY,this._dispose,this)}createAudioMessage(n){var r,g,u;try{let{file:E}=n.payload;E=this._processAudioFile(n.payload.file),n.payload.file=E;const m=(r=this._core.store.get("login"))===null||r===void 0?void 0:r.userId,D=(u=(g=this._core)===null||g===void 0?void 0:g.message.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},n),{from:m})),v={second:Math.max(1,Math.round((E.duration||E.second)/1e3)),size:E.fileSize||E.size||1,url:E.tempFilePath||E.uri||E.url,uuid:Vt.generateUUID(E)},T=new to(v);return D.setElement(T),this._messageOptionsMap.set(D.clientSequence,n),D}catch(E){throw E}}createCustomUploadAudioMessage(n){var r,g,u;try{this._validateCustomUploadOptions(n);const{store:E,message:m}=this._core,D=(r=E.get("login"))===null||r===void 0?void 0:r.userId,{url:v,uuid:T,duration:P,fileSize:W}=((g=n?.payload)===null||g===void 0?void 0:g.file)||{},oA=(u=m.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},n),{from:D})),EA=new to({second:P,size:W||1,url:v,uuid:T,isCustomUpload:!0});return oA.setElement(EA),this._messageOptionsMap.set(oA.clientSequence,n),oA}catch(E){throw E}}upload(n){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g}}=this._core;r.debug("upload",`${fa} uploadAudio message:${g(n)}`);const{file:u}=this._messageOptionsMap.get(n.clientSequence).payload;this._validateBeforeUploadAudio(u);const E=n.getElements()[0],m=yield this._performAudioUpload(E,n,u),D=Vt.addAuthToUrl(m?.location);return E.updateAudioUrl(D),n})}_validateBeforeUploadAudio(n){const{helper:{ChatError:r},store:g}=this._core;if(!n)throw new r({code:be});const u=X(Cl)||20971520;if(n.size>u)throw new r({code:bt});if(n.size===0)throw new r({code:nn})}_performAudioUpload(n,r,g){return mA(this,void 0,void 0,function*(){const{to:u}=r,E={uploadFileType:Cl,file:g,to:u,message:r,onProgress:D=>{var v,T;n.updatePercent(D),(T=(v=this._messageOptionsMap.get(r.clientSequence))===null||v===void 0?void 0:v.onProgress)===null||T===void 0||T.call(v,D)}},{response:m}=yield K.uploadToCOS(E);return m})}_processAudioFile(n){var r;const{IN_MINI_APP:g,IN_BROWSER:u}=(r=this._core)===null||r===void 0?void 0:r.utils;return g?this._processMiniFile(n):u?this._processWebFile(n):void 0}_processMiniFile(n){return{url:n.tempFilePath,name:n.tempFilePath.slice(n.tempFilePath.lastIndexOf("/")+1),size:n.fileSize,second:n.duration,type:n.tempFilePath.slice(n.tempFilePath.lastIndexOf(".")+1).toLowerCase()}}_processWebFile(n){if(n.tempFilePath||n.uri)return n;const r=URL.createObjectURL(n);return n.tempFilePath=r,n}_validateCustomUploadOptions(n){var r;const{utils:{isEmpty:g}}=this._core,{url:u,uuid:E,duration:m}=((r=n?.payload)===null||r===void 0?void 0:r.file)||{};if(g(u)||g(E)||g(m))throw new Error("Invalid audio message options")}_reset(){this._messageOptionsMap.clear()}_dispose(){this._reset();const{notificationCenter:n,InnerEvent:r}=this._core;n.unSubscribeInnerEvent(r.DESTROY,this._dispose,this)}};const oi={to:{required:!0,rules:["string"],allowEmpty:!1},conversationType:{required:!0,rules:["string"],allowEmpty:!1},payload:{required:!0,rules:["object"],allowEmpty:!1},cloudCustomData:{required:!1,rules:["string"],allowEmpty:!1},priority:{required:!1,rules:["string"],allowEmpty:!1},customModerationConfigurationID:{required:!1,rules:["string"],allowEmpty:!1},onProgress:{required:!1,rules:["function"],allowEmpty:!1}},pn={createImageMessage:oi,createAudioMessage:oi,createVideoMessage:oi,createFileMessage:oi},ni={createImageMessage:!0,createAudioMessage:!0,createVideoMessage:!0,createFileMessage:!0},ys={[rc]:rA,[qa]:xt,[Vl]:yi,[Pg]:FA};var Ti=new class{constructor(){this.name="RichMediaMessage"}install(n){this._core=n;const{constants:{OuterConstant:{MSG_AUDIO:r,MSG_FILE:g,MSG_IMAGE:u,MSG_VIDEO:E}}}=n;M.init(n),rA.init(n),xt.init(n),yi.init(n),FA.init(n),K.init(n),Vt.init(n),n.helper.registerApi({apiName:"sendMessage",context:this,matcher:m=>[r,g,u,E].includes(m[0].type)}),n.helper.registerValidateConfig({auth:ni,params:pn})}sendMessage(n,r){return mA(this,void 0,void 0,function*(){var g,u,E;try{return this._isCustomUpload(n)||(yield this._upload(n)),yield(E=(u=(g=this._core)===null||g===void 0?void 0:g.message)===null||u===void 0?void 0:u.messageSender)===null||E===void 0?void 0:E.sendMessage(n,r)}catch(m){throw m}})}_upload(n){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g}}=this._core;if(r.debug("_upload",` uploadFile message:${g(n)}`),n._relayFlag!==!0)try{const u=ys[n.type];u&&(yield u.upload(n),r.info("_upload",` type:${n.type}`))}catch(u){throw n.status=au.FAIL,u instanceof Error&&(u.data={message:n}),this._core.message.messageDataHandler.storeConversationMessage(n),u}})}_isCustomUpload(n){var r,g;return((g=(r=n._elements)===null||r===void 0?void 0:r[0])===null||g===void 0?void 0:g[jr])===!0}};const yo=new class{init(n){this.core=n}};class yt{constructor(r){this.conversationID=r.conversationID||"",this.unreadCount=r.unreadCount||0,this.type=r.type||"",this.lastMessage=yo.core.common.buildLastMessage(r.lastMessage),this.peerReadTime=r.peerReadTime||0,this.groupAtInfoList=[],this.remark=r.remark||"",this.isPinned=r.isPinned||!1,this.messageRemindType=r.messageRemindType,this.markList=r.markList||[],this.customData=r.customData||"",this.conversationGroupList=r.conversationGroupList||[],this.draftText=r.draftText||"",this.userProfile=r.userProfile,this.groupProfile=r.groupProfile,this.subType=r.subType||"",this._isInfoCompleted=!1,this._init()}_init(){var r;const{core:{OuterConstant:g,utils:{isUndefined:u}}}=yo;u(this.userProfile)&&this.type===g.CONV_C2C?this.userProfile={userID:this.conversationID.replace(g.CONV_C2C,"")}:this.type===g.CONV_GROUP&&(!this.subType&&(!((r=this.groupProfile)===null||r===void 0)&&r.type)&&(this.subType=this.groupProfile.type),u(this.groupProfile)&&(this.groupProfile={groupID:this.conversationID.replace(g.CONV_GROUP,""),selfInfo:{},lastMessage:{},type:this.subType}))}updateUnreadCount(r){var g;const{core:{OuterConstant:u,utils:{isUndefined:E},store:m}}=yo,{nextUnreadCount:D,isFromGetConversations:v,isUnreadC2CMessage:T}=r;if(E(D))return;if(this.subType===u.GRP_AVCHATROOM)return void(this.unreadCount=0);if(v&&this.type===u.CONV_GROUP)return void(this.unreadCount=D);if(T&&this.type===u.CONV_C2C)return void(this.unreadCount=D);const P=((g=m.get("cloudConfig"))===null||g===void 0?void 0:g.support_unread_count_for_meeting)==="1";this.subType!==u.GRP_MEETING||P?this.unreadCount+=D:this.unreadCount=0}updateLastMessage(r){this.lastMessage=yo.core.common.buildLastMessage(r)}reduceUnreadCount(){return this.unreadCount>=1&&(this.unreadCount-=1,!0)}isLastMessageRevoked(r){const{core:{OuterConstant:g}}=yo,{sequence:u,time:E}=r;return this.type===g.CONV_C2C&&u===this.lastMessage.lastSequence&&E===this.lastMessage.lastTime||this.type===g.CONV_GROUP&&u===this.lastMessage.lastSequence}setLastMessageRevoked(r){this.lastMessage.isRevoked=r}setLastMessageRevoker(r){this.lastMessage.revoker=r}setDraftText(r){this.draftText=r}updateGroupAtInfoList(r){const{core:{common:{updateGroupAtInfo:g}}}=yo;g(r,this.groupAtInfoList)}clearGroupAtInfoList(){this.groupAtInfoList.length=0}getProfileCompleted(){return this._isInfoCompleted}setProfileCompleted(){this._isInfoCompleted=!0}}const St=n=>{const{core:{OuterConstant:r,utils:{isString:g}}}=yo;return g(n)&&n.slice(0,3)===r.CONV_C2C},dg=n=>{const{core:{OuterConstant:r,utils:{isString:g}}}=yo;return g(n)&&n.slice(0,5)===r.CONV_GROUP},Js=n=>{const{core:{OuterConstant:r,utils:{isString:g}}}=yo;return g(n)&&n===r.CONV_SYSTEM};function io(n){const{OuterConstant:r}=yo.core;let g="";return n===0?g=r.MSG_REMIND_ACPT_AND_NOTE:n===1?g=r.MSG_REMIND_DISCARD:n===2?g=r.MSG_REMIND_ACPT_NOT_NOTE:n===3&&(g=r.NOT_RECEIVE_OFFLINE_PUSH_EXCEPT_AT),g}function Wr(n){const{OuterConstant:r}=yo.core;let g;return n.startsWith(r.CONV_C2C)&&(g=n.replace(r.CONV_C2C,"")),g==="@TLS#ERROR"||g==="@TLS#NOT_FOUND"}function ac(n,r){const{helper:g}=yo.core,u=new g.ChatError({functionName:n,code:r?.errorCode||r?.code,message:r?.errorInfo||r?.message});throw console.error(`${n} fail:`,u),u}var ls,ua;(function(n){n[n.OFF=0]="OFF",n[n.ON=1]="ON"})(ls||(ls={})),function(n){n[n.ONLY_CONVERSATIONID=1]="ONLY_CONVERSATIONID"}(ua||(ua={}));var Da;(function(n){n[n.CONV_NOT_FOUND=2500]="CONV_NOT_FOUND",n[n.USER_OR_GRP_NOT_FOUND=2501]="USER_OR_GRP_NOT_FOUND",n[n.CONV_UN_RECORDED_TYPE=2502]="CONV_UN_RECORDED_TYPE"})(Da||(Da={}));const oa=0,H=1;var QA=new class{constructor(){this._name="GetC2CMessageRemindType"}init(n){this._core=n}get(n){return mA(this,void 0,void 0,function*(){try{const{common:r}=this._core,g=yield function(E,m){return mA(this,void 0,void 0,function*(){const{toAccount:D,userIDList:v}=E,T={To_Account:D,Peer_Account:v};return m.common.buildAndSendPacket({servcmd:"openim.get_c2c_peer_mute_notifications",data:T})})}({toAccount:r.getCurrentUserID(),userIDList:n},this._core),{MuteNotificationsList:u=[]}=g||{};u.forEach(E=>{const{Peer_Account:m,MuteNotifications:D}=E,v=`${this._core.OuterConstant.CONV_C2C}${m}`,T=io(D);NA.patchMessageRemindType([v],T)})}catch(r){console.error(`${this._name}.get fail:`,r)}})}},yA=new class{constructor(){this._name="GetGroupMessageRemindType"}init(n){this._core=n}get(n){return mA(this,void 0,void 0,function*(){if(n.length!==0)try{const r=yield function(u,E){return mA(this,void 0,void 0,function*(){const{groupIDList:m,responseFilter:D}=u,v={GroupIdList:m,ResponseFilter:D};return E.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_group_self_member_info",data:v})})}({groupIDList:n,responseFilter:{MemberInfoFilter:["MsgFlag"]}},this._core),{GroupInfo:g=[]}=r||{};g.forEach(u=>{var E;const{GroupId:m,MemberList:D}=u,v=((E=D[0])===null||E===void 0?void 0:E.MsgFlag)||"",T=`${this._core.OuterConstant.CONV_GROUP}${m}`;NA.patchMessageRemindType([T],v)})}catch(r){console.error(`${this._name}.get fail:`,r)}})}},NA=new class{constructor(){this._name="ConversationDataHandler",this._totalUnreadCount=0,this._groupAtTipsList=[]}init(n){this._core=n;const{helper:r,notificationCenter:g,appStore:{conversationStore:u},constants:{WORKFLOW_NAME:E,WORKFLOW_STEP:m},InnerEvent:{SYNC_CONVERSATION_LIST:D,MESSAGE_PUSH:v,NEW_MESSAGE:T,MESSAGE_DELETED:P,MESSAGE_REVOKED:W,MESSAGE_MODIFIED:oA,CONVERSATION_UPDATED:EA,LOGOUT:wA,DESTROY:kA},InnerEventSubType:{C2C_MESSAGE_PEER_READ:xA}}=n;this._conversationStore=u,r.registerWorkflowStep(E.SYNC_SERVER_INFO_AFTER_LOGIN,m.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,this._handleUnreadSyncFinished,this),r.registerWorkflowStep(E.SYNC_SERVER_INFO_AFTER_LOGIN,m.CONVERSATION_UPDATE_AFTER_GROUP_LIST_SYNC_FINISHED,this._handleGroupListSyncFinished,this),r.registerWorkflowStep(E.RECEIVE_C2C_NEW_MESSAGE,m.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,this._handleNewMessage,this),r.registerWorkflowStep(E.RECEIVE_C2C_NEW_MESSAGE,m.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,this._handleUnreadSyncFinished,this),r.registerWorkflowStep(E.RECEIVE_GROUP_NEW_MESSAGE,m.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,this._handleNewMessage,this),r.registerWorkflowStep(E.SYNC_SERVER_INFO_AFTER_RE_ONLINE,m.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,this._handleUnreadSyncFinished,this),r.registerWorkflowStep(E.RECEIVE_GROUP_TIPS_NOTIFICATION,m.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,this._handleNewMessage,this);const{InnerEventSubType:{GROUP_AT_TIPS:LA}}=g;g.subscribeInnerEvent(D,this._handleConversationSynced,this),g.subscribeInnerEvent(T,this._handleNewMessage,this),g.subscribeInnerEvent(v,LA,this._handleNewGroupAtTips,this),g.subscribeInnerEvent(P,this._handleMessageDeleted,this),g.subscribeInnerEvent(W,this._handleMessageRevoked,this),g.subscribeInnerEvent(oA,this._handleMessageModified,this),g.subscribeInnerEvent(EA,this._handleConversationUpdated,this),g.subscribeInnerEvent(v,xA,this._handleMessageRead,this),g.subscribeInnerEvent(wA,this._reset,this),g.subscribeInnerEvent(kA,this._dispose,this),n.ssoLog.debug(`${this._name}.init`)}_handleConversationSynced(n){this.updateLocalConversationList({conversationUpdateFieldList:n.conversationUpdateFieldList||[],isFromGetConversations:!0,updateUnreadCount:!0}),this.emitConversationListUpdate()}_handleUnreadSyncFinished(n){const{constants:{WORKFLOW_STEP:r}}=this._core,{conversationUpdateFieldList:g=[],groupTipList:u=[],isUnreadC2CMessage:E}=n.result[r.UNREAD_MESSAGE_SYNC]||{};let m=!1;g.forEach(D=>{const{conversationID:v,unreadCount:T}=D,P=this.getLocalConversation(v);P&&P.unreadCount!==T&&(P.updateUnreadCount({nextUnreadCount:T,isUnreadC2CMessage:E}),m=!0)}),m&&this.emitConversationListUpdate(),this._handleGroupAtTipsSynced(u)}_handleGroupAtTipsSynced(n){var r;for(let g=0;g0&&this._handleNewGroupAtTips({GroupTips:v._groupAtInfoList}),m=!0}m&&this.emitConversationListUpdate()}_handleNewMessage(n){const{conversationUpdateFieldList:r=[],isInstantMessage:g=!0,isUnreadC2CMessage:u=!1,updateUnreadCount:E=!0}=n.result||{};if(r.length===0)return;const{common:{isTopic:m}}=this._core;m(r[0].conversationID)||(this.updateLocalConversationList({conversationUpdateFieldList:r,isInstantMessage:g,isUnreadC2CMessage:u,isFromGetConversations:!1,updateUnreadCount:E}),r.filter(D=>this._isConversationNeedShow(D.conversationID)).length>0&&this.emitConversationListUpdate())}_handleNewGroupAtTips(n){const{GroupTips:r=[]}=n;r.forEach(g=>{const{GroupAtTips:u,MsgBody:E,MsgRandom:m,ClientSeq:D}=g;let v={};u?v=this._convertGroupAtTipsKey(u):E?v=Object.assign({},this._convertGroupAtTipsKey(E)):g.groupAtType&&(v=Object.assign({},g)),v.__random=m,v.__sequence=D,this._groupAtTipsList.push(v)}),console.log(`${this._name}._handleNewGroupAtTips groupAtTipsList: ${JSON.stringify(this._groupAtTipsList)}`),this._updateGroupAtInfoList()}_convertGroupAtTipsKey(n){const{From_Account:r,GroupId:g,MsgSeq:u,GroupAtType:E}=n;return{from:r,groupID:g,sequence:u,groupAtType:E}}_updateGroupAtInfoList(){if(this._groupAtTipsList.length===0)return;const{common:n,OuterConstant:r}=this._core,g=n.getCurrentUserID();let u=!1;this._groupAtTipsList.forEach(E=>{const{groupID:m,from:D}=E;if(D!==g){const v=this.getLocalConversation(`${r.CONV_GROUP}${m}`);v&&(v.updateGroupAtInfoList(E),u=!0)}}),u&&this.emitConversationListUpdate(),this._groupAtTipsList.length=0}_handleMessageDeleted(n){var r,g;console.log(`${this._name}._handleMessageDeleted, conversationID:`,n);const{message:{messageDataHandler:u},OuterConstant:E}=this._core,m=u?.getLocalMessageList(n)||[];let D={};for(let P=(m.length||0)-1;P>=0;P--)if(!m[P].isDeleted&&m[P]._isExcludedFromLastMessage!==!0){D=m[P];break}const v=this.getLocalConversation(n);if(!v)return;let T=!1;v.lastMessage.lastSequence===D.sequence&&v.lastMessage.lastTime===D.time||(!((g=(r=this._core)===null||r===void 0?void 0:r.helper)===null||g===void 0)&&g.isEmpty(D)&&(D=void 0),v.updateLastMessage(D),T=!0),n.startsWith(E.CONV_C2C)&&this.updateUnreadCount(n),T&&(this.emitConversationListUpdate(),console.log(`${this._name}._handleMessageDeleted. update conversationID:${n} with lastMessage:`,v.lastMessage))}_handleMessageRevoked(n){const{messageList:r=[],updateUnreadCount:g=!0}=n;if(console.log(`${this._name}._handleMessageRevoked messageList:${r.length}`),r.length===0)return;let u=null,E=!1;r.forEach(m=>{u=this.getLocalConversation(m.conversationID),u&&(g&&u.reduceUnreadCount()&&(E=!0),u.isLastMessageRevoked({sequence:m.sequence,time:m.time})&&(u.setLastMessageRevoked(!0),u.setLastMessageRevoker(m.revoker),E=!0))}),E&&this.emitConversationListUpdate()}_handleMessageModified(n){const{utils:{isEmpty:r},common:{getMessagePreviewText:g},ssoLog:u}=this._core;u.debug(`${this._name}._handleMessageModified`,JSON.stringify(n));const{conversationID:E,messageList:m}=n,D=this.getLocalConversation(E);if(r(D))return;const{lastMessage:v}=D;if(v){const T=m?.[0]||{};v.lastTime===T.time&&v.lastSequence===T.sequence&&v.version!==T.version&&(v.type=T.type,v.payload=T.payload,v.messageForShow=g(T.type,T.payload),v.cloudCustomData=T.cloudCustomData,v.version=T.version,this.emitConversationListUpdate(),console.log(`${this._name} conversationID:${E} lastMessage updated`))}}_handleConversationUpdated(n){this.emitConversationListUpdate(n?.needSort)}updateLocalConversationList(n){const{isFromGetConversations:r}=n,{newConversationList:g}=this._getTmpConversationListMapping(n);this._sortConversationList(),r||this._updateNewConversationProfile(g),this._core.ssoLog.debug("updateLocalConversationList",` newConversationList: ${g.length}`)}_getTmpConversationListMapping(n){const{OuterConstant:r}=this._core,{conversationUpdateFieldList:g,isFromGetConversations:u,isInstantMessage:E,isUnreadC2CMessage:m=!1,updateUnreadCount:D}=n,v=[],T=g?.length;for(let P=0;P{v[1].isPinned===!0?n(v[1].lastMessage.lastTime)?u.push(v):g.push(v):n(v[1].lastMessage.lastTime)?m.push(v):E.push(v)});const D=g.sort((v,T)=>T[1].lastMessage.lastTime-v[1].lastMessage.lastTime).concat(u).concat(E.sort((v,T)=>T[1].lastMessage.lastTime-v[1].lastMessage.lastTime)).concat(m);this._updateConversationMapFromList(D)}_updateNewConversationProfile(n){if(n.length===0)return;const r=[],g=[],{OuterConstant:{CONV_GROUP:u,CONV_C2C:E}}=this._core;n.forEach(m=>{const{conversationID:D,type:v}=m;if(v===E){const T=D.replace(E,"");r.push(T)}else if(v===u){const T=D.replace(u,"");g.push(T)}}),r.length>0&&this._updateC2CConversation(r),g.length>0&&this._updateGroupConversation(g)}_updateC2CConversation(n){var r;const{OuterConstant:{CONV_C2C:g},appStore:{userStore:u},user:E}=this._core;let m=!1;(r=E.userProfile)===null||r===void 0||r.getUserProfile({userIDList:n}).then(D=>{(D?.data||[]).forEach(v=>{var T;const{userID:P}=v,W=this.getLocalConversation(`${g}${P}`);if(W){const oA=((T=u.getFriend(P))===null||T===void 0?void 0:T.remark)||"";W.remark=oA,W.userProfile=v,m=!0}}),m&&this.emitConversationListUpdate()}).catch(D=>{}),QA.get(n)}_updateGroupConversation(n){return mA(this,void 0,void 0,function*(){const{OuterConstant:{CONV_GROUP:r},appStore:{groupStore:g},utils:{safeStringify:u},ssoLog:E,apiMap:{getGroupProfile:m}}=this._core;let D=!1;try{yield Promise.all(n.map(v=>mA(this,void 0,void 0,function*(){const T=g.getGroup(v),P=this.getLocalConversation(`${r}${v}`);T&&P&&(P.groupProfile=T,D=!0),P&&!P.getProfileCompleted()&&typeof m=="function"&&(yield m({groupID:v}))}))),yA.get(n),D&&this.emitConversationListUpdate()}catch(v){E.debug("_updateGroupConversation",u(v))}})}_handleMessageRead(n){const{OuterConstant:{CONV_C2C:r}}=this._core,{C2cNotifyMsgArray:g=[]}=n||{};g.forEach(u=>{const{To_Account:E,UinPairReadArray:m=[]}=u?.C2cReadedReceipt||{};m?.forEach(D=>{const{LastReadTime:v}=D,T=`${r}${E}`;this._updateConversationReadInfo({conversationID:T,peerReadTime:v}),this._updateMessageListPeerRead({conversationID:T,peerReadTime:v})})})}_updateConversationReadInfo(n){const{appStore:r,utils:{isEmpty:g},common:{getCurrentUserID:u}}=this._core,{conversationID:E,peerReadTime:m}=n,D=r.conversationStore.getConversationMap();if(D.has(E)){const v=D.get(E);v.peerReadTime=m;const T=v?.lastMessage;g(T)||T.fromAccount===u()&&T.lastTime<=m&&!T.isPeerRead&&(T.isPeerRead=!0,r.conversationStore.updateConversation(E,{lastMessage:T}))}}_updateMessageListPeerRead(n){const{notificationCenter:r,OuterEvent:g,message:u}=this._core,{conversationID:E,peerReadTime:m}=n,D=u.messageDataHandler.getLocalMessageList(E),v=u.messageDataHandler.getSparseMessageList(E),T=[];D.forEach(P=>{P.time<=m&&!P.isPeerRead&&P.flow==="out"&&(P.isPeerRead=!0,T.push(P))}),v.forEach(P=>{P.time<=m&&!P.isPeerRead&&P.flow==="out"&&(P.isPeerRead=!0,T.push(P))}),r.emitOuterEvent(g.MESSAGE_READ_BY_PEER,{name:g.MESSAGE_READ_BY_PEER,data:T})}_isConversationNeedShow(n){var r,g;const{OuterConstant:{CONV_GROUP:u,GRP_ROOM:E,GRP_LIVE:m},utils:{isUndefined:D}}=this._core,v=this.getLocalConversation(n);if(D(v))return!0;const T=v.type===u&&((r=v.groupProfile)===null||r===void 0?void 0:r.type)===E,P=v.type===u&&((g=v.groupProfile)===null||g===void 0?void 0:g.type)===m;return!(T||P)}updateUnreadCount(n,r=!0){var g,u;let E=!1;const m=this.getLocalConversation(n),D=(u=(g=this._core)===null||g===void 0?void 0:g.message.messageDataHandler)===null||u===void 0?void 0:u.getLocalMessageList(n);if(!m)return E;const v=m.unreadCount,T=D?.filter(P=>!P.isRead&&!P._onlineOnlyFlag&&!P.isDeleted).length;return console.log(`${this._name}._updateUnreadCount conversationID:${n} currentUnreadCount:${v} newUnreadCount:${T}`),v!==T&&(m.unreadCount=T,E=!0,r===!0&&this.emitConversationListUpdate()),E}emitConversationListUpdate(n=!1){var r,g;n&&this._sortConversationList();const{OuterEvent:{CONVERSATION_LIST_UPDATED:u},conversation:E}=this._core,m=this.getLocalConversationList();this._emitEvent({name:u,data:m,isSyncCompleted:(g=(r=E?.syncConversationHandler)===null||r===void 0?void 0:r.isSyncCompleted)===null||g===void 0?void 0:g.call(r)}),this._emitTotalUnreadCountUpdate()}_emitTotalUnreadCountUpdate(){var n;const r=this.getTotalUnreadMessageCount();this._totalUnreadCount!==r&&(this._core.ssoLog.debug("_emitTotalUnreadCountUpdate",` from ${this._totalUnreadCount} to ${r}`),this._totalUnreadCount=r,this._emitEvent({name:(n=this._core)===null||n===void 0?void 0:n.OuterEvent.TOTAL_UNREAD_MESSAGE_COUNT_UPDATED,data:r}))}_emitEvent(n){var r;(r=this._core)===null||r===void 0||r.notificationCenter.emitOuterEvent(n.name,n)}getTotalUnreadMessageCount(){const{OuterConstant:n,utils:{isEmpty:r}}=this._core,g=this.getLocalConversationList();let u=0;return g.forEach(E=>{E.type!==n.CONV_SYSTEM&&(r(E.messageRemindType)||E.messageRemindType===n.MSG_REMIND_ACPT_AND_NOTE)&&(u+=E.unreadCount)}),u}getLocalConversationList(){return[...this._conversationStore.getConversationMap().values()].filter(n=>this._isConversationNeedShow(n.conversationID))}hasLocalConversation(n){return this._conversationStore.getConversationMap().has(n)}getLocalConversation(n){return this._conversationStore.getConversationMap().get(n)}setLocalConversation(n,r){return this._conversationStore.getConversationMap().set(n,r)}deleteLocalConversation(n){this._conversationStore.getConversationMap().delete(n)}_updateConversationMapFromList(n){this._clearConversationMap();for(const[r,g]of n)this.setLocalConversation(r,g)}_clearConversationMap(){this._conversationStore.getConversationMap().clear()}patchMessageRemindType(n,r){let g=!1;n.forEach(u=>{const E=this.getLocalConversation(u);E?.messageRemindType!==r&&(E.messageRemindType=r,g=!0)}),console.log(`${this._name}.patchMessageRemindType conversationIDList:${n} messageRemindType:${r} hasUpdated:${g}`),g&&this.emitConversationListUpdate()}markMessageAsRead(n){const{message:{messageDataHandler:r}}=this._core,{conversationID:g,lastReadTime:u=0,lastReadSequence:E=0}=n,m=r?.getLocalMessageList(g);if(m.length===0)return;const{length:D}=m;for(let v=D-1;v>=0;v--){const T=m[v],P=u&&T.time>u,W=E&&T.sequence>E;if(!P&&!W){if(T.flow==="in"&&T.isRead)break;T.setIsRead(!0)}}}appendToPinnedConversation(n){const r=[...this._conversationStore.getConversationMap().entries()],g=r.findIndex(u=>u[1].isPinned===!1);r.splice(g,0,[n.conversationID,n]),this._updateConversationMapFromList(r),this.emitConversationListUpdate()}_reset(){this._clearConversationMap(),this._totalUnreadCount=0,this._groupAtTipsList=[]}_dispose(){const{notificationCenter:n,InnerEvent:{NEW_MESSAGE:r,MESSAGE_DELETED:g,MESSAGE_REVOKED:u,MESSAGE_MODIFIED:E,CONVERSATION_UPDATED:m,LOGOUT:D,DESTROY:v,SYNC_CONVERSATION_LIST:T}}=this._core,{InnerEventSubType:{GROUP_AT_TIPS:P}}=n;n.unSubscribeInnerEvent(r,this._handleNewMessage,this),n.unSubscribeInnerEvent(r,P,this._handleNewGroupAtTips,this),n.unSubscribeInnerEvent(g,this._handleMessageDeleted,this),n.unSubscribeInnerEvent(u,this._handleMessageRevoked,this),n.unSubscribeInnerEvent(E,this._handleMessageModified,this),n.unSubscribeInnerEvent(m,this._handleConversationUpdated,this),n.unSubscribeInnerEvent(T,this._handleConversationSynced,this),n.unSubscribeInnerEvent(D,this._reset,this),n.unSubscribeInnerEvent(v,this._dispose,this)}},Ae=new class{constructor(){this._name="GetConversationList"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"getConversationList",context:this})}getConversationList(n){return mA(this,void 0,void 0,function*(){return{code:0,data:{conversationList:this._getConversationList(n),isSyncCompleted:this._core.conversation.syncConversationHandler.isSyncCompleted()}}})}_getConversationList(n){const{utils:{isUndefined:r,isArray:g,isPlainObject:u}}=this._core;if(r(n))return NA.getLocalConversationList();if(g(n))return n.length===0?[]:NA.getLocalConversationList().filter(E=>n.includes(E.conversationID));if(u(n)){const{type:E,markType:m,groupName:D,hasUnreadCount:v,hasGroupAtInfo:T}=n;return NA.getLocalConversationList().filter(P=>this._filterType(P,E)&&this._filterMarkType(P,m)&&this._filterGroupName(P,D)&&this._filterUnreadCount(P,v)&&this._filterGroupAtInfo(P,T))}return[]}_filterType(n,r){const{OuterConstant:g}=this._core;return r!==g.CONV_C2C&&r!==g.CONV_GROUP||n.type===r}_filterGroupName(n,r){const{utils:{isString:g}}=this._core;return!g(r)||(r===""?n.conversationGroupList.length===0:n.conversationGroupList.includes(r))}_filterMarkType(n,r){const{utils:{isNumber:g}}=this._core;return!g(r)||(r===0?n.markList.length===0:n.markList.includes(r))}_filterUnreadCount(n,r){let g=!0;return r===!0?g=n.unreadCount>=1:r===!1&&(g=n.unreadCount===0),g}_filterGroupAtInfo(n,r){let g=!0;return r===!0?g=n.groupAtInfoList.length>=1:r===!1&&(g=n.groupAtInfoList.length===0),g}},Ne=new class{constructor(){this._name="GetConversationProfile"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"getConversationProfile",context:this})}getConversationProfile(n){return mA(this,void 0,void 0,function*(){const{OuterConstant:{CONV_C2C:r,CONV_GROUP:g,GRP_AVCHATROOM:u},appStore:{groupStore:E},utils:{isEmpty:m}}=this._core,D={code:0,data:{}};let v=NA.getLocalConversation(n);if(Js(n))return D.data.conversation=v,D;let T=!1;const P=St(n)?r:g;if(m(v)&&(T=!0,v=new yt({conversationID:n,type:P})),console.log(`${this._name}.getConversationProfile conversationID:${n} isNewConversation:${T}`),D.data.conversation=v,v?.getProfileCompleted())return D;if(P===r){const W=n.replace(r,"");yield this._handleC2CConversation(v,W),T&&(yield QA.get([W]))}if(P===g){const W=n.replace(g,"");if(!E.getGroup(W))return D;yield this._handleGroupConversation(v,W),T&&v.groupProfile.type!==u&&(yield yA.get([W]))}return D})}_handleC2CConversation(n,r){return mA(this,void 0,void 0,function*(){var g,u;const{user:E,helper:m,utils:{isEmpty:D},appStore:{conversationStore:v,userStore:T}}=this._core,{conversationID:P}=n,W=yield(g=E.userProfile)===null||g===void 0?void 0:g.getUserProfile({userIDList:[r]});if(W?.data.length===0)throw new m.ChatError({code:Da.USER_OR_GRP_NOT_FOUND});n.userProfile=W?.data[0];const oA=(u=T.getFriend(r))===null||u===void 0?void 0:u.remark;D(oA)||n.remark===oA||(n.remark=oA),n.setProfileCompleted();const EA=NA.hasLocalConversation(P);console.log(`${this._name}._handleC2CConversation conversationID:${P} hasLocalConversation: ${EA}`),EA?v.updateConversation(P,n):NA.appendToPinnedConversation(n)})}_handleGroupConversation(n,r){return mA(this,void 0,void 0,function*(){const{apiMap:{getGroupProfile:g},appStore:{conversationStore:u}}=this._core,{conversationID:E}=n,m=yield g({groupID:r});n.groupProfile=m?.data.group,n.setProfileCompleted();const D=NA.hasLocalConversation(E);console.log(`${this._name}._handleGroupConversation conversationID:${E} hasLocalConversation: ${D}`),D?u.updateConversation(E,n):NA.appendToPinnedConversation(n)})}},de=new class{init(n){const{helper:r}=n;r.registerApi({apiName:"getTotalUnreadMessageCount",context:this})}getTotalUnreadMessageCount(){return NA.getTotalUnreadMessageCount()}},Ue=new class{constructor(){this._serverGroupConversationLastReadSeqMap=new Map,this._name="SetMessageRead"}init(n){this._core=n;const{helper:r,common:{isTopic:g},notificationCenter:u,InnerEvent:{MESSAGE_PUSH:E},InnerEventSubType:{ALL_MESSAGE_READ:m}}=n;r.registerApi({apiName:"setMessageRead",context:this,matcher:D=>!g(D[0].conversationID)}),r.registerApi({apiName:"setAllMessageRead",context:this}),u.subscribeInnerEvent(E,m,this._handleAllMessageRead,this)}handleC2CMessageReadSync(n){const{helper:{isEmpty:r},OuterConstant:g}=this._core;n.forEach(u=>{const{ReadC2cMsgNotify:E}=u;if(!r(E)){const{UinPairReadArray:m=[]}=E;m.forEach(D=>{const{From_Account:v,LastReadTime:T}=D,P=`${g.CONV_C2C}${v}`;console.log(`${this._name}.handleC2CMessageReadSync conversationID:${P} lastReadTime:${T}`),NA.markMessageAsRead({conversationID:P,lastReadTime:T}),NA.updateUnreadCount(P)})}})}handleGroupMessageReadSync(n){const{OuterConstant:r,utils:{isUndefined:g}}=this._core;n.forEach(u=>{const{GroupReadInfoArray:E}=u.MsgBody;g(E)||E.forEach(m=>{const{GroupId:D,LastReadMsgSeq:v}=m,T=`${r.CONV_GROUP}${D}`;console.log(`${this._name}.handleGroupMessageReadSync conversationID:${T} lastReadSequence:${v}`),NA.markMessageAsRead({conversationID:T,lastReadSequence:v}),NA.updateUnreadCount(T),this._clearGroupAtInfoList(T)})})}setMessageRead(n){return mA(this,void 0,void 0,function*(){var r,g;const{OuterConstant:u}=this._core,{conversationID:E}=n,m={code:0,data:{}},D=NA.getLocalConversation(E);let v=`${this._name}.setMessageRead conversationID:${E} unreadCount:${D?.unreadCount||0}`;if(m.successLog={message:v},!D)return m;const T=!(!((g=(r=this._core)===null||r===void 0?void 0:r.helper)===null||g===void 0)&&g.isEmpty(D.groupAtInfoList));if(D.type===u.CONV_GROUP&&T&&this._deleteGroupAtTips(E),D.unreadCount===0)return m;const{helper:{ChatError:P}}=this._core;try{if(D.type===u.CONV_C2C){const W=this._getLocalMessageMaxTime(D);v+=`lastMessageTime:${W}`,yield this._setC2CMessageRead(E,W)}if(D.type===u.CONV_GROUP){const W=this._getLocalMessageMaxSequence(D);v+=`lastMessageSequence:${W}`,yield this._setGroupMessageRead(E,W)}}catch(W){const{errorCode:oA,errorInfo:EA}=W;throw new P({functionName:"setMessageRead",code:oA,message:EA,moreMessage:v})}return D.type===u.CONV_SYSTEM&&(D.unreadCount=0),NA.emitConversationListUpdate(),Object.assign(Object.assign({},m),{successLog:{message:v}})})}setAllMessageRead(){return mA(this,arguments,void 0,function*(n={}){const{OuterConstant:{READ_ALL_MSG:r},utils:{safeStringify:g}}=this._core;let u=`scope:${n.scope}`;n.scope||(n.scope=r);const{scope:E}=n,m=this._generateSetAllMessageReadRequestData(E);if(m.allC2CMessageReadStatus===oa&&m.groupMessageReadInfoList.length===0)return{code:0};try{const D=yield function(v){return mA(this,void 0,void 0,function*(){const{allC2CMessageReadStatus:T,groupMessageReadInfoList:P}=v,W={C2CReadAllMsg:T,GroupReadInfo:P};return yo.core.common.buildAndSendPacket({servcmd:"openim.read_all_unread_msg",data:W})})}(m);if(D){const{GroupReadInfoArray:v,C2CReadAllMsg:T}=D,P=this._parseGroupReadInfo(v);this._updateAllConversationReadStatus({allC2CMessageReadStatus:T})>0&&NA.emitConversationListUpdate(),u+=`failureGroupInfoList:${g(P)}`}return{code:0,successLog:{message:u}}}catch(D){const{errorCode:v}=D;throw new this._core.helper.ChatError({functionName:"setAllMessageRead",code:v,moreMessage:u})}})}_handleAllMessageRead(n){const{GroupReadInfoArray:r,C2CReadAllMsg:g}=n;this._parseGroupReadInfo(r),this._updateAllConversationReadStatus({allC2CMessageReadStatus:g})>0&&NA.emitConversationListUpdate()}_updateAllConversationReadStatus(n){const{OuterConstant:{CONV_C2C:r,CONV_GROUP:g},appStore:u}=this._core,E=u.conversationStore.getConversationMap(),{allC2CMessageReadStatus:m}=n;let D=0;for(const[v,T]of E)if(T.unreadCount>=1){if(m===H&&T.type===r){const P=this._getLocalMessageMaxTime(T);NA.markMessageAsRead({conversationID:v,lastReadTime:P})}else if(T.type===g){const P=v.replace(g,"");if(this._serverGroupConversationLastReadSeqMap.has(P)){const W=this._serverGroupConversationLastReadSeqMap.get(P);NA.markMessageAsRead({conversationID:v,lastReadSequence:W})}}NA.updateUnreadCount(v,!1)&&(D+=1)}return D}_generateSetAllMessageReadRequestData(n){const{OuterConstant:{CONV_C2C:r,CONV_GROUP:g,READ_ALL_C2C_MSG:u},appStore:E}=this._core,m={allC2CMessageReadStatus:oa,groupMessageReadInfoList:[]},D=E.conversationStore.getConversationMap();for(const[,v]of D){const{type:T,unreadCount:P}=v;if(this._shouldSetAllMessageRead({scope:n,type:T,unreadCount:P})){if(T===r&&m.allC2CMessageReadStatus===oa){if(m.allC2CMessageReadStatus=H,n===u)break}else if(T===g){const W=this._getLocalMessageMaxSequence(v),{groupID:oA}=v.groupProfile;m.groupMessageReadInfoList.push({GroupId:oA,MsgSeq:W})}}}return m}_parseGroupReadInfo(n){const{utils:{isUndefined:r}}=this._core,g=[];return n?.forEach(u=>{const{GroupId:E,MsgSeq:m,RetCode:D,LastReadMsgSeq:v}=u;r(D)?this._serverGroupConversationLastReadSeqMap.set(E,v):(this._serverGroupConversationLastReadSeqMap.set(E,m),D!==0&&g.push(`${E}-${m}-${D}`))}),g}_deleteGroupAtTips(n){return mA(this,void 0,void 0,function*(){console.log(`${this._name}._deleteGroupAtTips conversationID:${n}`);const r=NA.getLocalConversation(n);if(!r)return;const g=r?.groupAtInfoList||[];if(g.length!==0)try{const{common:{getCurrentUserID:u,isCommunity:E},OuterConstant:{CONV_GROUP:m,CONV_AT_ALL:D}}=this._core;let v=[...g];if(E({groupID:n.replace(m,"")})&&(v=g.filter(P=>!P.atTypeArray.includes(D)),v.length===0))return void this._clearGroupAtInfoList(n,!1);const T=v.map(P=>({From_Account:P.from,To_Account:u(),MsgSeq:P.__sequence,MsgRandom:P.__random,GroupId:P.groupID}));yield function(P,W){return mA(this,void 0,void 0,function*(){const{messageListToDelete:oA}=P,EA={DelMsgList:oA};return W.common.buildAndSendPacket({servcmd:"openim.deletemsg",data:EA})})}({messageListToDelete:T},this._core),console.log(`${this._name}._deleteGroupAtTips ok. count:${g.length}`),this._clearGroupAtInfoList(n)}catch(u){console.error(`${this._name}._deleteGroupAtTips fail:`,u)}})}_clearGroupAtInfoList(n,r=!0){const g=NA.getLocalConversation(n);g&&(g.groupAtInfoList.length>0&&(g.clearGroupAtInfoList(),console.log(`${this._name}._clearGroupAtInfoList conversationID:${n} needEmitConversationUpdate:${r}`)),r&&NA.emitConversationListUpdate())}_getLocalMessageMaxTime(n){var r;const{conversationID:g}=n,u=this._core.message.messageDataHandler.getLocalMessageList(g),E=Math.max(...u.map(D=>D.time));let m=((r=n?.lastMessage)===null||r===void 0?void 0:r.lastTime)||0;return E>m&&(console.log(`${this._name}._getLocalMessageMaxTime update lastMessageTime from ${m} to ${E}`),m=E),m}_getLocalMessageMaxSequence(n){var r;const{conversationID:g}=n,u=this._core.message.messageDataHandler.getLocalMessageList(g),E=Math.max(...u.map(D=>D.sequence));let m=((r=n?.lastMessage)===null||r===void 0?void 0:r.lastSequence)||0;return E>m&&(console.log(`${this._name}._getLocalMessageMaxSequence update lastMessageSequence from ${m} to ${E}`),m=E),m}_setC2CMessageRead(n,r){return mA(this,void 0,void 0,function*(){try{yield function(g,u){return mA(this,void 0,void 0,function*(){return u.common.buildAndSendPacket({servcmd:"openim.msgreaded",data:g})})}({C2CMsgReaded:{Cookie:"",C2CMsgReadedItem:[{To_Account:n.replace("C2C",""),LastedMsgTime:r,Receipt:1}]}},this._core),console.log(`${this._name}._setC2CMessageRead ok, lastReadTime:${r}`),NA.markMessageAsRead({conversationID:n,lastReadTime:r}),NA.updateUnreadCount(n)}catch(g){throw console.warn(`${this._name}._setC2CMessageRead fail:`,g),g}})}_setGroupMessageRead(n,r){return mA(this,void 0,void 0,function*(){try{yield function(g,u){return mA(this,void 0,void 0,function*(){const{groupID:E,lastMessageSequence:m}=g,D={GroupId:E,MsgReadedSeq:m};return u.common.buildAndSendPacket({servcmd:"group_open_http_svc.msg_read_report",data:D})})}({groupID:n.replace("GROUP",""),lastMessageSequence:r},this._core),console.log(`${this._name}._setGroupMessageRead ok, lastReadSequence:${r}`),NA.markMessageAsRead({conversationID:n,lastReadSequence:r}),NA.updateUnreadCount(n)}catch(g){throw console.warn(`${this._name}._setGroupMessageRead fail:`,g),g}})}_shouldSetAllMessageRead(n){const{OuterConstant:{CONV_C2C:r,CONV_GROUP:g,READ_ALL_MSG:u,READ_ALL_C2C_MSG:E,READ_ALL_GROUP_MSG:m}}=this._core,{type:D,scope:v,unreadCount:T}=n;return!(T<=0)&&(!(D!==r||![u,E].includes(v))||!(D!==g||![u,m].includes(v)))}},Ee=new class{constructor(){this._name="PinConversation"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"pinConversation",context:this})}handleConversationPinned(n,r){const{utils:{isArray:g}}=this._core;if(!g(n))return;const{OuterConstant:u}=this._core;let E=!1;n.forEach(m=>{const{Type:D,Peer_Account:v,GroupId:T}=m;let P;D===1?P=NA.getLocalConversation(`${u.CONV_C2C}${v}`):D===2&&(P=NA.getLocalConversation(`${u.CONV_GROUP}${T}`)),P&&(console.log(`${this._name}.handleConversationPinned conversationID:${P.conversationID} localPinned:${P.isPinned} remotePinned:${r}`),r&&!P.isPinned&&(P.isPinned=!0,E=!0),!r&&P.isPinned&&(P.isPinned=!1,E=!0))}),E&&NA.emitConversationListUpdate(!0)}pinConversation(n){return mA(this,void 0,void 0,function*(){const{OuterConstant:r,common:g,helper:{ChatError:u}}=this._core,{conversationID:E,isPinned:m}=n,D={code:0,data:{conversationID:E}},v=NA.getLocalConversation(E);if(v&&v.isPinned===m)return D;if(Js(E))return v&&(v.isPinned=m),NA.emitConversationListUpdate(!0),D;const T=`conversationID:${E} isPinned:${m}`;try{let P=null;if(St(E)?P={Type:1,To_Account:E.replace(r.CONV_C2C,"")}:dg(E)&&(P={Type:2,GroupId:E.replace(r.CONV_GROUP,"")}),yield function(oA,EA){return mA(this,void 0,void 0,function*(){const{fromAccount:wA,operationType:kA,itemList:xA}=oA,LA={From_Account:wA,OperationType:kA,RecentContactItem:xA};return EA.common.buildAndSendPacket({servcmd:"recentcontact.top",data:LA})})}({fromAccount:g.getCurrentUserID(),operationType:m===!0?1:2,itemList:[P]},this._core)){if(v)v.isPinned!==m&&(v.isPinned=m);else{const oA=new yt({conversationID:E,type:St(E)?r.CONV_C2C:r.CONV_GROUP,isPinned:m});NA.setLocalConversation(E,oA)}NA.emitConversationListUpdate(!0)}return Object.assign(Object.assign({},D),{successLog:{message:T}})}catch(P){const{errorCode:W,errorInfo:oA}=P;throw new u({functionName:"pinConversation",code:W,message:oA,moreMessage:T})}})}},xe=new class{constructor(){this._name="DeleteConversation"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"deleteConversation",context:this})}handleConversationDeleted(n){const{utils:{isArray:r}}=this._core;if(!r(n))return;const{OuterConstant:g}=this._core,u=[];n.forEach(E=>{const{Type:m,Peer_Account:D,GroupId:v}=E;m===1&&u.push(`${g.CONV_C2C}${D}`),m===2&&u.push(`${g.CONV_GROUP}${v}`)}),console.log(`${this._name}.handleConversationDeleted conversationIDList:${u}`),this._deleteLocalConversationList(u)}deleteConversation(n){return mA(this,void 0,void 0,function*(){const{utils:{isString:r}}=this._core;if(r(n))return this._deleteConversation({conversationIDList:[n],flag:ua.ONLY_CONVERSATIONID});const g=Object.assign({},n);return g.conversationIDList.length>100&&(g.conversationIDList=g.conversationIDList.slice(0,100)),this._deleteConversation(g)})}_deleteConversation(n){return mA(this,void 0,void 0,function*(){const{conversationIDList:r,clearHistoryMessage:g=!0,flag:u=0}=n,{helper:{ChatError:E}}=this._core,m=`conversationIDList:${r} clearHistoryMessage:${g}`;try{const D=yield Promise.all([this._deleteConversationFromLocal(r),this._deleteConversationFromServer(r,g)]),v=[...D[0],...D[1]];if(v.length===0)throw new this._core.helper.ChatError({code:Da.CONV_NOT_FOUND});return{code:0,data:u===ua.ONLY_CONVERSATIONID?{conversationID:v[0]}:{conversationIDList:v},successLog:{message:m}}}catch(D){const{errorCode:v,errorInfo:T}=D;throw new E({code:v,message:T,moreMessage:m})}})}_deleteConversationFromLocal(n){const{OuterConstant:r}=this._core;return n.filter(g=>{var u;if(!NA.hasLocalConversation(g))return!1;const E=(u=NA.getLocalConversation(g))===null||u===void 0?void 0:u.type;return E!==r.CONV_GROUP||this._hasLocalGroup(g)?E===r.CONV_SYSTEM&&(this._deleteLocalConversation(g),!0):(this._deleteLocalConversation(g),!0)})}_deleteConversationFromServer(n,r){return mA(this,void 0,void 0,function*(){const{OuterConstant:g,common:u}=this._core,E={fromAccount:u.getCurrentUserID(),conversationList:[],clearHistoryMessage:r?1:0};if(n.forEach(D=>{var v;if(NA.hasLocalConversation(D)){const T=((v=NA.getLocalConversation(D))===null||v===void 0?void 0:v.type)||"",P=D.replace(T,"");T===g.CONV_C2C?E.conversationList.push({To_Account:P,Type:1}):T===g.CONV_GROUP&&this._hasLocalGroup(D)&&E.conversationList.push({ToGroupid:P,Type:2})}}),E.conversationList.length===0)return[];const m=yield function(D,v){return mA(this,void 0,void 0,function*(){const{fromAccount:T,conversationList:P,clearHistoryMessage:W}=D,oA={From_Account:T,ContactItem:P,ClearRamble:W};return v.common.buildAndSendPacket({servcmd:"recentcontact.batch_delete",data:oA})})}(E,this._core);if(m){const{ResultItem:D=[]}=m,v=[];return D.length>0&&D.forEach(T=>{if(T.ResultCode===0){const P=T.Type===1?`${g.CONV_C2C}${T.To_Account}`:`${g.CONV_GROUP}${T.ToGroupid}`;v.push(P)}}),this._deleteLocalConversationList(v),v}return[]})}_deleteLocalConversationList(n){let r=!1;n.forEach(g=>{NA.hasLocalConversation(g)&&(this._deleteLocalConversation(g,!1),r=!0)}),console.log(`${this._name}._deleteLocalConversationList isUpdate:${r}`),r&&NA.emitConversationListUpdate()}_deleteLocalConversation(n,r=!0){const g=NA.hasLocalConversation(n);console.log(`${this._name}._deleteLocalConversation conversationID:${n} has:${g}`),g&&(NA.deleteLocalConversation(n),this._deleteConversationLocalMessage(n),r&&NA.emitConversationListUpdate())}_hasLocalGroup(n){const{OuterConstant:{CONV_GROUP:r},appStore:{groupStore:g}}=this._core,u=n.replace(r,"");return!!g.getGroup(u)}_deleteConversationLocalMessage(n){console.log(`${this._name}._deleteConversationLocalMessage conversationID:${n}`),this._core.message.messageDataHandler.deleteConversationMessageList(n),this._core.message.messageHistory.completedHistoryConversations.delete(n)}},_t=new class{constructor(){this._name="SetConversationDraft"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"setConversationDraft",context:this})}setConversationDraft(n){return mA(this,void 0,void 0,function*(){const{conversationID:r,draftText:g}=n;if(console.log(`${this._name} conversationID:${r} draftText:${g}`),!NA.hasLocalConversation(r))throw new this._core.helper.ChatError({code:Da.CONV_NOT_FOUND});const u=NA.getLocalConversation(r);return u?.setDraftText(g),NA.emitConversationListUpdate(),{code:0,data:{conversation:u}}})}},ti=new class{constructor(){this._name="SetC2CMessageRemindType"}init(n){this._core=n}set(n,r){return mA(this,void 0,void 0,function*(){n.length>30&&(console.warn(`${this._name}.set userIDList length:${n.length} exceeds limit 30`),n.splice(30));const g=function(){const{MSG_REMIND_ACPT_AND_NOTE:P,MSG_REMIND_DISCARD:W,MSG_REMIND_ACPT_NOT_NOTE:oA}=yo.core.OuterConstant;return{[P]:0,[W]:1,[oA]:2}}()[r],u=yield function(P,W){return mA(this,void 0,void 0,function*(){const{userIDList:oA,receiveMessageOption:EA}=P,wA={Peer_Account:oA,Mute_Notifications:EA};return W.common.buildAndSendPacket({servcmd:"openim.set_c2c_peer_mute_notifications",data:wA})})}({userIDList:n,receiveMessageOption:g},this._core),{ErrorList:E=[]}=u||{},m=[];E.forEach(P=>{const{Peer_Account:W,ErrorCode:oA}=P;m.push({userID:W,code:oA});const EA=n.indexOf(W);EA>-1&&n.splice(EA,1)});const D=[],v=[],{OuterConstant:T}=this._core;return n.forEach(P=>{v.push(`${T.CONV_C2C}${P}`),D.push({userID:P})}),NA.patchMessageRemindType(v,r),{code:0,data:{successUserIDList:D,failureUserIDList:m}}})}},ui=new class{constructor(){this._name="SetGroupMessageRemindType"}init(n){this._core=n}set(n,r){return mA(this,void 0,void 0,function*(){const{common:{getCurrentUserID:g,isTopic:u},OuterConstant:E}=this._core;if(yield function(m,D){return mA(this,void 0,void 0,function*(){const{groupID:v,userID:T,receiveMessageOption:P}=m,W={GroupId:v,Member_Account:T,MsgFlag:P};return D.common.buildAndSendPacket({servcmd:"group_open_http_svc.modify_group_member_info",data:W})})}({groupID:n,userID:g(),receiveMessageOption:r},this._core),!u(n)){const m=`${E.CONV_GROUP}${n}`;NA.patchMessageRemindType([m],r)}return{code:0,data:{groupID:n,messageRemindType:r}}})}},Rt=new class{constructor(){this._name="SetMessageRemindType"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"setMessageRemindType",context:this})}handleC2CMessageRemindTypeSync(n){const{helper:{isEmpty:r},OuterConstant:g,ssoLog:u}=this._core;n.forEach(E=>{const{MuteNotificationsSync:m}=E;if(!r(m)){const{To_Account:D,MuteNotifications:v}=m,T=D.map(W=>`${g.CONV_C2C}${W}`),P=io(v);u.debug(`${this._name}.handleC2CMessageRemindTypeSync conversationIDList:${T} messageRemindType:${P}`),NA.patchMessageRemindType(T,P)}})}setMessageRemindType(n){return mA(this,void 0,void 0,function*(){const r="setMessageRemindType",{groupID:g,userIDList:u,messageRemindType:E}=n,{helper:m,utils:{isUndefined:D},ssoLog:v}=this._core;try{if(!D(g))return v.debug(`${this._name}.${r} groupID:${g} messageRemindType:${E}`),yield ui.set(g,E);if(!D(u))return v.debug(`${this._name}.${r} userIDList:${u} messageRemindType:${E}`),yield ti.set(u,E);throw new m.ChatError({functionName:r,message:"userIDList or groupID is required"})}catch(T){throw new m.ChatError({functionName:r,code:T?.errorCode,message:T?.errorInfo,moreMessage:`groupID:${g} userIDList:${u} messageRemindType:${E}`})}})}},fi=new class{init(n){n.ssoLog.debug("ConversationAction.init"),this._core=n,Ae.init(n),Ne.init(n),de.init(n),Ue.init(n),Ee.init(n),xe.init(n),_t.init(n),Rt.init(n);const{notificationCenter:r,InnerEvent:{MESSAGE_PUSH:g,DESTROY:u}}=this._core,{InnerEventSubType:{CONV_MODIFIED:E,C2C_MESSAGE_READ_SYNC:m,GROUP_MESSAGE_READ_SYNC:D,C2C_REMIND_TYPE_SYNC:v}}=r;r.subscribeInnerEvent(g,E,this._onConversationModified,this),r.subscribeInnerEvent(g,m,this._onC2CMessageReadSync,this),r.subscribeInnerEvent(g,v,this._onC2CMessageRemindTypeSync,this),r.subscribeInnerEvent(g,D,this._onGroupMessageReadSync,this),r.subscribeInnerEvent(u,this._dispose,this)}_onConversationModified(n){const{constants:{ConvModifyPushType:r}}=this._core,{RecentContactMod:g=[]}=n;g.forEach(u=>{const{PushType:E}=u;if(E===r.CONV_DELETED){const{RecentContactList:m}=u.RecentContactDeleteItem;xe.handleConversationDeleted(m)}if(E===r.CONV_PINED){const{RecentContactList:m}=u.RecentContactTopItem;Ee.handleConversationPinned(m,!0)}if(E===r.CONV_UNPINED){const{RecentContactList:m}=u.RecentContactTopItem;Ee.handleConversationPinned(m,!1)}})}_onC2CMessageReadSync(n){const{C2cNotifyMsgArray:r=[]}=n;Ue.handleC2CMessageReadSync(r)}_onC2CMessageRemindTypeSync(n){const{C2cNotifyMsgArray:r=[]}=n;Rt.handleC2CMessageRemindTypeSync(r)}_onGroupMessageReadSync(n){const{GroupTips:r=[]}=n;Ue.handleGroupMessageReadSync(r)}_dispose(){const{notificationCenter:n,InnerEvent:{MESSAGE_PUSH:r,DESTROY:g}}=this._core,{InnerEventSubType:{CONV_MODIFIED:u,C2C_MESSAGE_READ_SYNC:E,GROUP_MESSAGE_READ_SYNC:m,C2C_REMIND_TYPE_SYNC:D}}=n;n.unSubscribeInnerEvent(r,u,this._onConversationModified,this),n.unSubscribeInnerEvent(r,E,this._onC2CMessageReadSync,this),n.unSubscribeInnerEvent(r,D,this._onC2CMessageRemindTypeSync,this),n.unSubscribeInnerEvent(r,m,this._onGroupMessageReadSync,this),n.unSubscribeInnerEvent(g,this._dispose,this)}},go=new class{init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"setAllReceiveMessageOpt",context:this})}setAllReceiveMessageOpt(n){return mA(this,void 0,void 0,function*(){try{const{OuterConstant:{MSG_REMIND_ACPT_NOT_NOTE:r}}=this._core,{messageRemindType:g=r,isRepeated:u=!0}=n,{startTime:E=0,endTime:m=0}=this._calcStartAndEndTime(n),D=yield function(v){return mA(this,void 0,void 0,function*(){const{common:T}=yo.core,{startTime:P,endTime:W,isRepeated:oA,messageRemindType:EA}=v,wA={StartTime:P,EndTime:W,IsRepeated:oA,Level:EA};return T.buildAndSendPacket({servcmd:"im_msg_db_logic.ws_set_do_not_disturb",data:wA})})}({messageRemindType:this._getType(g),startTime:E,endTime:m,isRepeated:u?ls.ON:ls.OFF});return{code:0,data:{errorCode:D.ErrorCode,errorInfo:D.ErrorInfo}}}catch(r){ac("setAllReceiveMessageOpt",r)}})}_calcStartAndEndTime(n){const{startHour:r=0,startMinute:g=0,startSecond:u=0,duration:E=0,isRepeated:m=!0}=n,D=new Date,v=new Date(D.getFullYear(),D.getMonth(),D.getDate(),r,g,u),T=Math.round(v.getTime()/1e3);let P=T+E;return m&&E>=86400&&(P=T+86400),{startTime:T,endTime:P}}_getType(n){const{OuterConstant:r}=this._core;return{[r.MSG_REMIND_ACPT_AND_NOTE]:0,[r.MSG_REMIND_DISCARD]:1,[r.MSG_REMIND_ACPT_NOT_NOTE]:2}[n]}},ms=new class{init(n){this._core=n;const{helper:r,notificationCenter:g,InnerEvent:u}=n;r.registerApi({apiName:"getAllReceiveMessageOpt",context:this}),g.subscribeInnerEvent(u.MESSAGE_PUSH,g.InnerEventSubType.ALL_RECEIVE_MESSAGE_OPTION,this.onAllReceiveMsgOptionNotify,this)}onAllReceiveMsgOptionNotify(n){const r=this._handleResult(n),{notificationCenter:g,OuterEvent:{ALL_RECEIVE_MESSAGE_OPT_UPDATED:u}}=this._core;g.emitOuterEvent(u,{name:u,data:r})}getAllReceiveMessageOpt(){return mA(this,void 0,void 0,function*(){try{const n=yield function(){return mA(this,void 0,void 0,function*(){const{common:r}=yo.core,g={To_Account:r.getCurrentUserID()};return r.buildAndSendPacket({servcmd:"im_msg_db_logic.ws_get_do_not_disturb",data:g})})}();return{code:0,data:this._handleResult(n)}}catch(n){ac("getAllReceiveMessageOpt",n)}})}_handleResult(n){const{OuterConstant:r}=this._core,{MSG_REMIND_ACPT_AND_NOTE:g,MSG_REMIND_DISCARD:u,MSG_REMIND_ACPT_NOT_NOTE:E}=r,m={0:g,1:u,2:E},{Level:D,StartTime:v,EndTime:T,IsRepeated:P}=n;return{messageRemindType:m[D]||g,startTime:v,endTime:T,isRepeated:P===ls.ON}}},xo=new class{init(n){n.ssoLog.debug("ReceiveMessageOptions.init"),this._core=n,ti.init(n),ui.init(n),QA.init(n),yA.init(n),go.init(n),ms.init(n)}};const ai=n=>!St(n)&&!dg(n)&&!Js(n),xr={getConversationProfile:[{key:"conversationID",required:!0,rules:["string"],allowEmpty:!1,customValidator:n=>!ai(n)||"conversationID is invalid."}],setMessageRead:{conversationID:{required:!0,rules:["string"],allowEmpty:!1,customValidator:n=>!ai(n)||"conversationID is invalid."}},pinConversation:{conversationID:{required:!0,rules:["string"],allowEmpty:!1,customValidator:n=>!ai(n)||"conversationID is invalid."},isPinned:{required:!0,rules:["boolean"],allowEmpty:!1}},deleteConversation:[{key:"options",required:!0,rules:["string","object"],allowEmpty:!1,customValidator:n=>{const{core:{utils:{isArray:r,isObject:g,isString:u}}}=yo;if(!u(n)&&!g(n))return"options is String or Object.";if(u(n)&&ai(n))return"conversationID is invalid.";if(g(n)){if(!r(n.conversationIDList))return"conversationIDList is not Array.";if(n.conversationIDList.length===0)return"conversationIDList is empty.";if(n.conversationIDList.some(E=>{if(ai(E))return!0}))return"conversationIDList includes invalid conversationID.";if(n.clearHistoryMessage&&typeof n.clearHistoryMessage!="boolean")return"clearHistoryMessage is not Boolean."}return!0}}],setConversationDraft:{conversationID:{required:!0,rules:["string"],allowEmpty:!1,customValidator:n=>!(!St(n)&&!dg(n))||"conversationID is invalid."},draftText:{required:!0,rules:["string"],allowEmpty:!0}},setAllReceiveMessageOpt:{messageRemindType:{required:!1,rules:["string"],allowEmpty:!0},startHour:{required:!1,rules:["number"],allowEmpty:!0},startMinute:{required:!1,rules:["number"],allowEmpty:!0},startSecond:{required:!1,rules:["number"],allowEmpty:!0},duration:{required:!1,rules:["number"],allowEmpty:!0},isRepeated:{required:!1,rules:["boolean"],allowEmpty:!0}}},os={getConversationList:!0,getConversationProfile:!0,getTotalUnreadCount:!0,setMessageRead:!0,pinConversation:!0,deleteConversation:!0,setConversationDraft:!0,setMessageRemindType:!0,getAllReceiveMessageOpt:!0,setAllReceiveMessageOpt:!0};var er=new class{constructor(){this.name="Conversation"}install(n){yo.init(n),fi.init(n),xo.init(n),NA.init(n),n.helper.registerValidateConfig({auth:os,params:xr})}};const tr=new class{init(n){this.core=n}},sa="AVChatRoom",zr="AV_HISTORY_MSG",gc="GRP_COUNTER",Wu="Set",vm="Increase",Ni="Decrease",gi=0,_o=1,un=2,Is=["Type","Name","Introduction","Notification","FaceUrl","Owner_Account","CreateTime","InfoSeq","LastInfoTime","LastMsgTime","MemberNum","MaxMemberNum","ApplyJoinOption","NextMsgSeq","ShutUpAllMember","InviteJoinOption","LastRecallTime"],Cg=["Type","Name","Introduction","Notification","FaceUrl","CreateTime","Owner_Account","LastInfoTime","LastMsgTime","NextMsgSeq","MemberNum","MaxMemberNum","ApplyJoinOption","InviteJoinOption"],Jl=["Role","JoinTime","MsgFlag","MsgSeq"],yd=["Role","JoinTime","MsgSeq","MsgFlag","NameCard"],Yc=0,_r=1,_I="notStart",cu="resolved",xg="rejected",lu=10018,TI=11e3,Vc=2,zu=["Owner","Admin","Member"],Mm=["Role","JoinTime","NameCard","ShutUpUntil","OnlineStatus"],Rm=0,wm=1,_m=2,hD=4,BD=1,qM=2,QD=3,pD=4,KM=5,wT=1,Dd=0,_T=4,mD=6,TT=400,fD=300,NT={from:!0,groupID:!0,groupName:!0,to:!0},jM={from:!0,groupID:!0,groupName:!0,to:!0,type:!0},GT=2,WM=4,bT=5,kT=7,yD=8,DD=15,kQ=20,Tm=21,Nm=2600,Sd=2602,LT=2603,UT=2620,Gm=2621,SD=2623,dh=2660,FT=2661,OT=2681,bm=2683,zM=2684,vD=2685,km=2687,ZM=3122,PT=10018,xT={0:"DisableInvite",1:"NeedPermission",2:"FreeAccess"},XM=n=>n===tr.core.OuterConstant.GRP_PUBLIC,vd=n=>n===tr.core.OuterConstant.GRP_AVCHATROOM,Lm=(n,r)=>{const{isArray:g}=tr.core.utils;if(!g(n)||!g(r))return!1;let u=!1;return r.forEach(({key:E,value:m})=>{const D=n.find(v=>v.key===E);D?D.value!==m&&(D.value=m,u=!0):(n.push({key:E,value:m}),u=!0)}),u},Md=n=>{const r=[];if(!n)return r;for(let g=0,u=n.length;g{const r=[];for(let g=0,u=n.length;g0&&v.members.forEach(T=>{T.userID===this.selfInfo.userID&&D(this.selfInfo,T,["sequence"])})}updateSelfInfo(r){const{nameCard:g,joinTime:u,role:E,messageRemindType:m,readedSequence:D,excludedUnreadSequenceList:v}=r,{common:{deepMerge:T}}=tr.core;T(this.selfInfo,{nameCard:g,joinTime:u,role:E,messageRemindType:m,readedSequence:D,excludedUnreadSequenceList:v},[],["",null,void 0,0,NaN])}setSelfNameCard(r){this.selfInfo.nameCard=r}}var Wi=new class{constructor(){this._name="GroupDataHandler"}init(n){this._core=n;const{appStore:{groupStore:r}}=n;this._groupMap=r.getGroupMap()}hasLocalGroup(n){return this._groupMap.has(n)}getLocalGroup(n){return this._groupMap.get(n)}updateLocalGroup(n){const{common:{getCurrentUserID:r}}=this._core;let g;n.forEach(E=>{var m;g=E.groupID,this.hasLocalGroup(g)?(m=this.getLocalGroup(g))===null||m===void 0||m.updateGroup(E):(this._groupMap.set(g,new Zu(E)),this._clearGroupLocalMessage(g))});const u=r();for(const[,E]of this._groupMap)E.selfInfo.userID=u,E.selfInfo.role==="Owner"&&(E.ownerID=u)}deleteLocalGroup(n){this._groupMap.delete(n)}getLocalGroupList(){const{OuterConstant:{GRP_ROOM:n,GRP_LIVE:r}}=this._core;return[...this._groupMap.values()].filter(g=>{const{type:u}=g;return u!==n&&u!==r})}clearLocalGroup(){this._groupMap.clear()}emitGroupListUpdate(){const n=this.getLocalGroupList(),{OuterEvent:{GROUP_LIST_UPDATED:r},notificationCenter:g}=this._core;g.emitOuterEvent(r,{name:r,data:n})}updateConversationGroupProfile(n){const{appStore:{conversationStore:r},OuterConstant:{CONV_GROUP:g}}=this._core,u=`${g}${n}`,E=r.getConversation(u);if(E){const m=this.getLocalGroup(n);E.setProfileCompleted(),r.updateConversation(u,{groupProfile:m})}}reset(){this.clearLocalGroup()}_clearGroupLocalMessage(n){const{message:{messageHistory:r,messageDataHandler:g},OuterConstant:{CONV_GROUP:u},ssoLog:E}=this._core;E.debug("_clearGroupLocalMessage",`groupID:${n}`);const m=`${u}${n}`;r.completedHistoryConversations.delete(m),g.deleteConversationMessageList(m)}};function Fm(n,r){return mA(this,void 0,void 0,function*(){const{type:g,limit:u,offset:E,supportTopic:m=0,memberAccount:D,responseFilter:v}=n,T={Type:g,Limit:u,Offset:E,Member_Account:D,ResponseFilter:v,SupportTopic:m,NeedAppDefineData:1};return r.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_joined_group_list",data:T})})}const mn=function(n,r){return{code:0,data:n||{},successLog:r}};var $M=new class{constructor(){this._name="GetGroupList",this._pagingStatus=_I,this.PAGING_GRP_COUNT_LIMIT=200}init(n){this._core=n;const{helper:r,constants:{WORKFLOW_NAME:g,WORKFLOW_STEP:u}}=n;r.registerApi({apiName:"getGroupList",context:this}),r.registerWorkflowStep(g.SYNC_SERVER_INFO_AFTER_LOGIN,u.GROUP_LIST_SYNC,this._syncGroupList,this)}getGroupList(){return mA(this,arguments,void 0,function*(n=!1){if(n){const g=[];return yield this._pagingGetJoinedCommunityList({limit:this.PAGING_GRP_COUNT_LIMIT,offset:0,groupList:g}),Wi.updateLocalGroup(g),Wi.getLocalGroupList()}if(this._core.ssoLog.debug("getGroupList",`${this._name}.getGroupList pagingStatus:${this._pagingStatus}`),this._pagingStatus===xg||this._pagingStatus===_I)return this._syncGroupList().then(()=>{const g=Wi.getLocalGroupList();return mn({groupList:g,isSyncCompleted:this._isSyncCompleted()})}).catch(g=>{throw g});const r=Wi.getLocalGroupList();return mn({groupList:r,isSyncCompleted:this._isSyncCompleted()},{message:`return group count:${r.length}`})})}_syncGroupList(){return mA(this,void 0,void 0,function*(){this._pagingStatus===_I&&Wi.clearLocalGroup();const n=this.PAGING_GRP_COUNT_LIMIT,r=[];try{yield this._pagingGetGroupList({limit:n,offset:0,groupList:r}),this._pagingStatus=cu,this._groupListTreeShaking(r),Wi.updateLocalGroup(r);const g=Wi.getLocalGroupList();return this._core.ssoLog.debug("_syncGroupList",`${this._name}._syncGroupList ok, count:${g.length}`),Wi.emitGroupListUpdate(),g}catch(g){throw this._pagingStatus=xg,g}})}_pagingGetGroupList(n){return mA(this,void 0,void 0,function*(){const{ssoLog:r}=this._core,{isCommunityRelay:g=!1,groupList:u}=n;let E,{limit:m,offset:D}=n;const v=[...Is];g&&(E=this._core.OuterConstant.GRP_COMMUNITY,v.push("AtInfoList"));try{const T=yield Fm({type:E,limit:m,offset:D,memberAccount:this._core.store.get("login").userId,responseFilter:{GroupBaseInfoFilter:v,SelfInfoFilter:[...Jl]}},this._core),{GroupIdList:P=[],TotalCount:W=0}=T||{},oA=this._convertGroupKey(P);u.push(...oA);const EA=D+m,wA=!(W>EA),kA=`offset:${D} limit:${m} total:${W} isCompleted:${wA} current:${u.length} isCommunityRelay:${g}`;return r.debug("_pagingGetGroupList",`${this._name}._pagingGetGroupList ok. ${kA}`),g?wA?u:(D=EA,this._pagingGetGroupList({isCommunityRelay:!0,limit:m,offset:D,groupList:u})):wA?(r.debug("_pagingGetGroupList",`${this._name}._pagingGetGroupList start to get community list`),D=0,this._pagingGetGroupList({isCommunityRelay:!0,limit:m,offset:D,groupList:u})):(D=EA,this._pagingGetGroupList({limit:m,offset:D,groupList:u}))}catch(T){if(T.ErrorCode===lu)return r.warn("_pagingGetGroupList",`${this._name}._pagingGetGroupList response size exceeds the limit, request count:${m}`),m=50,this._pagingGetGroupList({isCommunityRelay:g,limit:m,offset:D,groupList:u});if(g)return T.code===TI&&r.debug("_pagingGetGroupList",`${this._name}._pagingGetGroupList ok. community unavailable`),u;throw T}})}_pagingGetJoinedCommunityList(n){return mA(this,void 0,void 0,function*(){const{common:{getCurrentUserID:r},OuterConstant:g,ssoLog:u}=this._core,{groupList:E}=n;let{limit:m,offset:D}=n;try{const v=yield Fm({limit:m,offset:D,type:g.GRP_COMMUNITY,memberAccount:r(),supportTopic:1,responseFilter:{GroupBaseInfoFilter:[...Is],SelfInfoFilter:[...Jl]}},this._core),{GroupIdList:T=[],TotalCount:P=0}=v||{},W=this._convertGroupKey(T);E.push(...W);const oA=D+m,EA=!(P>oA),wA=`offset:${D} limit:${m} total:${P} isCompleted:${EA} current:${E.length}`;return u.debug("_pagingGetJoinedCommunityList",`${this._name}._pagingGetJoinedCommunityList ok. ${wA}`),EA?E:(D=oA,this._pagingGetJoinedCommunityList({limit:m,offset:D,groupList:E}))}catch(v){if(v.code===PT)return u.warn("_pagingGetJoinedCommunityList",`${this._name}._pagingGetJoinedCommunityList response size exceeds the limit, request count:${m}`),m=50,this._pagingGetJoinedCommunityList({limit:m,offset:D,groupList:E});throw v}})}_groupListTreeShaking(n){const r=new Map([...Wi.getLocalGroupList()]);for(let u=0,E=n.length;u{const{AtFlagList:E,AtMsgSeq:m,From_Account:D}=u;g.push({groupID:n,groupAtType:E,sequence:m,from:D})}),g}},Xu=new class{constructor(){this._name="CreateGroup"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"createGroup",context:this})}createGroup(n){return mA(this,void 0,void 0,function*(){var r;this._preCheckParams(n);const{helper:{ChatError:g}}=this._core;try{const{utils:{isEmpty:u},common:{getCurrentUserID:E},OuterConstant:{GRP_AVCHATROOM:m}}=this._core,D=yield function(oA,EA){return mA(this,void 0,void 0,function*(){const{name:wA,type:kA,groupID:xA,introduction:LA,notification:SA,avatar:OA,maxMemberNum:WA,joinOption:ue,inviteOption:le,memberList:ki,groupCustomField:Li,isSupportTopic:Yt}=oA;let Fi,hs;ki&&(Fi=ki.map(Mt=>{const{userID:UA,memberCustomField:ci}=Mt;return{Member_Account:UA,AppMemberDefinedData:ci?VE(ci):void 0}})),Li&&(hs=VE(Li));const Re={Name:wA,Type:kA,GroupId:xA,Introduction:LA,Notification:SA,FaceUrl:OA,MaxMemberCount:WA,ApplyJoinOption:ue,InviteJoinOption:le,MemberList:Fi,AppDefinedData:hs,SupportTopic:Yt,webPushFlag:1};return EA.common.buildAndSendPacket({servcmd:"group_open_http_svc.create_group",data:Re})})}(Object.assign(Object.assign({},n),{ownerID:E()}),this._core),{GroupId:v,OverJoinedGroupLimit_Account:T=[]}=D||{},P=`${this._name}.createGroup ok, type:${n.type} groupID:${v} overLimitUserIDList:${T}`;if(u(n.memberList)||u(T)||(n.memberList=(r=n.memberList)===null||r===void 0?void 0:r.filter(oA=>T.includes(oA.userID))),n.type===m)return mn({group:new Zu(Object.assign(Object.assign({},n),{groupID:v}))},{message:P});Wi.updateLocalGroup([Object.assign(Object.assign({},n),{groupID:v})]);const W=Wi.getLocalGroup(v);return this._notNeedSendCustomMessage(n)||(this._sendCustomMessage(v,n.type),Wi.emitGroupListUpdate()),mn({group:W},{message:P})}catch(u){const{errorCode:E,errorInfo:m}=u;throw new g({functionName:"createGroup",code:E,message:m,moreMessage:` groupID:${n.groupID}`})}})}_preCheckParams(n){const{type:r,groupID:g}=n,{utils:{isEmpty:u,isUndefined:E},common:{isCommunity:m}}=this._core,D=!u(g);if(!(()=>{const{GRP_PUBLIC:v,GRP_WORK:T,GRP_MEETING:P,GRP_AVCHATROOM:W,GRP_COMMUNITY:oA}=tr.core.OuterConstant;return[v,T,P,W,oA]})().includes(r))throw new this._core.helper.ChatError({code:Nm});if(!m({type:r})){if(D&&m({groupID:g}))throw new this._core.helper.ChatError({code:Sd});E(n.isSupportTopic)||(n.isSupportTopic=void 0)}if(this._canIUseMemberList(r)||E(n.memberList)||(n.memberList=void 0),this._canIUseJoinOption(r)||E(n.joinOption)||(n.joinOption=void 0),m({type:r})){if(D&&!m({groupID:g}))throw new this._core.helper.ChatError({code:Sd});n.isSupportTopic=this._canIUseTopic(n)?1:0}}_canIUseMemberList(n){return!vd(n)}_canIUseJoinOption(n){return XM(n)||this._core.common.isCommunity({type:n})}_canIUseTopic(n){const{isSupportTopic:r}=n;return r===!0}_notNeedSendCustomMessage(n){const{type:r,isSupportTopic:g}=n,{OuterConstant:{GRP_AVCHATROOM:u,GRP_COMMUNITY:E}}=this._core;return r===u||r===E&&g===1}_sendCustomMessage(n,r){var g,u,E,m,D,v;const{OuterConstant:T,common:{t:P}}=this._core;let W=P("CREATE_GROUP"),oA=Yc;r===T.GRP_COMMUNITY&&(W=P("CREATE_COMMUNITY"),oA=_r);const EA={to:n,conversationType:"GROUP",payload:{data:JSON.stringify({businessID:"group_create",content:W,cmd:oA,opUser:this._core.store.get("login").userId,version:4})}},wA=(E=(u=(g=this._core)===null||g===void 0?void 0:g.message)===null||u===void 0?void 0:u.messageFactory)===null||E===void 0?void 0:E.createCustomMessage(EA);(v=(D=(m=this._core)===null||m===void 0?void 0:m.message)===null||D===void 0?void 0:D.messageSender)===null||v===void 0||v.sendMessage(wA,{})}},rn=new class{constructor(){this._name="AttributesDataHandler",this._groupAttributesCache=new Map,this._groupAttributesCacheValuesCopy={}}init(n){this._core=n;const{helper:r,constants:g}=n;r.registerWorkflowStep(g.WORKFLOW_NAME.SYNC_SERVER_INFO_AFTER_RE_ONLINE,g.WORKFLOW_STEP.GROUP_ATTRIBUTE_CACHE_CLEAR,this.clearLocalMainSequence,this)}clearLocalMainSequence(){this._groupAttributesCache.forEach(n=>{n.localMainSequence=0})}isGroupAttributesUpdated(n){const{elements:{newGroupProfile:r}}=n,{utils:{isEmpty:g,isUndefined:u}}=this._core;return!u(r)&&!g(r.groupAttributeOption)}handleGroupAttributesUpdated(n){const{groupID:r,groupAttributeOption:g}=n,{serverMainSequence:u,groupAttributeList:E=[],operation:m}=g;this._core.ssoLog.debug("handleGroupAttributesUpdated",`${this._name}.handleGroupAttributesUpdated groupID:${r} operation:${m}`);const{utils:{isUndefined:D}}=this._core;D(m)||(this.refreshGroupAttributesCache({groupID:r,serverMainSequence:u,groupAttributeList:E,operation:m}),this.emitGroupAttributesUpdated(r))}initGroupAttributesCache(n){const{groupID:r,avChatRoomKey:g}=n;this._groupAttributesCache.set(r,{lastUpdateTime:0,localMainSequence:0,serverMainSequence:0,avChatRoomKey:g,values:new Map}),this._core.ssoLog.debug("initGroupAttributesCache",`${this._name}.initGroupAttributesCache. groupID:${r} avChatRoomKey:${g}`)}hasGroupAttributesCache(n){return this._groupAttributesCache.has(n)}getGroupAttributesCache(n){return this.hasGroupAttributesCache(n)||this.initGroupAttributesCache({groupID:n}),this._groupAttributesCache.get(n)}deleteGroupAttributesCache(n){this.hasGroupAttributesCache(n)&&this._groupAttributesCache.delete(n)}refreshGroupAttributesCache(n){const{groupID:r,serverMainSequence:g,groupAttributeList:u,operation:E}=n;if(this.hasGroupAttributesCache(r)){const m=this.getGroupAttributesCache(r),{localMainSequence:D}=m;E!==KM&&g-D!==1||(m.serverMainSequence=g,m.localMainSequence=g,m.lastUpdateTime=Date.now(),this._updateGroupAttributesCacheValues({groupAttributes:m,groupAttributeList:u,operation:E})),g-D>1&&(m.serverMainSequence=g),this._groupAttributesCache.set(r,m),this._core.ssoLog.debug("refreshGroupAttributesCache",`${this._name}.refreshGroupAttributesCache. operation:${E} localMainSequence:${D} serverMainSequence:${g}`)}}_updateGroupAttributesCacheValues(n){const{groupAttributes:r,groupAttributeList:g=[],operation:u}=n;u!==QD?u!==pD?(u===BD&&r.values.clear(),g.forEach(E=>{const{key:m,value:D,sequence:v}=E;r.values.set(m,{value:D,sequence:v})})):g.forEach(E=>{r.values.delete(E.key)}):r.values.clear()}getGroupAttributesCacheValues(n){var r;const{groupID:g,keyList:u=[]}=n,E={};if(this.hasGroupAttributesCache(g)){const{values:m}=this.getGroupAttributesCache(g);if(u.length===0){for(const D of m.keys())E[D]=((r=m.get(D))===null||r===void 0?void 0:r.value)||"";return E}return u.forEach(D=>{var v;m.has(D)&&(E[D]=((v=m.get(D))===null||v===void 0?void 0:v.value)||"")}),E}return E}saveGroupAttributesCacheValuesCopy(n){this._groupAttributesCacheValuesCopy=this.getGroupAttributesCacheValues({groupID:n})}emitGroupAttributesUpdated(n){var r,g;const{OuterConstant:{GRP_ROOM:u,GRP_LIVE:E}}=this._core,m=this.getGroupAttributesCacheValues({groupID:n}),D=this._core.appStore.groupStore.getGroup(n),{updatedKeyList:v,deletedKeyList:T}=this._computeValuesChangedData(m);v.length===0&&T.length===0||([u,E].includes(D.type)?(this._core.ssoLog.debug("RICH_STATUS_CHANGED",`${this._name}.emitRichStatusChanged update count:${v.length}, delete count:${T.length}`),this._emitEvent({name:(r=this._core)===null||r===void 0?void 0:r.OuterEvent.RICH_STATUS_CHANGED,data:{groupID:n,richStatus:m,updatedKeyList:v,deletedKeyList:T}})):(this._core.ssoLog.debug("emitGroupAttributesUpdated",`${this._name}.emitGroupAttributesUpdated update count:${v.length}, delete count:${T.length}`),this._emitEvent({name:(g=this._core)===null||g===void 0?void 0:g.OuterEvent.GROUP_ATTRIBUTES_UPDATED,data:{groupID:n,groupAttributes:m,updatedKeyList:v,deletedKeyList:T}})))}_computeValuesChangedData(n){const{utils:{isUndefined:r}}=this._core,g=[],u=[];return Object.keys(n).forEach(E=>{n[E]!==this._groupAttributesCacheValuesCopy[E]&&g.push(E)}),Object.keys(this._groupAttributesCacheValuesCopy).forEach(E=>{r(n[E])&&u.push(E)}),this._groupAttributesCacheValuesCopy={},{updatedKeyList:g,deletedKeyList:u}}_emitEvent(n){var r;(r=this._core)===null||r===void 0||r.notificationCenter.emitOuterEvent(n.name,n)}convertKeyValueMapToList(n){const r=[];return Object.keys(n).forEach(g=>{r.push({key:g,value:n[g]})}),r}reset(){this._groupAttributesCache.clear(),this._groupAttributesCacheValuesCopy={}}},hh=new class{constructor(){this._name="DismissGroup"}init(n,r){this._core=n;const{helper:g}=n;g.registerApi({apiName:"dismissGroup",context:this,matcher:()=>!r.getInstalledSubPlugins().includes(sa)})}dismissGroup(n){return mA(this,void 0,void 0,function*(){const{helper:{ChatError:r}}=this._core;try{yield function(u,E){return mA(this,void 0,void 0,function*(){const m={GroupId:u};return E.common.buildAndSendPacket({servcmd:"group_open_http_svc.destroy_group",data:m})})}(n,this._core);const{type:g}=Wi.getLocalGroup(n);return Wi.deleteLocalGroup(n),Wi.emitGroupListUpdate(),rn.deleteGroupAttributesCache(n),mn({groupID:n,type:g},{message:n})}catch(g){const{errorCode:u,errorInfo:E}=g;throw new r({functionName:"dismissGroup",code:u,message:E})}})}},Hl=new class{constructor(){this._name="GetGroupProfile"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"getGroupProfile",context:this})}getGroupProfile(n){return mA(this,void 0,void 0,function*(){const{groupID:r,groupCustomFieldFilter:g}=n,u={groupIDList:[r],responseFilter:{GroupBaseInfoFilter:[...Is],AppDefinedDataFilter_Group:g,MemberInfoFilter:[...yd]}},{helper:{ChatError:E}}=this._core;try{const m=yield this.getGroupProfileAdvance(u),{successGroupList:D,failureGroupList:v}=m;if(v.length>0)throw v[0];let T;return!Wi.hasLocalGroup(r)&&vd(D[0].type)?T=new Zu(D[0]):(Wi.updateLocalGroup(D),T=Wi.getLocalGroup(r)),T.isSupportTopic||Wi.updateConversationGroupProfile(r),mn({group:T},{message:`groupID:${r}`})}catch(m){const{code:D,message:v}=m;throw new E({functionName:"getGroupProfile",code:D,message:v})}})}getGroupProfileAdvance(n){return mA(this,void 0,void 0,function*(){const{groupIDList:r}=n,{common:{isCommunity:g}}=this._core,u=r.filter(T=>!g({groupID:T})),E=r.filter(T=>g({groupID:T}));u.length>50&&(u.length=50),E.length>50&&(E.length=50);const m=yield Promise.all([this._getGroupProfileAdvance(Object.assign(Object.assign({},n),{groupIDList:u})),this._getGroupProfileAdvance(Object.assign(Object.assign({},n),{groupIDList:E,isCommunityProfile:!0}))]),D=[],v=[];return m.forEach(T=>{D.push(...T.successGroupList),v.push(...T.failureGroupList)}),{successGroupList:D,failureGroupList:v}})}_getGroupProfileAdvance(n){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{isUndefined:g}}=this._core,{isCommunityProfile:u=!1}=n,E=vo(n,["isCommunityProfile"]);if(E.groupIDList.length===0)return{successGroupList:[],failureGroupList:[]};try{const m=yield function(W,oA){return mA(this,void 0,void 0,function*(){const{groupIDList:EA,responseFilter:wA}=W,kA={GroupIdList:EA,ResponseFilter:wA};return oA.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_group_self_member_info",data:kA})})}(E,this._core),{GroupInfo:D=[]}=m||{},v=this._convertGroupProfileKey(D),T=v.filter(W=>g(W.errorCode)||W.errorCode===0),P=v.filter(W=>W.errorCode&&W.errorCode!==0).map(W=>({code:W.errorCode,message:W.errorInfo,data:{groupID:W.groupID}}));return r.debug("_getGroupProfileAdvance",`${this._name}._getGroupProfileAdvance ok, groupID:${E.groupIDList.join(",")}`),{successGroupList:T,failureGroupList:P}}catch(m){if(u)return{successGroupList:[],failureGroupList:[]};throw m}})}_convertGroupProfileKey(n){const r=[];for(let g=0,u=n.length;g0&&u{const{Key:T,Value:P=0}=v;E.set(T,P)}),this._groupCountersMap.set(r,{lastUpdateTime:Date.now(),groupCounterSeq:u,counters:E,avChatRoomKey:m})}}initGroupCountersCache(n){const{groupID:r,avChatRoomKey:g}=n;this._groupCountersMap.set(r,{lastUpdateTime:0,groupCounterSeq:0,counters:new Map,avChatRoomKey:g})}getLocalCounters(n,r){const g={};if(!this._hasLocalGroupCounters(n))return g;const{counters:u}=this.getLocalGroupCounters(n);if(r.length>0)r.forEach(E=>{u.has(E)&&(g[E]=u.get(E))});else for(const E of u.keys())g[E]=u.get(E);return g}deleteLocalGroupCounters(n){const{groupID:r,counterList:g=[],groupCounterSeq:u}=n;if(this._hasLocalGroupCounters(r)){const{counters:E,avChatRoomKey:m}=this.getLocalGroupCounters(r);g.forEach(D=>{E.delete(D.key)}),this._groupCountersMap.set(r,{lastUpdateTime:Date.now(),groupCounterSeq:u,counters:E,avChatRoomKey:m})}}setGroupCounters(n,r){if(!this._hasLocalGroupCounters(n))return;const g=this.getLocalGroupCounters(n),{counters:u}=g;let E=!1;Object.entries(r).forEach(([m,D])=>{u.has(m)&&u.get(m)!==D&&(u.set(m,D),E=!0)}),E&&this._groupCountersMap.set(n,Object.assign(Object.assign({},g),{lastUpdateTime:Date.now(),counters:u}))}_hasLocalGroupCounters(n){return this._groupCountersMap.has(n)}reset(){this._groupCountersMap.clear()}},JE=new class{constructor(){this._name="JoinGroup"}init(n,r){this._core=n;const{helper:g}=n;g.registerApi({apiName:"joinGroup",context:this,matcher:()=>!r.getInstalledSubPlugins().includes(sa)})}joinGroup(n){return mA(this,void 0,void 0,function*(){const{groupID:r}=n,{helper:{ChatError:g},OuterConstant:u,ssoLog:E}=this._core;try{if(Wi.hasLocalGroup(r))try{return yield Hl.getGroupProfile({groupID:r}),mn({status:u.JOIN_STATUS_ALREADY_IN_GROUP,group:Wi.getLocalGroup(r)},{message:`groupID:${r} joinedStatus:${u.JOIN_STATUS_ALREADY_IN_GROUP}`})}catch{return E.warn("joinGroup",`${this._name}.joinGroup ${r} was unjoined, start to join!`),Wi.deleteLocalGroup(r),yield this._applyJoinGroup(n)}return yield this._applyJoinGroup(n)}catch(m){const{errorCode:D,errorInfo:v}=m;throw new g({functionName:"joinGroup",code:D,message:v,moreMessage:`groupID:${r}`})}})}_applyJoinGroup(n){return mA(this,void 0,void 0,function*(){const{OuterConstant:r,helper:g,ssoLog:u}=this._core,{groupID:E}=n,m=Object.assign({},n),D=g.checkBusinessCapabilityBits(zr);D&&(m.historyMessageFlag=1);const v=yield function(SA,OA){return mA(this,void 0,void 0,function*(){const{groupID:WA,applyMessage:ue,historyMessageFlag:le}=SA,ki={GroupId:WA,ApplyMsg:ue,HugeGroupHistoryMsgFlag:le};return OA.common.buildAndSendPacket({servcmd:"group_open_http_svc.apply_join_group",data:ki})})}(m,this._core),{Type:T,JoinedStatus:P,LongPollingKey:W,StartSeq:oA,HugeGroupFlag:EA,AVChatRoomKey:wA,RspMsgList:kA=[]}=v||{},xA=`groupID:${E} joinedStatus:${P} longPollingKey:${W} startSeq:${oA} avChatRoomFlag:${EA} canGetAVChatRoomHistoryMsg:${D}, historyMessageCount:${kA.length}`;u.debug("_applyJoinGroup",`${this._name}._applyJoinGroup ok, ${xA}`);let LA=new Zu({groupID:E,type:T});if(P===r.JOIN_STATUS_WAIT_APPROVAL)return mn({status:r.JOIN_STATUS_WAIT_APPROVAL,group:LA});if(P===r.JOIN_STATUS_SUCCESS){try{LA=(yield Hl.getGroupProfile({groupID:E})).data.group}catch(SA){u.warn("_applyJoinGroup",`${this._name}._applyJoinGroup getGroupProfile failed, groupID: ${E}, errorCode:${SA?.code}`)}return this._handleJoinResult({group:LA,avChatRoomFlag:EA,longPollingKey:W,startSequence:oA,avChatRoomKey:wA,historyMessageList:kA})}throw new this._core.helper.ChatError({code:dh})})}_handleJoinResult(n){const{group:r,avChatRoomFlag:g,avChatRoomKey:u}=n;return g===1?(rn.initGroupAttributesCache({groupID:r.groupID,avChatRoomKey:u}),cc.initGroupCountersCache({groupID:r.groupID,avChatRoomKey:u}),mn(n)):(Wi.updateLocalGroup([r]),Wi.emitGroupListUpdate(),mn({status:this._core.OuterConstant.JOIN_STATUS_SUCCESS,group:r},{message:`groupID:${r.groupID}`}))}},LQ=new class{constructor(){this._name="QuitGroup"}init(n,r){this._core=n;const{helper:g}=n;g.registerApi({apiName:"quitGroup",context:this,matcher:()=>!r.getInstalledSubPlugins().includes(sa)})}quitGroup(n){return mA(this,void 0,void 0,function*(){if(!Wi.hasLocalGroup(n))throw new this._core.helper.ChatError({code:SD});const{helper:{ChatError:r}}=this._core;try{yield function(u,E){return mA(this,void 0,void 0,function*(){const m={GroupId:u};return E.common.buildAndSendPacket({servcmd:"group_open_http_svc.quit_group",data:m})})}(n,this._core);const{type:g}=Wi.getLocalGroup(n);return Wi.deleteLocalGroup(n),Wi.emitGroupListUpdate(),rn.deleteGroupAttributesCache(n),mn({groupID:n,type:g},{message:`groupID:${n}`})}catch(g){const{errorCode:u,errorInfo:E}=g;throw new r({functionName:"quitGroup",code:u,message:E,moreMessage:`groupID:${n}`})}})}},uB=new class{constructor(){this._name="SearchGroup"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"searchGroupByID",context:this})}searchGroupByID(n){return mA(this,void 0,void 0,function*(){try{const r=yield function(OA,WA){return mA(this,void 0,void 0,function*(){const ue={GroupIdList:[OA],GroupBasePublicInfoFilter:[...Cg]};return WA.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_group_public_info",data:ue})})}(n,this._core),{GroupInfo:g=[]}=r||{},{AppDefinedData:u=[],ApplyJoinOption:E,CreateTime:m,FaceUrl:D,Introduction:v,InviteJoinOption:T,MaxMemberNum:P,MemberNum:W,Name:oA,Owner_Account:EA,Type:wA,ErrorCode:kA,ErrorInfo:xA}=g[0];if(kA!==0)throw new this._core.helper.ChatError({code:kA,message:xA});const LA=Md(u),SA=new Zu({groupID:n,name:oA,avatar:D,introduction:v,joinOption:E,inviteOption:T,maxMemberCount:P,memberCount:W,type:wA,ownerID:EA,createTime:m,groupCustomField:LA});return mn({group:SA})}catch(r){const{errorCode:g,errorInfo:u}=r;throw new this._core.helper.ChatError({functionName:"searchGroupByID",code:g,message:u})}})}},YT=new class{constructor(){this._name="UpdateGroupProfile"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"updateGroupProfile",context:this})}updateGroupProfile(n){return mA(this,void 0,void 0,function*(){const{groupID:r}=n,{utils:{isUndefined:g,safeStringify:u},ssoLog:E,helper:m}=this._core;let D=Wi.getLocalGroup(r);if(D){const{type:v}=D;this._canIUseJoinOption(v)||g(n.joinOption)||(E.warn("updateGroupProfile",`${this._name}.updateGroupProfile groupID:${r} joinOption is unavailable for Work/Meeting/AVChatRoom`),n.joinOption=void 0)}g(n.muteAllMembers)||(n.muteAllMembers=n.muteAllMembers===!0?"On":"Off");try{return yield function(v,T){return mA(this,void 0,void 0,function*(){const{groupID:P,name:W,avatar:oA,introduction:EA,notification:wA,muteAllMembers:kA,joinOption:xA,inviteOption:LA,groupCustomField:SA}=v,OA={GroupId:P,Name:W,FaceUrl:oA,Introduction:EA,Notification:wA,ShutUpAllMember:kA,ApplyJoinOption:xA,InviteJoinOption:LA,AppDefinedData:SA?VE(SA):void 0};return T.common.buildAndSendPacket({servcmd:"group_open_http_svc.modify_group_base_info",data:OA})})}(n,this._core),D?(D.updateGroup(n),Wi.emitGroupListUpdate()):D=new Zu(n),mn({group:D},{message:`groupID:${r}`})}catch(v){const{errorCode:T,errorInfo:P}=v;throw new m.ChatError({code:T,message:P,moreMessage:`options:${u(n)}`})}})}_canIUseJoinOption(n){return XM(n)||this._core.common.isCommunity({type:n})}},VT=new class{constructor(){this._name="ChangeGroupOwner"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"changeGroupOwner",context:this})}changeGroupOwner(n){return mA(this,void 0,void 0,function*(){const r="changeGroupOwner",{groupID:g,newOwnerID:u}=n,E=Wi.getLocalGroup(g),{helper:m,OuterConstant:D,common:{getCurrentUserID:v}}=this._core;if(E?.type===D.GRP_AVCHATROOM)throw new m.ChatError({functionName:r,code:UT});if(u===v())throw new m.ChatError({functionName:r,code:Gm});try{return yield function(T,P){return mA(this,void 0,void 0,function*(){const{groupID:W,newOwnerID:oA}=T,EA={GroupId:W,NewOwner_Account:oA};return P.common.buildAndSendPacket({servcmd:"group_open_http_svc.change_group_owner",data:EA})})}(n,this._core),E.ownerID=u,Wi.emitGroupListUpdate(),mn({group:E})}catch(T){throw new m.ChatError({functionName:r,code:T?.errorCode,message:T?.errorInfo})}})}},UQ=new class{constructor(){this._name="GetGroupOnlineMemberCount",this._onlineMemberCountMap=new Map}init(n,r){this._core=n;const{helper:g}=n;g.registerApi({apiName:"getGroupOnlineMemberCount",context:this,matcher:()=>!r.getInstalledSubPlugins().includes(sa)})}getGroupOnlineMemberCount(n){return mA(this,void 0,void 0,function*(){const r="getGroupOnlineMemberCount";if(!Wi.hasLocalGroup(n))return mn({memberCount:0});const g=Date.now();if(this._onlineMemberCountMap.has(n)){const u=this._onlineMemberCountMap.get(n),{lastReqTime:E=0,memberCount:m=0}=u||{};if(g-E<=6e4)return mn({memberCount:m})}try{const u=yield function(D,v){return mA(this,void 0,void 0,function*(){const T={GroupId:D};return v.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_online_member_num",data:T})})}(n,this._core),{OnlineMemberNum:E=0}=u||{};this._onlineMemberCountMap.set(n,{lastReqTime:Date.now(),memberCount:E});const m=`${this._name}.${r} ok. groupID:${n} memberCount:${E}`;return mn({memberCount:E},{message:m})}catch(u){throw new this._core.helper.ChatError({functionName:r,code:u?.errorCode,message:u?.errorInfo})}})}},FQ=new class{init(n,r){n.ssoLog.debug("GroupAction.init"),$M.init(n),Xu.init(n),hh.init(n,r),JE.init(n,r),LQ.init(n,r),uB.init(n),Hl.init(n),YT.init(n),VT.init(n),UQ.init(n,r)}dismissGroup(n){return hh.dismissGroup(n)}joinGroup(n){return JE.joinGroup(n)}quitGroup(n){return LQ.quitGroup(n)}getGroupOnlineMemberCount(n){return UQ.getGroupOnlineMemberCount(n)}},AR=new class{constructor(){this._name="GetGroupApplicationList"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"getGroupApplicationList",context:this})}getGroupApplicationList(){return mA(this,void 0,void 0,function*(){const n="getGroupApplicationList";try{const r=yield Promise.all([this._getGroupApplicationList(),this._getGroupApplicationList({type:this._core.OuterConstant.GRP_COMMUNITY})]);this._core.ssoLog.debug("getGroupApplicationList",`${this._name}.${n} ok.`);const g=this._handleGroupApplicationResult([...r[0],...r[1]]);return mn({applicationList:g})}catch(r){throw new this._core.helper.ChatError({functionName:n,code:r?.errorCode,message:r?.errorInfo})}})}_getGroupApplicationList(n){return mA(this,void 0,void 0,function*(){const{type:r,startTime:g=0,limit:u=20}=n||{},{common:E}=this._core;let m;try{m=yield function(P,W){return mA(this,void 0,void 0,function*(){const{type:oA,startTime:EA,limit:wA,handleAccount:kA}=P,xA={Type:oA,StartTime:EA,Limit:wA,Handle_Account:kA};return W.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_pendency",data:xA})})}({type:r,startTime:g,limit:u,handleAccount:E.getCurrentUserID()},this._core)}catch(P){if(P?.errorCode!==11e3)throw P;m={}}const{NextStartTime:D=0,PendencyList:v=[]}=m||{};if(D===0)return v;const T=yield this._getGroupApplicationList(Object.assign(Object.assign({},n),{startTime:D}));return[...v,...T]})}_handleGroupApplicationResult(n){const r=[];return n.forEach(g=>{const u=this._convertApplicationData(g),{handled:E}=u,m=vo(u,["handled"]);E===0&&r.push(m)}),r}_convertApplicationData(n){const{Handled:r,AddTime:g,ApplyInviteMsg:u,Authentication:E,FromUserNickName:m,From_Account:D,GroupId:v,GroupName:T,PendencyType:P,To_Account:W}=n;return{handled:r,messageKey:g,applicant:D,applicantNick:m,groupID:v,groupName:T,authentication:E,applicationType:P,userID:W,note:u,addTime:g}}},eR=new class{constructor(){this._name="HandleGroupApplication"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"handleGroupApplication",context:this})}handleGroupApplication(n){return mA(this,void 0,void 0,function*(){const{application:r}=n,g=this._handleParams(n);try{r?.applicationType===Vc?yield function(E,m){return mA(this,void 0,void 0,function*(){const{groupID:D,handleAction:v,handleMessage:T,applicant:P,authentication:W,invitee:oA}=E,EA={GroupId:D,HandleMsg:v,ApprovalMsg:T,Applicant_Account:P,Authentication:W,Invited_Account:oA};return m.common.buildAndSendPacket({servcmd:"group_open_http_svc.handle_invite_join_permission_group",data:EA})})}(g,this._core):yield function(E,m){return mA(this,void 0,void 0,function*(){const{groupID:D,handleAction:v,handleMessage:T,applicant:P,authentication:W,messageKey:oA}=E,EA={GroupId:D,HandleMsg:v,ApprovalMsg:T,Applicant_Account:P,Authentication:W,MsgKey:oA};return m.common.buildAndSendPacket({servcmd:"group_open_http_svc.handle_apply_join_group",data:EA})})}(g,this._core);const u=Wi.getLocalGroup(g.groupID);return mn({group:u})}catch(u){throw new this._core.helper.ChatError({functionName:"handleGroupApplication",code:u?.errorCode,message:u?.errorInfo})}})}_handleParams(n){var r;const{handleAction:g,handleMessage:u,message:E,application:m}=n;let D,v,T,P,W;if(E){const{payload:oA}=E||{};D=oA.operatorID,v=(r=oA.groupProfile)===null||r===void 0?void 0:r.groupID,T=oA.authentication,P=oA.messageKey}else D=m?.applicant||"",v=m?.groupID||"",T=m?.authentication||"",P=m?.messageKey||0;return m?.applicationType===Vc&&(W=m.userID),{handleAction:g,handleMessage:u,applicant:D,invitee:W,groupID:v,authentication:T,messageKey:P}}},MD=new class{init(n){n.ssoLog.debug("GroupApplication.init"),AR.init(n),eR.init(n)}};let MC=class{constructor(n){this.userID="",this.avatar="",this.nick="",this.role="",this.joinTime="",this.nameCard="",this.muteUntil=0,this.memberCustomField=[],this.isOnline=!1,this.updateMember(n)}updateMember(n){const{core:{utils:{isUndefined:r},common:{deepMerge:g}}}=tr;r(n.muteTime)||(this.muteUntil=Math.floor((Date.now()+1e3*n.muteTime)/1e3)),r(n.onlineStatus)||(this.isOnline=n.onlineStatus==="Online");const u=[null,void 0,"",0,NaN];n.memberCustomField&&Lm(this.memberCustomField,n.memberCustomField),g(this,n,["memberCustomField","marks","onlineStatus","muteTime"],u)}};function EB(n,r){return mA(this,void 0,void 0,function*(){const{groupID:g,userID:u,muteTime:E,role:m,nameCard:D,memberCustomField:v}=n;let T;v&&(T=VE(v));const P={GroupId:g,Member_Account:u,ShutUpTime:E,Role:m,NameCard:D,AppMemberDefinedData:T};return r.common.buildAndSendPacket({servcmd:"group_open_http_svc.modify_group_member_info",data:P})})}var RD=new class{constructor(){this._name="GetGroupMemberList"}init(n,r){this._core=n;const{helper:g}=n;g.registerApi({apiName:"getGroupMemberList",context:this,matcher:()=>!r.getInstalledSubPlugins().includes(sa)})}getGroupMemberList(n){return mA(this,void 0,void 0,function*(){const r="getGroupMemberList",{groupID:g,offset:u=0,count:E=100,role:m="",filter:D=""}=n,v=Wi.getLocalGroup(g),T=E>100?100:E,P={groupID:g,offset:u,limit:T,memberRoleFilter:zu.includes(m)?[m]:void 0,memberInfoFilter:Mm};try{const W=yield function(le,ki){return mA(this,void 0,void 0,function*(){const{isCommunity:Li}=ki.common,{groupID:Yt,offset:Fi,limit:hs,memberRoleFilter:Re,memberInfoFilter:Mt}=le,UA={GroupId:Yt,Limit:hs,MemberRoleFilter:Re,MemberInfoFilter:Mt};return Li({groupID:Yt})?UA.Next=String(Fi):UA.Offset=Fi,ki.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_group_member_info",data:UA})})}(P,this._core),{MemberList:oA,MemberNum:EA,Next:wA}=W||{},kA=`${this._name}.${r} ok, totalMemberCount:${EA} next:${wA}`,{utils:{isArray:xA,isEmpty:LA},common:{isCommunity:SA}}=this._core;if(v&&(v.memberCount=EA),!xA(oA)||oA.length===0)return mn({memberList:[],offset:0},{message:kA});let OA=u+T;SA({groupID:g})&&(OA=LA(wA)?0:wA),oA.lengthD.userID),u=yield(r=this._core.user.userProfile)===null||r===void 0?void 0:r.getUserProfile({userIDList:g}),E=u?.data||[],m=new Map(E.map(D=>[D.userID,D]));return n.forEach(D=>{if(m.has(D.userID)){const{nick:v="",avatar:T=""}=m.get(D.userID);D.nick=v,D.avatar=T}}),n})}_generateGroupMember(n){const r=[];for(let g=0,u=n.length;g50&&(T.warn("getGroupMemberProfile",`${this._name}.${r} userIDList length:${u.length} exceeds limit 50`),u.splice(50));const P=`userIDList length:${u.length} groupID:${g}`;try{const W=yield function(kA,xA){return mA(this,void 0,void 0,function*(){const{groupID:LA,userIDList:SA,memberInfoFilter:OA,memberCustomFieldFilter:WA}=kA,ue={GroupId:LA,Member_List_Account:SA,MemberInfoFilter:OA,AppDefinedDataFilter_GroupMember:WA};return xA.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_specified_group_member_info",data:ue})})}({groupID:g,userIDList:u,memberCustomFieldFilter:E,memberInfoFilter:[...Mm]},this._core),{MemberList:oA}=W||{};if(!v(oA)||oA.length===0)return mn({memberList:[]});let EA=this._convertMemberInfo(oA);EA=yield this._getMemberAvatarAndNick(EA);const wA=this._generateGroupMember(EA);return mn({memberList:wA},{message:P})}catch(W){throw new D.ChatError({functionName:r,code:W?.errorCode,message:W?.errorInfo,moreMessage:P})}})}_convertMemberInfo(n){const r=[];for(let g=0,u=n.length;gD.userID),u=yield(r=this._core.user.userProfile)===null||r===void 0?void 0:r.getUserProfile({userIDList:g}),E=u?.data||[],m=new Map(E.map(D=>[D.userID,D]));return n.forEach(D=>{if(m.has(D.userID)){const{nick:v="",avatar:T=""}=m.get(D.userID);D.nick=v,D.avatar=T}}),n})}_generateGroupMember(n){const r=[];for(let g=0,u=n.length;g({Member_Account:v}));try{const v=yield function(wA,kA){return mA(this,void 0,void 0,function*(){const{groupID:xA,userIDList:LA}=wA,SA={GroupId:xA,MemberList:LA};return kA.common.buildAndSendPacket({servcmd:"group_open_http_svc.add_group_member",data:SA})})}({groupID:g,userIDList:D},this._core),{MemberList:T=[]}=v||{},{failureUserIDList:P,successUserIDList:W,existedUserIDList:oA,overLimitUserIDList:EA}=this._handleResult(T);return mn({failureUserIDList:P,successUserIDList:W,existedUserIDList:oA,overLimitUserIDList:EA,group:E},{message:` groupID:${g} successUserIDList:${W} failureUserIDList:${P} existedUserIDList:${oA} overLimitUserIDList:${EA}`})}catch(v){throw new m.ChatError({functionName:r,code:v?.errorCode,message:v?.errorInfo})}})}_handleResult(n){const r=[],g=[],u=[],E=[];return n.forEach(m=>{const{Result:D,Member_Account:v}=m;D===Rm?r.push(v):D===wm?g.push(v):D===_m?u.push(v):D===hD&&E.push(v)}),{failureUserIDList:r,successUserIDList:g,existedUserIDList:u,overLimitUserIDList:E}}},wd=new class{constructor(){this._name="DeleteGroupMember"}init(n,r){this._core=n;const{helper:g}=n;g.registerApi({apiName:"deleteGroupMember",context:this,matcher:()=>!r.getInstalledSubPlugins().includes(sa)})}deleteGroupMember(n){return mA(this,void 0,void 0,function*(){const r="deleteGroupMember",{groupID:g,userIDList:u}=n,E=Wi.getLocalGroup(g),{helper:m,utils:{isUndefined:D},ssoLog:v}=this._core;if(D(E))throw new m.ChatError({functionName:r,code:LT});u.length>20&&(v.warn("deleteGroupMember",`${this._name}.${r} userIDList length:${u.length} exceeds limit 20`),u.splice(20));try{return yield function(T,P){return mA(this,void 0,void 0,function*(){const{groupID:W,userIDList:oA,reason:EA}=T,wA={GroupId:W,MemberToDel_Account:oA,Reason:EA};return P.common.buildAndSendPacket({servcmd:"group_open_http_svc.delete_group_member",data:wA})})}({groupID:g,userIDList:u},this._core),mn({group:E,userIDList:u},{message:`groupID:${g} userIDList length:${u.length}`})}catch(T){throw new m.ChatError({functionName:r,code:T?.errorCode,message:T?.errorInfo})}})}},tR=new class{constructor(){this._name="SetGroupMemberMuteTime"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"setGroupMemberMuteTime",context:this})}setGroupMemberMuteTime(n){return mA(this,void 0,void 0,function*(){const{helper:r}=this._core,{groupID:g,userID:u,muteTime:E}=n,m=` groupID:${g} userID:${u} muteTime:${E}`;this._preCheckSettingMuteParams(n);try{yield EB(n,this._core);const D=Wi.getLocalGroup(g),v=new MC({userID:u,muteTime:E});return mn({group:D,member:v},{message:m})}catch(D){throw new r.ChatError({functionName:"setGroupMemberMuteTime",code:D?.errorCode,message:D?.errorInfo,moreMessage:m})}})}_preCheckSettingMuteParams(n){const{userID:r}=n,{store:g,helper:u}=this._core;if(r===g.get("login").userId)throw new u.ChatError({functionName:"setGroupMemberMuteTime",code:vD})}},PQ=new class{constructor(){this._name="SetGroupMemberRole"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"setGroupMemberRole",context:this})}setGroupMemberRole(n){return mA(this,void 0,void 0,function*(){const r="setGroupMemberRole",{helper:g}=this._core,{groupID:u,userID:E,role:m}=n,D=`${this._name}.${r} ok, groupID:${u} userID:${E} role:${m}`;this._preCheckSettingRoleParams(n);try{yield EB(n,this._core);const v=Wi.getLocalGroup(u),T=new MC({userID:E,role:m});return mn({group:v,member:T},{message:D})}catch(v){throw new g.ChatError({functionName:r,code:v?.errorCode,message:v?.errorInfo,moreMessage:D})}})}_preCheckSettingRoleParams(n){var r;const{groupID:g,userID:u,role:E}=n,{store:m,helper:D,OuterConstant:v,common:{isCommunity:T}}=this._core,P=Wi.getLocalGroup(g);if(((r=P?.selfInfo)===null||r===void 0?void 0:r.role)!==v.GRP_MBR_ROLE_OWNER)throw new D.ChatError({functionName:"setGroupMemberRole",code:OT});if(u===m.get("login").userId)throw new D.ChatError({functionName:"setGroupMemberRole",code:zM});const W=[...zu];if(T({groupID:g})&&W.push(v.GRP_MBR_ROLE_CUSTOM),!W.includes(E))throw new D.ChatError({functionName:"setGroupMemberRole",code:bm})}},wD=new class{constructor(){this._name="SetGroupMemberNameCard"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"setGroupMemberNameCard",context:this})}setGroupMemberNameCard(n){return mA(this,void 0,void 0,function*(){var r;const g="setGroupMemberNameCard",{helper:u,common:{getCurrentUserID:E}}=this._core,{groupID:m,userID:D=E(),nameCard:v}=n,T=`${this._name}.${g} ok, groupID:${m} userID:${D} nameCard:${v}`;this._preCheckSettingNameCardParams(n);try{yield EB({groupID:m,userID:D,nameCard:v},this._core);const W=Wi.getLocalGroup(m);D===((r=W?.selfInfo)===null||r===void 0?void 0:r.userID)&&(W.updateSelfInfo({nameCard:v}),Wi.emitGroupListUpdate(),Wi.updateConversationGroupProfile(m));const oA=new MC({userID:D,nameCard:v});return mn({group:W,member:oA},{message:T})}catch(P){throw new u.ChatError({functionName:g,code:P?.errorCode,message:P?.errorInfo,moreMessage:T})}})}_preCheckSettingNameCardParams(n){const{groupID:r}=n,{helper:g}=this._core,u=Wi.getLocalGroup(r);if(vd(u?.type))throw new g.ChatError({functionName:"setGroupMemberNameCard",code:km})}},Om=new class{constructor(){this._name="SetGroupMemberCustomField"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"setGroupMemberCustomField",context:this})}setGroupMemberCustomField(n){return mA(this,void 0,void 0,function*(){const r="setGroupMemberCustomField",{helper:g,common:{getCurrentUserID:u}}=this._core;this._preCheckSettingCustomFiledParams(n);const{groupID:E,userID:m=u(),memberCustomField:D}=n,v=`${this._name}.${r} ok, groupID:${E}userID:${m} memberCustomField:${JSON.stringify(D)}`;try{yield EB({groupID:E,userID:m,memberCustomField:D},this._core);const P=Wi.getLocalGroup(E),W=new MC({userID:m,memberCustomField:D});return mn({group:P,member:W},{message:v})}catch(T){throw new g.ChatError({functionName:r,code:T?.errorCode,message:T?.errorInfo,moreMessage:v})}})}_preCheckSettingCustomFiledParams(n){const{groupID:r}=n,{helper:g}=this._core,u=Wi.getLocalGroup(r);if(vd(u?.type))throw new g.ChatError({functionName:"setGroupMemberCustomField",code:km})}},iR=new class{init(n,r){n.ssoLog.debug("GroupMember.init"),RD.init(n,r),OQ.init(n),Rd.init(n),wd.init(n,r),tR.init(n),PQ.init(n),wD.init(n),Om.init(n)}getGroupMemberList(n){return RD.getGroupMemberList(n)}deleteGroupMember(n){return wd.deleteGroupMember(n)}},JT=new class{init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"getGroupCounters",context:this})}getGroupCounters(n){return mA(this,void 0,void 0,function*(){const r="getGroupCounters";try{Um(r,gc);const{groupID:g,keyList:u=[]}=n,{avChatRoomKey:E,lastUpdateTime:m}=cc.getLocalGroupCounters(g);if(!(Date.now()-m>=this._getExpireTime()))return{code:0,data:{counters:cc.getLocalCounters(g,u)}};const D=yield function(P){return mA(this,void 0,void 0,function*(){const{groupID:W,GroupCounterKeys:oA,avChatRoomKey:EA}=P,{common:wA}=tr.core,kA={GroupId:W,keyList:oA,BytesKey:EA};return wA.buildAndSendPacket({servcmd:"group_open_http_svc.get_group_counter",data:kA})})}({groupID:g,keyList:u,avChatRoomKey:E}),{GroupCounter:v=[],GroupCounterSeq:T}=D;return cc.updateLocalGroupCounters({groupID:g,counterList:v,groupCounterSeq:T}),{code:0,data:{counters:cc.getLocalCounters(g,u)}}}catch(g){vC(r,g)}})}_getExpireTime(){const{store:n,utils:{isUndefined:r}}=this._core,g=n.get("cloudConfig")||{},{grp_counter_expire_time:u}=g;return r(u)?3e4:Number(u)}},Pm=new class{init(n){const{helper:r}=n;r.registerApi({apiName:"setGroupCounters",context:this}),r.registerApi({apiName:"increaseGroupCounter",context:this}),r.registerApi({apiName:"decreaseGroupCounter",context:this})}setGroupCounters(n){return mA(this,void 0,void 0,function*(){return this._handleCounterOperation(Wu,n)})}increaseGroupCounter(n){return mA(this,void 0,void 0,function*(){return this._handleCounterOperation(vm,n)})}decreaseGroupCounter(n){return mA(this,void 0,void 0,function*(){return this._handleCounterOperation(Ni,n)})}_handleCounterOperation(n,r){return mA(this,void 0,void 0,function*(){const g=`${n}GroupCounter`;try{Um(g,gc);const{groupID:u,key:E,value:m=0}=r,{avChatRoomKey:D}=cc.getLocalGroupCounters(u),v=n===Wu?this._convertObjectToList(r.counters):[{Key:E,Value:m}],T=yield this._updateGroupCounters({groupID:u,counterList:v,avChatRoomKey:D,mode:n});return cc.setGroupCounters(u,T),{code:0,data:{counters:T}}}catch(u){vC(g,u)}})}_updateGroupCounters(n){return mA(this,void 0,void 0,function*(){const r=yield function(E){const{groupID:m,counterList:D,mode:v,avChatRoomKey:T}=E,{common:P}=tr.core,W={GroupId:m,GroupCounter:D,Mode:v,BytesKey:T};return P.buildAndSendPacket({servcmd:"group_open_http_svc.update_group_counter",data:W})}(n),{GroupCounter:g=[]}=r,u={};return g.forEach(E=>{const{Key:m,Value:D=0}=E;u[m]=D}),u})}_convertObjectToList(n){return Object.entries(n).map(([r,g])=>({Key:r,Value:g||0}))}},dB=new class{init(n){this._core=n,JT.init(n),Pm.init(n)}isGroupCounterUpdated(n){const{elements:{groupCounterInfo:r}}=n,{utils:{isEmpty:g}}=this._core;return!g(r)}handleGroupCounterUpdated(n){const{to:r,elements:{groupCounterInfo:g}}=n;g.forEach(u=>{const{type:E,groupCounterSeq:m,counterList:D=[]}=u;E!==gi&&E!==un||this._processAndNotifyCounterUpdate(r,m,D),E===_o&&cc.deleteLocalGroupCounters({groupID:r,groupCounterSeq:m,counterList:D})})}_processAndNotifyCounterUpdate(n,r,g){const{OuterEvent:u,notificationCenter:E}=this._core;cc.updateLocalGroupCounters({groupID:n,groupCounterSeq:r,counterList:g}),g.forEach(({Key:m,Value:D=0})=>{E.emitOuterEvent(u.GROUP_COUNTER_UPDATED,{name:u.GROUP_COUNTER_UPDATED,data:{groupID:n,key:m,value:D}})})}reset(){cc.reset()}},xm=new class{constructor(){this._name="InitGroupAttributes"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"initGroupAttributes",context:this})}initGroupAttributes(n){return mA(this,void 0,void 0,function*(){const{groupID:r,groupAttributes:g}=n,{serverMainSequence:u,avChatRoomKey:E}=rn.getGroupAttributesCache(r),m=rn.convertKeyValueMapToList(g);try{const D=yield function(W,oA){return mA(this,void 0,void 0,function*(){const{groupID:EA,mainSequence:wA,groupAttributeList:kA,avChatRoomKey:xA}=W,LA={GroupId:EA,AttrMainSeq:wA,GroupAttr:kA,BytesKey:xA,AttrControl:["RaceConflict"]};return oA.common.buildAndSendPacket({servcmd:"group_open_http_svc.set_group_attr",data:LA})})}({groupID:r,avChatRoomKey:E,groupAttributeList:m,mainSequence:u},this._core),{AttrMainSeq:v,GroupAttr:T}=D||{},P=T.map(W=>{const{Key:oA,seq:EA}=W;return{key:oA,value:g[oA],sequence:EA}});return rn.saveGroupAttributesCacheValuesCopy(r),rn.refreshGroupAttributesCache({groupID:r,serverMainSequence:v,groupAttributeList:P,operation:BD}),rn.emitGroupAttributesUpdated(r),mn({groupAttributes:g},{message:` groupID:${r} serverMainSequence:${v}`})}catch(D){throw new this._core.helper.ChatError({functionName:"initGroupAttributes",code:D?.errorCode,message:D?.errorInfo})}})}},HT=new class{constructor(){this._name="SetGroupAttributes"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"setGroupAttributes",context:this}),r.registerExperimentalAPI("setRichStatus",this)}setGroupAttributes(n){return mA(this,void 0,void 0,function*(){const{groupID:r,groupAttributes:g,richStatusMode:u}=n,{serverMainSequence:E,avChatRoomKey:m,values:D}=rn.getGroupAttributesCache(r),v=rn.convertKeyValueMapToList(g).map(T=>{var P;const{key:W,value:oA}=T;return{key:W,value:oA,seq:((P=D.get(T.key))===null||P===void 0?void 0:P.sequence)||0}});try{const T=yield function(EA,wA){return mA(this,void 0,void 0,function*(){const{groupID:kA,mainSequence:xA,groupAttributeList:LA,avChatRoomKey:SA,richStatusMode:OA}=EA,WA={GroupId:kA,AttrMainSeq:xA,GroupAttr:LA,BytesKey:SA,AttrControl:["RaceConflict"],AllowRoomEngineOpt:OA};return wA.common.buildAndSendPacket({servcmd:"group_open_http_svc.modify_group_attr",data:WA})})}({groupID:r,avChatRoomKey:m,groupAttributeList:v,mainSequence:E,richStatusMode:u},this._core),{AttrMainSeq:P,GroupAttr:W}=T||{},oA=W.map(EA=>{const{Key:wA,seq:kA}=EA;return{key:wA,value:g[wA],sequence:kA}});return rn.saveGroupAttributesCacheValuesCopy(r),rn.refreshGroupAttributesCache({groupID:r,serverMainSequence:P,groupAttributeList:oA,operation:qM}),rn.emitGroupAttributesUpdated(r),mn({groupAttributes:g},{message:` groupID:${r} serverMainSequence:${P}`})}catch(T){throw new this._core.helper.ChatError({functionName:"setGroupAttributes",code:T?.errorCode,message:T?.errorInfo})}})}setRichStatus(n){return mA(this,void 0,void 0,function*(){const{groupID:r,richStatus:g}=n;return this.setGroupAttributes({groupID:r,groupAttributes:g,richStatusMode:!0})})}},_D=new class{constructor(){this._name="DeleteGroupAttributes"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"deleteGroupAttributes",context:this}),r.registerExperimentalAPI("deleteRichStatus",this)}deleteGroupAttributes(n){return mA(this,void 0,void 0,function*(){const r="deleteGroupAttributes",{groupID:g,keyList:u=[],richStatusMode:E}=n;try{let m;m=u.length===0?yield this._clearGroupAttributes(g,{richStatusMode:E}):yield this._deleteGroupAttributes(g,{keyList:u,richStatusMode:E});const{resultList:D,serverMainSequence:v,operation:T,groupAttributeList:P}=m||{},W=`${this._name}.${r} ok. groupID:${g} operation: ${T}`;return rn.saveGroupAttributesCacheValuesCopy(g),rn.refreshGroupAttributesCache({groupID:g,serverMainSequence:v,groupAttributeList:P,operation:T}),rn.emitGroupAttributesUpdated(g),mn({keyList:D},{message:W})}catch(m){throw new this._core.helper.ChatError({functionName:r,code:m?.errorCode,message:m?.errorInfo})}})}deleteRichStatus(n){return mA(this,void 0,void 0,function*(){return this.deleteGroupAttributes(Object.assign(Object.assign({},n),{richStatusMode:!0}))})}_deleteGroupAttributes(n,r){return mA(this,void 0,void 0,function*(){const{serverMainSequence:g,avChatRoomKey:u,values:E}=rn.getGroupAttributesCache(n),{keyList:m,richStatusMode:D}=r,v=[],T=[];m.forEach(oA=>{if(E.has(oA)){const{sequence:EA=0}=E.get(oA)||{};T.push({key:oA,seq:EA}),v.push(oA)}});const P=yield function(oA,EA){return mA(this,void 0,void 0,function*(){const{groupID:wA,mainSequence:kA,groupAttributeList:xA,avChatRoomKey:LA,richStatusMode:SA}=oA,OA={GroupId:wA,AttrMainSeq:kA,GroupAttr:xA,BytesKey:LA,AttrControl:["RaceConflict"],AllowRoomEngineOpt:SA};return EA.common.buildAndSendPacket({servcmd:"group_open_http_svc.delete_group_attr",data:OA})})}({groupID:n,avChatRoomKey:u,groupAttributeList:T,mainSequence:g,richStatusMode:D},this._core),{AttrMainSeq:W}=P||{};return{resultList:v,serverMainSequence:W,groupAttributeList:T,operation:pD}})}_clearGroupAttributes(n,r){return mA(this,void 0,void 0,function*(){const{serverMainSequence:g,avChatRoomKey:u,values:E}=rn.getGroupAttributesCache(n),{richStatusMode:m}=r||{},D=[...E.keys()],v=yield function(P,W){return mA(this,void 0,void 0,function*(){const{groupID:oA,mainSequence:EA,avChatRoomKey:wA,richStatusMode:kA}=P,xA={GroupId:oA,AttrMainSeq:EA,BytesKey:wA,AttrControl:["RaceConflict"],AllowRoomEngineOpt:kA};return W.common.buildAndSendPacket({servcmd:"group_open_http_svc.clear_group_attr",data:xA})})}({groupID:n,avChatRoomKey:u,mainSequence:g,richStatusMode:m},this._core),{AttrMainSeq:T}=v||{};return{resultList:D,serverMainSequence:T,operation:QD}})}},TD=new class{constructor(){this._name="GetGroupAttributes"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"getGroupAttributes",context:this}),r.registerExperimentalAPI("getRichStatus",this,"getGroupAttributes")}getGroupAttributes(n){return mA(this,void 0,void 0,function*(){const{groupID:r}=n,{avChatRoomKey:g,lastUpdateTime:u,localMainSequence:E,serverMainSequence:m}=rn.getGroupAttributesCache(r),{helper:{ChatError:D}}=this._core,v=`groupID:${r} localMainSequence:${E} serverMainSequence:${m} keyList:${n.keyList}`;if(Date.now()-u>=3e4||E{const{key:oA,value:EA,seq:wA}=W;return{key:oA,value:EA,sequence:wA}});return rn.refreshGroupAttributesCache({groupID:u,serverMainSequence:v,groupAttributeList:P,operation:KM}),{serverGroupAttributeList:T}})}},xQ=new class{init(n){n.ssoLog.debug("GroupAttribute.init"),xm.init(n),HT.init(n),_D.init(n),TD.init(n),rn.init(n)}isGroupAttributesUpdated(n){return rn.isGroupAttributesUpdated(n)}handleGroupAttributesUpdated(n){const{to:r,elements:{newGroupProfile:g}}=n,{groupAttributeOption:u}=g,{serverMainSequence:E,withChangedAttributeInfo:m}=u,{localMainSequence:D}=rn.getGroupAttributesCache(r),v=E-D;if(console.log(`GroupAttribute.handleGroupAttributesUpdated groupID:${r} withChangedAttributeInfo:${m} diffSequence:${v}`),v!==0)if(rn.saveGroupAttributesCacheValuesCopy(r),m!==1||v!==1){if(rn.hasGroupAttributesCache(r)){const{avChatRoomKey:T}=rn.getGroupAttributesCache(r);TD.getGroupAttributesFromServer({groupID:r,avChatRoomKey:T}).then(()=>{rn.emitGroupAttributesUpdated(r)}).catch(()=>{})}}else rn.handleGroupAttributesUpdated({groupID:r,groupAttributeOption:u})}reset(){rn.reset()}};function HE(n,r="tips"){const{ClientSeq:g,From_Account:u,MsgClientTime:E,MsgPriority:m,MsgRandom:D,MsgSeq:v,MsgTimeStamp:T,TinyId:P,ToGroupId:W,GroupInfo:oA,MsgBody:EA}=n,wA=function(kA){const{GroupCode:xA,GroupId:LA,GroupName:SA,GroupType:OA,MsgFrom_AccountExtraInfo:WA,From_Account:ue,To_Account:le}=kA;return{groupCode:xA,groupID:LA,groupName:SA,type:OA,messageFromAccountExtraInformation:WA,from:ue,to:le}}(oA);return{clientSequence:g,from:u,clientTime:E,priority:m,random:D,sequence:v,time:T,tinyID:P,to:W,groupProfile:wA,elements:r==="tips"?$u(EA):Bh(EA)}}function $u(n){const r={};return Object.keys(n).forEach(g=>{var u,E;switch(g){case"MemberNum":r.memberCount=n[g];break;case"OpType":r.operationType=n[g];break;case"Operator_Account":r.operatorID=n[g];break;case"List_Account":r.userIDList=n[g];break;case"MsgMemberExtraInfo":r.memberInfoList=(u=n[g])===null||u===void 0?void 0:u.map(m=>ND(m));break;case"MsgOperatorMemberExtraInfo":r.operatorInfo=ND(n[g]);break;case"MsgGroupNewInfo":r.newGroupProfile=function(m){const D={};return Object.keys(m).forEach(v=>{switch(v){case"GroupIntroduction":D.introduction=m[v];break;case"GroupName":D.groupName=m[v];break;case"GroupFaceUrl":D.avatar=m[v];break;case"GroupNotification":D.notification=m[v];break;case"ApplyJoinOption":D.joinOption=m[v];break;case"InviteJoinOption":D.inviteOption=m[v];break;case"ShutupAll":D.muteAllMembers=m[v];break;case"Owner_Account":D.ownerID=m[v];break;case"GroupAttrOption":D.groupAttributeOption=function(P){const{BytesChangedKeys:W,GroupAttrSeq:oA,OpType:EA,PushChangedAttrValFlag:wA,GroupAttrInfo:kA}=P,xA=kA.map(LA=>{const{Key:SA,Val:OA,SubKeySeq:WA}=LA;return{key:SA,value:OA,sequence:WA}});return{changedKeyList:W,groupAttributeList:xA,serverMainSequence:oA,operation:EA,withChangedAttributeInfo:wA}}(m[v]);break;case"MsgAppDefinedData":D.groupCustomField=(T=m[v])==null?void 0:T.map(P=>({key:P.Key,value:P.Value}));break;case"InviteOption":D.inviteOption=xT[m[v]]||m[v]}var T}),D}(n[g]);break;case"MsgMemberInfo":r.msgMemberInfo=(E=n[g])===null||E===void 0?void 0:E.map(m=>function(D){const{ShutupTime:v,User_Account:T}=D;return{muteTime:v,userID:T}}(m));break;case"OnlineMemberInfo":r.onlineMemberInfo=function(m){const{ExpireTime:D,OnlineMemberNum:v}=m;return{expireTime:D,onlineMemberNum:v}}(n[g]);break;case"GroupCounterInfo":r.groupCounterInfo=function(m){return m.map(D=>{const{GroupCounterSeq:v,GroupCounter:T,Type:P}=D;return{type:P,groupCounterSeq:v,counterList:T}})}(n[g])}}),r}function ND(n){const{ImageUrl:r,NickName:g,Role:u,UserId:E}=n;return{avatar:r,nick:g,role:u,userID:E}}function Bh(n){const r={};return Object.keys(n).forEach(g=>{switch(g){case"MsgKey":r.messageKey=n[g];break;case"Operator_Account":r.operatorID=n[g];break;case"ReportType":r.operationType=n[g];break;case"Authentication":r.authentication=n[g];break;case"MsgFlag":r.messageRemindType=n[g];break;case"UserDefinedField":r.userDefinedField=n[g];break;case"RemarkInfo":r.remarkInfo=n[g];break;case"BanDuration":r.duration=n[g];break;case"MuteTime":r.muteTime=n[g];break;case"MsgMemberExtraInfoList":r.inviteeInfoList=(u=n[g]||[])==null?void 0:u.map(E=>{const{UserId:m,ImageUrl:D,NickName:v}=E;return{userID:m,avatar:D,nick:v}});break;case"MemberList_Account":r.inviteeList=n[g]}var u}),r}class Ym{constructor(r){this.type=tr.core.OuterConstant.MSG_GRP_TIP,this.content={},this._initContent(r)}static parseServerPushElement(r){const g=$u(r);return new Ym(g)}_initContent(r){Object.keys(r).forEach(g=>{switch(g){case"groupProfile":this._initGroupProfile(r[g]);break;case"operatorInfo":this._initOperatorInfo(r[g]);break;case"memberInfoList":case"msgMemberInfo":this._updateMemberList(r[g]);break;case"newGroupProfile":this._initNewGroupProfile(r[g]);break;case"memberExtraInfo":case"remarkInfo":case"onlineMemberInfo":break;default:this.content[g]=r[g]}}),this.content.userIDList||(this.content.userIDList=[this.content.operatorID])}_initGroupProfile(r){this.content.groupProfile={};const g=Object.keys(r);for(let u=0;u{r.forEach(u=>{g.userID===u.userID&&Object.assign(g,u)})}):this.content.memberList=r}_initNewGroupProfile(r){this.content.newGroupProfile={};const g=Object.keys(r);for(let u=0;u0&&this._handleGroupTipMessage(g),{conversationUpdateFieldList:u,messageList:g}}_emitGroupTipsEvent(n){var r;const{constants:{WORKFLOW_STEP:g}}=this._core,{messageList:u=[]}=((r=n?.result)===null||r===void 0?void 0:r[g.HANDLE_GROUP_TIPS_NOTIFICATION])||{};if(u.length>0){const{notificationCenter:E,OuterEvent:m}=this._core;E.emitOuterEvent(m.MESSAGE_RECEIVED,{name:m.MESSAGE_RECEIVED,data:u})}}_handleGroupTips(n,r=!0){const{Event:g,GroupTips:u}=n,E=new Map,m=[],D=[];for(let v=0,T=u.length;v{const{operationType:u}=g.payload;switch(u){case r.JOINED:this._handleNewMemberJoined(g);break;case r.QUITTED:this._handleMemberQuitted(g);break;case r.KICKED:this._handleMemberKicked(g);break;case r.GROUP_PROFILE_UPDATED:this._handleGroupProfileUpdated(g);break;case r.ADMIN_SET:this._handleMemberGrantAdmin(g);break;case r.ADMIN_CANCELED:this._handleMemberRevokeAdmin(g)}})}_handleNewMemberJoined(n){this._handleGroupMemberCountUpdated(n)}_handleMemberQuitted(n){this._handleGroupMemberCountUpdated(n)}_handleMemberKicked(n){this._handleGroupMemberCountUpdated(n)}_handleGroupProfileUpdated(n){var r;const{newGroupProfile:g,groupProfile:u,operatorInfo:E}=n.payload,{groupID:m}=u,D=Wi.getLocalGroup(m);Object.keys(g).forEach(T=>{switch(T){case"ownerID":this._handleGroupOwnerChanged(m,g);break;case"groupName":D.name=g[T];break;case"groupCustomField":Array.isArray(D[T])&&Array.isArray(g[T])?Lm(D[T],g[T]):D[T]=g[T];break;default:D[T]=g[T]}});const{utils:{isUndefined:v}}=this._core;v(E)||((r=D?.selfInfo)===null||r===void 0?void 0:r.userID)!==E.userID||Object.keys(E).forEach(T=>{T==="nameCard"&&D.updateSelfInfo({nameCard:E[T]}),T==="role"&&this._updateSelfRole(D,E[T])}),Wi.emitGroupListUpdate(),Wi.updateConversationGroupProfile(m)}_handleGroupOwnerChanged(n,r){const{common:g,OuterConstant:u}=this._core,E=Wi.getLocalGroup(n),m=g.getCurrentUserID(),{ownerID:D}=r;m===D&&E.updateGroup({ownerID:D,selfInfo:{role:u.GRP_MBR_ROLE_OWNER}})}_updateSelfRole(n,r){const{OuterConstant:g}=this._core;let u=g.GRP_MBR_ROLE_MEMBER;r===TT?u=g.GRP_MBR_ROLE_OWNER:r===fD&&(u=g.GRP_MBR_ROLE_ADMIN),n.updateSelfInfo({role:u})}_handleGroupMemberCountUpdated(n){const{memberCount:r,groupProfile:{groupID:g}}=n.payload,u=Wi.getLocalGroup(g),{utils:{isNumber:E}}=this._core;u&&E(r)&&u.memberCount!==r&&(u.memberCount=r,Wi.emitGroupListUpdate(),Wi.updateConversationGroupProfile(g))}_handleGroupTipsRecover(n){const{utils:{isArray:r}}=this._core,{groupTipList:g}=n?.result||{};r(g)&&g.forEach(u=>{const{messageList:E}=this._handleGroupTips({Event:u.Event,GroupTips:[u]},!1);this._handleGroupTipMessage(E)})}_handleMemberGrantAdmin(n){const{OuterConstant:r}=this._core,{groupProfile:g,userIDList:u}=n.payload,E=this._core.common.getCurrentUserID(),{groupID:m}=g,D=Wi.getLocalGroup(m);D&&u.includes(E)&&(D.updateSelfInfo({role:r.GRP_MBR_ROLE_ADMIN}),Wi.emitGroupListUpdate(),Wi.updateConversationGroupProfile(m))}_handleMemberRevokeAdmin(n){const{OuterConstant:r}=this._core,{groupProfile:g,userIDList:u}=n.payload,E=this._core.common.getCurrentUserID(),{groupID:m}=g,D=Wi.getLocalGroup(m);D&&u.includes(E)&&(D.updateSelfInfo({role:r.GRP_MBR_ROLE_MEMBER}),Wi.emitGroupListUpdate(),Wi.updateConversationGroupProfile(m))}};class YQ{constructor(r){this.type=tr.core.OuterConstant.MSG_GRP_SYS_NOTICE,this.content={},this._initContent(r)}static parseServerPushElement(r){const g=Bh(r);return new YQ(g)}_initContent(r){Object.keys(r).forEach(g=>{switch(g){case"remarkInfo":this.content.handleMessage=r[g];break;case"groupProfile":this._initGroupProfile(r[g]);break;case"memberInfoList":break;default:this.content[g]=r[g]}})}_initGroupProfile(r){this.content.groupProfile={};const g=Object.keys(r);for(let u=0;u0&&this._handleGroupSysTemMessage(g,E),g===!0&&E.length>0&&m.emitOuterEvent(D.MESSAGE_RECEIVED,{name:D.MESSAGE_RECEIVED,data:E})}_handleGroupSystemNotification(n,r){const g=[];let u={};for(let E=0;E0?[u]:[],messageList:g}}_assembleMessage(n){const{message:{messageFactory:r},OuterConstant:g,utils:{randomInt:u}}=this._core;n.flow="in",n.conversationType=g.CONV_SYSTEM,n.conversationSubType=n.groupProfile.type,n.conversationID=g.CONV_SYSTEM;const E=r.createMessage(n),m=new YQ(Object.assign(Object.assign({},n.elements),{groupProfile:Object.assign({},n.groupProfile)}));E.setElement(m),E.isSystemMessage=!0;const D=E.sequence===1&&E.random===1,v=E.sequence===2&&E.random===2;return(D||v)&&(E.sequence=u(),E.random=u(),E.generateMessageID()),E}_handleConversationOptions(n,r){const{OuterConstant:g}=this._core,u={conversationID:g.CONV_SYSTEM,unreadCount:0,type:g.CONV_SYSTEM,subType:n.conversationSubType,lastMessage:null};return r&&u.unreadCount++,u}_handleGroupSysTemMessage(n,r){n&&r.forEach(g=>{const{operationType:u}=g.payload;switch(u){case GT:this._handleGroupJoinResult(g);break;case WM:this._handleMemberKicked(g);break;case bT:this._handleGroupDismissed(g);break;case kT:this._handleGroupInvitedResult(g);break;case yD:this._handleGroupQuitResult(g);break;case kQ:this._handleMessageRemindTypeSynced(g);break;case Tm:this._handleAVChatRoomMemberBanned(g)}})}_handleGroupJoinResult(n){const{groupProfile:r}=n.payload,{groupID:g,type:u}=r,E=Wi.hasLocalGroup(g);this._core.ssoLog.debug("_handleGroupJoinResult",` groupID:${g} type:${u} hasLocalGroup:${E}`),E||vd(u)||(Wi.updateLocalGroup([Object.assign({},r)]),Wi.emitGroupListUpdate())}_handleMemberKicked(n){const{groupProfile:{groupID:r,type:g}}=n.payload;Wi.hasLocalGroup(r)&&this._deleteLocalGroup(r,g),this._updateConversationProfile(r,{unreadCount:0})}_handleGroupDismissed(n){const{groupProfile:{groupID:r,type:g}}=n.payload;Wi.hasLocalGroup(r)&&this._deleteLocalGroup(r,g),this._updateConversationProfile(r,{unreadCount:0})}_handleGroupInvitedResult(n){const{groupProfile:r}=n.payload,{groupID:g}=r,u=Wi.hasLocalGroup(g);this._core.ssoLog.debug("_handleGroupInvitedResult",` groupID:${g} hasLocalGroup:${u}`),u||Hl.getGroupProfile({groupID:g}).then(E=>{const{data:{group:m}}=E;Wi.updateLocalGroup([Object.assign({},m)]),Wi.emitGroupListUpdate()})}_handleGroupQuitResult(n){const{groupProfile:{groupID:r,type:g}}=n.payload,u=Wi.hasLocalGroup(r);this._core.ssoLog.debug("_handleGroupQuitResult",` groupID:${r} type:${g} hasLocalGroup:${u}`),u&&this._deleteLocalGroup(r,g),this._updateConversationProfile(r,{unreadCount:0})}_handleMessageRemindTypeSynced(n){const{groupProfile:{groupID:r},messageRemindType:g}=n.payload;this._updateConversationProfile(r,{messageRemindType:g})}_handleAVChatRoomMemberBanned(n){const{groupProfile:{groupID:r,type:g}}=n.payload;this._deleteLocalGroup(r,g)}_deleteLocalGroup(n,r){if(vd(r)){const{appStore:{conversationStore:g},OuterConstant:{CONV_GROUP:u}}=this._core;g.deleteConversation(`${u}${n}`)}Wi.deleteLocalGroup(n),Wi.emitGroupListUpdate()}_updateConversationProfile(n,r){const{appStore:{conversationStore:g},OuterConstant:{CONV_GROUP:u}}=this._core,E=`${u}${n}`;g.getConversation(E)&&g.updateConversation(E,r)}},GD=new class{init(n){this._core=n,n.ssoLog.debug("GroupNotificationHandler.init"),oR.init(n),sR.init(n);const{notificationCenter:r,InnerEvent:g}=n,{InnerEventSubType:u}=r;r.subscribeInnerEvent(g.MESSAGE_PUSH,u.GROUP_TIPS_NOTIFICATION,this._onNewGroupTipsNotification,this),r.subscribeInnerEvent(g.MESSAGE_PUSH,u.GROUP_SYSTEM_NOTIFICATION,this._onNewGroupSystemNotification,this),r.subscribeInnerEvent(g.DESTROY,this._dispose,this)}_onNewGroupTipsNotification(n){const{common:{workflowManager:r},constants:{WORKFLOW_NAME:g}}=this._core;r.executeWorkflow(g.RECEIVE_GROUP_TIPS_NOTIFICATION,n)}_onNewGroupSystemNotification(n){sR.onNewGroupSystemNotification(n)}_dispose(){const{notificationCenter:n,InnerEvent:r}=this._core,{InnerEventSubType:g}=n;n.unSubscribeInnerEvent(r.MESSAGE_PUSH,g.GROUP_TIPS_NOTIFICATION,this._onNewGroupTipsNotification,this),n.unSubscribeInnerEvent(r.MESSAGE_PUSH,g.GROUP_SYSTEM_NOTIFICATION,this._onNewGroupSystemNotification,this)}};const Gn={required:!0,rules:["string"],allowEmpty:!1},VQ={required:!0,rules:["number"],allowEmpty:!1},_d={required:!0,rules:["array"],allowEmpty:!1},bD={required:!0,rules:["object"],allowEmpty:!1},qT={createGroup:{name:Gn,type:Gn},dismissGroup:[Object.assign({key:"groupID"},Gn)],joinGroup:{groupID:Gn,applyMessage:{required:!1,rules:["string"],allowEmpty:!0}},quitGroup:[Object.assign({key:"groupID"},Gn)],searchGroupByID:[Object.assign({key:"groupID"},Gn)],getGroupProfile:{groupID:Gn,groupCustomFieldFilter:{required:!1,rules:["array"],allowEmpty:!0}},updateGroupProfile:{groupID:Gn,muteAllMembers:{required:!1,rules:["boolean"],allowEmpty:!1}},changeGroupOwner:{groupID:Gn,newOwnerID:Gn},getGroupOnlineMemberCount:[Object.assign({key:"groupID"},Gn)],handleGroupApplication:{handleAction:Gn},getGroupMemberList:{groupID:Gn},getGroupMemberProfile:{groupID:Gn,userIDList:_d,memberCustomFieldFilter:{required:!1,rules:["array"],allowEmpty:!0}},addGroupMember:{groupID:Gn,userIDList:_d},deleteGroupMember:{groupID:Gn,userIDList:_d},setGroupMemberMuteTime:{groupID:Gn,userID:Gn,muteTime:Object.assign(Object.assign({},VQ),{customValidator:n=>!(n<0)||"muteTime must be a non-negative number."})},setGroupMemberRole:{groupID:Gn,userID:Gn,role:Gn},setGroupMemberNameCard:{groupID:Gn,userID:{required:!1,rules:["string"],allowEmpty:!1},nameCard:Gn},setGroupMemberCustomField:{groupID:Gn,userID:{required:!1,rules:["string"],allowEmpty:!1},memberCustomField:_d},markGroupMemberList:{groupID:Gn,markType:Object.assign(Object.assign({},VQ),{customValidator:n=>!(n<1e3)||"markType must be greater than or equal to 1000."}),enableMark:{required:!0,rules:["boolean"],allowEmpty:!1},userIDList:_d},initGroupAttributes:{groupID:Gn,groupAttributes:bD},setGroupAttributes:{groupID:Gn,groupAttributes:bD},deleteGroupAttributes:{groupID:Gn,keyList:Object.assign(Object.assign({},_d),{allowEmpty:!0})},getGroupAttributes:{groupID:Gn,keyList:Object.assign(Object.assign({},_d),{allowEmpty:!0})},getGroupCounters:{groupID:Gn,keyList:{required:!1,rules:["array"],allowEmpty:!0}},setGroupCounters:{groupID:Gn,counters:bD},increaseGroupCounter:{groupID:Gn,key:Gn,value:VQ},decreaseGroupCounter:{groupID:Gn,key:Gn,value:VQ}},KT={getGroupList:!0,createGroup:!0,dismissGroup:!0,joinGroup:!0,quitGroup:!0,searchGroupByID:!0,getGroupProfile:!0,updateGroupProfile:!0,changeGroupOwner:!0,getGroupOnlineMemberCount:!0,getGroupApplicationList:!0,handleGroupApplication:!0,getGroupMemberList:!0,getGroupMemberProfile:!0,addGroupMember:!0,deleteGroupMember:!0,setGroupMemberMuteTime:!0,setGroupMemberRole:!0,setGroupMemberNameCard:!0,setGroupMemberCustomField:!0,markGroupMemberList:!0,initGroupAttributes:!0,setGroupAttributes:!0,getGroupAttributes:!0,deleteGroupAttributes:!0,getGroupCounters:!0,setGroupCounters:!0,increaseGroupCounter:!0,decreaseGroupCounter:!0};var jT=new class{constructor(){this._installedSubPlugins=[],this.groupDataHandler=Wi,this.groupAction=FQ,this.groupAttribute=xQ,this.groupMember=iR,this.groupCounter=dB,this.name="Group"}install(n,r=[]){this._core=n,tr.init(n),Wi.init(n),FQ.init(n,this),iR.init(n,this),MD.init(n),dB.init(n),xQ.init(n),GD.init(n),n.helper.registerValidateConfig({auth:KT,params:qT}),this._installSubPlugins(r);const{notificationCenter:g,InnerEvent:u}=n;g.subscribeInnerEvent(u.LOGOUT,this._reset,this),g.subscribeInnerEvent(u.DESTROY,this._dispose,this)}getInstalledSubPlugins(){return this._installedSubPlugins}_installSubPlugins(n){const{utils:{isArray:r}}=this._core;n&&r(n)&&n.forEach(g=>{var u;this._installedSubPlugins.includes(g.name)||((u=g.install)===null||u===void 0||u.call(g,this._core,this),this._installedSubPlugins.push(g.name))})}_reset(){Wi.reset(),xQ.reset(),dB.reset()}_dispose(){this._reset();const{notificationCenter:n,InnerEvent:r}=this._core;n.unSubscribeInnerEvent(r.LOGOUT,this._reset,this),n.unSubscribeInnerEvent(r.DESTROY,this._dispose,this)}};const CB=new class{init(n){this.core=n}},nR="AV_MBR_LIST",WT="AV_BAN_MBR",qE={NORMAL_MESSAGE:3,GROUP_TIPS_HAS_ROAMING:4,GROUP_SYSTEM_MESSAGE:5,GROUP_TIPS_HAS_NO_ROAMING:6,BROADCAST_MESSAGE:17,MESSAGE_REVOKED:20,MESSAGE_REACTION:21,LIVE_CUSTOM_DATA:100},Qh={GROUP_DISMISSED:5,QUIT_GROUP:8,AVCHATROOM_MEMBER_BANNED:21},kD=60,LD=2603,zT=2686,ZT=2688,JQ=3122;class rR{constructor(r){const{core:g,manager:u,groupID:E,getRequestParams:m,onSuccess:D,onFail:v}=r;this._name="Polling",this._core=g,this._manager=u,this._timeoutID=-1,this._isRunning=!1,this._groupID=E,this._getRequestParams=m,this._onSuccess=D,this._onFail=v}start(){this._isRunning=!0,this._request(),console.log(`${this._name}.start pollingInterval:${this._manager.getCurrentPollingInterval(this._groupID)}`)}isRunning(){return this._isRunning}_request(){return mA(this,void 0,void 0,function*(){try{const r=this._getRequestParams(this._groupID),g=yield function(E,m){return mA(this,void 0,void 0,function*(){const{longPollingKey:D,startSequence:v,startBroadcastSeq:T,simplifiedMessage:P}=E,W={Key:D,StartSeq:v,StartBroadcastSeq:T,DownsizeFlag:P,USP:1,HoldTime:90};return m.common.buildAndSendPacket({servcmd:"group_open_long_polling_http_svc.get_msg",data:W})})}(r,this._core);this._onSuccess(this._groupID,g);const u=this._manager.getCurrentPollingInterval(this._groupID);this._runNextPolling(u)}catch(r){this._onFail(this._groupID,r),this._runNextPolling(2e3)}})}_runNextPolling(r){this.isRunning()&&(this._timeoutID>-1&&clearTimeout(this._timeoutID),this._timeoutID=setTimeout(this._request.bind(this),r))}stop(){console.log(`${this._name}.stop timerID:${this._timeoutID}`),this._timeoutID>-1&&(clearTimeout(this._timeoutID),this._timeoutID=-1),this._isRunning=!1}}class ph{constructor(r){this._maxLength=r,this._map=new Map}set(r){var g;if(this._map.size>=this._maxLength){const u=((g=this._map.entries().next().value)===null||g===void 0?void 0:g[0])||"";this._map.delete(u)}this._map.set(r,1)}has(r){return this._map.has(r)}delete(r){this.has(r)&&this._map.delete(r)}clear(){this._map.clear()}}const AE=n=>n===qE.GROUP_TIPS_HAS_NO_ROAMING||n===qE.GROUP_TIPS_HAS_ROAMING,HQ=n=>n===qE.GROUP_SYSTEM_MESSAGE;function Vm(n){const r=function(g){const{E:u,MCT:E,MR:m,MP:D,MTS:v,GId:T,MS:P,CCD:W,F_Account:oA,IsSys:EA,GInf:wA,MsgBody:kA}=g,xA=vo(g,["E","MCT","MR","MP","MTS","GId","MS","CCD","F_Account","IsSys","GInf","MsgBody"]);return Object.assign({Event:u,MsgClientTime:E,MsgRandom:m,MsgPriority:D,MsgTimeStamp:v,ToGroupId:T,MsgSeq:P,CloudCustomData:W,From_Account:oA,IsSystemMsg:EA,GroupInfo:UD(wA),MsgBody:XT(kA)},xA)}(n);return function(g){const{Event:u}=g;(AE(u)||HQ(u))&&(g.From_Account=g.From_Account||"@TIM#SYSTEM"),E=u,(E===qE.BROADCAST_MESSAGE||(m=>m===qE.NORMAL_MESSAGE)(u))&&function(m){const{core:{OuterConstant:D}}=CB;m.CloudCustomData=m.CloudCustomData||"",m.MsgBody=m.MsgBody.map(v=>{if(v.MsgType===D.MSG_CUSTOM){const{content:T={}}=v;v.content=Object.assign({Data:"",Desc:"",Ext:""},T)}return v})}(g);var E;AE(u)&&function(m){const{GroupJoinType:D,MsgOperatorMemberExtraInfo:v={},MsgMemberExtraInfo:T,Operator_Account:P,List_Account:W,OpType:oA}=m.MsgBody||{};typeof D=="number"||oA!==1&&oA!==2||(m.MsgBody.GroupJoinType=oA===2?0:1),T||(m.MsgBody.MsgMemberExtraInfo=W?.map(EA=>({UserId:EA}))),oA!==1||T||(m.MsgBody.MsgMemberExtraInfo=[{UserId:v.UserId}]),m.MsgBody.MsgOperatorMemberExtraInfo=Object.assign({Operator_Account:P,ImageUrl:"",NickName:""},v)}(g),HQ(u)&&function(m){const{MsgOperatorMemberExtraInfo:D={},Operator_Account:v}=m.MsgBody||{};m.MsgBody.MsgMemberExtraInfo=Object.assign({UserId:v,ImageUrl:"",NickName:""},D),m.MsgBody=Object.assign({Authentication:"",RemarkInfo:"",MsgKey:1e3*m.MsgTimeStamp},m.MsgBody),m.MsgBody=Object.keys(m.MsgBody).filter(T=>T!=="MsgOperatorMemberExtraInfo").reduce((T,P)=>Object.assign(Object.assign({},T),{[P]:m.MsgBody[P]}),{})}(g)}(r),r}function UD(n){const r=n||{},{GN:g,GT:u,F_Hd:E,F_NN:m,F_Ll:D}=r,v=vo(r,["GN","GT","F_Hd","F_NN","F_Ll"]),T=Object.assign({GroupName:g,GroupType:u},v);return E&&(T.From_AccountHeadurl=E),m&&(T.From_AccountNick=m),D&&(T.From_AccountLevel=D),T}function XT(n){let r=n;Array.isArray(n)||(r=[n]);const g=r.map(u=>{const{O_Account:E,Opt:m,L_Account:D,RT:v,UDF:T,OpInf:P,OnlineInf:W,MsgMemberExtraInfo:oA}=u,EA=vo(u,["O_Account","Opt","L_Account","RT","UDF","OpInf","OnlineInf","MsgMemberExtraInfo"]),wA=Object.assign({Operator_Account:E,OpType:m,List_Account:D,ReportType:v,UserDefinedField:T},EA);return P&&(wA.MsgOperatorMemberExtraInfo=function(kA){const{Img:xA,NN:LA}=kA,SA=vo(kA,["Img","NN"]);return Object.assign({ImageUrl:xA,NickName:LA},SA)}(P)),oA&&(wA.MsgMemberExtraInfo=function(kA){return kA?.map(xA=>{const{Img:LA,NN:SA}=xA,OA=vo(xA,["Img","NN"]);return Object.assign({ImageUrl:LA,NickName:SA},OA)})}(oA)),W&&(wA.OnlineMemberInfo=function(kA){const{ET:xA,Num:LA}=kA;return{ExpireTime:xA,OnlineMemberNum:LA}}(W)),wA});return Array.isArray(n)?g:g[0]}var mh=new class{constructor(){this._name="MessageParser",this._sequenceList=new ph(200),this._messageIDList=new ph(100),this._broadcastMessageIDMap=new Map,this._reportMessageStackedCount=0}init(n,r){this._core=n,this._avChatRoomHandler=r}onMessageReceived(n,r,g=!1){this._sortServerMessageList({groupID:n,serverMessageList:r,isHistoryMessage:g});const u=this._handleMessageList(n,r);if(u.length===0)return;if(!g){const{appStore:{conversationStore:T},OuterConstant:{CONV_GROUP:P},common:{buildLastMessage:W}}=this._core,oA=W(u[u.length-1]);T.updateConversation(`${P}${n}`,{lastMessage:oA})}this._checkMessageStacked(u);const E=u.filter(T=>T.isModified===!0),m=u.filter(T=>T.isModified===!1),{OuterEvent:{MESSAGE_RECEIVED:D,MESSAGE_MODIFIED:v}}=this._core;E.length>0&&this._emitEvent({name:v,data:E}),m.length>0&&this._emitEvent({name:D,data:m})}_sortServerMessageList(n){const{groupID:r,serverMessageList:g,isHistoryMessage:u}=n;let E=[];this._avChatRoomHandler.isPollingSimplifiedMessage()&&!u?(g.sort((m,D)=>m.MS-D.MS),E=g.map(m=>m.MS)):(g.sort((m,D)=>m.MsgSeq-D.MsgSeq),E=g.map(m=>m.MsgSeq)),console.log(`${this._name}._sortServerMessageList groupID:${r} count:${E.length} sequenceList:${E}`),E.length=0}_handleMessageList(n,r){var g;const{message:{messageDataHandler:u,messageHelper:E}}=this._core,m=this._avChatRoomHandler.isPollingSimplifiedMessage(),D=[],v=r.length;for(let T=0;Tg===qE.MESSAGE_REVOKED)(r)?(this._handleMessageRevoked(n),null):(g=>g===qE.LIVE_CUSTOM_DATA)(r)?(this._onLiveCustomData(n),null):(g=>g===qE.MESSAGE_REACTION)(r)?null:n:(console.warn(`${this._name}.onMessageReceived unknown event:${r}`),null)}_createMessage(n){const{message:{messageFactory:r},OuterConstant:g}=this._core;let u=g.CONV_GROUP;n.elements.type===g.MSG_GRP_SYS_NOTICE&&(u=g.CONV_SYSTEM);const E=!!n.isSystemMessage,m=r.createMessage(Object.assign(Object.assign({},n),{conversationType:u,isSystemMessage:E,flow:"in"}));return m.setElement(n.elements),m}_filterDuplicateMessage(n){const{common:r}=this._core;if(!r.isUnlimitedAVChatRoom()){if(this._sequenceList.has(n.sequence))return null;this._sequenceList.set(n.sequence)}const g=this._messageIDList.has(n.ID);return g?(console.warn(`${this._name}_filterDuplicateMessageItem ID:${n.ID} has:${g}`),null):(this._messageIDList.set(n.ID),n)}_handleMessageRevoked(n){const{OuterConstant:r,OuterEvent:{MESSAGE_REVOKED:g}}=this._core,{ToGroupId:u,MsgBody:{RevokeMsgList:E},RevokerInfo:{Revoker_Account:m,Reason:D=""}}=n,v=[];E.forEach(T=>{const{TinyId:P,MsgClientTime:W,Random:oA,MsgSeq:EA}=T,wA={conversationID:`${r.CONV_GROUP}${u}`,ID:`${P}-${W}-${oA}`,revoker:m,revokeReason:D,revokerInfo:{userID:m,nick:"",avatar:""},sequence:EA};v.push(wA)}),v.length!==0&&this._emitEvent({name:g,data:v})}_onLiveCustomData(n){const{OuterEvent:{ROOM_CUSTOM_DATA_RECEIVED:r}}=this._core,{ToGroupId:g,MsgSeq:u,MsgTimeStamp:E,MsgBody:m}=n,D=m?.Content||m?.MsgContent||"";this._emitEvent({name:r,data:D}),console.log(`${this._name}._onLiveCustomData groupID:${g} sequence:${u} time:${E} data:${D}`)}_onGroupDismissed(n){this._avChatRoomHandler.reset(n)}_checkMessageStacked(n){const{length:r}=n;if(r>=100&&this._reportMessageStackedCount<5){const g=this._avChatRoomHandler.getJoinedGroups();this._core.ssoLog.info("MessageStacked",`count:${r} groupID:${g.join(",")}`),this._reportMessageStackedCount+=1}}_emitEvent(n){this._core.notificationCenter.emitOuterEvent(n.name,n)}onBroadcastMessageReceived(n){const{message:{messageHelper:r},OuterEvent:{MESSAGE_RECEIVED:g}}=this._core,u=this._avChatRoomHandler.isPollingSimplifiedMessage(),E=[],m=n.length;for(let D=0;D0&&this._emitEvent({name:g,data:E})}_updateLocalOnlineMemberCountFromTips(n){const{utils:{isEmpty:r}}=this._core,{ToGroupId:g,MsgBody:{OnlineMemberInfo:u}}=n;if(r(u))return;const{OnlineMemberNum:E=0,ExpireTime:m=kD}=u,D=Date.now();let v=this._avChatRoomHandler.getLocalOnlineMemberCount(g);r(v)?v={lastReqTime:0,lastSyncTime:0,latestUpdateTime:D,memberCount:E,expireTime:m}:(v.latestUpdateTime=D,v.memberCount=E),this._avChatRoomHandler.updateLocalOnlineMemberCount(g,v)}reset(){this._reportMessageStackedCount=0,this._sequenceList.clear(),this._messageIDList.clear(),this._broadcastMessageIDMap.clear()}};const hB=n=>{const{core:{store:r}}=CB;return(r.get("cloudConfig")||{})[n]},fh=n=>{const{core:{utils:{isUndefined:r}}}=CB;return!r(n)},qQ=()=>{const n=hB("polling_interval");return fh(n)?parseInt(n,10):300},BB=()=>{const n=hB("polling_simplified_msg");return fh(n)?parseInt(n,10):0};var aR=new class{constructor(){this._name="GetAVChatRoomOnlineMemberCount"}init(n,r){this._core=n,this._parentPlugin=r;const{helper:g}=n;g.registerApi({apiName:"getGroupOnlineMemberCount",context:this,matcher:()=>r.getInstalledSubPlugins().length>0})}getGroupOnlineMemberCount(n){return mA(this,void 0,void 0,function*(){const{appStore:{groupStore:r},OuterConstant:g}=this._core,u=r.getGroup(n);return u?u.type===g.GRP_AVCHATROOM?this._getOnlineMemberCount(n):this._parentPlugin.groupAction.getGroupOnlineMemberCount(n):{code:0,data:{memberCount:0}}})}_getOnlineMemberCount(n){return mA(this,void 0,void 0,function*(){const r="_getOnlineMemberCount",{utils:{isEmpty:g}}=this._core,u=Yg.getLocalOnlineMemberCount(n);if(g(u)||this._isExpired(n)){const{memberCount:E=0}=yield this._getOnlineMemberCountFromServer(n);return console.log(`${this._name}.${r} ok, groupID:${n} memberCount:${E} from server.`),{code:0,data:{memberCount:E}}}return console.log(`${this._name}.${r} ok, groupID:${n} memberCount:${u.memberCount} from local.`),{code:0,data:{memberCount:u.memberCount}}})}_isExpired(n){const r=Yg.getLocalOnlineMemberCount(n),g=Date.now(),u=g-r.lastSyncTime>1e3*r.expireTime,E=g-r.latestUpdateTime>1e4,m=g-r.lastReqTime>3e3;return u&&E&&m}_getOnlineMemberCountFromServer(n){return mA(this,void 0,void 0,function*(){const r="_getOnlineMemberCountFromServer";try{const g=yield function(v,T){return mA(this,void 0,void 0,function*(){const P={GroupId:v};return T.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_online_member_num",data:P})})}(n,this._core),{OnlineMemberNum:u=0,ExpireTime:E=kD}=g||{},m=Date.now(),D={lastSyncTime:m,latestUpdateTime:m,lastReqTime:m,memberCount:u,expireTime:E};return Yg.updateLocalOnlineMemberCount(n,D),{memberCount:u}}catch(g){const u=new this._core.helper.ChatError({functionName:r,code:g?.errorCode,message:g?.errorInfo});throw console.error(`${this._name}.${r} fail:`,u),u}})}},Yg=new class{constructor(){this._name="AVChatRoomHandler",this._joinedGroupMap=new Map,this._pollingRequestInfoMap=new Map,this._pollingInstanceMap=new Map,this._onlineMemberCountMap=new Map,this._pollingIntervalMap=new Map,this._pollingNoMessageCountMap=new Map,this._membersReqInfoMap=new Map,this._startBroadcastSequence=1}init(n,r){this._core=n,this._parentPlugin=r,mh.init(n,this),n.ssoLog.debug("AVChatRoomHandler.init")}onAVChatRoomSystemNotification(n){const{OuterConstant:{GRP_AVCHATROOM:r}}=this._core,{GroupTips:g=[]}=n;for(let u=0;u0&&(r=[...this._joinedGroupMap.values()].filter(g=>g.type===n)),r}handleJoinGroupResult(n){return mA(this,void 0,void 0,function*(){const{utils:{isUndefined:r},OuterConstant:{CONV_GROUP:g},apiMap:{getConversationProfile:u},OuterConstant:E}=this._core,{longPollingKey:m,group:D,historyMessageList:v=[]}=n,{groupID:T}=D;return yield this._preCheck(D),this._joinedGroupMap.set(T,D),this._parentPlugin.groupDataHandler.updateLocalGroup([D]),this._parentPlugin.groupDataHandler.emitGroupListUpdate(),u(`${g}${T}`),aR.getGroupOnlineMemberCount(T),v.length>0&&mh.onMessageReceived(T,v,!0),r(m)?{code:0,data:{status:E.JOIN_STATUS_SUCCESS,group:D}}:{code:0,data:this.startMessageLongPolling(n)}})}isGroupCounterUpdated(n){return this._parentPlugin.groupCounter.isGroupCounterUpdated(n)}handleGroupCounterUpdated(n){this._parentPlugin.groupCounter.handleGroupCounterUpdated(n)}_preCheck(n){return mA(this,void 0,void 0,function*(){const{common:r,OuterConstant:g,helper:u,apiMap:{quitGroup:E},ssoLog:m}=this._core;if(r.isUnlimitedAVChatRoom()){if(this._pollingInstanceMap.size>(()=>{const T=hB("polling_count_limit");return fh(T)&&T>0?parseInt(T,10):20})())throw new u.ChatError({code:ZT,message:"the count of longPolling exceeds the max limit"});return}if(this._joinedAVChatRoomCount()===0||n.type===g.GRP_LIVE)return;const[D,v]=this._joinedGroupMap.entries().next().value;if(v.selfInfo.role===g.GRP_MBR_ROLE_OWNER)this._parentPlugin.groupDataHandler.deleteLocalGroup(D);else try{yield E(D)}catch(T){m.debug("quitGroup",`${this._name}._preCheck quitGroup failed, groupID:${D} info:`,T)}this.reset(D)})}startMessageLongPolling(n){const{OuterConstant:r}=this._core,{longPollingKey:g,startSequence:u=1,group:E}=n,{groupID:m}=E;return this._pollingRequestInfoMap.set(m,{longPollingKey:g,startSequence:u}),this._pollingIntervalMap.set(m,qQ()),this._startPolling(m),this._reportLongPollingCount(),{status:r.JOIN_STATUS_SUCCESS,group:E}}_startPolling(n){if(this._core.ssoLog.debug("_startPolling",`${this._name}._startPolling groupID:${n}`),this._pollingInstanceMap.has(n)){const g=this._pollingInstanceMap.get(n);return void(g?.isRunning()||g==null||g.start())}const r=new rR({core:this._core,manager:this,groupID:n,getRequestParams:this._handleRequestParams.bind(this),onSuccess:this._handleSuccess.bind(this),onFail:this._handleFailure.bind(this)});r.start(),this._pollingInstanceMap.set(n,r)}_handleRequestParams(n){const{longPollingKey:r,startSequence:g}=this._pollingRequestInfoMap.get(n)||{};return n===[...this._pollingInstanceMap.keys()][0]?{longPollingKey:r,startSequence:g,startBroadcastSeq:this._startBroadcastSequence,simplifiedMessage:BB()}:{longPollingKey:r,startSequence:g,simplifiedMessage:BB()}}_handleSuccess(n,r){const{ErrorCode:g}=r;if(g!==0){const{longPollingKey:u,startSequence:E}=this._pollingRequestInfoMap.get(n)||{};return void console.warn(`${this._name}._handleSuccess groupID:${n} key:${u} startSeq:${E} errorCode:${g}`)}this._hasJoinedAVChatRoom(n)&&this._handleResponseData(n,r)}_handleResponseData(n,r){const{Key:g,NextSeq:u,NextBroadcastSeq:E,RspMsgList:m=[],RspBroadcastMsgList:D=[]}=r;if(g&&u&&this._pollingRequestInfoMap.set(n,{longPollingKey:g,startSequence:u}),E&&E>this._startBroadcastSequence&&(this._startBroadcastSequence=E),m.length>0)this._getPollingNoMessageCount(n)!==0&&(this._updatePollingNoMessageCount(n,0),this._pollingIntervalMap.set(n,qQ())),mh.onMessageReceived(n,m);else{let v=this._getPollingNoMessageCount(n);if(v+=1,this._updatePollingNoMessageCount(n,v),v===(()=>{const T=hB("polling_no_msg_count");return fh(T)?parseInt(T,10):20})()){const T=qQ()+(()=>{const P=hB("polling_interval_plus");return fh(P)?parseInt(P,10):2e3})();this._pollingIntervalMap.set(n,T)}}D.length>0&&mh.onBroadcastMessageReceived(D)}_handleFailure(n,r){const{ssoLog:g,utils:{safeStringify:u}}=this._core;g.warn("polling",`${this._name}._handleFailure groupID:${n} error: ${u(r)}`)}_joinedAVChatRoomCount(){const{OuterConstant:n}=this._core;let r=[];return this._joinedGroupMap.size>0&&(r=this.getJoinedGroups().filter(g=>g.type===n.GRP_AVCHATROOM)),r.length}_hasJoinedAVChatRoom(n){return this._joinedGroupMap.has(n)}getJoinedGroups(){return[...this._joinedGroupMap.values()]}updateLocalLiveGroup(n,r){this._joinedGroupMap.set(n,r),this._parentPlugin.groupDataHandler.updateLocalGroup([r])}handleLiveHistoryMessages(n,r){mh.onMessageReceived(n,r,!0)}isOverFrequencyLimit(n){if(!this._membersReqInfoMap.has(n))return this._membersReqInfoMap.set(n,{startTime:Date.now(),requestCount:1}),!1;let{startTime:r,requestCount:g}=this._membersReqInfoMap.get(n);const{interval:u,count:E}=(()=>{const m=hB("av_members_freq_limit");if(fh(m)){const{interval:D,count:v}=JSON.parse(m);if(v>0&&D>0)return{interval:D,count:v}}return{interval:30,count:4}})();return Date.now()-r>1e3*u?(this._membersReqInfoMap.set(n,{startTime:Date.now(),requestCount:1}),!1):(g+=1,this._membersReqInfoMap.set(n,{startTime:r,requestCount:g}),g>E)}_stopPolling(n){if(this._core.ssoLog.debug("_stopPolling",`${this._name}._stopPolling groupID:${n}`),n){const{appStore:{conversationStore:r},OuterConstant:{CONV_GROUP:g}}=this._core;r.deleteConversation(`${g}${n}`);const u=this._pollingInstanceMap.get(n);return u?.stop(),this._parentPlugin.groupDataHandler.deleteLocalGroup(n),this._pollingInstanceMap.delete(n),this._pollingRequestInfoMap.delete(n),this._joinedGroupMap.delete(n),this._onlineMemberCountMap.delete(n),this._pollingIntervalMap.delete(n),this._pollingNoMessageCountMap.delete(n),void this._membersReqInfoMap.delete(n)}for(const r of this._pollingInstanceMap.values())r?.stop();this._pollingInstanceMap.clear(),this._pollingRequestInfoMap.clear(),this._joinedGroupMap.clear(),this._onlineMemberCountMap.clear(),this._pollingIntervalMap.clear(),this._pollingNoMessageCountMap.clear(),this._membersReqInfoMap.clear()}_updatePollingNoMessageCount(n,r){this._pollingNoMessageCountMap.set(n,r)}_getPollingNoMessageCount(n){return this._pollingNoMessageCountMap.get(n)||0}_reportLongPollingCount(){const n=this._joinedGroupMap.size;if(n>1){const{common:r,OuterConstant:g,ssoLog:u}=this._core,E=r.isUnlimitedAVChatRoom()?1:0,m=[],D=[];Array.from(this._joinedGroupMap.values()).forEach(({groupID:v,type:T})=>{T===g.GRP_LIVE?D.push(v):m.push(v)}),u.info("longPollingCount",String(n),{moreMessage:`av:${m.join(",")} live:${D.join(",")} code: ${E}`,eventType:29})}}reset(n){this._stopPolling(n),this._startBroadcastSequence=1,mh.reset()}},gR=new class{init(n,r){this._core=n,this._parentPlugin=r;const{helper:g}=n;g.registerApi({apiName:"joinGroup",context:this,matcher:()=>r.getInstalledSubPlugins().length>0})}joinGroup(n){return mA(this,void 0,void 0,function*(){const{OuterConstant:r}=this._core,g=yield this._parentPlugin.groupAction.joinGroup(n),{data:{status:u,group:{type:E}}}=g;return E===r.GRP_AVCHATROOM?u===r.JOIN_STATUS_ALREADY_IN_GROUP?g:Yg.handleJoinGroupResult(g.data):g})}},$T=new class{init(n,r){this._core=n,this._parentPlugin=r;const{helper:g}=n;g.registerApi({apiName:"quitGroup",context:this,matcher:()=>r.getInstalledSubPlugins().length>0})}quitGroup(n){return mA(this,void 0,void 0,function*(){const{OuterConstant:r}=this._core,g=yield this._parentPlugin.groupAction.quitGroup(n),{data:{type:u}}=g;return u===r.GRP_AVCHATROOM&&Yg.reset(n),g})}},cR=new class{init(n,r){this._core=n,this._parentPlugin=r;const{helper:g}=n;g.registerApi({apiName:"dismissGroup",context:this,matcher:()=>r.getInstalledSubPlugins().length>0})}dismissGroup(n){return mA(this,void 0,void 0,function*(){const{OuterConstant:r}=this._core,g=yield this._parentPlugin.groupAction.dismissGroup(n),{data:{type:u}}=g;return u===r.GRP_AVCHATROOM&&Yg.reset(n),g})}},Jm=new class{constructor(){this._name="GetAVChatRoomMemberList"}init(n,r){this._core=n,this._parentPlugin=r;const{helper:g}=n;g.registerApi({apiName:"getGroupMemberList",context:this,matcher:()=>r.getInstalledSubPlugins().length>0})}getGroupMemberList(n){return mA(this,void 0,void 0,function*(){const{appStore:{groupStore:r},helper:g,OuterConstant:u}=this._core,{groupID:E}=n,m=r.getGroup(E);if(m?.type===u.GRP_AVCHATROOM&&g.checkBusinessCapabilityBits(nR)){if(Yg.isOverFrequencyLimit(E))throw{code:2996,message:`Over frequency limit: get_members-${E}`};return this._getGroupMemberList(n)}return this._parentPlugin.groupMember.getGroupMemberList(n)})}_getGroupMemberList(n){return mA(this,void 0,void 0,function*(){const r="_getGroupMemberList",{helper:g}=this._core;try{const u=yield function(v,T){return mA(this,void 0,void 0,function*(){const{groupID:P,offset:W=0}=v,oA={GroupId:P,Timestamp:W};return T.common.buildAndSendPacket({servcmd:"group_open_avchatroom_http_svc.get_members",data:oA})})}(n,this._core),{MemberList:E=[],NextTimestamp:m=0}=u||{},D=this._handleMemberList(E);return console.log(`${this._name}.${r} ok, groupID:${n.groupID} count:${D.length} nextOffset:${m}`),{code:0,data:{memberList:D,offset:m}}}catch(u){const E=new g.ChatError({functionName:r,code:u?.errorCode,message:u?.errorInfo});throw console.error(`${this._name}.${r} fail:`,E),E}})}_handleMemberList(n){return n.map(r=>{const{Member_Account:g,NickName:u="",Avatar:E="",Remark:m="",JoinTime:D=0,Marks:v=[]}=r;return{userID:g,nick:u,avatar:E,remark:m,joinTime:D,marks:v,isOnline:!0}})}},Hm=new class{constructor(){this._name="DeleteAVChatRoomMember"}init(n,r){this._core=n,this._parentPlugin=r;const{helper:g}=n;g.registerApi({apiName:"deleteGroupMember",context:this,matcher:()=>r.getInstalledSubPlugins().length>0})}deleteGroupMember(n){return mA(this,void 0,void 0,function*(){const r="deleteGroupMember",{appStore:{groupStore:g},utils:{isUndefined:u},helper:E,OuterConstant:m}=this._core,{groupID:D}=n,v=g.getGroup(D);if(u(v))throw new E.ChatError({functionName:r,code:LD});if(v.type===m.GRP_AVCHATROOM){if(E.checkBusinessCapabilityBits(WT))return this._deleteGroupMember(n);throw new E.ChatError({functionName:r,code:JQ})}return this._parentPlugin.groupMember.deleteGroupMember(n)})}_deleteGroupMember(n){return mA(this,void 0,void 0,function*(){const r="_deleteGroupMember",{appStore:{groupStore:g},helper:u,ssoLog:E}=this._core,{groupID:m,duration:D=0,userIDList:v}=n;if(D===0)throw new u.ChatError({functionName:r,code:zT});try{return yield function(T,P){return mA(this,void 0,void 0,function*(){const{groupID:W,userIDList:oA,duration:EA,reason:wA}=T,kA={GroupId:W,Members_Account:oA,Duration:EA,Description:wA};return P.common.buildAndSendPacket({servcmd:"group_open_http_svc.ban_group_member",data:kA})})}(n,this._core),E.debug(r,`${this._name}.${r} ok, groupID:${m}`),{code:0,data:{group:g.getGroup(m),userIDList:v}}}catch(T){throw new u.ChatError({functionName:r,code:T?.errorCode,message:T?.errorInfo})}})}},Td=new class{constructor(){this._name="MarkAVChatRoomMember"}init(n){this._core=n;const{helper:r}=n;r.registerApi({apiName:"markGroupMemberList",context:this})}markGroupMemberList(n){return mA(this,void 0,void 0,function*(){const r="markGroupMemberList",{groupID:g,markType:u,enableMark:E,userIDList:m=[]}=n,D=this._generateRequestData(n);try{const v=yield function(oA,EA){return mA(this,void 0,void 0,function*(){const{groupID:wA,operationType:kA,memberList:xA}=oA,LA={GroupId:wA,CommandType:kA,MemberList:xA};return EA.common.buildAndSendPacket({servcmd:"group_open_avchatroom_http_svc.modify_user_info",data:LA})})}(D,this._core),{MemberList:T=[]}=v||{},{successUserIDList:P,failureUserIDList:W}=this._handleResult(T,m);return{code:0,data:{successUserIDList:P,failureUserIDList:W},successLog:{message:`${this._name}.${r} ok, groupID:${g} markType:${u} enableMark:${E} success:${P.length} fail:${W.length}`}}}catch(v){throw new this._core.helper.ChatError({functionName:r,code:v?.errorCode,message:v?.errorInfo})}})}_generateRequestData(n){const{groupID:r,markType:g,enableMark:u,userIDList:E=[]}=n,m=u===!0?1:2,D=[...E];return D.length>500&&console.warn(`${this._name}._generateRequestData, the length of userIDList cannot exceed 500`),{groupID:r,operationType:m,memberList:D.map(v=>({Member_Account:v,Marks:[g]}))}}_handleResult(n,r){const g=[],u=[];return n.length===r.length?(g.push(...r),{successUserIDList:g,failureUserIDList:u}):(r.forEach(E=>{n.find(m=>m.Member_Account===E)?g.push(E):u.push(E)}),{successUserIDList:g,failureUserIDList:u})}},lR=new class{init(n,r){n.ssoLog.debug("AVChatRoomAction.init"),gR.init(n,r),$T.init(n,r),cR.init(n,r),Jm.init(n,r),aR.init(n,r),Hm.init(n,r),Td.init(n)}},IR=new class{constructor(){this._name="LiveHandler"}init(n){this._core=n;const{helper:r,ssoLog:g}=n;r.registerExperimentalAPI("startMessageLongPolling",this),r.registerExperimentalAPI("stopMessageLongPolling",this),g.debug("LiveHandler.init")}startMessageLongPolling(n){const{common:r,utils:{isEmpty:g},OuterConstant:u,ssoLog:E}=this._core,{groupID:m,longPollingKey:D,longPollingSequence:v=1}=n;if(g(D))return E.warn("startMessageLongPolling",`${this._name}.startMessageLongPolling longPollingKey is empty.`),Promise.resolve({});Yg.hasPollingInstance(m)&&this.stopMessageLongPolling({groupID:m});const T=Yg.getJoinedLiveList(),P=r.isUnlimitedAVChatRoom();!P&&T.length>0&&this.stopMessageLongPolling({groupID:T[0].groupID}),E.debug("startMessageLongPolling",`${this._name}.startMessageLongPolling isUnlimited:${P} groupID:${m} longPollingKey:${D} longPollingSequence:${v}`);const W={groupID:m,type:u.GRP_LIVE};return Yg.updateLocalLiveGroup(m,W),this._getLiveHistoryMessages({groupID:m,longPollingKey:D,startSequence:v}),Yg.startMessageLongPolling({group:W,longPollingKey:D,startSequence:v})}stopMessageLongPolling(n){const{groupID:r}=n;return Yg.reset(r),this._core.ssoLog.debug("stopMessageLongPolling",`${this._name}.stopMessageLongPolling ok, groupID:${r}`),Promise.resolve({groupID:r})}_getLiveHistoryMessages(n){return mA(this,void 0,void 0,function*(){const{ssoLog:r}=this._core,{groupID:g}=n;try{const u=yield function(m,D){return mA(this,void 0,void 0,function*(){const{groupID:v,longPollingKey:T,startSequence:P}=m,W={GroupId:v,LongPollingKey:T,PullPreSeq:P};return D.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_huge_group_msg",data:W})})}(n,this._core),{RspMsgList:E=[]}=u||{};r.debug("_getLiveHistoryMessages",`${this._name}._getLiveHistoryMessages ok, groupID:${g} count:${E.length}`),E.length>0&&Yg.handleLiveHistoryMessages(g,E)}catch(u){r.debug("_getLiveHistoryMessages",`${this._name}._getLiveHistoryMessages failed, groupID:${g} info:${u.message}`)}})}},qm=new class{constructor(){this.name="AVChatRoom"}install(n,r){this._core=n,CB.init(n),Yg.init(n,r),lR.init(n,r),IR.init(n);const{notificationCenter:g,InnerEvent:u}=n,{InnerEventSubType:E}=g;g.subscribeInnerEvent(u.MESSAGE_PUSH,E.GROUP_SYSTEM_NOTIFICATION,this._onAVChatRoomSystemNotification,this),g.subscribeInnerEvent(u.LOGOUT,this._reset,this),g.subscribeInnerEvent(u.DESTROY,this._dispose,this)}_onAVChatRoomSystemNotification(n){Yg.onAVChatRoomSystemNotification(n)}_reset(){Yg.reset()}_dispose(){this._reset();const{notificationCenter:n,InnerEvent:r}=this._core,{InnerEventSubType:g}=n;n.unSubscribeInnerEvent(r.MESSAGE_PUSH,g.GROUP_SYSTEM_NOTIFICATION,this._onAVChatRoomSystemNotification,this),n.unSubscribeInnerEvent(r.LOGOUT,this._reset,this),n.unSubscribeInnerEvent(r.DESTROY,this._dispose,this)}};const ig=new class{init(n){this.core=n}},Km="message",QB="user",pB={OR:"or",AND:"and"},NI=20,AN=20,uR=20,yh={required:!1,rules:["array"],allowEmpty:!0,customValidator:n=>!n||!!(Array.isArray(n)&&n.length<=5)||"keywordList should be an array and length <= 5"},jm={required:!1,rules:["string"],allowEmpty:!0,customValidator:n=>!n||!![pB.OR,pB.AND].includes(n)||"keywordListMatchType should be OR or AND"},RC={required:!1,rules:["number"],allowEmpty:!0,customValidator:n=>typeof n=="number"&&n>=1&&n<=100||"count must be a number between 1 and 100"},KQ={required:!1,rules:["string"],allowEmpty:!0},ER={required:!1,rules:["array"],allowEmpty:!0,customValidator:n=>{const{OuterConstant:r}=ig.core;if(!Array.isArray(n))return"groupTypeList should be an array";const g=[r.GRP_PUBLIC,r.GRP_COMMUNITY,r.GRP_WORK,r.GRP_MEETING];let u=!1;for(let E=0;E{const{OuterConstant:r}=ig.core,g=[r.MSG_TEXT,r.MSG_IMAGE,r.MSG_AUDIO,r.MSG_FILE,r.MSG_VIDEO,r.MSG_LOCATION,r.MSG_CUSTOM,r.MSG_MERGER];let u=!1;for(let E=0;E{const{OuterConstant:r}=ig.core;return!(!n?.startsWith(r.CONV_C2C)&&!n?.startsWith(r.CONV_GROUP)&&n!==r.CONV_SYSTEM)||"conversationID is invalid"}},Wm=n=>({required:!1,rules:["number"],allowEmpty:!0,customValidator:r=>typeof r=="number"&&r>=0||`${n} should be a number >= 0';`}),FD={required:!1,rules:["string"],allowEmpty:!0,customValidator:n=>{const{OuterConstant:r}=ig.core;return!![r.GENDER_FEMALE,r.GENDER_MALE].includes(n)||"gender is invalid"}},zm={searchCloudMessages:{keywordList:yh,keywordListMatchType:jm,cursor:KQ,senderUserIDList:{required:!1,rules:["array"],allowEmpty:!0,customValidator:n=>!!(Array.isArray(n)&&n.length<=5)||"senderUserIDList should be an array and length <= 5"},messageTypeList:dR,conversationID:CR,timePosition:Wm("timePosition"),timePeriod:Wm("timePeriod")},searchCloudUsers:{keywordList:yh,keywordListMatchType:jm,cursor:KQ,count:RC,miniBirthday:Wm("miniBirthday"),maxBirthday:Wm("maxBirthday"),gender:FD},searchCloudGroupMembers:{keywordList:yh,keywordListMatchType:jm,cursor:KQ,count:RC,groupTypeList:ER,groupIDList:{required:!1,rules:["array"],allowEmpty:!0}},searchCloudGroups:{keywordList:yh,keywordListMatchType:jm,cursor:KQ,count:RC,groupTypeList:ER}},OD={searchCloudMessages:!0,searchCloudUsers:!0,searchCloudGroupMembers:!0,searchCloudGroups:!0};var PD=new class{constructor(){this.name="CloudSearch"}install(n){this._core=n,ig.init(n),n.helper.registerApi({apiName:"searchCloudMessages",context:this}),n.helper.registerApi({apiName:"searchCloudUsers",context:this}),n.helper.registerApi({apiName:"searchCloudGroupMembers",context:this}),n.helper.registerApi({apiName:"searchCloudGroups",context:this}),n.helper.registerValidateConfig({auth:OD,params:zm})}searchCloudMessages(n){return mA(this,void 0,void 0,function*(){try{const{OuterConstant:r,helper:g}=this._core,{conversationID:u,timePeriod:E,timePosition:m}=n,D=vo(n,["conversationID","timePeriod","timePosition"]),v=Object.assign({count:100},D);u&&(u.startsWith(r.CONV_C2C)?v.account=u.replace(r.CONV_C2C,""):u.startsWith(r.CONV_GROUP)&&(v.groupID=u.replace(r.CONV_GROUP,""))),this._setTimeRangeParams(v,{timePeriod:E,timePosition:m});const T=yield function(LA){return mA(this,void 0,void 0,function*(){const{count:SA,keywordList:OA,keywordListMatchType:WA,senderUserIDList:ue,messageTypeList:le,endTime:ki,startTime:Li,cursor:Yt,account:Fi,groupID:hs}=LA,Re={Count:SA,KeywordList:OA,MatchType:WA,SendUserIDList:ue,MsgTypeList:le,EndTime:ki,StartTime:Li,Cursor:Yt,PeerAccount:Fi,GroupID:hs};return ig.core.common.buildAndSendPacket({servcmd:"message_search.query",data:Re})})}(v);if(!T)return{code:0,data:{}};const{ErrorCode:P,ErrorInfo:W,TotalCount:oA,Cursor:EA="",ConversationMsgs:wA=[]}=T;if(P!==0)throw{errorCode:P,errorInfo:W};const kA=`keywordList:${n.keywordList} keywordListMatchType:${n.keywordListMatchType} cursor:${n.cursor} res: totalCount:${oA}`;return{code:0,data:{searchResultList:wA.map(LA=>{const{MsgList:SA,Count:OA,GroupID:WA,UserID:ue}=LA,le=WA?`${r.CONV_GROUP}${WA}`:`${r.CONV_C2C}${ue}`;if(this._isSearchingAllConversations(n)&&OA>1)return{conversationID:le,messageCount:OA,messageList:[]};const ki=SA.map(Li=>g.isEmpty(WA)?function(Yt,Fi){const hs=Fi.OuterConstant.CONV_C2C,Re=Fi.message.messageHelper.parseServerPushMessage(Yt),Mt=Fi.message.messageFactory.createMessage(Object.assign(Object.assign({},Re),{conversationType:hs,flow:"in"}));return Mt.setElement(Re.elements),Mt}(Li,this._core):function(Yt,Fi){const hs=Fi.OuterConstant.CONV_GROUP,Re=Fi.message.messageHelper.parseServerGroupMessage(Yt),Mt=Fi.message.messageFactory.createMessage(Object.assign(Object.assign({},Re),{conversationType:hs,flow:"in"}));return Mt.setElement(Re.elements),Mt}(Li,this._core));return{conversationID:le,messageCount:OA,messageList:ki}}),cursor:EA,totalCount:oA},successLog:{message:kA}}}catch(r){const{errorCode:g,errorInfo:u}=r||{};this._handleError({errorCode:g,errorInfo:u,searchType:Km,functionName:"searchCloudMessages"})}})}searchCloudUsers(n){return mA(this,void 0,void 0,function*(){var r;try{const{keywordListMatchType:g,count:u=AN}=n,E=vo(n,["keywordListMatchType","count"]),m=Object.assign({count:u,keywordListMatchType:g===pB.AND?1:0},E);this._setBirthdayRangeParams(m,n);const D=yield function(kA){return mA(this,void 0,void 0,function*(){const{count:xA,keywordList:LA,keywordListMatchType:SA,miniBirthday:OA,maxBirthday:WA,cursor:ue,gender:le}=kA,ki={Count:xA,Keywords:LA,KeywordMatchType:SA,Cursor:ue,UserBirthStart:OA,UserBirthEnd:WA,Gender:le};return ig.core.common.buildAndSendPacket({servcmd:"user_search.query",data:ki})})}(m);if(!D)return{error:0,data:{}};const{ErrorCode:v,ErrorInfo:T,TotalCount:P,Cursor:W="",Users:oA=[]}=D;if(v!==0)throw{errorCode:v,errorInfo:T};const EA=`keywordList:${n.keywordList} keywordListMatchType:${n.keywordListMatchType} cursor:${n.cursor} count:${n.count} res: totalCount:${P}`,wA=[];for(let kA=0,xA=oA.length;kA({tag:ue.Tag,value:ue.StrValue})),WA=(r=this._core.user.userProfile)===null||r===void 0?void 0:r.createProfile(LA,OA);wA.push(WA)}return{code:0,data:{searchResultList:wA,cursor:W,totalCount:P},successLog:{message:EA}}}catch(g){const{errorCode:u,errorInfo:E}=g||{};this._handleError({errorCode:u,errorInfo:E,searchType:QB,functionName:"searchCloudUsers"})}})}searchCloudGroupMembers(n){return mA(this,void 0,void 0,function*(){try{const{count:r=uR,keywordListMatchType:g}=n,u=vo(n,["count","keywordListMatchType"]),E=Object.assign({count:r,keywordListMatchType:g===pB.AND?1:0},u),m=yield function(wA){return mA(this,void 0,void 0,function*(){const{count:kA,keywordList:xA,keywordListMatchType:LA,groupTypeList:SA,cursor:OA,groupIDList:WA}=wA,ue={Count:kA,Keywords:xA,KeywordMatchType:LA,Cursor:OA,GroupType:SA,GroupIdList:WA};return ig.core.common.buildAndSendPacket({servcmd:"group_member_search.query",data:ue})})}(E);if(!m)return{code:0,data:{}};const{ErrorCode:D,ErrorInfo:v,GroupMembers:T=[],Cursor:P,TotalCount:W}=m;if(D!==0)throw{errorCode:D,errorInfo:v};const oA=`keywordList:${n.keywordList} keywordListMatchType:${n.keywordListMatchType} cursor:${n.cursor} count:${n.count} res: totalCount:${W}`,EA=new Map;return T.forEach(wA=>{const{GroupID:kA,GroupName:xA,GroupType:LA,GroupFaceUrl:SA,GroupMemberUserName:OA,GroupMemberUserID:WA,GroupMemberNameCard:ue,GroupMemberAvatar:le=""}=wA,ki={groupID:kA,name:xA,type:LA,avatar:SA},Li={userID:WA,nick:OA,nameCard:ue,avatar:le};if(EA.has(kA)){const Yt=EA.get(kA);Yt.memberList.push(Li),EA.set(kA,Yt)}else EA.set(kA,{groupInfo:ki,memberList:[Li]})}),{code:0,data:{searchResultList:[...EA.values()],cursor:P,totalCount:W},successLog:{message:oA}}}catch(r){const{errorCode:g,errorInfo:u}=r||{};this._handleError({errorCode:g,errorInfo:u,searchType:QB,functionName:"searchCloudGroupMembers"})}})}searchCloudGroups(n){return mA(this,void 0,void 0,function*(){try{const{count:r=NI,keywordListMatchType:g}=n,u=vo(n,["count","keywordListMatchType"]),E=Object.assign({count:r,keywordListMatchType:g===pB.AND?1:0},u),m=yield function(EA){return mA(this,void 0,void 0,function*(){const{count:wA,keywordList:kA,keywordListMatchType:xA,groupTypeList:LA,cursor:SA}=EA,OA={Count:wA,Keywords:kA,KeywordMatchType:xA,Cursor:SA,GroupType:LA};return ig.core.common.buildAndSendPacket({servcmd:"group_search.query",data:OA})})}(E);if(!m)return{code:0,data:{}};const{ErrorCode:D,ErrorInfo:v,Groups:T,Cursor:P,TotalCount:W}=m;if(D!==0)throw{errorCode:D,errorInfo:v};const oA=`keywordList:${n.keywordList} keywordListMatchType:${n.keywordListMatchType} cursor:${n.cursor} count:${n.count} res: totalCount:${W}`;return{code:0,data:{searchResultList:T?.map(EA=>function(wA){const{GroupFaceUrl:kA,GroupID:xA,GroupIntroduction:LA,GroupMemberNum:SA,GroupName:OA,GroupOwnerTinyID:WA,GroupOwnerUserID:ue,GroupOwnerUserName:le,GroupType:ki,GroupAddOption:Li,GroupInviteOption:Yt}=wA;return{avatar:kA,groupID:xA,introduction:LA,memberCount:SA,name:OA,ownerTinyID:WA,ownerID:ue,ownerNick:le,type:ki,joinOption:Li,inviteOption:Yt}}(EA))||[],cursor:P,totalCount:W},successLog:{message:oA}}}catch(r){const{errorCode:g,errorInfo:u}=r||{};this._handleError({errorCode:g,errorInfo:u,searchType:QB,functionName:"searchCloudGroups"})}})}_setTimeRangeParams(n,{timePeriod:r,timePosition:g}){r&&r>0&&(n.startTime=g&&g>0?g-r:this._core.helper.timeManager.getServerTimeSeconds()-r),n.startTime&&n.startTime<0&&(n.startTime=void 0),g&&g>0&&(n.endTime=g)}_handleError({errorCode:n,errorMessage:r,searchType:g}){const{helper:u}=this._core;let E=n;throw n===60020?E="SearchUnable":g!==Km&&n===27003?E="SearchParamsError":g!==Km&&n===60018&&(E="SearchOverLimit"),new u.ChatError({code:E,message:r})}_isSearchingAllConversations(n){return this._core.helper.isEmpty(n.conversationID)}_setBirthdayRangeParams(n,r){const{miniBirthday:g,maxBirthday:u}=r;g!==void 0&&(n.miniBirthday=g,u===void 0&&(n.maxBirthday=4294967295)),u!==void 0&&(n.maxBirthday=u)}};function Dh(n,r){return Math.round(Number(n)*Math.pow(10,r))/Math.pow(10,r)}const hR="qualityStat",xD="im-ssolog-quality-stat";var YD;(function(n){n[n.ONLINE=8]="ONLINE"})(YD||(YD={}));const Zm="networkRTT",Sh="messageE2EDelay",mB="sendMessageC2C",vh="sendMessageGroup",Mh="sendMessageGroupAV",fB="sendMessageRichMedia",yB="cosUpload",wC="messageReceivedGroup",jQ="messageReceivedGroupAVPush",WQ="messageReceivedGroupAVPull",eN={[Zm]:2,[Sh]:3,[mB]:4,[vh]:5,[Mh]:6,[fB]:7,[wC]:8,[jQ]:9,[WQ]:10,[yB]:11},BR=[mB,vh,Mh,fB,yB],Rh=[wC,jQ,WQ],DB=[Zm,Sh,mB,vh,Mh,fB,yB,wC,jQ,WQ],VD={ERR_SVR_COMM_SENSITIVE_TEXT:80001,ERR_SVR_COMM_BODY_SIZE_LIMIT:80002,OPEN_SERVICE_OVERLOAD_ERROR:60022,ERR_SVR_MSG_PKG_PARSE_FAILED:20001,ERR_SVR_MSG_INTERNAL_AUTH_FAILED:20002,ERR_SVR_MSG_INVALID_ID:20003,ERR_SVR_MSG_PUSH_DENY:20006,ERR_SVR_MSG_IN_PEER_BLACKLIST:20007,ERR_SVR_MSG_BOTH_NOT_FRIEND:20009,ERR_SVR_MSG_NOT_PEER_FRIEND:20010,ERR_SVR_MSG_NOT_SELF_FRIEND:20011,ERR_SVR_MSG_SHUTUP_DENY:20012,ERR_SVR_GROUP_INVALID_PARAMETERS:10004,ERR_SVR_GROUP_PERMISSION_DENY:10007,ERR_SVR_GROUP_NOT_FOUND:10010,ERR_SVR_GROUP_INVALID_GROUPID:10015,ERR_SVR_GROUP_REJECT_FROM_THIRDPARTY:10016,ERR_SVR_GROUP_SHUTUP_DENY:10017,MSG_SEND_FAIL:2100,OVER_FREQUENCY_LIMIT:2996},Xm="quality_stat";var zQ=new class{constructor(){this._messageStatsMap=new Map,this._userSideErrorCodes=new Set(Object.values(VD))}init(n){this._core=n,Object.values(BR).forEach(r=>{this._messageStatsMap.set(r,{totalCount:0,successCount:0,failedCountOfUserSide:0,costSum:0,costCount:0,fileSizeSum:0})})}dispatchSendStats(n){const{name:r,message:g,error:u,startTs:E}=n,{SEND_MESSAGE_STAT:m}=this._core.constants;switch(r){case m.TOTAL_COUNT:this._handleTotalCount(g);break;case m.SUCCESS_COUNT:this._handleSuccessCount(g);break;case m.FAILED_COUNT:this._handleFailedCount(g,u);break;case m.SEND_COST:this._handleSendCost(g,E)}}getStatResult(n){const r=this._messageStatsMap.get(n);if(!r||r.totalCount===0)return null;const{totalCount:g,successCount:u,failedCountOfUserSide:E}=r,m=Dh(u/g*100,2),D=u+E,v=Dh(D/g*100,2),T=this._calcAverageValue(r,n);return this._resetStat(n),{total_count:g,success_count_business:u,percent_business:m,success_count_platform:D,percent_platform:v,average_value:T}}_handleTotalCount(n){const r=this._getSendMessageSpecifiedKey(n),g=r&&this._messageStatsMap.get(r);g&&g.totalCount++}_handleSuccessCount(n){const r=this._getSendMessageSpecifiedKey(n),g=r&&this._messageStatsMap.get(r);g&&g.successCount++}_handleFailedCount(n,r){var g;const u=(g=r?.code)!==null&&g!==void 0?g:r?.errorCode;if(this._isUserSideError(u)){const E=this._getSendMessageSpecifiedKey(n),m=E&&this._messageStatsMap.get(E);m&&m.failedCountOfUserSide++}}_handleSendCost(n,r){const g=this._getSendMessageSpecifiedKey(n),u=g&&this._messageStatsMap.get(g);u&&(u.costSum+=Date.now()-r,u.costCount++)}_isUserSideError(n){return this._userSideErrorCodes.has(n)||n>=120001&&n<=13e4||n>=10100&&n<=10200}_getSendMessageSpecifiedKey(n){const{MSG_IMAGE:r,MSG_AUDIO:g,MSG_VIDEO:u,MSG_FILE:E,CONV_C2C:m,CONV_GROUP:D,GRP_AVCHATROOM:v}=this._core.OuterConstant;if([r,g,u,E].includes(n.type))return fB;if(n.conversationType===m)return mB;if(n.conversationType===D){const{groupStore:T}=this._core.appStore,P=T.getGroup(n.to);if(!P)return;const{type:W}=P;return W===v?Mh:vh}}_calcAverageValue(n,r){return n.costCount===0?0:Math.round(r===yB?1e3*n.fileSizeSum/n.costSum:n.costSum/n.costCount)}_resetStat(n){const r=this._messageStatsMap.get(n);r&&(r.totalCount=0,r.successCount=0,r.failedCountOfUserSide=0,r.costSum=0,r.costCount=0,r.fileSizeSum=0)}},ZQ=new class{constructor(){this._lastCycleStats=new Map,this._currentCycleStats=new Map}init(n){this._core=n;const{OuterEvent:r,notificationCenter:g}=n;this._initStatsMap(),g.subscribeOuterEvent(r.MESSAGE_RECEIVED,this._onMessageReceived,this)}addMessageSequence(n){const r=this._getReceivedMessageSpecifiedKey(n),{utils:{isUndefined:g},OuterConstant:{CONV_GROUP:u},ssoLog:E}=this._core;if(g(r)||!this._currentCycleStats.has(r))return void E.debug("addMessageSequence",`${hR}.addMessageSequence invalid key:${r}`);const{conversationID:m,sequence:D}=n,v=m.replace(u,""),T=this._lastCycleStats.get(r);if(T.size===0||!T.has(v))return void this._addToCurrentCycle(r,v,D);const P=T.get(v);D>P.minSeq&&D{const{sortedSequences:m,minSeq:D,maxSeq:v}=E;m.length>0&&(u+=m.length,g+=v-D+1)}),g===0?null:(this._transferCycleDataOptimized(n),{total_count:g,success_count_business:u,percent_business:Dh(u/g*100,2)})}reset(){this._lastCycleStats.clear(),this._currentCycleStats.clear()}dispose(){const{notificationCenter:n,OuterEvent:{MESSAGE_RECEIVED:r}}=this._core;n.unSubscribeOuterEvent(r,this._onMessageReceived,this),this.reset()}_initStatsMap(){Object.values(Rh).forEach(n=>{this._lastCycleStats.set(n,new Map),this._currentCycleStats.set(n,new Map)})}_onMessageReceived(n){const{data:r=[]}=n;r.forEach(g=>{this.addMessageSequence(g)})}_transferCycleDataOptimized(n){const r=this._currentCycleStats.get(n);if(!r)return;const g=new Map;r.forEach((u,E)=>{const m=u.dirty?[...u.sortedSequences].sort((D,v)=>D-v):u.sortedSequences;g.set(E,{sortedSequences:m,minSeq:u.minSeq,maxSeq:u.maxSeq,dirty:!1})}),this._lastCycleStats.set(n,g),this._currentCycleStats.set(n,new Map)}_getReceivedMessageSpecifiedKey(n){const{OuterConstant:{CONV_GROUP:r,GRP_AVCHATROOM:g}}=this._core;if(n.conversationType===r&&n?._onlineOnlyFlag!==!0){const{groupStore:u}=this._core.appStore,E=u.getGroup(n.to);if(!E)return null;const{type:m}=E;return m===g?WQ:wC}}_insertToLastCycle(n,r){r.dirty&&(r.sortedSequences.sort((u,E)=>u-E),r.dirty=!1);const g=this._findInsertPos(r.sortedSequences,n);r.sortedSequences.splice(g,0,n),r.minSeq=Math.min(r.minSeq,n),r.maxSeq=Math.max(r.maxSeq,n)}_findInsertPos(n,r){let g=0,u=n.length-1;for(;g<=u;){const E=Math.floor((g+u)/2);if(n[E]===r)return E;n[E]0&&(this._totalDelay+=g,this._totalCount++,g<=1?this._countLessThan1s++:g<=3&&this._countLessThan3s++)}getStatResult(){if(this._totalCount===0)return null;const n={total_count:this._totalCount,success_count_business:this._countLessThan1s,success_count_platform:this._countLessThan3s,percent_business:this._calculatePercentage(this._countLessThan1s,this._totalCount),percent_platform:this._calculatePercentage(this._countLessThan3s,this._totalCount),average_value:this._calculateAverageDelay(this._totalCount)};return this.reset(),n}reset(){this._totalDelay=0,this._totalCount=0,this._countLessThan1s=0,this._countLessThan3s=0}dispose(){const{notificationCenter:n,OuterEvent:{MESSAGE_RECEIVED:r}}=this._core;n.unSubscribeOuterEvent(r,this._onMessageReceived,this),this.reset()}_onMessageReceived(n){const{data:r=[]}=n,{OuterConstant:{MSG_GRP_TIP:g,MSG_GRP_SYS_NOTICE:u}}=this._core,E=[g,u];r.forEach(m=>{!E.includes(m.type)&&m.clientTime>0&&this.addMessageDelay(m.clientTime)})}_calculateAverageDelay(n){return n===0?0:Dh(this._totalDelay/n,1)}_calculatePercentage(n,r){return Dh(n/r*100,2)}},QR=new class{init(n){this.core=n}},tN=new class{constructor(){this.name="MessageQualityStat",this._reportIndex=0,this._wholePeriod=!1,this._pendingReports=[],this._failedLogsCache=new Map}install(n){this._core=n;const{helper:r,notificationCenter:g,InnerEvent:{QUALITY_STAT:u,LOGOUT:E,DESTROY:m},constants:{WORKFLOW_NAME:D,WORKFLOW_STEP:v}}=n;QR.init(n),zQ.init(n),ZQ.init(n),XQ.init(n),r.registerWorkflowStep(D.SYNC_SERVER_INFO_AFTER_LOGIN,v.QUALITY_REPORT,this.handleLoginSuccess,this),g.subscribeInnerEvent(u,this._handleQualityStat,this),g.subscribeInnerEvent(E,this._reset,this),g.subscribeInnerEvent(m,this._dispose,this)}handleLoginSuccess(){const{store:n,helper:r,utils:{isUndefined:g}}=this._core,u=n.get("cloudConfig")||{},{q_rpt_interval:E}=u,m=g(E)?12e4:Number(E);r.taskScheduler.addTask({id:Xm,intervalMs:m,callback:this.report,context:this})}report(){this._wholePeriod=!0;const n=[...DB.map(r=>{const g=this._buildQualityReportItem(r);return g?Object.assign(Object.assign({},g),{report_index:this._reportIndex,whole_period:this._wholePeriod}):null}).filter(Boolean),...this._pendingReports];this._pendingReports=[],this._needSkipReport()||this._uploadQualityReports(n)}_handleQualityStat(n){const{constants:{QUALITY_METRICS:r}}=this._core,{label:g,data:u}=n;g===r.MESSAGE_SEND_SUCCESS_RATE&&zQ.dispatchSendStats(u)}_needSkipReport(){return this._isSDKAppIDInBlacklist()&&!this._isTinyIDInWhitelist()}_isSDKAppIDInBlacklist(){const{store:n,utils:r}=this._core,g=n.get("cloudConfig")||{},u=n.get("instance")||{},{sdkAppId:E}=u,{q_rpt_sdkappid_bl:m=[]}=g;if(!r.isEmpty(m))return m.split(",").map(D=>Number(D)).includes(E)}_isTinyIDInWhitelist(){const{store:n,utils:r}=this._core,g=n.get("cloudConfig")||{},u=n.get("login")||{},E=Number(u.tinyID),{q_rpt_tinyid_wl:m=[]}=g;if(!r.isEmpty(m))return m.split(",").includes(E)}_buildQualityReportItem(n){const r=this._getStatResultByKey(n);if(r===null)return null;const g={quality_type:eN[n],timestamp:Date.now(),network_type:YD.ONLINE,extension:""};return Object.assign(Object.assign({},g),r)}_getStatResultByKey(n){switch(n){case Sh:return XQ.getStatResult();case mB:case vh:case Mh:case fB:case yB:return zQ.getStatResult(n);case wC:case jQ:case WQ:return ZQ.getStatResult(n);default:return null}}_uploadQualityReports(n){return mA(this,void 0,void 0,function*(){try{const r={header:this._core.common.getCommonHead(),quality:n};yield function(g){const{common:u,channel:E}=QR.core,m="imopenstat.tim_web_report_v2",D=u.generateSSOLogProtocolData({servcmd:m,data:g}),v=`${D.head.seq}${m}`;return E.sendPacket(D,{requestId:v})}(r),this._reportIndex++,this._wholePeriod=!1}catch(r){console.warn("doReport failed. error:",r),this._pendingReports=this._pendingReports.concat(n),this._cacheFailedLogs()}})}_cacheFailedLogs(){const n=this._pendingReports,r=`${hR}._cacheFailedLogs`;let g=[...this._failedLogsCache.get(xD)||[],...n];g.length>10&&(g=g.slice(g.length-10),console.log(`${r} logs overflow, keeping last 10 items`)),this._failedLogsCache.set(xD,g),console.log(`${r} count: ${g.length}`),this._pendingReports=[]}_reset(){const{helper:n}=this._core;n.taskScheduler.removeTask(Xm)}_dispose(){const{notificationCenter:n,InnerEvent:{QUALITY_STAT:r,LOGOUT:g,DESTROY:u}}=this._core;n.unSubscribeInnerEvent(r,this._handleQualityStat,this),n.unSubscribeInnerEvent(g,this._reset,this),n.unSubscribeInnerEvent(u,this._dispose,this),this._reset(),XQ.dispose(),ZQ.dispose()}};const hl=new class{init(n){this.core=n}};function pR(n){return mA(this,void 0,void 0,function*(){var r;const{message:g,user:u,appStore:E,constants:{OuterConstant:m}}=hl.core,D=E.conversationStore.getConversationMap();if(D.has(n)){const T=(r=D.get(n))===null||r===void 0?void 0:r.userProfile;if(T&&n.startsWith(m.CONV_C2C)){const{avatar:P,nick:W}=T;hl.core.message.messageDataHandler.updateNickAndAvatarOfSentMessage({conversationID:n,latestAvatar:P,latestNick:W,isSentByMe:!1})}}const{data:v}=(yield u.userProfile.getMyProfile())||{};if(v){const{avatar:T,nick:P}=v;g.messageDataHandler.updateNickAndAvatarOfSentMessage({conversationID:n,latestAvatar:T,latestNick:P,isSentByMe:!0})}})}function mR(n){return mA(this,void 0,void 0,function*(){const r=n.map(g=>g.revoker);try{const g=yield function(u){return mA(this,void 0,void 0,function*(){var E,m;const D=yield(E=hl.core.user.userProfile)===null||E===void 0?void 0:E.getUserProfile({userIDList:u});return D?.data?(m=D.data)===null||m===void 0?void 0:m.reduce((v,{userID:T,nick:P,avatar:W})=>(v[T]={nick:P||"",avatar:W||""},v),{}):null})}(r);g&&n.forEach(u=>{const{revoker:E}=u;g[E]&&(u.revokerInfo.nick=g[E].nick||"",u.revokerInfo.avatar=g[E].avatar||"",u.revokerInfo.userID=E)})}catch(g){console.debug(g)}})}const JD=1,fR=2,wh=20,$Q=2500,yR=1,_h=300;function Ap(n){return mA(this,void 0,void 0,function*(){var r,g;const{appStore:u,utils:{isEmpty:E},common:{getCurrentUserID:m},notificationCenter:D,OuterEvent:v,OuterConstant:{CONV_C2C:T}}=hl.core,{messageList:P,conversationID:W}=n,oA=u.conversationStore.getConversationMap();let EA=(r=oA.get(W))===null||r===void 0?void 0:r.peerReadTime;if(!EA){const kA=W.replace(T,""),xA=yield function(LA){return mA(this,void 0,void 0,function*(){const SA={To_Account:LA};return hl.core.common.buildAndSendPacket({servcmd:"openim.get_peer_read_time",data:SA})})}([kA]);if(xA){const{ReadTime:LA}=xA;EA=LA?.[0],oA.has(W)&&(oA.get(W).peerReadTime=EA)}}if(oA.has(W)){const kA=(g=oA.get(W))===null||g===void 0?void 0:g.lastMessage;E(kA)||kA.fromAccount===m()&&kA.lastTime<=EA&&!kA.isPeerRead&&(kA.isPeerRead=!0,u.conversationStore.updateConversation(W,{lastMessage:kA}))}const wA=[];P.forEach(kA=>{kA.time<=EA&&!kA.isPeerRead&&kA.flow==="out"&&(kA.isPeerRead=!0,wA.push(kA))}),wA.length>0&&D.emitOuterEvent(v.MESSAGE_READ_BY_PEER,{name:v.MESSAGE_READ_BY_PEER,data:wA})})}var DR=new class{init(n){this._core=n,n.helper.registerApi({apiName:"getMessageList",context:this}),n.helper.registerApi({apiName:"getMessageListHopping",context:this}),n.helper.registerApi({apiName:"clearHistoryMessage",context:this})}getMessageList(n){return mA(this,void 0,void 0,function*(){try{const{message:r,OuterConstant:{Direction:g,CONV_C2C:u,CONV_GROUP:E},InnerEvent:{HISTORY_MESSAGE_FETCHED:m},notificationCenter:D}=this._core,{conversationID:v,nextReqMessageID:T}=n,P=wh;if(v==="@TIM#SYSTEM")return{code:0,data:{messageList:[],isCompleted:!1,nextMessageSeq:""}};const W=this._getAvailableLocalMessagesCount({conversationID:v,nextReqMessageID:T});if(this._needFetchHistoryMessageList({conversationID:v,availableLocalMessagesCount:W,targetCount:P})){let oA=null;if(v.startsWith(E)?oA=yield r.messageHistory.getGroupRoamingMessagesByAnchor({conversationID:v,sequence:Number(T),count:P,direction:g.FORWARD,shouldMarkCompleted:!0}):v.startsWith(u)&&(oA=yield r.messageHistory.getC2CRoamingMessagesByAnchor({conversationID:v,messageID:T,count:P,direction:g.FORWARD,shouldMarkCompleted:!0})),oA){const{nextReqMessageIDFromServer:EA,hasNoMoreHistoryMessage:wA,messageList:kA}=oA,xA=r.messageDataHandler.prependLocalMessageList({messageList:kA,conversationID:v});(function(ue){const{appStore:le,message:ki,OuterConstant:Li}=hl.core,Yt=le.conversationStore.getConversation(ue),Fi=ki.messageDataHandler.getLocalMessageList(ue);if(!Yt||Fi.length===0||ue===Li.CONV_SYSTEM)return;const hs=[];for(let Mt=0;MtUA.isRevoked).length;Re=hs.length-Yt.unreadCount-Mt}else Re=hs.length-Yt.unreadCount;for(let Mt=0;Mtue.isRevoked);yield mR(SA),D.emitInnerEvent(m,xA);const OA={nextReqMessageID:wA?"":String(EA),messageList:LA,isCompleted:wA},WA=LA.map(ue=>ue.sequence);return{code:0,data:OA,successLog:{message:`conversationID: ${v} nextReqMessageID: ${T} availableLocalMessagesCount: ${W} sequenceList: ${JSON.stringify(WA)}`}}}return{code:0,data:{messageList:[],isCompleted:!1,nextReqMessageID:""}}}return{code:0,data:yield this._getMessageListFromMemory({conversationID:v,nextReqMessageID:T,count:P}),successLog:{message:`conversationID: ${v} nextReqMessageID: ${T} availableLocalMessagesCount: ${W}}`}}}catch(r){const{code:g,message:u}=r||{};throw new this._core.helper.ChatError({code:g,message:u,moreMessage:`options: ${this._core.utils.safeStringify(n)}`})}})}getMessageListHopping(n){return mA(this,void 0,void 0,function*(){var r,g;const{OuterConstant:{Direction:u,CONV_C2C:E,CONV_GROUP:m},utils:{safeStringify:D}}=this._core,{conversationID:v,sequence:T,time:P,direction:W=u.FORWARD}=n,{utils:{isEmpty:oA},message:EA,notificationCenter:wA,InnerEvent:{HISTORY_MESSAGE_FETCHED:kA}}=this._core;if(![u.BACKWARD,u.FORWARD].includes(W))throw new this._core.helper.ChatError({message:"direction must be 0 or 1",moreMessage:`options: ${D(n)}`});let{count:xA=wh}=n;xA=xA>wh?wh:xA;let LA=null;if(v.startsWith(m)){if(LA=yield EA.messageHistory.getGroupRoamingMessagesByAnchor({conversationID:v,sequence:T,count:xA,direction:W}),LA){const{nextReqMessageIDFromServer:SA,hasNoMoreHistoryMessage:OA,messageList:WA,invisibleSequenceList:ue}=LA;if(this._core.message.messageDataHandler.storeSparseMessageList(WA),wA.emitInnerEvent(kA,WA),W===u.FORWARD){const le=OA&&SA<1;return{code:0,data:{messageList:WA,isCompleted:le,nextMessageSeq:le?"":SA}}}if(W===u.BACKWARD){if(oA(WA)&&oA(ue))return{code:0,data:{messageList:[],isCompleted:!0,nextMessageSeq:""}};const le=((r=WA?.[WA.length-1])===null||r===void 0?void 0:r.sequence)||0,ki=((g=ue?.[ue.length-1])===null||g===void 0?void 0:g.sequence)||0;return{code:0,data:{messageList:WA.filter(Li=>Li.sequence>=T),isCompleted:!OA,nextMessageSeq:OA?Math.max(le,ki)+1:""}}}return{code:0,data:LA}}}else if(v.startsWith(E)&&(LA=yield EA.messageHistory.getC2CRoamingMessagesByAnchor({conversationID:v,count:xA+1,time:P,direction:W}),LA)){const{messageList:SA,lastMessageTime:OA,hasNoMoreHistoryMessage:WA}=LA;return wA.emitInnerEvent(kA,SA),WA||(W===u.FORWARD?SA.shift():SA.pop()),EA.messageDataHandler.storeSparseMessageList(SA),yield Ap({messageList:SA,conversationID:v}),{code:0,data:{messageList:SA,isCompleted:WA,nextMessageTime:WA?"":OA}}}})}clearHistoryMessage(n){return mA(this,void 0,void 0,function*(){var r;const{appStore:g,common:{ChatError:u,getCurrentUserID:E},OuterConstant:{CONV_C2C:m,CONV_GROUP:D},apiMap:v,message:T}=this._core,P=g.conversationStore.getConversation(n);if(!P)throw new u({code:$Q});const W={fromAccount:E()},{type:oA}=P;oA===m?(W.type=JD,W.toAccount=n.replace(m,"")):oA===D&&(W.type=fR,W.toGroupID=n.replace(D,""));try{return yield(r=v?.setMessageRead)===null||r===void 0?void 0:r.call(v,{conversationID:n}),(yield function(wA){return mA(this,void 0,void 0,function*(){const{fromAccount:kA,type:xA,toAccount:LA,toGroupID:SA}=wA,OA={From_Account:kA,Type:xA,To_Account:LA,ToGroupid:SA};return hl.core.common.buildAndSendPacket({servcmd:"recentcontact.clear_msg",data:OA})})}(W))&&(T.messageDataHandler.deleteConversationMessageList(n),T.messageHistory.completedHistoryConversations.delete(n),T.messageHistory.clearHistoryMessageListFetchAnchors(n),this._updateConversationLastMessage(n)),{code:0,data:{conversationID:n},successLog:{message:`convID:${n}`}}}catch(EA){const{errorCode:wA}=EA;throw new this._core.helper.ChatError({functionName:"clearHistoryMessage",code:wA,moreMessage:`convID:${n}`})}})}_updateConversationLastMessage(n){const{appStore:r}=this._core;r.conversationStore.updateConversation(n,{lastMessage:this._generateLastMessage()},{needSort:!0})}_getAvailableLocalMessagesCount({conversationID:n,nextReqMessageID:r}){const{OuterConstant:{CONV_C2C:g,CONV_GROUP:u}}=this._core,E=this._core.message.messageDataHandler.getLocalMessageList(n),{length:m}=E;if(!r)return m;let D=-1;return n?.startsWith(g)?D=E.findIndex(v=>v.ID===r):n?.startsWith(u)&&(D=E.findIndex(v=>r.includes("-")?v.ID===r:String(v.sequence)===r)),D===-1?0:D}_needFetchHistoryMessageList({conversationID:n,availableLocalMessagesCount:r,targetCount:g}){const{message:u}=this._core;return rr.startsWith(E)?EA.ID===g:String(EA.sequence)===g),W=oA>u?oA-u:0,T=oA):W=v>u?v-u:0,P.messageList=D.slice(W,oA),P.isCompleted=T<=u&&m.messageHistory.completedHistoryConversations.has(r),P.isCompleted?P.nextReqMessageID="":P.nextReqMessageID=this._generateNextReqMessageID({conversationID:r,targetIndex:W}),r.startsWith(E)&&(yield pR(r),yield Ap({messageList:P.messageList,conversationID:r})),P})}_generateNextReqMessageID({conversationID:n,targetIndex:r}){const g=this._core.message.messageDataHandler.getLocalMessageList(n);return n.startsWith("C2C")?g[r].ID:String(g[r].sequence)}_generateLastMessage(){return{lastTime:0,lastSequence:0,fromAccount:"",messageForShow:"",payload:null,type:"",isRevoked:!1,cloudCustomData:"",onlineOnlyFlag:!1,nick:"",nameCard:"",version:0,isPeerRead:!1,revoker:null}}},SB=new class{constructor(){this._lastMessageSequenceMapOnDisconnect=new Map,this._lastMessageTimeMapOnDisconnect=new Map}init(n){this._core=n;const{common:{workflowManager:r},constants:{WORKFLOW_NAME:g,WORKFLOW_STEP:u,InnerEvent:E}}=n;r.registerWorkflowStep(g.SYNC_SERVER_INFO_AFTER_RE_ONLINE,u.HISTORY_MESSAGE_RECOVER,this._syncGroupOfflineMessage,this),r.registerWorkflowStep(g.SYNC_SERVER_INFO_AFTER_RE_ONLINE,u.C2C_HISTORY_MESSAGE_RECOVER,this._syncC2COfflineMessage,this),n.notificationCenter.subscribeInnerEvent(E.SOCKET_DISCONNECTED,this._updateLastMessageSequenceMapOnDisconnect,this)}_syncGroupOfflineMessage(n){const{conversationList:r}=n?.result||{},{OuterConstant:g,utils:{isArray:u}}=this._core;if(u(r)){const E=r.filter(m=>m.type===g.CONV_GROUP&&m.groupProfile.type!==g.GRP_AVCHATROOM);return this._recoverGroupHistoryMessage(E)}}_recoverGroupHistoryMessage(n){return mA(this,void 0,void 0,function*(){const{OuterConstant:r}=this._core,g=[],u=[];return yield Promise.all(n?.map(E=>mA(this,void 0,void 0,function*(){const{groupProfile:{groupID:m}={},lastMessage:{lastSequence:D}={}}=E,v=`${r.CONV_GROUP}${m}`;let T=this._getLocalLastMessageSequence(v);this._shouldRecoverHistory({localLastMessageSequence:T,serverLastMessageSequence:D})&&(yield this._recoverGroupHistoryForConversation({conversationID:v,localLastMessageSequence:T,serverLastMessageSequence:D,groupTipList:u})),g.push(v.replace(r.CONV_GROUP,""))}))),{recoverRevokeNoticeGroupIDList:g,groupTipList:u}})}_recoverGroupHistoryForConversation(n){return mA(this,arguments,void 0,function*({conversationID:r,localLastMessageSequence:g,serverLastMessageSequence:u,groupTipList:E}){try{const{utils:{isArray:m,isObject:D,isEmpty:v},OuterEvent:T,OuterConstant:P,notificationCenter:W,message:oA,appStore:EA,common:{getMessagePreviewText:wA,buildLastMessage:kA}}=this._core,xA=u-g,LA=Math.min(20,xA),SA={},OA=yield oA.messageHistory.getGroupRoamingMessagesByAnchor({conversationID:r,sequence:g+LA,direction:P.Direction.FORWARD,count:LA}),{nextReqMessageIDFromServer:WA,hasNoMoreHistoryMessage:ue,messageList:le,serverGroupTipList:ki}=OA;m(ki)&&E.push(...ki);const Li=ue&&WA<0,Yt=[];if(m(le)&&(le.forEach(Fi=>{oA.messageReceiver.groupMessageReceiver.updateMessageProfile(Fi),Fi.from===P.CONV_SYSTEM&&(Fi.isSystemMessage=!1),oA.messageDataHandler.storeConversationMessage(Fi)&&!v(Fi.payload)&&(Yt.push(Fi),Fi._isExcludedFromLastMessage||(SA.lastMessage=kA(Fi)))}),Yt.length>0&&W.emitOuterEvent(T.MESSAGE_RECEIVED,{name:T.MESSAGE_RECEIVED,data:Yt})),!Li&&le.length>0){const Fi=le[le.length-1].sequence;yield this._recoverGroupHistoryForConversation({conversationID:r,localLastMessageSequence:Fi,serverLastMessageSequence:u,groupTipList:E})}D(SA.lastMessage)&&(SA.lastMessage.messageForShow=wA(SA.lastMessage.type,SA.lastMessage.payload),EA.conversationStore.updateConversation(r,SA))}catch(m){this._core.ssoLog.error("_recoverGroupHistoryForConversation",`Recovery failed for conversation:${r}`,{error:m})}})}_updateLastMessageSequenceMapOnDisconnect(){const{message:n}=this._core,r=n.messageDataHandler.getContinuousMessagesByConversation();for(const[g,u]of r){const E=Array.from(u.values());if(E?.length>0){const m=E[E.length-1];g.startsWith("C2C")?this._lastMessageTimeMapOnDisconnect.set(g,m.time):g.startsWith("GROUP")&&this._lastMessageSequenceMapOnDisconnect.set(g,m.sequence)}}}_getLocalLastMessageSequence(n){const{message:r}=this._core;if(this._lastMessageSequenceMapOnDisconnect.has(n))return this._lastMessageSequenceMapOnDisconnect.get(n);const g=r.messageDataHandler.getLocalMessageList(n),u=g[g.length-1];return u?.sequence}_shouldRecoverHistory(n){const{localLastMessageSequence:r,serverLastMessageSequence:g}=n;if(typeof r!="number"||typeof g!="number")return!1;const u=g-r;return g!==0&&r>0&&u>=yR&&u<_h}_syncC2COfflineMessage(n){const{conversationList:r}=n?.result||{},{OuterConstant:g,utils:{isArray:u}}=this._core;if(u(r)){const E=[];return r.forEach(m=>{m.type===g.CONV_C2C&&E.push(m)}),this._recoverC2CHistoryMessage(E)}}_recoverC2CHistoryMessage(n){return mA(this,void 0,void 0,function*(){yield Promise.all(n?.map(r=>mA(this,void 0,void 0,function*(){const{conversationID:g,lastMessage:{lastTime:u}={}}=r,E=this._getLocalLastMessageTime(g);this._shouldRecoverC2CHistory({localLastMessageTime:E,serverLastMessageTime:u})&&(yield this._recoverHistoryForC2CConversation({conversationID:g,localLastMessageTime:E,serverLastMessageTime:u}))})))})}_shouldRecoverC2CHistory(n){const{localLastMessageTime:r,serverLastMessageTime:g}=n,u=g-r;return r>0&&u>=1&&u<=600}_recoverHistoryForC2CConversation(n){return mA(this,void 0,void 0,function*(){var r;const{conversationID:g,localLastMessageTime:u,serverLastMessageTime:E}=n,{utils:{isArray:m,isObject:D,isEmpty:v,safeStringify:T},OuterEvent:P,OuterConstant:W,notificationCenter:oA,message:EA,appStore:wA,common:{getMessagePreviewText:kA,buildLastMessage:xA}}=this._core;try{const LA={},SA=yield EA.messageHistory.getC2CRoamingMessagesByAnchor({conversationID:g,direction:W.Direction.BACKWARD,time:u,count:20});if(v(SA))return;const{hasNoMoreHistoryMessage:OA,messageList:WA}=SA,ue=[];m(WA)&&(WA.forEach(ki=>{EA.messageDataHandler.storeConversationMessage(ki)&&!v(ki.payload)&&(ue.push(ki),ki._isExcludedFromLastMessage||(LA.lastMessage=xA(ki)))}),ue.length>0&&oA.emitOuterEvent(P.MESSAGE_RECEIVED,{name:P.MESSAGE_RECEIVED,data:ue}));const le=(r=WA[WA.length-1])===null||r===void 0?void 0:r.time;!OA&&le>E&&(yield this._recoverHistoryForC2CConversation({conversationID:g,localLastMessageTime:le,serverLastMessageTime:E})),D(LA.lastMessage)&&(LA.lastMessage.messageForShow=kA(LA.lastMessage.type,LA.lastMessage.payload),wA.conversationStore.updateConversation(g,LA))}catch(LA){this._core.ssoLog.error("_recoverHistoryForC2CConversation",`Recovery failed for conversation:${g} error: ${T(LA)}`)}})}_getLocalLastMessageTime(n){const{message:r}=this._core;if(this._lastMessageTimeMapOnDisconnect.has(n))return this._lastMessageTimeMapOnDisconnect.get(n);const g=r.messageDataHandler.getLocalMessageList(n),u=g[g.length-1];return u?.time}reset(){this._lastMessageSequenceMapOnDisconnect.clear(),this._lastMessageTimeMapOnDisconnect.clear()}dispose(){this.reset()}},vB=new class{constructor(){this.name="HistoryMessage"}install(n){this._core=n,hl.init(n),DR.init(n),SB.init(n),n.notificationCenter.subscribeInnerEvent(n.InnerEvent.LOGOUT,this._reset,this),n.notificationCenter.subscribeInnerEvent(n.InnerEvent.DESTROY,this.dispose,this)}dispose(){const{notificationCenter:n,InnerEvent:r}=this._core;n.unSubscribeInnerEvent(r.LOGOUT,this._reset,this),n.unSubscribeInnerEvent(r.DESTROY,this.dispose,this),SB.dispose()}_reset(){SB.reset()}},HD=new class{init(n){this.core=n}},_C=new class{constructor(){this._reportedAtomicStoreIDs=new Set}init(n){const{helper:{registerExperimentalAPI:r}}=n;this._core=n,r("reportModalView",this),r("reportTUIFeatureUsage",this),r("reportRoomEngineEvent",this)}reportModalView(n){const{ssoLog:r,utils:{safeStringify:g,isString:u}}=this._core;try{if(!u(n))throw new Error("reportModalView data is not a string");r.createSSOLogData({method:"reportModalView",message:n,eventType:30}).end(!0)}catch(E){r.debug(`reportModalView Report failed: ${g(E)}`)}}reportTUIFeatureUsage(n){const{ssoLog:r,utils:{safeStringify:g,isEmpty:u}}=this._core,{atomicStoreID:E}=n;try{u(E)||this._reportedAtomicStoreIDs.has(E)||(this._core.ssoLog.info("reportTUIFeatureUsage",`atomicStoreID: ${n.atomicStoreID}`,{method:"reportTUIFeatureUsage",eventType:31,code:E}),this._reportedAtomicStoreIDs.add(E))}catch(m){r.debug(`reportTUIFeatureUsage Report failed: ${g(m)}`)}}reportRoomEngineEvent(n){const{utils:{safeStringify:r},ssoLog:g}=this._core;try{g.debug(`reportRoomEngineEvent Report: ${r(n)}`);const{eventId:u,eventCode:E,eventResult:m,eventMessage:D,moreMessage:v,extensionMessage:T}=n;g.createSSOLogData({method:T,code:u,message:D,eventType:30,costTime:E,uiPlatform:m,moreMessage:v}).end(!0)}catch(u){g.debug(`reportRoomEngineEvent Report failed: ${r(u)}`)}}reset(){this._reportedAtomicStoreIDs.clear()}dispose(){this.reset()}},ep=new class{constructor(){this.name="DataReport"}install(n){this._core=n;const{notificationCenter:r,InnerEvent:{LOGOUT:g,DESTROY:u}}=n;HD.init(n),_C.init(n),r.subscribeInnerEvent(g,this._reset,this),r.subscribeInnerEvent(u,this._dispose,this)}_reset(){_C.reset()}_dispose(){const{notificationCenter:n,InnerEvent:{LOGOUT:r,DESTROY:g}}=this._core;n.unSubscribeInnerEvent(r,this._reset,this),n.unSubscribeInnerEvent(g,this._dispose,this),_C.dispose()}};let $m=dr.STANDARD,MB=[];$m=dr.STANDARD,MB=[lh,dC,CC,hC,bc,tN,vB,ep,PE,Ti,er,jT,qm,PD,tu];function RB(n,r){const{operationType:g,memberInfoList:u,operatorInfo:E}=n||{};let m={};if(ts(u)?ts(E)||(m=E):g!==Gg.JOINED&&g!==Gg.KICKED&&g!==Gg.ADMIN_SET&&g!==Gg.ADMIN_CANCELED||(m=Object.assign({},u[0])),!ts(m)){const{nick:D="",avatar:v=""}=m;r.nick=D,r.avatar=v}}const tp=n=>({lastTime:n?.time||n?.lastTime||0,lastSequence:n?.sequence||n?.lastSequence||0,fromAccount:n?.from||n?.fromAccount||"",messageForShow:il(n?.type,n?.payload),payload:n?.payload||null,type:n?.type||"",isRevoked:n?.isRevoked||!1,cloudCustomData:n?.cloudCustomData||"",onlineOnlyFlag:n?._onlineOnlyFlag||!1,nick:n?.nick||"",nameCard:n?.nameCard||"",version:n?.version||0,isPeerRead:n?.isPeerRead||!1,revoker:n?.revoker||null});var ip=Object.freeze({__proto__:null,ChatError:Cs,WorkflowManager:Fs,buildAndSendPacket:lg,buildLastMessage:tp,get builtInPlugins(){return MB},checkBusinessCapabilityBits:In,deepMerge:hd,getCurrentUserID:ar,getErrorMessage:Es,getMessagePreviewText:il,isC2CConv:n=>c(n)&&n.slice(0,3)===Oa.CONV_C2C,isCommunity:ea,isGroupConv:n=>c(n)&&n.slice(0,5)===Oa.CONV_GROUP,isInternational:bl,isTopic:tl,isUnlimitedAVChatRoom:function(){var n;return!!(!((n=De.store.get("instance"))===null||n===void 0)&&n.unlimitedAVChatRoom)},liteChatInstanceMap:ma,registerInterceptor:Nc,registerValidateConfig:el,requireAuth:Ed,get sdkEdition(){return $m},setGroupTipsUserInfo:RB,t:Uu,updateGroupAtInfo:(n,r)=>{const{CONV_AT_ME:g,CONV_AT_ALL:u,CONV_AT_ALL_AT_ME:E}=Po;if(function(v,T){const{CONV_AT_ME:P,CONV_AT_ALL:W,CONV_AT_ALL_AT_ME:oA}=Po,{groupID:EA,sequence:wA}=v;let kA=!1;return ea({groupID:EA})&&T.forEach(xA=>{xA.messageSequence===wA&&(xA.atTypeArray.includes(P)&&v.groupAtType.includes(W)&&(xA.atTypeArray=[oA]),xA.atTypeArray.includes(W)&&v.groupAtType.includes(P)&&(xA.atTypeArray=[oA],xA.__random=v.__random,xA.__sequence=v.__sequence),kA=!0)}),kA}(n,r))return;let m=[...n.groupAtType];m.includes(g)&&m.includes(u)&&(m=[E]);const D={from:n.from,groupID:n.groupID,topicID:n.topicID,messageSequence:n.sequence,atTypeArray:m,__random:n.__random,__sequence:n.__sequence};r.push(D)},validateAndExecute:wr,validateParameters:hI});class Iu{constructor(){this._builtInPlugins=new Set,this._externalPlugins=new Set}static getInstance(){return Iu._instance||(Iu._instance=new Iu),Iu._instance}static setInstance(r){Iu._instance=r}installBuiltInPlugin(r){r&&this._installPlugin(r,this._builtInPlugins)}installExternalPlugin(r){r&&this._installPlugin(r,this._externalPlugins)}clear(){this._builtInPlugins=new Set,this._externalPlugins=new Set}_installPlugin(r,g){let u=[];u=C(r)?r:[r];const E=u.findIndex(D=>D?.name==="AVChatRoom"),m=E>-1?u.splice(E,1):[];u.forEach(D=>{this._isPluginInstalled(D.name)||(D&&wg(D.install)?(g.add(D.name),wg(D.getInstalledSubPlugins)?(m?.forEach(v=>g.add(v?.name)),D.install(Sr.getInstance().exposeApiForPlugin(),m)):D.install(Sr.getInstance().exposeApiForPlugin()),wg(D.handleLoginSuccess)&&this._isLoggedIn()&&D.handleLoginSuccess()):wg(D)?(g.add(D.name),D(Sr.getInstance().exposeApiForPlugin()),wg(D.handleLoginSuccess)&&this._isLoggedIn()&&D.handleLoginSuccess()):console.warn('A plugin must either be a function or an object with an "install" function.'))})}_isPluginInstalled(r){return this._builtInPlugins.has(r)||this._externalPlugins.has(r)}_isLoggedIn(){var r;return((r=De.store.get("login"))===null||r===void 0?void 0:r.isLoggedIn)===!0}}var wB=new class{constructor(){this._conversationMap=new Map}getConversationMap(){return this._conversationMap}getConversation(n){return this._conversationMap.get(n)}updateConversation(n,r,g){const{emit:u=!0,needSort:E=!1}=g||{},m=this._conversationMap.get(n);m&&!ts(r)&&(Object.keys(r).forEach(D=>{m[D]=r[D]}),u&&De.notificationCenter.emitInnerEvent(lo.CONVERSATION_UPDATED,{needSort:E}))}deleteConversation(n){this._conversationMap.has(n)&&(this._conversationMap.delete(n),De.notificationCenter.emitInnerEvent(lo.CONVERSATION_UPDATED))}},op=new class{constructor(){this._groupMap=new Map}getGroupMap(){return this._groupMap}getGroup(n){return this._groupMap.get(n)}updateGroup(n,r){const g=this._groupMap.get(n);g&&!ts(r)&&Object.keys(r).forEach(u=>{g[u]=r[u]})}},sp=new class{constructor(){this._messagesByConversation=new Map}updateMessage(n,r,g){var u;const{operation:E,updateUnreadCount:m=!0}=g,D=vo(g,["operation","updateUnreadCount"]),v=[];for(const T of r){const P=(u=this._messagesByConversation.get(n))===null||u===void 0?void 0:u.get(T);if(!P)return!1;Object.keys(D).forEach(W=>{P[W]=D[W]}),v.push(P)}return this._emitMessageStoreOperationEvent(E,{conversationID:n,messageList:v,updateUnreadCount:m}),v}getMessagesByConversation(n){var r;return[...((r=this._messagesByConversation.get(n))===null||r===void 0?void 0:r.values())||[]]}getMessages(){return this._messagesByConversation}_emitMessageStoreOperationEvent(n,r){const{conversationID:g}=r;tl(g)?De.notificationCenter.emitInnerEvent(Nu[n],r):De.notificationCenter.emitInnerEvent(n,r)}},lc=new class{constructor(){this.userProfileMap=new Map,this.friendMap=new Map}getUserProfileMap(){return this.userProfileMap}getFriendMap(){return this.friendMap}getUserProfile(n){return this.userProfileMap.get(n)}getFriend(n){return this.friendMap.get(n)}},qD=Object.freeze({__proto__:null,conversationStore:wB,groupStore:op,messageStore:sp,userStore:lc});class Sr{static getInstance(){return Sr._instance||(Sr._instance=new Sr),Sr._instance}static setInstance(r){Sr._instance=r}constructor(){this._experimentalApiMap={statTUIKeyFeatures:this.statKeyFeatureUsage.bind(this),setApplicationID:this.setApplicationID.bind(this)},this._apiHandlersMap={},this._apiMap={on:De.notificationCenter.subscribeOuterEvent.bind(De.notificationCenter),off:De.notificationCenter.unSubscribeOuterEvent.bind(De.notificationCenter),destroy:this.destroy.bind(this),callExperimentalAPI:this.callExperimentalAPI.bind(this),use:Iu.getInstance().installExternalPlugin.bind(Iu.getInstance()),registerPlugin:this.registerPlugin.bind(this),setLogLevel:this.setLogLevel.bind(this)}}registerPlugin(r){De.ssoLog.debug("registerPlugin",r)}statKeyFeatureUsage(r){De.ssoLog.debug("statTUIKeyFeatures",r)}setLogLevel(r){De.ssoLog.debug("setLogLevel",r),De.ssoLog.setLogLevel(r)}setApplicationID(r){De.store.set("instance",{applicationID:r})}getApiMap(){return this._apiMap}setApiMap(r){this._apiMap=r}registerApi(r){const{common:{timeManager:g},utils:{safeStringify:u}}=De,{apiName:E,context:m,methodName:D=E,matcher:v}=r;this._apiHandlersMap[E]||(this._apiHandlersMap[E]=[]),this._apiHandlersMap[E].push({context:m,methodName:D,matcher:v}),this._apiMap[E]&&this._apiHandlersMap[E].length!==1||(this._apiMap[E]=(...T)=>{const P=g.getServerTimeMs();let W=0;E==="login"&&(W=4),zI.includes(E)&&De.ssoLog.debug(E,`${E} start params: ${u(T)}`),wr(D,T);const oA=this._apiHandlersMap[E];for(const EA of oA)if(!EA.matcher||EA.matcher(T))try{const wA=EA.context[EA.methodName].bind(EA.context)(...T);return this._isPromiseLike(wA)?this._handleAsyncResult(wA,E,W,P):(this._reportApiSuccessLog({result:wA,apiName:E,eventType:W,startTime:P}),wA)}catch(wA){throw De.ssoLog.error(E,`${E} fail ${wA?.message||wA?.errorMessage})`,{error:wA,costTime:g.getServerTimeMs()-P,eventType:W,method:E}),wA}})}registerExperimentalAPI(r,g,u){const E=u||r;this._experimentalApiMap[r]=g[E].bind(g)}destroy(){return mA(this,void 0,void 0,function*(){var r,g;try{!((r=De.store.get("login"))===null||r===void 0)&&r.isLogin&&(yield this._apiMap.logout()),De.notificationCenter.emitInnerEvent(lo.DESTROY)}catch(u){console.debug("destroy error: ",u)}finally{De.notificationCenter.emitOuterEvent(Rr.SDK_DESTROY,{SDKAppID:(g=De.store.get("instance"))===null||g===void 0?void 0:g.sdkAppId}),ma.clear(),Iu.getInstance().clear(),Fs.getInstance().destroy(),De.destroy()}})}exposeApiForClient(){return this._apiMap}exposeApiForPlugin(){return Object.assign(Object.assign({InnerEvent:lo,InnerEventSubType:De.notificationCenter.InnerEventSubType,OuterEvent:Rr,OuterConstant:Po,SignalingEvent:Xc,helper:Object.assign(Object.assign(Object.assign({},De.utils),De.common),{registerApi:this.registerApi.bind(this),registerExperimentalAPI:this.registerExperimentalAPI.bind(this),registerInterceptor:Nc,registerValidateConfig:el,checkBusinessCapabilityBits:In,registerWorkflowStep:Fs.getInstance().registerWorkflowStep.bind(Fs.getInstance()),ChatError:Cs}),apiMap:this._apiMap},De),{constants:Object.assign(Object.assign({},$a),De.constants),common:Object.assign(Object.assign(Object.assign({},ip),De.common),{workflowManager:Fs.getInstance()}),utils:De.utils,appStore:qD})}callExperimentalAPI(r,g){return De.ssoLog.debug(`callExperimentalAPI.${r} start params: ${De.utils.safeStringify(g)}`),this._experimentalApiMap[r]?this._experimentalApiMap[r](g):(De.ssoLog.error("callExperimentalAPI",`callExperimentalAPI.${r} not found, params: ${De.utils.safeStringify(g)}`),Promise.reject(new Cs({code:pa.INVALID_OPERATION})))}_isPromiseLike(r){return r!==null&&typeof r=="object"&&typeof r.then=="function"}_handleAsyncResult(r,g,u,E){return r.then(m=>(this._reportApiSuccessLog({result:m,apiName:g,eventType:u,startTime:E}),m)).catch(m=>{throw De.ssoLog.error(g,`${g} fail ${m?.message||m?.errorMessage})`,{error:m,costTime:De.common.timeManager.getServerTimeMs()-E,eventType:u,method:g,startTime:E}),m})}_reportApiSuccessLog(r){let{result:g,apiName:u,startTime:E,eventType:m}=r;const{timeManager:D}=De.common,{successLog:{message:v,moreMessage:T}={message:"",moreMessage:""}}=g||{},P=D.getServerTimeMs();u==="login"&&(E+=D.getTimeOffsetWithServer()),zI.includes(u)&&De.ssoLog.info(u,`${u} success ${v} ${T}`,{costTime:P-E,eventType:m,message:v,moreMessage:T,startTime:E}),g?.successLog&&delete g.successLog}}class SR{constructor(){this._latestLoginAt=0,this._latestSendOnlinePresenceRequestTime=0,this._helloInterval=120,this._customLoginInfo=""}init(){const{notificationCenter:r,store:g}=De;g.set("login",{isReady:!1}),Sr.getInstance().registerApi({apiName:"login",context:this}),Sr.getInstance().registerApi({apiName:"logout",context:this}),Sr.getInstance().registerApi({apiName:"getLoginUser",context:this}),Sr.getInstance().registerApi({apiName:"isReady",context:this}),Sr.getInstance().registerApi({apiName:"getServerTime",context:this}),Sr.getInstance().registerExperimentalAPI("setCustomLoginInfo",this),r.subscribeInnerEvent(lo.RECONNECTED,this._reLogin,this),De.notificationCenter.subscribeInnerEvent(lo.DESTROY,this._dispose,this)}login(r){return mA(this,void 0,void 0,function*(){var g;const{sdkEdition:u}=De.store.get("instance")||{};try{if(this._isLoginIn())return this._createRepeatLoginResponse();if(this._isLoginFrequencyExceeded())throw new Cs({functionName:"login",code:pa.REPEAT_LOGIN});const E=yield this._performLogin(r);this._validateAfterLogin(E),this._handleLoginSuccess(E),yield this._ensureAsyncComplete(),this._updateAndEmitSDKReady(),this._latestLoginAt=0;const m=(g=De.channel.getSocketAdapter())===null||g===void 0?void 0:g.getId(),{appId:D,href:v}=De.store.get("instance")||{},{instanceID:T,customStatus:P}=E||{};return{code:0,data:E,successLog:{message:u,moreMessage:`socketID:${m} instanceID:${T} customStatus:${P} href: ${v} appId: ${D}`}}}catch(E){const{errorCode:m}=E;m!==pa.REPEAT_LOGIN&&(this._latestLoginAt=0);const D=new Cs({functionName:"login",code:m});throw console.error(D),D}})}_reLogin(){return mA(this,void 0,void 0,function*(){var r;try{if(!this._isLoginIn())return;const g=yield Lu(this._customLoginInfo);if(g){const{instanceID:u,customStatus:E}=g;De.store.set("login",{statusInstanceId:u}),Fs.getInstance().executeWorkflow(jt.SYNC_SERVER_INFO_AFTER_RE_ONLINE,{customStatus:E,statusType:SE.USER_STATUS_ONLINE});const m=(r=De.channel.getSocketAdapter())===null||r===void 0?void 0:r.getId();De.ssoLog.info("reLogin",`socketId:${m} instanceId:${u}`)}}catch(g){console.warn(g)}})}logout(){return mA(this,arguments,void 0,function*(r=ca.USER_INITIATED){const{ssoLog:g}=De;g.debug("logout",`logout start logoutReason: ${r}`);try{yield this._performLogout(r),g.info("logout","logout success"),De.ssoLog.uploadSSOLogData()}catch(u){const{errorCode:E}=u;throw new Cs({functionName:"logout",code:E})}finally{this.handleLogoutCompleted()}return{code:0,data:{}}})}getLoginUser(){return this._isLoginIn()?ar():""}isReady(){var r;return(r=De.store.get("login"))===null||r===void 0?void 0:r.isReady}setCustomLoginInfo(r=""){this._customLoginInfo=r}handleLogoutCompleted(){this._updateAndEmitSDKNotReady(),this._reset(),Fs.getInstance().reset(),De.notificationCenter.emitInnerEvent("logout")}getServerTime(){const{timeManager:r}=De.common;return r.getServerTimeMs()}_updateAndEmitSDKReady(){De.store.set("login",{isReady:!0}),setTimeout(()=>{De.notificationCenter.emitOuterEvent(Rr.SDK_READY,{name:Rr.SDK_READY})},1)}_updateAndEmitSDKNotReady(){De.store.set("login",{isReady:!1}),De.notificationCenter.emitOuterEvent(Rr.SDK_NOT_READY,{name:Rr.SDK_NOT_READY})}_validateAfterLogin(r){const g="login";if(!r)throw new Cs({functionName:g,message:"login response is empty"});const{tinyID:u,a2Key:E}=r||{};if(!u)throw new Cs({functionName:g,code:pa.NO_TINYID});if(!E)throw new Cs({functionName:g,code:pa.NO_A2KEY})}_createRepeatLoginResponse(){var r;return{code:0,data:{actionStatus:"OK",errorCode:0,errorInfo:Es({code:"RepeatLogin",replacement1:(r=De.store.get("login"))===null||r===void 0?void 0:r.userId}),repeatLogin:!0}}}_performLogin(r){return mA(this,void 0,void 0,function*(){const{userID:g,userSig:u}=r;return De.store.set("login",{userId:g,userSig:u}),this._latestLoginAt=Date.now(),Lu(this._customLoginInfo)})}_ensureAsyncComplete(){return mA(this,void 0,void 0,function*(){yield new Promise(r=>{setTimeout(()=>r(null),1)})})}_handleLoginSuccess(r){const{timeManager:g}=De.common,{helloInterval:u,timeStamp:E,customStatus:m,purchaseBits:D}=r,v=1e3*E;g.calculateTimeOffsetWithServer(this._latestLoginAt,v),this._helloInterval=u||120,this._updateLoginStore(r),De.user.userStatus.setCustomStatus(m),Fs.getInstance().executeWorkflow(jt.SYNC_SERVER_INFO_AFTER_LOGIN,{purchaseBits:D}),De.common.taskScheduler.addTask({id:kg,intervalMs:1e3*this._helloInterval,callback:this._sendOnlinePresenceRequest,context:this})}_performLogout(r){return function(g){return mA(this,void 0,void 0,function*(){const{logoutReason:u}=g,E="im_open_status.wslogout",m=De.common.generateProtocolData({servcmd:E,data:{wslogout_type:u,isWebUniapp:0}}),D=`${m.head.seq}${E}`;return yield De.channel.sendPacket(m,{requestId:D})})}({logoutReason:r})}_updateLoginStore(r){const{a2Key:g,tinyID:u,instanceID:E,authKey:m}=r;De.store.set("login",{a2Key:g,tinyID:u,statusInstanceId:E,authKey:m,isLoggedIn:!0})}_sendOnlinePresenceRequest(){return mA(this,void 0,void 0,function*(){this._latestSendOnlinePresenceRequestTime=Date.now();try{yield function(){const r="im_open_status.wshello",g=De.common.generateProtocolData({servcmd:r,data:{isWebUniapp:0}}),u=`${g.head.seq}${r}`;return De.channel.sendPacket(g,{requestId:u})}()}catch(r){De.ssoLog.warn("_sendOnlinePresenceRequest",` error:${r.message}`)}})}_isLoginIn(){var r;return((r=De.store.get("login"))===null||r===void 0?void 0:r.isLoggedIn)===!0}_isLoginFrequencyExceeded(){return Date.now()-this._latestLoginAt<=15e3}_reset(){De.common.taskScheduler.removeTask(kg),this._helloInterval=120,this._latestSendOnlinePresenceRequestTime=0,this._latestLoginAt=0,this._customLoginInfo="",De.store.clear("login"),De.store.set("login",{isReady:!1}),De.store.set("instance",{applicationID:0})}_dispose(){this._reset();const{notificationCenter:r}=De;r.unSubscribeInnerEvent(lo.RECONNECTED,this._reLogin,this),r.unSubscribeInnerEvent(lo.DESTROY,this._dispose,this)}}const vR={login:{userID:{required:!0,rules:["string"],allowEmpty:!1},userSig:{required:!0,rules:["string"],allowEmpty:!1}}},iN={logout:!0};class Th{constructor(){this.loginAction=new SR,this.kickedOutHandler=new ku,this.loginAction.init(),this.kickedOutHandler.init(),el({auth:iN,params:vR})}}var Zr,eE,KE;(function(n){n.CONV_C2C="C2C",n.CONV_GROUP="GROUP",n.CONV_TOPIC="TOPIC",n.CONV_SYSTEM="@TIM#SYSTEM"})(Zr||(Zr={})),function(n){n.MSG_PRIORITY_HIGH="High",n.MSG_PRIORITY_NORMAL="Normal",n.MSG_PRIORITY_LOW="Low",n.MSG_PRIORITY_LOWEST="Lowest"}(eE||(eE={})),function(n){n.MSG_TEXT="TIMTextElem",n.MSG_CUSTOM="TIMCustomElem",n.MSG_LOCATION="TIMLocationElem",n.MSG_FACE="TIMFaceElem",n.MSG_IMAGE="TIMImageElem",n.MSG_AUDIO="TIMSoundElem",n.MSG_FILE="TIMFileElem",n.MSG_VIDEO="TIMVideoFileElem",n.MSG_GRP_TIP="TIMGroupTipElem",n.MSG_GRP_SYS_NOTICE="TIMGroupSystemNoticeElem",n.MSG_MERGER="TIMRelayElem"}(KE||(KE={}));const KD={1:eE.MSG_PRIORITY_HIGH,2:eE.MSG_PRIORITY_NORMAL,3:eE.MSG_PRIORITY_LOW,4:eE.MSG_PRIORITY_LOWEST},jD=0,MR=1;var tE;(function(n){n.IN="in",n.OUT="out"})(tE||(tE={}));const RR=2,np={};function uu(n){if(!n)return 0;if(np[n]===void 0){const r=new Date,g=`3${r.getHours()}`.slice(-2),u=`0${r.getMinutes()}`.slice(-2),E=`0${r.getSeconds()}`.slice(-2);np[n]=parseInt([g,u,E,"0001"].join(""),10),console.log(`autoIncrementIndex start index:${np[n]}`)}else np[n]+=1;return np[n]}class jE{constructor(r){this.ID="",this.random=0,this.sequence=0,this.nameCard="",this.isRead=!1,this.isPeerRead=!1,this.isDeleted=!1,this.isResend=!1,this.hasRiskContent=!1,this._onlineOnlyFlag=!1,this.atUserList=[],this._groupAtInfoList=[],this.isBroadcastMessage=!1,this.priority=eE.MSG_PRIORITY_NORMAL,this._relayFlag=!1;const{clientTime:g=De.common.timeManager.getServerTimeSeconds()||0,senderTinyID:u,currentUser:E,needReadReceipt:m,isSupportExtension:D,customModerationConfigurationId:v,to:T,from:P,nick:W="",avatar:oA="",time:EA,messageControlInfo:wA,tinyID:kA,cloudCustomData:xA="",messageLifeTime:LA,messageVersion:SA=0,conversationType:OA,sequence:WA,checkResult:ue=0,isPlaceMessage:le=0,messageFlagBits:ki,receiverList:Li,isSystemMessage:Yt=!1,status:Fi=qr.SUCCESS,revokeReason:hs="",conversationSubType:Re,clientSequence:Mt,protocol:UA="JSON",revokerInfo:ci={userID:"",nick:"",avatar:""},readReceiptInfo:Os={readCount:void 0,unreadCount:void 0,isPeerRead:void 0,timestamp:0},random:Oi,groupProfile:Yr,atUserList:ji,flow:Br,isRead:Ut=!1,priority:Ft=eE.MSG_PRIORITY_NORMAL,onlineOnlyFlag:oE=!1,nameCard:Cn="",quoteInfo:Do}=r;var Bl;this.clientTime=g,this.senderTinyID=u||kA,this.needReadReceipt=m===!0||m===1,this.isSupportExtension=D===!0||D===1,this._cmConfigID=v,this.to=T,this.nick=W,this.avatar=oA,this.protocol=UA,this.random=Oi===void 0?(Bl=Bl||99999999,Math.round(Math.random()*Bl)):Oi,this.time=EA||Math.ceil(Date.now()/1e3),this._isExcludedFromLastMessage=!!wA?.excludedFromLastMessage,this._isExcludedFromUnreadCount=!!wA?.excludedFromUnreadCount,this.isModified=!!SA,this.cloudCustomData=xA,this.messageLifeTime=LA,this.from=P||null,this.sequence=WA||0,this.conversationType=OA||Zr.CONV_C2C,this.hasRiskContent=ue>1,this.version=SA,this.isPlaceMessage=le,this.isRevoked=le===2||ki===8,this.isSystemMessage=Yt,this.readReceiptInfo=Os,this.revokeReason=hs,this.revokerInfo=ci,this._receiverList=Li,this.conversationSubType=Re,this.revoker=ci?.revoker||"",this.clientSequence=Mt||WA||0,this.status=Fi,this.atUserList=ji||[],this.flow=Br,this.isRead=Ut,this.priority=Ft,this._onlineOnlyFlag=oE,this.nameCard=Cn,this.quoteInfo=Do,this.reInitialize(E),this._initC2CReadReceiptInfo(r),this._extractGroupInfo(Yr)}getElements(){return this._elements}isOnlineMessage(){return this.messageLifeTime===0}setElement(r){Array.isArray(r)?this._elements=r:this._elements=[r],this._updatePayloadAndType()}transformElementsToServerFormat(){return this._elements?Array.isArray(this._elements)?this._elements.map(r=>r.transformToServerFormat()):this._elements.transformToServerFormat():null}setRelayFlag(r){this._relayFlag=r}validateBeforeSend(){var r,g,u;return this._relayFlag?{isValid:!0}:((r=this._elements)===null||r===void 0?void 0:r.length)>0?(u=(g=this._elements[0])===null||g===void 0?void 0:g.validateBeforeSend)===null||u===void 0?void 0:u.call(g):{isValid:!1}}_updatePayloadAndType(){this._elements[0]&&(this.payload=this._elements[0].content,this.type=this._elements[0].type)}_initC2CReadReceiptInfo(r){const{readReceiptSentByPeer:g,timestamp:u=0}=r;this.conversationType===Zr.CONV_C2C&&this.needReadReceipt===!0&&(this.readReceiptInfo.isPeerRead=g===1,this.readReceiptInfo.timestamp=u)}_extractGroupInfo(r){if(!r)return;const{From_AccountNick:g,From_AccountHeadurl:u,MsgFrom_AccountExtraInfo:E,GroupType:m}=r,{NameCard:D}=E||{};typeof g=="string"&&(this.nick=g),typeof u=="string"&&(this.avatar=u),typeof D=="string"&&(this.nameCard=D),this.conversationSubType=m}reInitialize(r){r===this.from&&(this.isRead=!0),this._initSequence(r),this._concatConversationID(r),this.generateMessageID()}_concatConversationID(r){let g="";const u=this.conversationType;u!==Zr.CONV_SYSTEM?(g=u===Zr.CONV_C2C?r===this.from?this.to:this.from:this.to,this.conversationID=g?`${u}${g}`:null):this.conversationID=Zr.CONV_SYSTEM}_initSequence(r){this.clientSequence===0&&r&&(this.clientSequence=uu(r)),this.sequence===0&&this.conversationType===Zr.CONV_C2C&&(this.sequence=this.clientSequence)}generateMessageID(){this.from===Zr.CONV_SYSTEM&&(this.senderTinyID="144115198244471703"),this.ID=`${this.senderTinyID}-${this.clientTime}-${this.random}`}setIsRead(r){this.isRead=r}}class Nd{static parseServerPushElement(r){const{MsgContent:g={}}=r,{Data:u,Ext:E,Desc:m}=g;return new Nd({data:u,description:m,extension:E})}constructor(r){this.type=KE.MSG_CUSTOM;const{data:g="",description:u="",extension:E=""}=r;this.content={data:g,description:u,extension:E}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{data:E,description:m,extension:D}=u;return{MsgType:this.type,MsgContent:{Data:E,Ext:D,Desc:m}}}validateBeforeSend(){const{isEmpty:r}=De.utils,g=[this.content.data,this.content.description,this.content.extension].some(u=>!r(u));return{isValid:g,error:g?null:{message:"content can not be empty"}}}}class Gd{static parseServerPushElement(r){const{MsgContent:g={Text:""}}=r,{Text:u}=g;return new Gd({text:u})}constructor(r){this.type=Tg.MSG_TEXT,this.content={text:r.text||""}}validateBeforeSend(){var r,g;return((g=(r=this.content)===null||r===void 0?void 0:r.text)===null||g===void 0?void 0:g.length)>0?{isValid:!0}:{isValid:!1,error:{message:"content can not be empty"}}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{text:E}=u;return{MsgType:this.type,MsgContent:{Text:E}}}}var Af=new class{constructor(){this._elementClassMap={[KE.MSG_CUSTOM]:Nd,[KE.MSG_TEXT]:Gd}}init(){Sr.getInstance().registerApi({apiName:"createCustomMessage",context:this}),Sr.getInstance().registerApi({apiName:"createTextMessage",context:this})}registerElementClass(n,r){var g;(g=r).prototype!==void 0&&"constructor"in g.prototype&&(this._elementClassMap[n]=r)}getElementClass(n){return this._elementClassMap[n]}createMessage(n){const{from:r,flow:g=tE.OUT}=n,{userId:u}=De.store.get("login")||{};this._isSendByCurrentInstance({from:r,flow:g,currentUser:u})?this._updateWithSenderInfo(n):this._isMultiEndpointSyncMessage({from:r,flow:g,currentUser:u})&&(n.flow=tE.OUT);const E=Object.assign(Object.assign({},n),{currentUser:u});return new jE(E)}createCustomMessage(n){const r=ar(),g=this.createMessage(Object.assign(Object.assign({},n),{from:r})),u=this._elementClassMap[KE.MSG_CUSTOM];if(!g)return null;if(u){const E=new u(n.payload);g.setElement(E)}return g}createTextMessage(n){var r;if(!n)return null;const g=typeof n.payload=="string"?n.payload:((r=n?.payload)===null||r===void 0?void 0:r.text)||"",u=new Gd({text:g}),E=ar(),m=De.message.messageFactory.createMessage(Object.assign(Object.assign({},n),{from:E}));return m.setElement(u),m}_updateWithSenderInfo(n){var r,g;const{nick:u,avatar:E,conversationType:m,to:D}=n,{userId:v,tinyID:T}=De.store.get("login")||{},P=lc.getUserProfile(v);return n.nick=u||P?.nick||"",n.avatar=E||P?.avatar||"",n.tinyID=n.tinyID||T||"",n.from=v,n.status=qr.UNSENT,n.flow=tE.OUT,m===Oa.CONV_GROUP&&(n.nameCard=(g=(r=op.getGroup(D))===null||r===void 0?void 0:r.selfInfo)===null||g===void 0?void 0:g.nameCard),n}_isMultiEndpointSyncMessage(n){const{from:r,flow:g,currentUser:u}=n;return r===u&&g===tE.IN}_isSendByCurrentInstance(n){const{from:r,flow:g,currentUser:u}=n;return r===u&&g===tE.OUT}};const wR={PushFlag:0,Title:"",Desc:"",Ext:"",ApnsInfo:{Sound:"",BadgeMode:0,IsVoipPush:void 0,Image:"",InterruptionLevel:"active",ContentAvailable:0},AndroidInfo:{Sound:"",XiaoMiChannelID:"",OPPOChannelID:"",GoogleChannelID:"",VIVOClassification:1,VIVOCategory:"",HuaWeiCategory:"",OPPOCategory:"",HuaWeiImage:"",HonorImage:"",GoogleImage:"",HonorImportance:"",MeizuNotifyType:void 0}},bd={HonorImportance:{range:["LOW","NORMAL"],defaultValue:void 0},MeizuNotifyType:{range:[0,1],defaultValue:void 0}},WD={enableIOSBackgroundNotification:{range:[!0,!1],defaultValue:!1},interruptionLevel:{range:["passive","active","time-sensitive","critical"],defaultValue:"active"}};function _R(n,r){return Object.keys(r).forEach(g=>{const{range:u,defaultValue:E}=r[g];n[g]=u.includes(n[g])?n[g]:E}),n}function rp(n){const r=n.lastIndexOf(".");return r===-1?n:n.slice(0,r)}function TR(n){const{androidInfo:r={},androidOPPOChannelID:g=""}=n,u=r.OPPOChannelID||g,E=_R(r,bd),{sound:m="",FCMChannelID:D=""}=E,v=vo(E,["sound","FCMChannelID"]);return Object.assign(Object.assign({},v),{Sound:rp(m),OPPOChannelID:u,GoogleChannelID:D})}function NR(n){const{apnsInfo:r={},ignoreIOSBadge:g=!1,disableVoipPush:u}=n,E=_R(r,WD),{ignoreIOSBadge:m,disableVoipPush:D,enableIOSBackgroundNotification:v}=E,T=vo(E,["ignoreIOSBadge","disableVoipPush","enableIOSBackgroundNotification"]),P=m===!0||g===!0?1:0;let W;return s(u)||(W=u===!1?1:0),s(D)||(W=D===!1?1:0),Object.assign(Object.assign({},T),{BadgeMode:P,IsVoipPush:W,ContentAvailable:v?1:0})}function zD(n){return De.utils.isPlainObject(n)?{PushFlag:n.disablePush===!0?1:0,Title:n.title||"",Desc:n.description||"",Ext:n.extension||"",ApnsInfo:NR(n),AndroidInfo:TR(n)}:wR}function ef(n){const{From_AccountHeadurl:r,From_AccountNick:g,IsNeedReadReceipt:u,IsPeerRead:E,IsSyncMsg:m,MsgBody:D,MsgClientTime:v,MsgLifeTime:T,MsgRandom:P,MsgSeq:W,MsgTimeStamp:oA,SendMsgControl:EA,SupportMessageExtension:wA,TinyId:kA,MsgCheckResult:xA,CloudCustomData:LA,MsgVersion:SA,MsgFlagBits:OA,RevokerInfo:WA,InnerSdkCustomData:ue}=n;let le,{From_Account:ki,To_Account:Li}=n;if(m===1){const Yt=Li;Li=ki,ki=Yt}if(WA){const{Reason:Yt,Revoker_Account:Fi,Revoker_FromUin:hs}=WA;le={reason:Yt,revoker:Fi,revokerFromUin:hs,userID:Fi}}return{from:ki,avatar:r,nick:g,needReadReceipt:u===1,isSyncMessage:m,clientTime:v,messageLifeTime:T,random:P,sequence:W,time:oA,messageControlInfo:{excludedFromLastMessage:EA?.NoLastMsg===1,excludedFromUnreadCount:EA?.NoUnread===1},isSupportExtension:wA,to:Li,tinyID:kA,checkResult:xA,cloudCustomData:LA,revokerInfo:le,messageVersion:SA,messageFlagBits:OA,readReceiptSentByPeer:E,elements:TC(D),onlineOnlyFlag:T===0,quoteInfo:ap(ue)}}function tf(n){const{From_Account:r,MsgBody:g,MsgClientTime:u,MsgRandom:E,MsgSeq:m,MsgTimeStamp:D,To_Account:v,MsgVersion:T,CloudCustomData:P,MsgCheckResult:W}=n;return{from:r,clientTime:u,random:E,sequence:m,time:D,to:v,elements:TC(g),messageVersion:T,cloudCustomData:P,checkResult:W}}function ZD(n){const{ClientSeq:r,From_Account:g,GroupInfo:u,MsgBody:E,MsgClientTime:m,MsgRandom:D,MsgSeq:v,MsgTimeStamp:T,SendMsgControl:P,SupportMessageExtension:W,TinyId:oA,CloudCustomData:EA,MsgVersion:wA,MsgCheckResult:kA,NeedReadReceipt:xA,IsPlaceMsg:LA,RevokerInfo:SA,GroupAtInfo:OA,OnlineOnlyFlag:WA,InnerSdkCustomData:ue}=n;let le,ki=eE.MSG_PRIORITY_NORMAL;if(Object.keys(KD).includes(String(n.MsgPriority))&&(ki=KD[n.MsgPriority]),SA){const{Reason:Yt,Revoker_Account:Fi,Revoker_FromUin:hs}=SA;le={reason:Yt,revoker:Fi,revokerFromUin:hs,userID:Fi}}const Li=function(Yt){const Fi=[];return Array.isArray(Yt)&&Yt.forEach(hs=>{hs.GroupAtAllFlag===jD?Fi.push(hs.GroupAt_Account):hs.GroupAtAllFlag===MR&&Fi.push(Po.MSG_AT_ALL)}),Fi}(OA);return{clientSequence:r,from:g,groupProfile:u,clientTime:m,priority:ki,random:D,sequence:v,time:T,messageControlInfo:{excludedFromLastMessage:P?.NoLastMsg===1,excludedFromUnreadCount:P?.NoUnread===1},isSupportExtension:W,tinyID:oA,cloudCustomData:EA,messageVersion:wA,checkResult:kA,needReadReceipt:xA,isPlaceMessage:LA,revokerInfo:le,atUserList:Li,elements:TC(E),to:oN(n),onlineOnlyFlag:WA===1,quoteInfo:ap(ue)}}function oN(n){const{utils:{isEmpty:r},constants:{IS_TOPIC_MESSAGE:g}}=De,{ToGroupId:u,GroupInfo:{MillionGroupFlag:E=0,TopicId:m}={}}=n;return E!==g||r(m)?u:m}function TC(n){if(!n)return null;if(Array.isArray(n))return n.map(g=>{const u=De.message.messageFactory.getElementClass(g.MsgType);return u?.parseServerPushElement(g)});const r=De.message.messageFactory.getElementClass(n.MsgType);return r?.parseServerPushElement(n)}function XD(n){const{From_Account:r,MsgBody:g,MsgClientTime:u,MsgRandom:E,MsgSeq:m,MsgTimeStamp:D,GroupId:v,TopicId:T,MsgVersion:P,CloudCustomData:W,MsgCheckResult:oA}=n;return{from:r,clientTime:u,random:E,sequence:m,time:D,groupID:v,topicID:T,elements:TC(g),messageVersion:P,cloudCustomData:W,checkResult:oA}}function ap(n){const{utils:{isString:r,safeStringify:g},ssoLog:u}=De;if(!r(n))return null;try{const{messageID:E,messageTime:m,messageSequence:D}=JSON.parse(n).businessQuote;return{msgID:E,messageTime:m,messageSequence:D}}catch(E){return u.debug("_parseServerQuoteInfo",g(E)),null}}function gp({conversationUpdateFields:n,message:r}){const{conversationID:g,conversationType:u,conversationSubType:E,flow:m,_isExcludedFromUnreadCount:D,_isExcludedFromLastMessage:v}=r,T=v?"":tp(r),P=!D&&m===tE.IN;n.has(g)?(n.get(g).lastMessage=T,P&&n.get(g).unreadCount++):n.set(g,{conversationID:g,type:u,subType:E,unreadCount:P?1:0,lastMessage:T})}function _B(n){return n.filter(r=>{const g=!ts(r?._elements),u=r?.isPlaceMessage===1;return g||De.ssoLog.error("emptyMessageBody",`from:${r.from} to:${r.to} sequence:${r.sequence}`),g&&!u})}function TB(n){const{messageDataHandler:r}=De.message;return!r.isInMessageList(n)&&!r.isMessageSentByCurrentInstance(n)}var GR=Object.freeze({__proto__:null,autoIncrementIndex:uu,createAndroidPushInfo:TR,createApnsPushInfo:NR,createOfflinePushInfo:zD,filterValidMessages:_B,getAndroidSoundName:rp,parseServerGroupMessage:ZD,parseServerPushC2CModifyMessage:tf,parseServerPushGroupModifyMessage:XD,parseServerPushMessage:ef,parseServerPushMessageElement:TC,shouldStoreMessage:TB,updateConversationFields:gp});const{isPlainObject:bR}=De.utils;function cp(n,r={}){const{onlineUserOnly:g,messageControlInfo:u}=r;let{offlinePushInfo:E}=r;n.conversationType===Zr.CONV_C2C&&g===!0&&(E?E.disablePush=!0:E={disablePush:!0});let m="";typeof n.cloudCustomData=="string"&&n.cloudCustomData.length>0&&(m=n.cloudCustomData);const D=[];if(u&&bR(u)){const{excludedFromUnreadCount:v,excludedFromLastMessage:T,excludedFromContentModeration:P}=u;v===!0&&D.push("NoUnread"),T===!0&&D.push("NoLastMsg"),P===!0&&D.push("NoMsgCheck")}return{onlineUserOnly:g,cloudCustomData:m,messageControlInfo:D,offlinePushInfo:E}}function $D(n){const{webhookInfo:{disableCloudMessagePreHook:r=!1,disableCloudMessagePostHook:g=!1}={}}=n||{};if(!r&&!g)return;const u=[];return r&&u.push("ForbidBeforeSendMsgCallback"),g&&u.push("ForbidAfterSendMsgCallback"),u}function Nh(n,r){return mA(this,void 0,void 0,function*(){const g=n.conversationType===Zr.CONV_GROUP?function(E,m){var D;const v=cp(E,m),{onlineUserOnly:T,cloudCustomData:P,messageControlInfo:W,offlinePushInfo:oA}=v,EA=JSON.parse(JSON.stringify(E.transformElementsToServerFormat()));let wA;return C(E._receiverList)&&E._receiverList.length>0&&(wA=E._receiverList,E._receiverList.length>50&&(wA=E._receiverList.slice(0,50),console.warn("ReceiverListLimit"))),{servcmd:"group_open_http_svc.send_group_msg",data:{From_Account:(D=De.store.get("login"))===null||D===void 0?void 0:D.userId,GroupId:E.to,MsgBody:EA,CloudCustomData:P,Random:E.random,MsgPriority:E.priority,ClientSeq:E.clientSequence,GroupAtInfo:E._groupAtInfoList,OnlineOnlyFlag:T?1:0,MsgClientTime:E.clientTime,OfflinePushInfo:zD(oA),SendMsgControl:T?void 0:W,NeedReadReceipt:E.needReadReceipt===!0?1:0,To_Account:wA,SupportMessageExtension:E.isSupportExtension===!0?1:0,IsRelayMsg:E._relayFlag===!0?1:0,CustomModerationConfigID:E._cmConfigID,ForbidCallbackControl:$D(m),InnerSdkCustomData:GB(E)}}}(n,r):function(E,m){var D;const v=cp(E,m),{onlineUserOnly:T,cloudCustomData:P,messageControlInfo:W,offlinePushInfo:oA}=v,EA=T===!0?0:void 0,wA=JSON.parse(JSON.stringify(E.transformElementsToServerFormat()));return{servcmd:"openim.sendmsg",data:{From_Account:(D=De.store.get("login"))===null||D===void 0?void 0:D.userId,To_Account:E.to,MsgBody:wA,CloudCustomData:P,MsgSeq:E.sequence,MsgRandom:E.random,MsgLifeTime:EA,From_AccountNick:E.nick,From_AccountHeadurl:E.avatar,SendMsgControl:EA!==0?W:void 0,MsgClientTime:E.clientTime,IsNeedReadReceipt:E.needReadReceipt===!0?1:0,SupportMessageExtension:E.isSupportExtension===!0?1:0,IsRelayMsg:E._relayFlag===!0?1:0,CustomModerationConfigID:E._cmConfigID,OfflinePushInfo:zD(oA),ForbidCallbackControl:$D(m),InnerSdkCustomData:GB(E)}}}(n,r),u=yield lg(g);return u?{time:u.MsgTime,messageDropReason:u.MsgDropReason,sequence:u.MsgSeq}:null})}function Gh(n){return mA(this,void 0,void 0,function*(){const{from:r,to:g,version:u=0,sequence:E,random:m,time:D,type:v,cloudCustomData:T}=n,P={From_Account:r,To_Account:g,MsgVersion:u,MsgSeq:E,MsgRandom:m,MsgTime:D,MsgType:v,MsgBody:n.transformElementsToServerFormat(),CloudCustomData:T},W=yield lg({servcmd:"openim.modify_c2c_msg",data:P});if(W){const{MsgBody:oA,MsgVersion:EA,CloudCustomData:wA}=W;return{elements:TC(oA),messageVersion:EA,cloudCustomData:wA}}})}function NB(n){return mA(this,void 0,void 0,function*(){const{to:r,version:g=0,sequence:u,cloudCustomData:E}=n,m={GroupId:r,MsgVersion:g,MsgSeq:u,MsgBody:n.transformElementsToServerFormat(),CloudCustomData:E},D=yield lg({servcmd:"openim.modify_group_msg",data:m});if(D){const{MsgBody:v,MsgVersion:T,CloudCustomData:P}=D;return{elements:TC(v),messageVersion:T,cloudCustomData:P}}})}function bh(n){return mA(this,void 0,void 0,function*(){const{groupID:r,count:g,messageSequence:u,messageSequenceList:E,getType:m}=n,D={GroupId:r,ReqMsgNumber:g,WithRecalledMsg:1,Version:1,GetType:m};return u&&(D.ReqMsgSeq=u),C(E)&&E.length>0&&(D.ReqMsgSeqList=E),yield lg({servcmd:"group_open_http_svc.group_msg_get",data:D})})}function of(n){return mA(this,void 0,void 0,function*(){const{peerAccount:r,count:g,lastMessageTime:u,messageKey:E,direction:m}=n;return lg({servcmd:"openim.getroammsg",data:{Peer_Account:r,MaxCnt:g,WithRecalledMsg:1,LastMsgTime:u,MsgKey:E,GetDirection:m}})})}function GB(n){if(De.utils.isObject(n.quoteInfo)){const{msgID:r,messageSequence:g,messageTime:u}=n.quoteInfo;return JSON.stringify({businessQuote:{messageID:r,messageSequence:g,messageTime:u}})}}var AS=Object.freeze({__proto__:null,createMessagePackOptions:cp,generateForbidCallbackControl:$D,getC2CRoamingMessagesByAnchor:of,getGroupRoamingMessagesByAnchor:bh,getRoamingMessages:function(n){return mA(this,void 0,void 0,function*(){const{peerAccount:r,count:g,lastMessageTime:u,messageKey:E}=n;return(yield lg({servcmd:"openim.getroammsg",data:{Peer_Account:r,MaxCnt:g||15,LastMsgTime:u||0,MsgKey:E,GetDirection:0,WithRecalledMsg:1}}))||[]})},modifyC2CMessage:Gh,modifyGroupMessage:NB,sendMessage:Nh});const{isPlainObject:sN}=De.utils,{MSG_AUDIO:eS,MSG_FILE:tS,MSG_IMAGE:kR,MSG_VIDEO:LR,MSG_MERGER:UR}=Po;class sf{constructor(){this._sendProtocolMap=new Map}init(){Sr.getInstance().registerApi({apiName:"sendMessage",context:this,matcher:r=>![eS,tS,kR,LR,UR].includes(r[0].type)})}registerSendProtocol(r,g,u){this._sendProtocolMap.set(r,g.bind(u))}sendMessage(r,g){return mA(this,void 0,void 0,function*(){const{TOTAL_COUNT:u,SEND_COST:E,SUCCESS_COUNT:m,FAILED_COUNT:D}=Cr;if(!(r instanceof jE))throw new Cs({code:pa.MSG_INSTANCE_REQUIRED});const v=r.validateBeforeSend();if(!v.isValid){const{code:W,message:oA=""}=v.error||{};throw new Cs({code:W,message:oA})}this._reportMessageSendQuality({name:u,message:r});let T=!1;const{messageDataHandler:P}=De.message||{};try{const{messageControlInfo:W}=g||{};let oA=null;P.addRandomOfSentMessage(r.random);const EA=Date.now(),wA=this._getSendProtocol(r);if(r.conversationType===Zr.CONV_C2C?(T=g?.onlineUserOnly===!0,oA=yield wA(r,g)):r.conversationType===Zr.CONV_GROUP&&(yield this._validateBeforeSendGroupMessage(r),oA=yield wA(r,g)),oA){const{messageDropReason:kA,sequence:xA,time:LA}=oA;if(this._updateNickAndAvatarOfSentMessageByMe(r),kA&&this._logRateLimitInfo(r,xA,kA),this._reportMessageSendQuality({name:m,message:r}),this._reportMessageSendQuality({name:E,message:r,startTs:EA}),r.isResend===!0){const SA=P.findMessage(r.ID);SA&&(De.ssoLog.debug("sendMessage",`sendMessage resend ok. ID:${SA.ID}`),P.deleteConversationMessage(SA))}return r.status=qr.SUCCESS,r.time=LA,r.conversationType===Zr.CONV_GROUP&&(r.sequence=xA),T?r._onlineOnlyFlag=!0:(P.storeConversationMessage(r),this._applySentMessageControlInfo(r,W),this._emitOnlineMessageSent(r)),r.type===Tg.MSG_STREAM?{code:0,data:{message:r,streamMessageID:oA.streamMessageID}}:{code:0,data:{message:r}}}}catch(W){r.status=qr.FAIL,P.removeRandomOfSentMessage(r.random);let{errorCode:oA}=W||{},EA=W?.errorInfo||W?.message||"";throw this._hasRiskContent(oA)&&(r.hasRiskContent=!0),T||this._isRejectedByRestApi(oA)||P.storeConversationMessage(r),this._reportMessageSendQuality({name:D,message:r,error:W}),new Cs({code:oA,message:EA,data:{message:r},moreMessage:`type:${r.type} from:${r.from} to:${r.to}`})}})}_hasRiskContent(r){return r===80001||r===80004}_isRejectedByRestApi(r){return r>=10100&&r<=10200||r>=120001&&r<=13e4}_emitOnlineMessageSent(r){const g=r._isExcludedFromLastMessage?"":r,{conversationID:u,conversationType:E}=r,m=tl(u)?lo.TOPIC_NEW_MESSAGE:lo.NEW_MESSAGE;De.notificationCenter.emitInnerEvent(m,{result:{conversationUpdateFieldList:[{conversationID:u,type:E,message:r,lastMessage:g,unreadCount:0}]}})}_applySentMessageControlInfo(r,g){g&&sN(g)&&(g.excludedFromLastMessage===!0&&(r._isExcludedFromLastMessage=!0),g.excludedFromUnreadCount===!0&&(r._isExcludedFromUnreadCount=!0))}_logRateLimitInfo(r,g,u){const E=`from:${r.from} to:${r.to} sequence:${g} messageDropReason:${u}`;De.ssoLog.warn("messageDropReason",E)}_updateNickAndAvatarOfSentMessageByMe(r){const{messageDataHandler:g}=De.message||{};let u=!1;const{conversationID:E}=r,m=g.getLatestMsgSentByMe(E);if(m){const{nick:D,avatar:v}=m;D===r.nick&&v===r.avatar||(u=!0),u&&g.updateNickAndAvatarOfSentMessage({conversationID:E,latestNick:r.nick,latestAvatar:r.avatar,isSentByMe:!0})}}_validateBeforeSendGroupMessage(r){return mA(this,void 0,void 0,function*(){var g,u,E;const{to:m,from:D}=r;let v=m,T=op.getGroup(v);if(ea({groupID:v})&&T?.isSupportTopic)throw new Cs({code:pa.MSG_SEND_GRP_WITH_TOPIC_FAIL});if(tl(m)&&([v]=m.split(ga.TOPIC),T=op.getGroup(v)),!T&&typeof((g=Sr.getInstance().getApiMap())===null||g===void 0?void 0:g.getGroupProfile)=="function"){const P=yield Sr.getInstance().getApiMap().getGroupProfile({groupID:v});if(((E=(u=P?.data)===null||u===void 0?void 0:u.group)===null||E===void 0?void 0:E.type)===Po.GRP_AVCHATROOM){const W=Es({code:pa.MSG_SEND_FAIL_NOT_IN_AV,replacement1:D,replacement2:v});throw new Cs({code:pa.MSG_SEND_FAIL_NOT_IN_AV,message:W})}}return!0})}_reportMessageSendQuality(r){De.notificationCenter.emitInnerEvent(lo.QUALITY_STAT,{label:dI.MESSAGE_SEND_SUCCESS_RATE,data:r})}_getSendProtocol(r){return this._sendProtocolMap.get(r.type)||Nh}}var nN=new class{constructor(){this._sparseMessagesByConversation=new Map,this._latestMessageSentByPeerMap=new Map,this._latestMessageSentByMeMap=new Map,this._randomOfSentMessageList=new Set}init(){De.notificationCenter.subscribeInnerEvent(lo.LOGOUT,this._reset,this),De.notificationCenter.subscribeInnerEvent(lo.DESTROY,this._dispose,this)}get _messagesByConversation(){return sp.getMessages()}storeConversationMessage(n,r=!1){if(Hs)return!0;const{conversationID:g}=n;if(!g||(this._messagesByConversation.has(g)||this._messagesByConversation.set(g,new Map),this._shouldSkipStoreMessage(n,r)))return!1;const u=this._getUniqueIdOfMessage(n);return this._messagesByConversation.get(g).set(u,n),this._updateLatestMessageMap(n),!0}_updateLatestMessageMap(n){const{conversationID:r}=n;n.flow==="out"?this._setLatestMsgSentByMe(r,n):r.startsWith("C2C")&&this._setLatestMsgSentByPeer(r,n)}_shouldSkipStoreMessage(n,r){const g=this._getUniqueIdOfMessage(n),u=this._messagesByConversation.get(n.conversationID);if(u?.has(g)){const E=u?.get(g);if(!r||E?.isModified===!0)return!0}return!1}deleteConversationMessage(n){var r;const{conversationID:g=""}=n,u=this._getUniqueIdOfMessage(n);this._messagesByConversation.has(g)&&((r=this._messagesByConversation.get(g))===null||r===void 0||r.delete(u))}modifyConversationMessage(n,r){var g;if(!this._messagesByConversation.has(n)&&!this._sparseMessagesByConversation.has(n))return{isUpdated:!1,message:null};const u=this._getUniqueIdOfMessage(r),E=this._getMessageFromLocalMessage(n,u);if(E){const{messageVersion:m,elements:D,cloudCustomData:v,checkResult:T=0}=r,P=T>1;if(De.ssoLog.debug("modifyConversationMessage",`conversationToMessageMap modifyConversationMessage localVersion:${E.version} remoteVersion:${m}`),E.versionE.ID===n)||null,r)break;if(!r){const u=Array.from(this._sparseMessagesByConversation.values());for(const E of u)if(r=E.get(n)||null,r)break}return r}deleteConversationMessageList(n){this._messagesByConversation.has(n)&&(this._messagesByConversation.delete(n),this._latestMessageSentByMeMap.delete(n),this._latestMessageSentByPeerMap.delete(n)),this._sparseMessagesByConversation.has(n)&&this._sparseMessagesByConversation.delete(n)}revokeMessage({conversationID:n,sequence:r,random:g,revoker:u}){const E=this._messagesByConversation.get(n);let m=null;if(E){const D=Array.from(E.values());if(m=this._findMessageBySequenceAndRandom({messageList:D,random:g,sequence:r}),m){const v=this._getUniqueIdOfMessage(m);return sp.updateMessage(n,[v],{isRevoked:!0,revoker:u,operation:wc.revoke}),m}}if(this._sparseMessagesByConversation.has(n)){const D=Array.from(this._sparseMessagesByConversation.get(n).values());if(m=this._findMessageBySequenceAndRandom({messageList:D,random:g,sequence:r}),m)return m.isRevoked=!0,m.revoker=u,m}}_findMessageBySequenceAndRandom({messageList:n,sequence:r,random:g}){for(let u=0;u0){const D=new Map([...E,...m.entries()]);this._messagesByConversation.set(g,D),this._updateLatestMessageSentByMe(g),this._updateLatestMessageSentByPeer(g)}return u}storeSparseMessageList(n){if(n.length===0)return;const{conversationID:r}=n[0],g=n.length;this._sparseMessagesByConversation.has(r)||this._sparseMessagesByConversation.set(r,new Map);const u=this._sparseMessagesByConversation.get(r);for(let E=0;E=0;u--)if(g[u].flow==="out"){this._setLatestMsgSentByMe(n,g[u]);break}}}_updateLatestMessageSentByPeer(n){var r;const g=Array.from(((r=this._messagesByConversation.get(n))===null||r===void 0?void 0:r.values())||[]);if(g.length!==0&&n.startsWith("C2C")){for(let u=g.length-1;u>=0;u--)if(g[u].flow==="in"){this._setLatestMsgSentByPeer(n,g[u]);break}}}_getUniqueIdOfMessage(n){const{from:r,to:g,random:u,sequence:E,time:m}=n;return`${r}-${g}-${u}-${E}-${m}`}_setLatestMsgSentByPeer(n,r){this._latestMessageSentByPeerMap.set(n,r)}_setLatestMsgSentByMe(n,r){this._latestMessageSentByMeMap.set(n,r)}getLatestMsgSentByPeer(n){return this._latestMessageSentByPeerMap.get(n)}getLatestMsgSentByMe(n){return this._latestMessageSentByMeMap.get(n)}addRandomOfSentMessage(n){this._randomOfSentMessageList.add(n)}removeRandomOfSentMessage(n){this._randomOfSentMessageList.delete(n)}updateNickAndAvatarOfSentMessage(n){const{conversationID:r="",latestAvatar:g,latestNick:u,isSentByMe:E=!0}=n,m=this._messagesByConversation.get(r);if(!m)return;const D=Array.from(m.values()),v=E?"out":"in";D.forEach(T=>{const{nick:P,avatar:W,flow:oA}=T;oA===v&&(P!==u&&(T.nick=u),W!==g&&(T.avatar=g))})}isInMessageList(n){var r;const{conversationID:g}=n;if(!g||!this._messagesByConversation.has(g))return!1;const u=this._getUniqueIdOfMessage(n);return(r=this._messagesByConversation.get(g))===null||r===void 0?void 0:r.has(u)}isMessageSentByCurrentInstance(n){const{random:r}=n;return this._randomOfSentMessageList.has(r)}getContinuousMessagesByConversation(){return this._messagesByConversation}getLocalMessageList(n){const r=this._messagesByConversation.get(n);return r?[...r.values()]:[]}getSparseMessageList(n){const r=this._sparseMessagesByConversation.get(n);return r?[...r.values()]:[]}_reset(){this._messagesByConversation.clear(),this._latestMessageSentByPeerMap.clear(),this._latestMessageSentByMeMap.clear(),this._randomOfSentMessageList.clear()}_dispose(){this._reset(),De.notificationCenter.unSubscribeInnerEvent(lo.LOGOUT,this._reset,this),De.notificationCenter.unSubscribeInnerEvent(lo.DESTROY,this._dispose,this)}};function nf(n,r){const g=wB.getConversation(n);if(g?.lastMessage){const{lastMessage:u}=g,{lastTime:E,lastSequence:m,version:D}=u,{time:v,sequence:T,messageVersion:P,elements:W,cloudCustomData:oA}=r;E===v&&m===T&&D!==P&&(u.type=W[0].type,u.payload=W[0].content,u.messageForShow=il(u.type,u.payload),u.cloudCustomData=oA,u.version=P,wB.updateConversation(n,{lastMessage:u}))}}class FR{init(){Sr.getInstance().registerApi({apiName:"modifyMessage",context:this})}modifyMessage(r){return mA(this,void 0,void 0,function*(){const{to:g,payload:u,sequence:E,conversationType:m,random:D,time:v,from:T,type:P}=r;if(this._canModifyMessageElement(P)){const W=r?._elements||[];W.length>=1&&(W[0].type=P,W[0].content=u)}try{let W=null,oA=null;if(m===Zr.CONV_C2C?W=yield Gh(r):m===Zr.CONV_GROUP&&(W=yield NB(r)),W){let EA=`${m}${g}`;return g===ar()&&m===Zr.CONV_C2C&&(EA=`${m}${T}`),oA={conversationType:m,from:T,to:g,time:v,random:D,sequence:E,elements:W?.elements,cloudCustomData:W?.cloudCustomData,messageVersion:W?.messageVersion,conversationID:EA},this._handleModifyMessageSuccess(oA),{code:0,data:{message:r},successLog:{message:`to:${g}`}}}}catch(W){const{errorCode:oA}=W||{};throw new Cs({functionName:"modifyMessage",code:oA,moreMessage:`to:${g}`})}})}_handleModifyMessageSuccess(r){const{conversationID:g}=r,{isUpdated:u,message:E}=De.message.messageDataHandler.modifyConversationMessage(g,r);u===!0&&De.notificationCenter.emitOuterEvent(Rr.MESSAGE_MODIFIED,{name:Rr.MESSAGE_MODIFIED,data:[E]}),De.notificationCenter.emitInnerEvent(lo.MESSAGE_MODIFIED,{conversationID:g,message:E}),nf(g,r)}_canModifyMessageElement(r){return[KE.MSG_TEXT,KE.MSG_CUSTOM,KE.MSG_LOCATION,KE.MSG_FACE].includes(r)}}class kh{init(){const{notificationCenter:r}=De,{InnerEventSubType:g}=r;Fs.getInstance().registerWorkflowStep(jt.RECEIVE_C2C_NEW_MESSAGE,Xt.HANDLE_C2C_NEW_MESSAGE,this._handleC2CMessagePush,this),Fs.getInstance().registerWorkflowStep(jt.RECEIVE_C2C_NEW_MESSAGE,Xt.EMIT_C2C_MESSAGE_EVENT,this._emitMessageEventsAfterReceiveNewMessage,this),Fs.getInstance().registerWorkflowStep(jt.SYNC_SERVER_INFO_AFTER_RE_ONLINE,Xt.EMIT_C2C_MESSAGE_EVENT,this._emitMessageEventsAfterSyncUnreadMessage,this),r.subscribeInnerEvent(lo.MESSAGE_PUSH,g.C2C_REALTIME_MESSAGE,this._executeReceiverNewMessageWorkFlow,this),r.subscribeInnerEvent(lo.MESSAGE_PUSH,g.C2C_MESSAGE_MODIFIED,this._handleC2CMessageModify,this),r.subscribeInnerEvent(lo.DESTROY,this._dispose,this)}_executeReceiverNewMessageWorkFlow(r){Fs.getInstance().executeWorkflow(jt.RECEIVE_C2C_NEW_MESSAGE,r)}_handleC2CMessagePush(r){const g=r.data||{},{messageDataHandler:u}=De.message||{},E=[],m=new Map;return g.C2cMsgArray.forEach(D=>{const v=this._generateC2CMessage(D);this._updateMessageProfile(v);let T=v.isModified===1;u.isMessageSentByCurrentInstance(v)?v.isModified=T:T=!1,v._onlineOnlyFlag?u.isMessageSentByCurrentInstance(v)||E.push(v):TB(v)&&(u.storeConversationMessage(v)&&gp({conversationUpdateFields:m,message:v}),u.isMessageSentByCurrentInstance(v)&&!T||E.push(v))}),{conversationUpdateFieldList:[...m.values()],messages:E}}_emitMessageEventsAfterReceiveNewMessage(r){var g;const{messages:u=[]}=((g=r.result)===null||g===void 0?void 0:g[Xt.HANDLE_C2C_NEW_MESSAGE])||{};this._emitMessageEvents(u)}_emitMessageEventsAfterSyncUnreadMessage(r){var g;const{messages:u=[]}=((g=r.result)===null||g===void 0?void 0:g[Xt.UNREAD_MESSAGE_SYNC])||{};this._emitMessageEvents(u)}_emitMessageEvents(r){const g=r?.filter(E=>E?.isModified===!0)||[];g.length>0&&De.notificationCenter.emitOuterEvent("onMessageModified",{name:"onMessageModified",data:g});const u=r?.filter(E=>!E?.isModified);u.length>0&&De.notificationCenter.emitOuterEvent("onMessageReceived",{name:"onMessageReceived",data:u})}_generateC2CMessage(r){const g=Zr.CONV_C2C,u=ef(r),E=De.message.messageFactory.createMessage(Object.assign(Object.assign({},u),{conversationType:g,flow:tE.IN})),{elements:m}=u;return E.setElement(m),E}_updateMessageProfile(r){var g;const{messageDataHandler:u}=De.message||{},E=(g=De.store.get("login"))===null||g===void 0?void 0:g.userId,{from:m,nick:D,avatar:v,conversationID:T=""}=r;if(m!==E){const P=u.getLatestMsgSentByPeer(T);if(P){const{nick:W,avatar:oA}=P;s(D)||s(v)?(r.nick=c(W)?W:r.nick,r.avatar=c(oA)?oA:r.avatar):D===W&&v===oA||(u.updateNickAndAvatarOfSentMessage({conversationID:T,latestNick:D,latestAvatar:v,isSentByMe:!1}),this._updateConversationUserProfile({conversationID:T,nick:D,avatar:v}))}}else{const P=u.getLatestMsgSentByMe(T);!P||D===P.nick&&v===P.avatar||u.updateNickAndAvatarOfSentMessage({conversationID:T,latestNick:D,latestAvatar:v,isSentByMe:!0})}}_updateConversationUserProfile(r){const{conversationID:g,nick:u,avatar:E}=r,m=wB.getConversation(g),{userProfile:D={}}=m||{};D.avatar===E&&D.nick===u||wB.updateConversation(g,{userProfile:Object.assign(Object.assign({},D),{nick:u,avatar:E})})}_updateMessageListDueToModify(r){const{conversationID:g}=r,{isUpdated:u,message:E}=De.message.messageDataHandler.modifyConversationMessage(g,r);u===!0&&De.notificationCenter.emitOuterEvent("onMessageModified",{name:"onMessageModified",data:[E]}),De.notificationCenter.emitInnerEvent("ModifyMessageSuccess",r),nf(g,r)}_handleC2CMessageModify(r){r.C2cMsgModNotifys.forEach(g=>{var u;const E=Zr.CONV_C2C;let m=tf(g);const{to:D,from:v}=m;let T=`${E}${D}`;D===((u=De.store.get("login"))===null||u===void 0?void 0:u.userId)&&(T=`${E}${v}`),m=Object.assign({conversationType:E,conversationID:T},m),this._updateMessageListDueToModify(m)})}_dispose(){const{notificationCenter:r}=De,{InnerEventSubType:g}=r;De.notificationCenter.unSubscribeInnerEvent(lo.MESSAGE_PUSH,g.C2C_REALTIME_MESSAGE,this._handleC2CMessagePush,this),De.notificationCenter.unSubscribeInnerEvent(lo.MESSAGE_PUSH,g.C2C_MESSAGE_MODIFIED,this._handleC2CMessageModify,this),De.notificationCenter.unSubscribeInnerEvent(lo.DESTROY,this._dispose,this)}}class Lh{init(){const{notificationCenter:r}=De,{InnerEventSubType:g}=r;Fs.getInstance().registerWorkflowStep(jt.RECEIVE_GROUP_NEW_MESSAGE,Xt.HANDLE_GROUP_NEW_MESSAGE,this._handleGroupMessagePush,this),Fs.getInstance().registerWorkflowStep(jt.RECEIVE_GROUP_NEW_MESSAGE,Xt.EMIT_GROUP_MESSAGE_EVENT,this._emitMessageEvents,this),r.subscribeInnerEvent(lo.MESSAGE_PUSH,g.GROUP_REALTIME_MESSAGE,this._executeReceiverNewMessageWorkFlow,this),r.subscribeInnerEvent(lo.MESSAGE_PUSH,g.GROUP_MESSAGE_MODIFIED,this._handleGroupMessageModify,this),r.subscribeInnerEvent(lo.DESTROY,this._dispose,this)}_executeReceiverNewMessageWorkFlow(r){this._canExecuteReceiverNewMessageWorkFlow(r)&&Fs.getInstance().executeWorkflow(jt.RECEIVE_GROUP_NEW_MESSAGE,r)}_handleGroupMessagePush(r){const g=r.data||{},{messageDataHandler:u}=De.message,E=[],m=new Map,D=g?.GroupMsgArray;return D?.forEach(v=>{if(v.GroupInfo.NotVisible===1)return;const T=this._generateGroupMessage(v);this.updateMessageProfile(T);let P=T.isModified===1;u.isMessageSentByCurrentInstance(T)?T.isModified=P:P=!1,T._onlineOnlyFlag?u.isMessageSentByCurrentInstance(T)||E.push(T):TB(T)&&u.storeConversationMessage(T)&&(E.push(T),gp({conversationUpdateFields:m,message:T}))}),{conversationUpdateFieldList:[...m.values()],messages:E}}_emitMessageEvents(r){var g;const{messages:u}=((g=r.result)===null||g===void 0?void 0:g[Xt.HANDLE_GROUP_NEW_MESSAGE])||{},E=u?.filter(D=>D?.isModified===!0)||[];E.length>0&&De.notificationCenter.emitOuterEvent("onMessageModified",{name:"onMessageModified",data:E});const m=u?.filter(D=>!D?.isModified)||[];m.length>0&&De.notificationCenter.emitOuterEvent("onMessageReceived",{name:"onMessageReceived",data:m})}_generateGroupMessage(r){const g=Zr.CONV_GROUP,u=ZD(r),E=De.message.messageFactory.createMessage(Object.assign(Object.assign({},u),{conversationType:g,flow:tE.IN})),{elements:m}=u;return E.setElement(m),E}updateMessageProfile(r){var g;const{messageDataHandler:u}=De.message||{},E=(g=De.store.get("login"))===null||g===void 0?void 0:g.userId,{from:m,nick:D,avatar:v,conversationID:T="",_elements:P}=r;if(m===E){const W=u.getLatestMsgSentByMe(T);!W||D===W.nick&&v===W.avatar||u.updateNickAndAvatarOfSentMessage({conversationID:T,latestNick:D,latestAvatar:v,isSentByMe:!0})}else if(m===Po.CONV_SYSTEM){const{operationType:W,memberInfoList:oA,operatorInfo:EA}=P;let wA={};if(ts(oA)?ts(EA)||(wA=EA):[Gg.JOINED,Gg.KICKED,Gg.ADMIN_SET,Gg.ADMIN_CANCELED].includes(W)&&(wA=Object.assign({},oA[0])),!ts(wA)){const{nick:kA="",avatar:xA=""}=wA;r.nick=kA,r.avatar=xA}}}_updateMessageListDueToModify(r){const{conversationID:g}=r,{isUpdated:u,message:E}=De.message.messageDataHandler.modifyConversationMessage(g,r);u===!0&&De.notificationCenter.emitOuterEvent("onMessageModified",{name:"onMessageModified",data:[E]}),nf(g,r)}_handleGroupMessageModify(r){r.GroupMsgModNotifys.forEach(g=>{const u=Zr.CONV_GROUP;let E=XD(g);const{topicID:m,groupID:D}=E,v=m||D,T=`${u}${v}`;E=Object.assign({conversationType:u,conversationID:T,to:v},E),this._updateMessageListDueToModify(E)})}_dispose(){const{notificationCenter:r}=De,{InnerEventSubType:{GROUP_REALTIME_MESSAGE:g,GROUP_MESSAGE_MODIFIED:u}}=r;r.unSubscribeInnerEvent(lo.MESSAGE_PUSH,g,this._handleGroupMessagePush,this),r.unSubscribeInnerEvent(lo.MESSAGE_PUSH,u,this._handleGroupMessageModify,this),r.unSubscribeInnerEvent(lo.DESTROY,this._dispose,this)}_canExecuteReceiverNewMessageWorkFlow(r){var g,u;const{GroupId:E,GroupType:m}=((u=(g=r?.GroupMsgArray)===null||g===void 0?void 0:g[0])===null||u===void 0?void 0:u.GroupInfo)||{},D=m===Pa.GRP_AVCHATROOM;return!(!op.getGroup(E)&&D)}}var iS=new class{constructor(){this.c2cMessageReceiver=new kh,this.groupMessageReceiver=new Lh}init(){this.c2cMessageReceiver.init(),this.groupMessageReceiver.init()}};const OR={createCustomMessage:{to:{required:!0,rules:["string"],allowEmpty:!1},conversationType:{required:!0,rules:["string"],allowEmpty:!1},payload:{required:!0,rules:["object"],allowEmpty:!1},cloudCustomData:{required:!1,rules:["string"],allowEmpty:!1},priority:{required:!1,rules:["string"],allowEmpty:!1},customModerationConfigurationID:{required:!1,rules:["string"],allowEmpty:!1}},sendMessage:[{key:"message",required:!0,rules:["object"],allowEmpty:!1},{key:"options",required:!1,rules:["object"],allowEmpty:!1}],createTextMessage:{to:{required:!0,rules:["string"],allowEmpty:!1},conversationType:{required:!0,rules:["string"],allowEmpty:!1,customValidator:n=>!(!n.startsWith("C2C")&&!n.startsWith("GROUP"))||"conversationType is invalid."},payload:{required:!0,rules:["object"],allowEmpty:!1,customValidator:n=>function(r){var g;return typeof r?.text!="string"||typeof r.text=="string"&&((g=r?.text)===null||g===void 0?void 0:g.length)===0?"payload.text must be a string":!0}(n)}}},rN={createCustomMessage:!0,sendMessage:!0,modifyMessage:!0};var aN=new class{constructor(){this._historyMessageListFetchAnchors=new Map,this.completedHistoryConversations=new Set}getGroupRoamingMessagesByAnchor(n){return mA(this,void 0,void 0,function*(){try{const{conversationID:r,count:g,direction:u,sequence:E,messageSequenceList:m,shouldMarkCompleted:D=!1,getType:v}=n,T=r.replace(Oa.CONV_GROUP,""),P=[];let W=E;if(u===$c.BACKWARD){if(typeof E!="number")return{messageList:[],hasNoMoreHistoryMessage:!1,nextReqMessageIDFromServer:""};W=E+g-1}const oA=yield bh({groupID:T,count:g,messageSequence:W,messageSequenceList:m,getType:v});if(oA){const{RspMsgList:EA=[],NextReqMsgSeq:wA=0,IsFinished:kA,InvisibleMsgSeq:xA}=oA,LA=`groupID:${T} sequence:${E} reqSeq:${W} direction:${u} complete:${kA} nextSequence:${wA} remoteMsgCount:${EA.length} invisibleSequenceList:${xA}`,SA=[];for(let ue=0;ue=E),OA&&D&&this.completedHistoryConversations.add(r);const WA=_B(SA);return De.ssoLog.info("getGroupRoamingMessagesByAnchor",LA),{messageList:WA,invisibleSequenceList:xA,nextReqMessageIDFromServer:wA,hasNoMoreHistoryMessage:OA,serverGroupTipList:P}}}catch(r){const{errorCode:g,errorInfo:u}=r||{};throw new Cs({code:g,message:u})}})}clearHistoryMessageListFetchAnchors(n){this._historyMessageListFetchAnchors.delete(n)}isHistoryMessageFetchCompleted(n){return this.completedHistoryConversations.has(n)}_parseMessage(n){var r;const g=Oa.CONV_GROUP;n.Event===4&&(n.MsgBody.MsgType=Po.MSG_GRP_TIP);const u=ZD(n),E=Af.createMessage(Object.assign(Object.assign({},u),{conversationType:g,flow:"in"}));return RB(((r=u.elements)===null||r===void 0?void 0:r.content)||{},E),E.setElement(u.elements),E}getC2CRoamingMessagesByAnchor(n){return mA(this,void 0,void 0,function*(){var r;try{const{conversationID:g,count:u,messageID:E,time:m,direction:D,shouldMarkCompleted:v=!1}=n;let T=m,P="";if(!m){const EA=E?De.message.messageDataHandler.findMessage(E):null;if(T=EA?.time||0,E&&this._historyMessageListFetchAnchors.has(g)){const wA=this._historyMessageListFetchAnchors.get(g);T=wA.lastMessageTime,P=wA.messageKey}}const W=g.replace(Oa.CONV_C2C,""),oA=yield of({count:u,lastMessageTime:T,messageKey:P,peerAccount:W,direction:D});if(oA){const{MsgList:EA=[],Complete:wA,MsgKey:kA,LastMsgTime:xA}=oA;this._historyMessageListFetchAnchors.set(g,{messageKey:kA,lastMessageTime:xA});const LA=[];for(let ue=0;ue{const{tag:E,value:m}=u;E&&E.indexOf(sS)>-1?g.profileCustomField.push({key:E,value:m}):kd.has(E)&&(g[kd.get(E)]=m)}),Object.assign(Object.assign({},rf),g)}parseProfileItem(n=[]){const r=[];return n.forEach(g=>{r.push({tag:g.Tag,value:g.Value})}),r}parseProfileList(n=[]){const r=[];return n.forEach(g=>{r.push({tag:g.Tag,value:g.ValueBytes})}),r}convertParamsToProfile(n){const r=[];return Object.keys(n).forEach(g=>{g!==nS&&r.push({tag:ql[g.toUpperCase()],value:n[g]})}),n.profileCustomField&&C(n.profileCustomField)&&n.profileCustomField.forEach(g=>{r.push({tag:g.key,value:g.value})}),r}normalizeProfileFields(n){const r={},g=[];return n.forEach(u=>{const{tag:E,value:m}=u;if(E&&E.indexOf(sS)>-1&&g.push({key:E,value:m}),kd.has(E)&&m!==void 0){const D=kd.get(E);r[D]=m}}),g.length>0&&(r.profileCustomField=g),r}};const{generateProtocolData:xR}=De.common;function YR(n){return mA(this,void 0,void 0,function*(){const r="profile.portrait_get_all",g={From_Account:ar(),UserItem:[]};n.forEach(D=>{g.UserItem.push({CustomSequence:0,StandardSequence:0,To_Account:D})});const u=xR({servcmd:r,data:g}),E=`${u.head.seq}${r}`,m=yield De.channel.sendPacket(u,{requestId:E});if(m)return function(D){const{ActionStatus:v,ErrorCode:T,ErrorDisplay:P,ErrorInfo:W,UserProfileItem:oA}=D,EA=[];return oA.map(wA=>{const{To_Account:kA,CustomSequence:xA,ResultCode:LA,ResultInfo:SA,StandardSequence:OA,ProfileItem:WA}=wA,ue=iE.parseProfileItem(WA);EA.push({userId:kA,customSequence:xA,resultCode:LA,resultInfo:SA,standardSequence:OA,profileItem:ue})}),{actionStatus:v,errorCode:T,errorDisplay:P,errorInfo:W,userProfile:EA}}(m)})}function WE(n){return lc.getFriendMap().has(n)}const{isEmpty:rS}=De.utils;class af{constructor(){this._strangerProfileMap=new Map}init(){Sr.getInstance().registerApi({apiName:"getMyProfile",context:this}),Sr.getInstance().registerApi({apiName:"getUserProfile",context:this}),Sr.getInstance().registerApi({apiName:"updateMyProfile",context:this}),this.createProfile=iE.createProfile.bind(iE);const{notificationCenter:r}=De;Fs.getInstance().registerWorkflowStep(jt.SYNC_SERVER_INFO_AFTER_LOGIN,Xt.USER_PROFILE_SYNC,this.getMyProfileCacheThenServer,this),r.subscribeInnerEvent(lo.MESSAGE_PUSH,r.InnerEventSubType.PROFILE_MODIFIED,this._onProfileDataModify,this),r.subscribeInnerEvent(lo.LOGOUT,this._reset,this),r.subscribeInnerEvent(lo.DESTROY,this._dispose,this)}getMyProfile(){return mA(this,void 0,void 0,function*(){try{const r=ar(),g=yield YR([r]);if(g){const u=this._handleProfileFormResponse(g)[0];return lc.getUserProfileMap().set(r,u),{code:0,data:u}}}catch(r){const{errorCode:g,errorInfo:u}=r;throw new Cs({functionName:"getMyProfile",code:g,message:u})}})}getUserProfile(r){return mA(this,void 0,void 0,function*(){try{let{userIDList:g}=r;const{userIdListToRequest:u,profileFromCache:E}=this._filterRequestAndCacheUsers(g);if(u.length===0)return{code:0,data:E,successLog:{message:`userIDList.length:${g.length}`}};u.length>PR&&(De.ssoLog.warn("getUserProfile","userIdListToRequest.length > 1000"),u.length=PR);const{data:m,error:D}=yield this._batchFetchUserProfiles(u),v=u.length,T=m.length,P=v-T;if(E.length===0&&v===P&&!rS(D))throw D;if(C(m))return m.forEach(oA=>{WE(oA.userID)?lc.getUserProfileMap().set(oA.userID,oA):this._strangerProfileMap.set(oA.userID,oA)}),{code:0,data:m.concat(E),successLog:{message:`getUserProfile query:${v} success:${T} fail:${P} from cache:${E.length}`}}}catch(g){throw new Cs(g)}})}getMyProfileCacheThenServer(){return mA(this,void 0,void 0,function*(){const r=ar(),g=lc.getUserProfileMap().has(r);return g?{code:0,data:g}:this.getMyProfile()})}updateMyProfile(r){return mA(this,void 0,void 0,function*(){const g=ar(),u={};for(const m in r)r[m]!==void 0&&(u[m]=r[m]);const E=iE.convertParamsToProfile(u);try{yield function(P){return mA(this,void 0,void 0,function*(){const W="profile.portrait_set",oA=xR({servcmd:W,data:P}),EA=`${oA.head.seq}${W}`,wA=yield De.channel.sendPacket(oA,{requestId:EA});if(wA){const{ActionStatus:kA,ErrorCode:xA,ErrorDisplay:LA,ErrorInfo:SA}=wA;return{actionStatus:kA,errorCode:xA,errorDisplay:LA,errorInfo:SA}}})}({From_Account:g,ProfileItem:E});const D=lc.getUserProfile(g);let v;v=D?Object.assign(Object.assign({},D),u):iE.createProfile(g,E);const T=!gg(D,v,["lastUpdatedTime"]);return v.lastUpdatedTime=Date.now(),lc.getUserProfileMap().set(g,v),T&&this._emitProfileUpdated(v),{code:0,data:v,successLog:{message:`profileArray: ${De.utils.safeStringify(E)}`}}}catch(m){const{errorCode:D,errorInfo:v}=m;throw new Cs({functionName:"updateMyProfile",code:D,message:v,moreMessage:`params: ${De.utils.safeStringify(r)}`})}})}updateMyNickAndAvatar(r){return mA(this,void 0,void 0,function*(){const g=ar(),u=Date.now(),E=lc.getUserProfile(g);let m={};m=E?Object.assign(E,r):iE.createProfile(g,r),m.lastUpdatedTime=u,lc.getUserProfileMap().set(g,m)})}_onProfileDataModify(r){const g=function(m){const{Profile_Account:D,PushType:v,ProfileList:T}=m;return{userId:D,pushType:v,profileList:iE.parseProfileList(T)}}(r.ProfileDataMod[0]);if(rS(g))return;const{isProfileUpdated:u,profile:E}=this._handleProfileModified(g);u&&this._emitProfileUpdated(E)}_emitProfileUpdated(r){De.notificationCenter.emitInnerEvent(lo.PROFILE_UPDATE,{name:lo.PROFILE_UPDATE,data:[r]}),De.notificationCenter.emitOuterEvent(Rr.PROFILE_UPDATED,{name:Rr.PROFILE_UPDATED,data:[r]}),wB.updateConversation(`C2C${r?.userID}`,{userProfile:r})}_dispose(){const{notificationCenter:r}=De;r.unSubscribeInnerEvent(lo.LOGOUT,this._reset,this),r.unSubscribeInnerEvent(lo.MESSAGE_PUSH,r.InnerEventSubType.PROFILE_MODIFIED,this._onProfileDataModify,this),r.unSubscribeInnerEvent(lo.DESTROY,this._dispose,this),this._reset()}_handleProfileModified(r){const{userId:g,profileList:u}=r,E=lc.getUserProfile(g);if(!(ar()===g||WE(g)&&E))return{isProfileUpdated:!1,profile:null};const m=iE.normalizeProfileFields(u),D=Object.keys(m).some(W=>W===nS?this._isCustomFieldChanged(E.profileCustomField,m.profileCustomField):E[W]!==m[W]);if(!D)return{isProfileUpdated:!1,profile:E};const v=Date.now(),T=Object.prototype.hasOwnProperty.call(m,nS)?this._mergeProfileCustomField(E.profileCustomField,m.profileCustomField):E.profileCustomField,P=Object.assign(Object.assign(Object.assign({},E),m),{profileCustomField:T,lastUpdatedTime:v});return lc.getUserProfileMap().set(g,P),{isProfileUpdated:D,profile:P}}_filterRequestAndCacheUsers(r){const g=[],u=[];return r.forEach(E=>{const m=lc.getUserProfileMap().has(E);WE(E)&&m?u.push(lc.getUserProfile(E)):this._isStrangerAndProfileValid(E)?u.push(this._strangerProfileMap.get(E)):g.push(E)}),{userIdListToRequest:g,profileFromCache:u}}_handleProfileFormResponse(r){const{userProfile:g}=r;if(!Array.isArray(g))return[];const u=g.filter(m=>m.userId!=="@TLS#NOT_FOUND"&&m.userId!==""&&!rS(m.profileItem)),E=Date.now();return u.map(m=>{const D=iE.createProfile(m.userId,m.profileItem);return D.lastUpdatedTime=E,D})}_isStrangerAndProfileValid(r){var g;if(!WE(r)){const{lastUpdatedTime:u=0}=this._strangerProfileMap.get(r)||{},E=((g=De.store.get("cloudConfig"))===null||g===void 0?void 0:g.stranger_profile_expiration_time)||6e5;return Date.now()-u<=E}return!1}_chunkUserIDList(r,g){return Array.from({length:Math.ceil(r.length/g)},(u,E)=>r.slice(E*g,(E+1)*g))}_batchFetchUserProfiles(r){return mA(this,void 0,void 0,function*(){const g=[],u=[];let E={};return this._chunkUserIDList(r,100).forEach(m=>{g.push(YR(m))}),(yield Promise.allSettled(g)).forEach(m=>{if(m.status==="fulfilled"){const D=m.value,v=this._handleProfileFormResponse(D);C(v)&&u.push(...v)}else if(m.status==="rejected"){const{code:D,message:v}=m.reason||{};E={errorCode:D,message:v}}}),{data:u,error:E}})}_isCustomFieldChanged(r=[],g=[]){if(!C(g)||g.length===0)return!1;if(!C(r)||r.length===0)return!0;const u=new Map(r.map(E=>[E.key,E.value]));return g.some(E=>u.get(E.key)!==E.value)}_mergeProfileCustomField(r=[],g=[]){const u=C(r)?r.map(E=>Object.assign({},E)):[];return C(g)&&g.length!==0&&g.forEach(({key:E,value:m})=>{const D=u.find(v=>v.key===E);D?D.value=m:u.push({key:E,value:m})}),u}_reset(){lc.getUserProfileMap().clear(),this._strangerProfileMap.clear()}}const gf=new Map,aS=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];for(let n=0,r=aS.length;n>(-2*m&6)):0)E="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(E);try{return decodeURIComponent(escape(g))}catch(u){return console.warn(u),""}}const{isEmpty:cN}=De.utils,{generateProtocolData:cf}=De.common;function VR(n){return mA(this,void 0,void 0,function*(){const r="im_open_status.ws_get_user_status",g=cf({servcmd:r,data:{To_Account:n}}),u=`${g.head.seq}${r}`,E=yield De.channel.sendPacket(g,{requestId:u});if(E)return function(m){const{ErrorCode:D,ErrorInfo:v,ErrorList:T=[],UserStatusList:P=[]}=m,W=P.map(EA=>{const{To_Account:wA,Status:kA,CustomStatus:xA,Detail:LA=[]}=EA;return{userID:wA,statusType:kA,customStatus:lp(xA),onlineDevices:lN(LA)}}),oA=T.map(EA=>{const{To_Account:wA,Invalid_Account:kA,ErrorCode:xA,ErrorInfo:LA}=EA;return{userID:cN(kA)?wA:kA,code:xA,message:LA}});return{errorCode:D,errorInfo:v,successUserList:W,failureUserList:oA}}(E)})}function lN(n){const r=[];return n?.forEach(g=>{const{Platform:u,Status:E}=g;E==="Online"&&r.push(u)}),r}class IN{constructor(){this._customStatus=""}init(){const{notificationCenter:r}=De;Sr.getInstance().registerApi({apiName:"getUserStatus",context:this}),Sr.getInstance().registerApi({apiName:"setSelfStatus",context:this}),Sr.getInstance().registerApi({apiName:"subscribeUserStatus",context:this}),Sr.getInstance().registerApi({apiName:"unsubscribeUserStatus",context:this}),Fs.getInstance().registerWorkflowStep(jt.SYNC_SERVER_INFO_AFTER_RE_ONLINE,Xt.USER_STATUS_UPDATE,this._onReOnline,this),r.subscribeInnerEvent(lo.MESSAGE_PUSH,r.InnerEventSubType.USER_STATUS_UPDATE,this._onUserStatusUpdate,this),r.subscribeInnerEvent(lo.LOGOUT,this._reset,this),r.subscribeInnerEvent(lo.DESTROY,this._dispose,this)}setSelfStatus(r){return mA(this,void 0,void 0,function*(){const g=ar(),{customStatus:u}=r;try{return yield function(E){return mA(this,void 0,void 0,function*(){const m="im_open_status.ws_set_custom_status",D=cf({servcmd:m,data:{CustomStatus:E}}),v=`${D.head.seq}${m}`,T=yield De.channel.sendPacket(D,{requestId:v});if(T){const{ErrorCode:P,ErrorInfo:W}=T;return{errorCode:P,errorInfo:W}}})}(u),this._customStatus=u,{code:0,data:{userID:g,statusType:Uh,customStatus:u},successLog:{message:`customStatus: ${u}`}}}catch(E){const{errorCode:m,errorInfo:D}=E;throw new Cs({functionName:"setSelfStatus",code:m,message:D})}})}getUserStatus(r){return mA(this,void 0,void 0,function*(){const{userIDList:g=[]}=r;if(this._isOnlyMeInArray(g))return this._getMyStatus();const u=yield this._getUserStatus(g);return Object.assign(Object.assign({},u),{successLog:{message:`userIDList length: ${g.length}`}})})}setCustomStatus(r){const g=lp(r);this._customStatus=g}subscribeUserStatus(r){return mA(this,void 0,void 0,function*(){try{const{userIDList:g=[]}=r;this._checkBusinessCapabilityBits("subscribeUserStatus");const u=this._getMaxUserCount("subscribe"),E=this._sliceUserIDList(g,u),m=yield function(v){return mA(this,void 0,void 0,function*(){const{channel:T}=De,P="im_open_status.ws_status_subscribe",W=cf({servcmd:P,data:{To_Account:v}}),oA=`${W.head.seq}${P}`;return yield T.sendPacket(W,{requestId:oA})})}(E),D=this._parseResponse(m);return{code:0,data:{failureUserList:D},successLog:{message:`userID length:${g.length} failCount: ${D.length}`}}}catch(g){const{errorCode:u}=g;throw new Cs({functionName:"subscribeUserStatus",code:u})}})}unsubscribeUserStatus(r){return mA(this,void 0,void 0,function*(){try{this._checkBusinessCapabilityBits("unsubscribeUserStatus");const{userIDList:g=[]}=r,u=this._getMaxUserCount("unsubscribe"),E=this._sliceUserIDList(g,u),m=yield function(v){return mA(this,void 0,void 0,function*(){const{channel:T}=De,P="im_open_status.ws_status_unsubscribe";let W={};W=v.length===0?{UnsubscribeAll:1}:{To_Account:v};const oA=cf({servcmd:P,data:W}),EA=`${oA.head.seq}${P}`;return yield T.sendPacket(oA,{requestId:EA})})}(E),D=this._parseResponse(m);return{code:0,data:{failureUserList:D},successLog:{message:`userID length:${g.length} failCount: ${D.length}`}}}catch(g){const{errorCode:u}=g;throw new Cs({functionName:"unsubscribeUserStatus",code:u})}})}_onUserStatusUpdate(r){const{UserStatusList:g=[]}=r||{},u=g.map(E=>{const{To_Account:m,Status:D,CustomStatus:v,Platform:T}=E,P={userID:m,statusType:D,customStatus:lp(v)};return T&&(P.onlineDevices=T),P});this._emitUserStatusUpdatedEvent(u)}_onReOnline(r){const g=lp(r.data.customStatus);if(this._customStatus===g)return;this._customStatus=g;const u={userID:ar(),statusType:Uh,customStatus:g};this._emitUserStatusUpdatedEvent(u)}_emitUserStatusUpdatedEvent(r){De.notificationCenter.emitOuterEvent(Rr.USER_STATUS_UPDATED,{name:Rr.USER_STATUS_UPDATED,data:r})}_sliceUserIDList(r,g){return r.slice(0,g)}_parseResponse(r){const{ErrorList:g=[]}=r;return g.map(u=>{const{To_Account:E,Invalid_Account:m,ErrorCode:D,ErrorInfo:v}=u;return{userID:De.utils.isEmpty(m)?E:m,code:D,message:v}})}_checkBusinessCapabilityBits(r){if(!De.store.get("commercialConfig").get(gN))throw new Cs({functionName:r,code:pa.NO_USE,replacement1:r})}_getMaxUserCount(r){const g=De.store.get("cloudConfig")||{},u={query:{key:"status_query_count",default:500},subscribe:{key:"status_sub_count",default:100},unsubscribe:{key:"status_unsub_count",default:100}},{key:E,default:m}=u[r],D=g[E]||m;return parseInt(D,10)}_getMyStatus(){return{code:0,data:{successUserList:[{userID:ar(),statusType:Uh,customStatus:this._customStatus}],failureUserList:[]}}}_getUserStatus(r){return mA(this,void 0,void 0,function*(){try{this._checkBusinessCapabilityBits("getUserStatus");const g=this._getMaxUserCount("query"),u=this._sliceUserIDList(r,g),E=yield VR(u),{successUserList:m,failureUserList:D}=E||{};return{code:0,data:{successUserList:m,failureUserList:D}}}catch(g){const{errorCode:u}=g;throw new Cs({functionName:"getUserStatus",code:u})}})}_isOnlyMeInArray(r){const g=ar();return r.length===1&&r.indexOf(g)>-1}_dispose(){const{notificationCenter:r}=De;r.unSubscribeInnerEvent(lo.MESSAGE_PUSH,r.InnerEventSubType.USER_STATUS_UPDATE,this._onUserStatusUpdate,this),r.unSubscribeInnerEvent(lo.DESTROY,this._dispose,this),r.unSubscribeInnerEvent(lo.LOGOUT,this._reset,this),this._reset()}_reset(){this._customStatus=""}}const gS={getUserProfile:{userIDList:{required:!0,rules:["array"],allowEmpty:!1}},updateMyProfile:{nick:{required:!1,rules:["string"],allowEmpty:!0},avatar:{required:!1,rules:["string"],allowEmpty:!0},gender:{required:!1,rules:["string"],allowEmpty:!0},selfSignature:{required:!1,rules:["string"],allowEmpty:!0},allowType:{required:!1,rules:["string"],allowEmpty:!0},birthday:{required:!1,rules:["number"],allowEmpty:!1},language:{required:!1,rules:["string"],allowEmpty:!0},messageSettings:{required:!1,rules:["string"],allowEmpty:!0},adminForbidType:{required:!1,rules:["string"],allowEmpty:!0},level:{required:!1,rules:["number"],allowEmpty:!1},role:{required:!1,rules:["number"],allowEmpty:!0},profileCustomField:{required:!1,rules:["array"],allowEmpty:!0,customValidator:function(n){for(const r of n){if(typeof r!="object")return"Each item in profileCustomField must be an object";if(typeof r?.key!="string")return"Each item.key in profileCustomField must be a string";if(!r?.key.startsWith(sS))return'Each item.key in profileCustomField must start with "Tag_Profile_Custom"'}return!0}}},setSelfStatus:{customStatus:{required:!0,rules:["string"],allowEmpty:!0}},getUserStatus:{userIDList:{required:!0,rules:["array"],allowEmpty:!1}},subscribeUserStatus:{userIDList:{required:!0,rules:["array"],allowEmpty:!1}},unsubscribeUserStatus:{userIDList:{required:!1,rules:["array"],allowEmpty:!0}}},uN={getMyProfile:!0,getUserProfile:!0,updateMyProfile:!0,setSelfStatus:!0,getUserStatus:!0,subscribeUserStatus:!0,unsubscribeUserStatus:!0};class EN{constructor(){this.userProfile=new af,this.userStatus=new IN,this.userProfile.init(),this.userStatus.init(),el({auth:uN,params:gS})}}function cS(n){const r=[];if(!c(n))return r;const g=n.length;if(g===0)return r;for(let u=g-1;u>=0;u--)n[u]==="1"&&r.push(2**(g-u-1));return r}var Ld,NC,Ud;(function(n){n.NOT_START="notStart",n.PENDING="pending",n.RESOLVED="resolved",n.REJECTED="rejected"})(Ld||(Ld={})),function(n){n[n.C2C=1]="C2C",n[n.GROUP=2]="GROUP"}(NC||(NC={})),function(n){n[n.C2C=8]="C2C",n[n.GROUP=2]="GROUP"}(Ud||(Ud={}));class lS{constructor(){this._name="SyncConversationHandler",this._pagingStatus=Ld.NOT_START,this._pagingTimeStamp=0,this._pagingStartIndex=0,this._pagingPinnedTimeStamp=0,this._pagingPinnedStartIndex=0}init(){const{notificationCenter:r}=De;Fs.getInstance().registerWorkflowStep(jt.SYNC_SERVER_INFO_AFTER_RE_ONLINE,Xt.CONVERSATION_RECOVER,this._syncConversationList,this),Fs.getInstance().registerWorkflowStep(jt.SYNC_SERVER_INFO_AFTER_LOGIN,Xt.CONVERSATION_LIST_SYNC,this._syncConversationListAfterLogin,this),r.subscribeInnerEvent(lo.LOGOUT,this._reset,this),r.subscribeInnerEvent(lo.DESTROY,this._dispose,this),De.ssoLog.debug(`${this._name}.init`)}isSyncCompleted(){return this._pagingStatus===Ld.RESOLVED}_syncConversationListAfterLogin(){return mA(this,void 0,void 0,function*(){return this._pagingStatus=Ld.NOT_START,this._pagingTimeStamp=0,this._pagingStartIndex=0,this._pagingPinnedTimeStamp=0,this._pagingPinnedStartIndex=0,this._syncConversationList()})}_syncConversationList(){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g}}=De;r.debug("_syncConversationList","start");try{const u=yield this._pagingGetConversationList(!0);this._pagingStatus=Ld.RESOLVED;const{conversationList:E=[]}=u||{};return r.info("_syncConversationList",`success count:${E.length}`),u}catch(u){const E=new Cs(u);r.error("_syncConversationList",`fail ${g(u)}`,{error:E})}})}_pagingGetConversationList(r){return mA(this,void 0,void 0,function*(){try{const g=[];this._pagingStatus=Ld.PENDING;const u=yield function(oA){return mA(this,void 0,void 0,function*(){const{fromAccount:EA,pagingTimeStamp:wA,pagingStartIndex:kA,pagingPinnedTimeStamp:xA,pagingPinnedStartIndex:LA}=oA;return lg({servcmd:"recentcontact.page_get",data:{AssistFlags:31,MsgAssistFlags:15,OrderType:1,From_Account:EA,StartIndex:kA,TimeStamp:wA,TopStartIndex:LA,TopTimeStamp:xA}})})}({fromAccount:ar(),pagingTimeStamp:r?this._pagingTimeStamp:0,pagingStartIndex:r?this._pagingStartIndex:0,pagingPinnedTimeStamp:r?this._pagingPinnedTimeStamp:0,pagingPinnedStartIndex:r?this._pagingPinnedStartIndex:0}),{CompleteFlag:E,SessionItem:m=[],TimeStamp:D,StartIndex:v,TopTimeStamp:T,TopStartIndex:P}=u||{};let W=[];if(E===1&&(this._pagingStatus=Ld.RESOLVED),m.length>0&&(W=this._getConversationOptions(m),g.push(...W)),De.notificationCenter.emitInnerEvent(lo.SYNC_CONVERSATION_LIST,{conversationUpdateFieldList:W}),this._pagingTimeStamp=D,this._pagingStartIndex=v,this._pagingPinnedTimeStamp=T,this._pagingPinnedStartIndex=P,E!==1){const{conversationList:oA}=yield this._pagingGetConversationList(r);g.push(...oA)}return{conversationList:g}}catch(g){throw g}})}_getConversationOptions(r){const{utils:{isUndefined:g}}=De,u=this._convertConversationKey(r);return this._filterValidConversations(u).map(E=>(g(E.lastMsg)&&(E.lastMsg={elements:[]}),E.type===NC.C2C?this._assembleC2COption(E):this._assembleGroupOption(E)))}_filterValidConversations(r){return r.filter(({type:g,userID:u})=>g===NC.C2C&&!function(E){let m;return E.startsWith(Po.CONV_C2C)&&(m=E.replace(Po.CONV_C2C,"")),m==="@TLS#ERROR"||m==="@TLS#NOT_FOUND"}(u)||g===2)}_assembleC2COption(r){var g,u,E,m,D,v,T,P;const W=this._createUserprofile(r);return{conversationID:`${Po.CONV_C2C}${r.userID}`,type:Po.CONV_C2C,lastMessage:{lastTime:r.time,lastSequence:r.sequence,fromAccount:r.lastC2CMsgFromAccount,type:!((g=r.lastMsg)===null||g===void 0)&&g.elements[0]?(u=r.lastMsg)===null||u===void 0?void 0:u.elements[0].type:null,payload:!((E=r.lastMsg)===null||E===void 0)&&E.elements[0]?this._amendLayersOverLimitProp(r.lastMsg.elements[0].content):null,cloudCustomData:((v=(D=(m=r.lastMsg)===null||m===void 0?void 0:m.elements)===null||D===void 0?void 0:D[0])===null||v===void 0?void 0:v.cloudCustomData)||"",isRevoked:r.lastMessageFlag===Ud.C2C,onlineOnlyFlag:!1,nick:"",nameCard:"",version:0,isPeerRead:this._computeIsPeerRead(r),revoker:((P=(T=r.lastMsg)===null||T===void 0?void 0:T.revokerInfo)===null||P===void 0?void 0:P.revoker)||null},unreadCount:0,userProfile:W,peerReadTime:r.peerReadTime,isPinned:r.isPinned===1,customData:r.customMark||"",markList:cS(r.standardMark),conversationGroupList:[],remark:r.friendRemark||"",messageRemindType:this._transMsgRemindType(r.messageRemindType)}}_createUserprofile(r){var g;const{userID:u,nick:E,peerAvatar:m}=r,D=[{tag:"Tag_Profile_IM_Nick",value:E},{tag:"Tag_Profile_IM_Image",value:m}];return(g=De.user.userProfile)===null||g===void 0?void 0:g.createProfile(u,D)}_computeIsPeerRead(r){const g=ar(),{lastC2CMsgFromAccount:u,time:E,c2cPeerReadTime:m}=r;return u===g&&E<=m}_assembleGroupOption(r){var g,u,E,m,D;return{conversationID:`${Po.CONV_GROUP}${r.groupID}`,type:Po.CONV_GROUP,lastMessage:Object.assign(Object.assign({lastTime:r.time,lastSequence:r.sequence,fromAccount:r.msgGroupFromAccount},this._patchTypeAndPayload(r)),{cloudCustomData:((E=(u=(g=r.lastMsg)===null||g===void 0?void 0:g.elements)===null||u===void 0?void 0:u[0])===null||E===void 0?void 0:E.cloudCustomData)||"",isRevoked:r.lastMessageFlag===Ud.GROUP,onlineOnlyFlag:!1,nick:r.msgGroupFromNickName||"",nameCard:r.msgGroupFromCardName||"",revoker:((D=(m=r.lastMsg)===null||m===void 0?void 0:m.revokerInfo)===null||D===void 0?void 0:D.revoker)||null}),groupProfile:{groupID:r.groupID,name:r.groupNick,avatar:r.groupImage,type:r.groupType,nextMessageSeq:r.nextMessageSeq},unreadCount:this._computeGroupUnreadCount(r),peerReadTime:0,isPinned:r.isPinned===1,version:0,customData:r.customMark||"",markList:cS(r.standardMark),conversationGroupList:[],messageRemindType:this._transMsgRemindType(r.messageRemindType),subType:r.groupType}}_convertConversationKey(r){return r.map(g=>({type:g.Type,userID:g.To_Account,nick:g.C2cNick,peerAvatar:g.C2cImage,time:g.MsgTimeStamp,sequence:g.MsgSeq,lastC2CMsgFromAccount:g.LastC2cMsgFrom_Account,lastMsg:this._convertLastMsgKey(g.LastMsg),lastMessageFlag:g.LastMsgFlags,c2cPeerReadTime:g.C2cPeerReadTime,peerReadTime:g.C2cPeerReadTime,friendRemark:g.C2cRemark,isPinned:g.TopFlags,standardMark:g.StandardMark,customMark:g.CustomMark,messageRemindType:g.MsgRecvOption,groupID:g.ToAccount,groupNick:g.GroupNick,groupImage:g.GroupImage,groupType:g.GroupType,nextMessageSeq:g.GroupNextMsgSeq,msgGroupFromAccount:g.MsgGroupFrom_Account,msgGroupFromNickName:g.MsgGroupFromNickName,msgGroupFromCardName:g.MsgGroupFromCardName,unreadCount:g.UnreadMsgCount,noUnreadCount:g.GroupIgnoredUnreadSeqCount}))}_convertLastMsgKey(r){var g,u,E;const{utils:{isEmpty:m}}=De;if(m(r))return null;let D="",v=null;if(!m(r.GroupTips)){const{From_Account:T,GroupName:P}=((g=r.GroupTips)===null||g===void 0?void 0:g.GroupInfo)||{};D=Po.MSG_GRP_TIP,v=Object.assign(Object.assign({},this._parseContent(D,r.GroupTips.MsgBody)),{groupProfile:{from:T,groupName:P}})}return r.MsgBody&&(D=(u=r.MsgBody[0])===null||u===void 0?void 0:u.MsgType,v=this._parseContent(D,r.MsgBody[0])),{event:r.Event,elements:[{type:D,content:v,cloudCustomData:r.CloudCustomData}],revokerInfo:{revoker:(E=r.RevokerInfo)===null||E===void 0?void 0:E.Revoker_Account}}}_parseContent(r,g){var u;if(!g)return g;const E=De.message.messageFactory.getElementClass(r);return E?(u=E.parseServerPushElement(g))===null||u===void 0?void 0:u.content:g}_amendLayersOverLimitProp(r){const{LayersOverLimit:g}=r;return vo(r,["LayersOverLimit"]).layersOverLimit=g===1,r}_transMsgRemindType(r){let g="";return r===0?g=Po.MSG_REMIND_ACPT_AND_NOTE:r===1?g=Po.MSG_REMIND_DISCARD:r===2?g=Po.MSG_REMIND_ACPT_NOT_NOTE:r===3&&(g=Po.NOT_RECEIVE_OFFLINE_PUSH_EXCEPT_AT),g}_patchTypeAndPayload(r){var g;const{utils:{isUndefined:u}}=De,{event:E,elements:m=[]}=r.lastMsg||{};return u(E)?{type:m[0]?m[0].type:null,payload:m[0]?this._amendLayersOverLimitProp(m[0].content):null}:{type:Po.MSG_GRP_TIP,payload:((g=m?.[0])===null||g===void 0?void 0:g.content)||{}}}_computeGroupUnreadCount(r){const{unreadCount:g=0,noUnreadCount:u=0}=r,E=g-u;return E>0?E:0}_reset(){this._pagingStatus=Ld.NOT_START,this._pagingTimeStamp=0,this._pagingStartIndex=0,this._pagingPinnedTimeStamp=0,this._pagingPinnedStartIndex=0}_dispose(){this._reset();const{notificationCenter:r}=De;r.unSubscribeInnerEvent(lo.LOGOUT,this._reset,this),r.unSubscribeInnerEvent(lo.DESTROY,this._dispose,this)}}class IS{constructor(){this.syncConversationHandler=new lS,this.syncConversationHandler.init()}}console.log(`TencentCloudLiteChat.VERSION:${Aa}`);var uS={create:function(n){var r,g;const{SDKAppID:u,testEnv:E=!1,devMode:m=!1,unlimitedAVChatRoom:D=!1,scene:v="",oversea:T=!1,instance:P,disableIndependentDomain:W=!1,proxyServer:oA=""}=n;let EA=u;if(!function(kA){if(typeof kA=="number")return!0;const xA=Number(kA);return!Number.isNaN(xA)}(EA))return console.error("Create SDK instance failed. Failed to parse the SDKAppID, please check the arguments"),null;if(EA=Number(EA),ma.has(EA))return ma.get(EA);let wA=null;if(P)wA=P,wA._workflowManager&&Fs.setInstance(wA._workflowManager),wA._pluginManager&&wA._pluginManager.installBuiltInPlugin(MB),P.isReady()&&((g=(r=Fs.getInstance()).executeWorkflow)===null||g===void 0||g.call(r,jt.SYNC_SERVER_INFO_AFTER_LOGIN));else{const kA=function(){function ue(){return(65536*(1+Math.random())|0).toString(16).substring(1)}return`${ue()+ue()}${ue()}${ue()}${ue()}${ue()}${ue()}${ue()}`}();De.init({sdkAppId:EA,instanceId:kA,testEnv:E,devMode:m,unlimitedAVChatRoom:D,disableIndependentDomain:W,scene:v,oversea:T,sdkEdition:$m,version:Aa,proxyServer:oA}),Fs.getInstance().init(),De.message=new oS,De.user=new EN,De.login=new Th,De.conversation=new IS,Iu.getInstance().installBuiltInPlugin(MB),wA=Sr.getInstance().exposeApiForClient(),wA._workflowManager=Fs.getInstance(),wA._pluginManager=Iu.getInstance();const{utils:{IS_WORKER_AVAILABLE:xA,USER_AGENT:LA,getPlatformType:SA,isIOSWebView:OA}}=De,WA=`instanceID:${kA} SDKAppID:${u} platform:${HA} host:${SA()} isIOSWebView:${OA} workerAvailable:${xA} UserAgent:${LA}`;De.ssoLog.info("sdkConstruct",WA)}return ma.set(EA,wA),wA},TSignaling:Xc,EVENT:Rr,VERSION:Aa,TYPES:Po};return uS})}(uY)),uY.exports}var ksA=bsA();const ng=ZW(ksA);var EY={exports:{}},LsA=EY.exports,F8;function UsA(){return F8||(F8=1,function(t,i){(function(s,c){t.exports=c()})(LsA,function(){function s(ge,Ve){if(!(ge instanceof Ve))throw new TypeError("Cannot call a class as a function")}function c(ge,Ve){for(var Qt=0;Qt"u"&&typeof uni.requireNativePlugin=="function",KA=RA&&uni.getDeviceInfo().platform.toLocaleLowerCase()==="ios",$A=(RA&&uni.getDeviceInfo().platform.toLocaleLowerCase(),lA||tA||BA||IA||gA||RA),jA=L!==void 0&&(L.nativeModuleProxy!==void 0||L.ReactNative!==void 0),Qe=tA?qq:BA?tt:IA?swan:gA?my:lA?wx:RA?uni:{},ae=function(ge){if(N(ge)!=="object"||ge===null)return!1;var Ve=Object.getPrototypeOf(ge);if(Ve===null)return!0;for(var Qt=Ve;Object.getPrototypeOf(Qt)!==null;)Qt=Object.getPrototypeOf(Qt);return Ve===Qt};function st(ge){if(ge==null)return!0;if(typeof ge=="boolean")return!1;if(typeof ge=="number")return ge===0;if(typeof ge=="string"||typeof ge=="function"||Array.isArray(ge))return ge.length===0;if(ge instanceof Error)return ge.message==="";if(ae(ge)){for(var Ve in ge)if(Object.prototype.hasOwnProperty.call(ge,Ve))return!1;return!0}return!1}var Ct=function(){return I(function ge(){s(this,ge),this._n="WebRequest"},[{key:"request",value:function(ge,Ve){var Qt=this,Ai="".concat(this._n,".request"),Pt=ge.downloadUrl||"",ii=(ge.method||"PUT").toUpperCase(),bi=ge.url;if(console.log("%c tim-upload-plugin %c","background:#0abf5b; padding:1px; border-radius:3px; color: #fff","background:transparent","".concat(Ai," URL:").concat(bi)),ge.qs){var ao=function(Ui){var es=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"&",Ro=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"=";return st(Ui)?"":ae(Ui)?Object.keys(Ui).map(function(oo){var $t=encodeURIComponent(oo)+Ro;return Array.isArray(Ui[oo])?Ui[oo].map(function(so){return $t+encodeURIComponent(so)}).join(es):$t+encodeURIComponent(Ui[oo])}).filter(Boolean).join(es):void 0}(ge.qs);ao&&(bi+="".concat(bi.indexOf("?")===-1?"?":"&").concat(ao))}var Hi=new XMLHttpRequest;Hi.open(ii,bi,!0),Hi.responseType=ge.dataType||"text";var Vi=ge.headers||{};if(ge.uploadByIP&&(Vi=w(w({},Vi),{},{host:ge.uploadIP})),!st(Vi))for(var ws in Vi)Vi.hasOwnProperty(ws)&&ws.toLowerCase()!=="content-length"&&ws.toLowerCase()!=="user-agent"&&ws.toLowerCase()!=="origin"&&ws.toLowerCase()!=="host"&&Hi.setRequestHeader(ws,Vi[ws]);return Hi.onload=function(){if(Hi.status===200)Ve(null,Qt._xhrRes(Hi,Qt._xhrBody(Hi,Pt,ge.uploadByIP&&ge.uploadIP),Vi));else{if(ge.uploadIP&&ge.url.indexOf(ge.uploadIP)===-1)return ge.url=function(es,Ro){return es.replace(/^http(s)?:\/\/(.*?)\//,"https://".concat(Ro,"/"))}(ge.url,ge.uploadIP),ge.uploadByIP=!0,Qt.request(ge,Ve);var Ui={code:Hi.status,message:JSON.stringify(Hi.responseText)};Ve(Ui,Qt._xhrRes(Hi,Qt._xhrBody(Hi,Pt,ge.uploadByIP&&ge.uploadIP),Vi))}},Hi.onerror=function(Ui){var es=Qt._xhrBody(Hi,Pt,ge.uploadByIP&&ge.uploadIP),Ro={code:Hi.status,message:JSON.stringify(Hi.responseText)};es||Hi.statusText||Hi.status!==0||(Ui.message="CORS blocked or network error"),Ve(Ro,Qt._xhrRes(Hi,es)),Ro=null},ge.onProgress&&Hi.upload&&(Hi.upload.onprogress=function(Ui){var es=Ui.total,Ro=Ui.loaded,oo=Math.floor(100*Ro/es);ge.onProgress({total:es,loaded:Ro,percent:(oo>=100?100:oo)/100})}),Hi.send(ge.resources),Hi}},{key:"_xhrRes",value:function(ge,Ve){var Qt={};return ge.getAllResponseHeaders().trim().split(`
-`).forEach(function(Ai){if(Ai){var Pt=Ai.indexOf(":"),ii=Ai.substr(0,Pt).trim().toLowerCase(),bi=Ai.substr(Pt+1).trim();Qt[ii]=bi}}),{statusCode:ge.status,statusMessage:ge.statusText,headers:Qt,data:Ve}}},{key:"_xhrBody",value:function(ge,Ve,Qt){return ge.status===200&&Ve?{location:Ve,uploadIP:Qt}:{response:ge.responseText,uploadIP:Qt}}}])}(),We=["unknown","image","video","audio","log"],Te=["name"],ot=function(){return I(function ge(){s(this,ge)},[{key:"request",value:function(ge,Ve){var Qt=this,Ai=ge.resources,Pt=Ai===void 0?"":Ai,ii=ge.headers,bi=ii===void 0?{}:ii,ao=ge.url,Hi=ge.downloadUrl,Vi=Hi===void 0?"":Hi,ws=ao,Ui=null,es=Vi.match(/^(https?:\/\/[^/]+\/)([^/]*\/?)(.*)$/),Ro=decodeURIComponent(es[3]),oo=Ro.indexOf("?")>-1?Ro.split("?")[0]:Ro,$t={key:ge.fileKey?ge.fileKey:oo,success_action_status:200,"Content-Type":""},so={};if(KA){var Ri=ao.split("?sign=");if(Ri.length>1){var Qs=Ri[1];ws="".concat(Ri[0],"?sign=").concat(encodeURIComponent("".concat(Qs))),so.sign=decodeURIComponent(Qs),so.signature=decodeURIComponent(Qs)}}var HA={url:ws,header:bi,name:"file",filePath:Pt,formData:w(w({},$t),so),timeout:ge.timeout||3e5};if(gA){var Ie=HA;Ie.name,HA=w(w({},function(Ye,Lt){if(Ye==null)return{};var at,Et,ei=function(Le,$e){if(Le==null)return{};var Tt={};for(var Gt in Le)if({}.hasOwnProperty.call(Le,Gt)){if($e.includes(Gt))continue;Tt[Gt]=Le[Gt]}return Tt}(Ye,Lt);if(Object.getOwnPropertySymbols){var Jt=Object.getOwnPropertySymbols(Ye);for(Et=0;Et=3e4&&(this.systemClockOffset=ao-bi,Ve=!0)}else Math.floor(ge.statusCode/100)===5&&(Ve=!0)}return Ve}}],[{key:"getVersion",value:function(){return"1.4.3"}}])}()})}(EY)),EY.exports}var FsA=UsA();const OsA=ZW(FsA);/**
+`],{type:"application/javascript"});this._worker=new Worker(URL.createObjectURL(g)),this._worker.postMessage({type:ur,url:r})}send(r){var g,u;try{(g=this._worker)===null||g===void 0||g.postMessage({type:On,data:r})}catch(E){(u=this._onSendFail)===null||u===void 0||u.call(this,E)}}bindSocketHandlers(r){const{onOpen:g,onMessage:u,onClose:E,onError:f,onSendFail:D}=r;if(this._worker){const v={[yn]:g,[ce]:u,[ot]:E,[Zt]:f,[Ho]:D};this._onSendFail=D,this._worker.onmessage=N=>{var P;const{type:W}=N?.data||{};typeof v[W]=="function"&&((P=v[W])===null||P===void 0||P.call(v,N?.data))}}}unbindSocketHandlers(){this._worker&&(this._worker.onmessage=null)}disconnect(){this._worker&&(this._worker.postMessage({type:vg}),this._worker.terminate(),this._worker=null),this._blobUrl&&(URL.revokeObjectURL(this._blobUrl),this._blobUrl=null)}}class WI{}var gn,ro=new class{constructor(){this._store=new Map}get(s){return this._store.get(s)}getStorage(s){return Fi?ii?my.getStorageSync({key:s}).data:no.getStorageSync(s):this._canUseLocalStorage()?localStorage.getItem(s):{}}set(s,r){const g=this._store.get(s)||{};r instanceof Map?this._store.set(s,r):this._store.set(s,Object.assign(Object.assign({},g),r))}setStorage(s,r){Fi?ii?my.setStorageSync({key:s,data:JSON.stringify(r)}):no.setStorageSync(s,JSON.stringify(r)):this._canUseLocalStorage()&&localStorage.setItem(s,JSON.stringify(r))}clear(s){typeof s=="string"?this._store.set(s,{}):this._store.clear()}clearLocalStorage(s){this._canUseLocalStorage()&&(typeof s=="string"?localStorage.setItem(s,""):localStorage.clear())}reset(){this.clear()}_canUseLocalStorage(){return typeof window<"u"&&navigator&&navigator.cookieEnabled&&localStorage}};class Mc{connectSocket(r){return this._socket=no.connectSocket({url:r,header:{"content-type":"application/json"},multiple:!0,complete:()=>{}}),this._socket}send(r){var g;(g=this._socket)===null||g===void 0||g.send({data:r,fail:this._onSendFail})}bindSocketHandlers(r){const{onOpen:g,onMessage:u,onClose:E,onError:f,onSendFail:D}=r;this._socket&&(this._socket.onClose(E),this._socket.onOpen(g),this._socket.onMessage(v=>u(v?.data)),this._socket.onError(()=>f),this._onSendFail=D)}unbindSocketHandlers(){this._socket&&(this._socket.onClose(()=>{}),this._socket.onOpen(()=>{}),this._socket.onMessage(()=>{}),this._socket.onError(()=>{}))}disconnect(){this._socket&&(this._socket.close(),this._socket=null)}}(function(s){s[s.CONNECTED=0]="CONNECTED",s[s.CONNECTING=1]="CONNECTING",s[s.DISCONNECTED=2]="DISCONNECTED"})(gn||(gn={}));class gg{constructor(r){this._url="",this._readyState=gn.DISCONNECTED,this._url=r,this._id=b(),this._emitter=new Ls,ii?this._socket=new Mc:Xe||ao||pt||Je||ki||Pt?this._socket=new ts({onError:this._onError.bind(this)}):jn?this._socket=new WI:this._canUseWebWorker()?this._socket=new Ba:this._socket=new vc,this.connect()}connect(){this.doOpen(),this._bindSocketHandlers()}doOpen(){[gn.CONNECTED,gn.CONNECTING].includes(this._readyState)||(this._readyState=gn.CONNECTING,this._ws=this._socket.connectSocket(this._url))}send(r){this._readyState!==gn.CONNECTED?this.reconnect():this._socket.send(r)}reconnect(){[gn.CONNECTED,gn.CONNECTING].includes(this._readyState)||(this.disconnect(),this.doOpen())}getId(){return this._id}on(r,g,u){this._emitter.on(r,g,u)}off(r,g,u){this._emitter.off(r,g,u)}isConnected(){return this._readyState===gn.CONNECTED}disconnect(){this._readyState=gn.DISCONNECTED,this._unbindSocketHandlers(),this._socket.disconnect()}_onOpen(r){this._readyState===gn.CONNECTING&&(this._readyState=gn.CONNECTED,this._emitter.emit("connect",{socketId:this._id,event:r}))}_onMessage(r){this._emitter.emit("message",r)}_onClose(r){this._readyState=gn.DISCONNECTED,this._emitter.emit("close",{socketId:this._id,event:r})}_onError(r){this._readyState=gn.DISCONNECTED,this._emitter.emit("error",{socketId:this._id,error:r})}_onSendFail(r){this._readyState=gn.DISCONNECTED,this._emitter.emit("sendFail",{socketId:this._id,error:r})}_bindSocketHandlers(){this._socket.bindSocketHandlers({onOpen:this._onOpen.bind(this),onMessage:this._onMessage.bind(this),onClose:this._onClose.bind(this),onError:this._onError.bind(this),onSendFail:this._onSendFail.bind(this)})}_unbindSocketHandlers(){this._socket.unbindSocketHandlers()}_canUseWebWorker(){const r=ro.get("cloudConfig")||{};return(n(r.isWorkerEnabled)||r.isWorkerEnabled==="1")&&wo}}const Mg={[Ye.SINGAPORE]:[[2e7,3e7],[172e7,173e7]],[Ye.KOREA]:[[3e7,4e7],[173e7,174e7]],[Ye.GERMANY]:[[4e7,5e7],[174e7,175e7]],[Ye.IND]:[[5e7,6e7],[175e7,176e7]],[Ye.JPN]:[[6e7,7e7],[176e7,177e7]],[Ye.USA]:[[7e7,8e7],[177e7,178e7]],[Ye.INDONESIA]:[[8e7,9e7],[178e7,179e7]],[Ye.KSA]:[[9e7,1e8],[179e7,18e8]]};function Qa(s){var r;if(!((r=ro.get("instance"))===null||r===void 0)&&r.oversea)return Ye.OVERSEA;for(const g of Object.keys(Mg))for(const[u,E]of Mg[g])if(s>=u&&s`${nA}=${W[nA]}`).join("&"));var W;return g?`${s}/binfo?${P}&compress=gzip`:`${s}/info?${P}`}function is(s){const r=ro.get("instance"),{sdkAppId:g,testEnv:u,proxyServer:E}=r,f=Qa(g);if(u)return Xs(We.TEST[f].DEFAULT,{isBinary:s});if(!tn(E))return Xs(E,{isBinary:s});const D=We.PRODUCTION[f],v=Ai&&D.ANYCAST,N=Ai,P=!!D.BACKUP_CN;return Xs({[Fo.INITIAL]:()=>(Uo=Fo.DEFAULT,D.DEFAULT),[Fo.DEFAULT]:()=>(Uo=Fo.IPV6,D.IPV6),[Fo.IPV6]:()=>(Uo=Fo.BACKUP,D.BACKUP),[Fo.BACKUP]:()=>N?(Uo=Fo.BACKUP_WEB_ONLY,function(W){const nA=Math.floor(10001*Math.random())+1e4;return W.replace("*",String(nA))}(D.BACKUP_WEB_ONLY)):P?(Uo=Fo.BACKUP_CN,D.BACKUP_CN):v?(Uo=Fo.ANYCAST,D.ANYCAST):D.DEFAULT,[Fo.BACKUP_WEB_ONLY]:()=>P?(Uo=Fo.BACKUP_CN,D.BACKUP_CN):v?(Uo=Fo.ANYCAST,D.ANYCAST):D.DEFAULT,[Fo.BACKUP_CN]:()=>(Uo=v?Fo.ANYCAST:Fo.DEFAULT,D[Uo]),[Fo.ANYCAST]:()=>(Uo=Fo.DEFAULT,D.ANYCAST="",D.DEFAULT)}[Uo](),{isBinary:s})}var Rg=new class{constructor(){this._timeOffsetWithServer=0}getServerTimeMs(){return Date.now()+this._timeOffsetWithServer}getServerTimeSeconds(){return Math.floor(this.getServerTimeMs()/1e3)}getTimeOffsetWithServer(){return this._timeOffsetWithServer}calculateTimeOffsetWithServer(s,r){const g=Date.now(),u=g-s;this._timeOffsetWithServer=r+u-g}};const Rc=16;var ws=new class{constructor(){this._tasks=[],this._timer=null,this._taskMap=new Map}_addTaskToScheduler(s){const{id:r}=s;this.removeTask(r),this._tasks.push(s),this._taskMap.set(r,s),this._sort(),this._scheduleNextTask()}_createTask(s){const{id:r,callback:g,context:u,isOnce:E=!1,intervalMs:f=Rc}=s,D=Math.max(f,Rc);return{id:r,nextExecuteTime:Date.now()+D,intervalMs:f,callback:g,context:u,isOnce:E}}addTask(s){const r=this._createTask(s);this._addTaskToScheduler(r)}addOnceTask(s){const r=this._createTask(Object.assign(Object.assign({},s),{isOnce:!0}));this._addTaskToScheduler(r)}removeTask(s){const r=this._tasks.findIndex(g=>g.id===s);r>-1&&(this._tasks.splice(r,1),this._taskMap.delete(s),this._scheduleNextTask())}updateTaskInterval(s,r){const g=this._taskMap.get(s);g&&(g.intervalMs=r,g.nextExecuteTime=Date.now()+r,this._sort(),this._scheduleNextTask())}clearAllTasks(){this._tasks=[],this._taskMap.clear(),this._timer&&(clearTimeout(this._timer),this._timer=null)}dispose(){this.clearAllTasks()}_sort(){this._tasks.sort((s,r)=>s.nextExecuteTime-r.nextExecuteTime)}_scheduleNextTask(){this._timer&&(clearTimeout(this._timer),this._timer=null);const s=this._tasks[0];if(s){const r=Math.max(0,s.nextExecuteTime-Date.now());this._timer=setTimeout(()=>this._execute(),r)}}_execute(){const s=Date.now();for(;this._tasks.length&&this._tasks[0].nextExecuteTime<=s;){const r=this._tasks[0];try{r.context?r.callback.call(r.context):r.callback(),r.isOnce?this.removeTask(r.id):(r.nextExecuteTime=s+r.intervalMs,this._sort())}catch(g){console.warn(`Task ${r.id} execution failed:`,g),r.isOnce&&this.removeTask(r.id)}}this._scheduleNextTask()}};function Fa(s){const r=[];for(let g=0;g=55296&&u<=56319){const E=s.charCodeAt(++g)-56320+(u-55296<<10)+65536;r.push(240|E>>18,128|E>>12&63,128|E>>6&63,128|63&E)}else u<=127?r.push(u):u<=2047?r.push(192|u>>6,128|63&u):r.push(224|u>>12,128|u>>6&63,128|63&u)}return new Uint8Array(r)}function Qs(s){const r=Array.isArray(s)?[]:Object.create(null);for(const g in s)Object.prototype.hasOwnProperty.call(s,g)&&_(g)&&s[g]!=null&&(s[g]===null||typeof s[g]!="object"?r[g]=s[g]:r[g]=Qs(s[g]));return r}function Tn(s,r){if(CA.includes(s))return 0;const g=Fa(JSON.stringify(r));let u=4294967295;const{length:E}=g;for(let f=0;f>>=1:u=u>>>1^3988292384}return(4294967295^u)>>>0}function pa(s){const{servcmd:r,data:g}=s,u=function(f){const D=ro.get("login")||{},v=ro.get("instance")||{};return{servcmd:f,ver:"v4",platform:jA,websdkappid:537048168,websdkversion:"1.7.3",a2:D.a2Key||void 0,tinyid:D.tinyID||void 0,status_instid:D.statusInstanceId||0,sdkappid:v.sdkAppId,contenttype:"json",reqtime:Math.floor(Date.now()/1e3),identifier:D.a2Key?void 0:D.userId,usersig:D.a2Key?void 0:D.userSig,sdkability:478343027,sdkability_ext:cA(""),cappid:v.applicationID||0,tjgID:"",seq:Ta(),cs:0}}(r),E=Qs(g);return u.cs=Tn(r,E),{head:u,body:E}}function _s(s){const{servcmd:r,data:g}=s,u=function(f){const D=ro.get("login")||{},v=ro.get("instance")||{};return{servcmd:f,ver:"v4",platform:jA,websdkappid:537048168,websdkversion:"1.7.3",sdkappid:v.sdkAppId,contenttype:"",reqtime:Math.floor(Date.now()/1e3),identifier:"",usersig:"",status_instid:D.statusInstanceId||0,sdkability:478343027,sdkability_ext:cA(""),cappid:v.applicationID||0,seq:Ta(),cs:0}}(r),E=Qs(g);return u.cs=Tn(r,E),{head:u,body:E}}let Oa=b();function Ta(){return Oa=Oa<2415919103?Oa+1:b(),Oa}function $(){var s;const r=ro.get("login")||{},g=ro.get("instance")||{};return{sdk_type:30,sdk_app_id:g.sdkAppId,sdk_version:"1.6.18",tiny_id:Number(r.tinyID),user_id:r.userId||((s=ro.get("webPush"))===null||s===void 0?void 0:s.userId),platform:jA,instance_id:g.instanceId,trace_id:new Date().getTime()}}var j,RA=Object.freeze({__proto__:null,calcBodyCRC:Tn,filterProtocolDataInvalidFields:Qs,generateCosSpecifiedData:function(s){const{servcmd:r,data:g}=s,u=function(f){const D=ro.get("login")||{},v=ro.get("instance")||{};return{servcmd:f,ver:"v4",platform:jA,websdkappid:537048168,websdkversion:"1.7.3",sdkappid:v.sdkAppId,contenttype:"json",reqtime:Math.floor(Date.now()/1e3),identifier:D.userId,usersig:D.userSig,status_instid:D.statusInstanceId||0,sdkability:478343027,sdkability_ext:cA(""),cappid:v.applicationID||0,seq:Ta(),cs:0}}(r),E=Qs(g);return u.cs=Tn(r,E),{head:u,body:E}},generateProtocolData:pa,generateSSOLogProtocolData:_s,generateSequence:Ta,getCommonHead:$,getHostSite:Qa,taskScheduler:ws,timeManager:Rg});(function(s){s[s.info=4]="info",s[s.warning=5]="warning",s[s.error=6]="error"})(j||(j={}));const ZA={method:"extension",networkType:"network_type",eventType:"event_type",code:"error_code",message:"error_message",moreMessage:"more_message",duplicate:"duplicate",costTime:"cost_time",level:"level",uiPlatform:"ui_platform",timestamp:"timestamp"};class ne{constructor(r){this.level=j.info,this._canSendLog=!0,this._logCreatedAt=Rg.getServerTimeMs(),this.timestamp=0,this.networkType=8,this.code=0,this.moreMessage="",this.method="",this.message="",this.costTime=0,this.duplicate=!1,this.eventType=0,this.uiPlatform=this._getUiPlatform(),this._sdkEdition=this._getSDKEdition();const{method:g,eventType:u=0,message:E="",costTime:f=0,error:D,uiPlatform:v,moreMessage:N="",code:P=0,startTime:W=0}=r||{};this.eventType=u,this.method=g,this.message=E,this.costTime=f,this.moreMessage=`${N} startTime:${W}`,this.code=P,D&&this.setError(D),tn(v)||(this.uiPlatform=v)}setMoreMessage(r){this.moreMessage=`${this.moreMessage} ${r}`}updateLogCreatedAtByTimeOffset(){this._logCreatedAt+=Rg.getTimeOffsetWithServer()}end(r=!1){this._canSendLog&&(this._canSendLog=!1,this.timestamp=Rg.getServerTimeMs(),this._ssoLogModule.pushToLogQueue(this._convertSSOLogDataKeyToServe()),r&&this._ssoLogModule.uploadSSOLogData())}setError(r){var g;return r instanceof Error?this._canSendLog?(!((g=ro.get("netWorkMonitor"))===null||g===void 0)&&g.isNetworkOnline&&(r.errorCode&&(this.code=r.errorCode),r.errorMessage&&this.setMoreMessage(r.errorMessage)),this.level=j.error,this):this:(console.warn("SSOLogData.setError value not instanceof Error, please check!"),this)}setLogInfo(r){return Object.keys(r).forEach(g=>{Object.keys(ZA).includes(g)&&(this[g]=r[g])}),this}setSSOLogModule(r){this._ssoLogModule=r}_convertSSOLogDataKeyToServe(){const r={};return Object.keys(this).forEach(g=>{const u=g;ZA[u]&&(r[ZA[u]]=this[u])}),r}_getUiPlatform(){var r;const g=(r=ro.get("instance"))===null||r===void 0?void 0:r.scene;if(typeof g=="string"){const u=Number(g);return isNaN(u)?void 0:u}}_getSDKEdition(){var r;return(r=ro.get("instance"))===null||r===void 0?void 0:r.sdkEdition}}var De;(function(s){s.RECONNECTED="reconnected",s.CLOUD_CONFIG_UPDATE="cloud_config_update",s.SOCKET_DISCONNECTED="socket_disconnected"})(De||(De={}));var Ke=De;const qe=20,Et=6e4,ft=[4,5,6],Nt="report-logger";var Kt=new class{constructor(){this._sdkAppIdBlackList=[],this._tinyIdWhiteList=[],this._reportLevel=[4,5,6],this._minThreshold=qe,this._maxThreshold=100,this._waitingTime=Et,this._lastReportAt=Date.now(),this._ssoLogMap=new Map,this._logLevel=IA.DEBUG,this._throttleConfig={global:{throttleTime:se,maxCount:WA},single:{throttleTime:Ae,maxCount:HA}},this._globalThrottle={count:0,startTime:Date.now()},this._singleThrottleMap=new Map,es.subscribeInnerEvent(Ke.CLOUD_CONFIG_UPDATE,this._handleCloudConfigUpdate,this),ws.addTask({id:Nt,intervalMs:1e3,callback:this._checkAndReportIfDue,context:this}),this._logQueue=[],this._savePlatFormInfo()}_handleCloudConfigUpdate(s){const{evt_rpt_threshold:r=qe,evt_rpt_waiting:g=Et,evt_rpt_level:u=ft,evt_rpt_sdkappid_bl:E="",evt_rpt_tinyid_wl:f="",evt_rpt_global_throttle_time:D=se,evt_rpt_global_throttle_count:v=WA,evt_rpt_single_throttle_time:N=Ae,evt_rpt_single_throttle_count:P=HA}=s||{};this._sdkAppIdBlackList=E.split(",").map(W=>Number(W)),this._waitingTime=Number(g),this._minThreshold=r,this._reportLevel=u,this._tinyIdWhiteList=f.split(","),this._throttleConfig={global:{throttleTime:D,maxCount:v},single:{throttleTime:N,maxCount:P}}}createSSOLogData(s){const r=new ne(s);return r.setSSOLogModule(this),this._ssoLogMap.set(s.method,r),r}getSSOLogData(s){return this._ssoLogMap.get(s)||{}}pushToLogQueue(s){s&&(this._logQueue.push(s),this._shouldUploadImmediately()&&this.uploadSSOLogData())}setLogLevel(s){[IA.DEBUG,IA.ERROR,IA.INFO,IA.NONE,IA.WARN].includes(s)&&(this._logLevel=s)}debug(s,r="",g){this._log(IA.DEBUG,s,r,g)}info(s,r="",g){this._log(IA.INFO,s,r,g)}warn(s,r="",g){this._log(IA.WARN,s,r,g)}error(s,r="",g){this._log(IA.ERROR,s,r,g)}_shouldUploadImmediately(){return this._logQueue.length>=this._minThreshold}_isReportDue(){return Date.now()>=this._lastReportAt+this._waitingTime}_checkAndReportIfDue(){this._isReportDue()&&this._logQueue.length>0&&this.uploadSSOLogData()}uploadSSOLogData(){return mA(this,void 0,void 0,function*(){if(this._logQueue.length===0)return;const s=this._logQueue.slice();this._logQueue=[];try{const r=this._filterLogs(s);if(r.length===0)return void(this._lastReportAt=Date.now());const g={Header:$(),Event:r};tn(g.Header.user_id)||(yield function(u){const E="imopenstat.tim_web_report_v2",f=_s({servcmd:E,data:u}),D=`${f.head.seq}${E}`;return ve.sendPacket(f,{requestId:D})}(g))}catch(r){this._requeueFailedLogs(s),this.debug("uploadSSOLogData",_n(r))}finally{this._lastReportAt=Date.now()}})}_requeueFailedLogs(s){this._logQueue=s.concat(this._logQueue);const r=this._logQueue.length-200;r>0&&(this._logQueue.splice(0,r),this.debug("uploadSSOLogData",`log queue overflow, dropped ${r} oldest logs`))}_savePlatFormInfo(){var s,r;if(Xe){const g=(r=(s=wx.getAccountInfoSync)===null||s===void 0?void 0:s.call(wx))===null||r===void 0?void 0:r.miniProgram;if(g){const{appId:u,envVersion:E}=g;ro.set("instance",{appId:u,envVersion:E})}}else Ai&&ro.set("instance",{href:window.location.href})}_filterLogs(s){const{tinyID:r}=ro.get("login")||{},{sdkAppId:g}=ro.get("instance")||{};return this._sdkAppIdBlackList.includes(g)&&!this._tinyIdWhiteList.includes(r)?[]:s.filter(u=>this._reportLevel.includes(u.level))}_checkThrottle(s){return!!this._checkGlobalThrottle()||this._checkSingleThrottle(s)}_checkGlobalThrottle(){const s=Date.now();if(s-this._globalThrottle.startTime>=this._throttleConfig.global.throttleTime)this._globalThrottle.count=1,this._globalThrottle.startTime=s;else if(this._globalThrottle.count++,this._globalThrottle.count>this._throttleConfig.global.maxCount)return!0;return!1}_checkSingleThrottle(s){const r=Date.now(),g=this._singleThrottleMap.get(s);return g?r-g.startTime>=this._throttleConfig.single.throttleTime?(g.count=1,g.startTime=r,!1):g.count>=this._throttleConfig.single.maxCount||(g.count++,!1):(this._singleThrottleMap.set(s,{count:1,startTime:r}),!1)}_shouldLog(s){return s>=this._logLevel&&this._logLevel!==IA.NONE}_shouldReport(s){return this._reportLevel.includes(qA[s])}_formatLog(s,r,g,u){const E=new Date,f=`${E.getHours()}:${E.getMinutes()}:${E.getSeconds()}:${E.getMilliseconds()}`,D=`<${IA[s]}>`;return Gt||Fi?[`${oA} [${f}] ${D} [${r}] ${g}`]:["%c%s%c%s","background:#0abf5b; padding:1px; border-radius:3px; color: #fff",oA,"",`[${f}] ${D} [${r}] ${g} params: ${_n(u)}`]}_log(s,r,g,u){if(this._shouldLog(s)){const E=this._formatLog(s,r,g,u);vA[s].apply(console,E)}if(this._shouldReport(s)){const E=this._getThrottleKey(r,g,u);this._checkThrottle(E)||this.createSSOLogData(Object.assign(Object.assign({message:g},u),{method:r})).end()}}_getThrottleKey(s,r,g){const u=`${s}${r}${_n(Object.assign(Object.assign({},g),{costTime:""}))}`,E=Fa(JSON.stringify(u));let f=4294967295;const{length:D}=E;for(let v=0;v>>=1:f=f>>>1^3988292384}return`${(4294967295^f)>>>0}`}reset(){console.log("SSO_LOG_MODULE.reset"),ws.removeTask(Nt),es.unSubscribeInnerEvent(Ke.CLOUD_CONFIG_UPDATE,this._handleCloudConfigUpdate,this),this._lastReportAt=0,this.uploadSSOLogData(),this._sdkAppIdBlackList=[],this._tinyIdWhiteList=[],this._minThreshold=qe,this._maxThreshold=100,this._waitingTime=Et,this._logQueue=[],this._logLevel=IA.DEBUG,this._globalThrottle={count:0,startTime:Date.now()},this._singleThrottleMap.clear()}};const di=15e3,Bt="Channel",Jt="channel_schedule_task",$i="channel_reconnect_task",eo="connected",os="connecting",Ti="disconnected",on=1e3,wg="network_status_change",Er="activity_status_change",Mr="send_fail",js="reconnect_failed",Tl="socket_error",ns="socket_close";function uI(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}function ec(s){return ec=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(r){return typeof r}:function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},ec(s)}function wc(s){throw new Error('Could not dynamically require "'+s+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Tu,Na={exports:{}},Nl=(Tu||(Tu=1,function(s){s.exports=function r(g,u,E){function f(N,P){if(!u[N]){if(!g[N]){if(!P&&wc)return wc(N);if(D)return D(N,!0);var W=new Error("Cannot find module '"+N+"'");throw W.code="MODULE_NOT_FOUND",W}var nA=u[N]={exports:{}};g[N][0].call(nA.exports,function(EA){return f(g[N][1][EA]||EA)},nA,nA.exports,r,g,u,E)}return u[N].exports}for(var D=wc,v=0;v>>6:(EA<65536?nA[VA++]=224|EA>>>12:(nA[VA++]=240|EA>>>18,nA[VA++]=128|EA>>>12&63),nA[VA++]=128|EA>>>6&63),nA[VA++]=128|63&EA);return nA},u.buf2binstring=function(W){return P(W,W.length)},u.binstring2buf=function(W){for(var nA=new E.Buf8(W.length),EA=0,wA=nA.length;EA>10&1023,SA[wA++]=56320|1023&kA)}return P(SA,wA)},u.utf8border=function(W,nA){var EA;for((nA=nA||W.length)>W.length&&(nA=W.length),EA=nA-1;0<=EA&&(192&W[EA])==128;)EA--;return EA<0||EA===0?nA:EA+v[W[EA]]>nA?EA:nA}},{"./common":1}],3:[function(r,g,u){g.exports=function(E,f,D,v){for(var N=65535&E,P=E>>>16&65535,W=0;D!==0;){for(D-=W=2e3>>1:f>>>1;D[v]=f}return D}();g.exports=function(f,D,v,N){var P=E,W=N+v;f^=-1;for(var nA=N;nA>>8^P[255&(f^D[nA])];return-1^f}},{}],6:[function(r,g,u){g.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}},{}],7:[function(r,g,u){g.exports=function(E,f){var D,v,N,P,W,nA,EA,wA,kA,VA,LA,SA,PA,zA,Ee,Ie,Li,Ui,Yt,Oi,Bn,Re,Mt,FA,ci;D=E.state,v=E.next_in,FA=E.input,N=v+(E.avail_in-5),P=E.next_out,ci=E.output,W=P-(f-E.avail_out),nA=P+(E.avail_out-257),EA=D.dmax,wA=D.wsize,kA=D.whave,VA=D.wnext,LA=D.window,SA=D.hold,PA=D.bits,zA=D.lencode,Ee=D.distcode,Ie=(1<>>=Yt=Ui>>>24,PA-=Yt,(Yt=Ui>>>16&255)==0)ci[P++]=65535&Ui;else{if(!(16&Yt)){if(!(64&Yt)){Ui=zA[(65535&Ui)+(SA&(1<>>=Yt,PA-=Yt),PA<15&&(SA+=FA[v++]<>>=Yt=Ui>>>24,PA-=Yt,!(16&(Yt=Ui>>>16&255))){if(!(64&Yt)){Ui=Ee[(65535&Ui)+(SA&(1<>>=Yt,PA-=Yt,(Yt=P-W)>3,SA&=(1<<(PA-=Oi<<3))-1,E.next_in=v,E.next_out=P,E.avail_in=v>>24&255)+(Re>>>8&65280)+((65280&Re)<<8)+((255&Re)<<24)}function SA(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new E.Buf16(320),this.work=new E.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function PA(Re){var Mt;return Re&&Re.state?(Mt=Re.state,Re.total_in=Re.total_out=Mt.total=0,Re.msg="",Mt.wrap&&(Re.adler=1&Mt.wrap),Mt.mode=wA,Mt.last=0,Mt.havedict=0,Mt.dmax=32768,Mt.head=null,Mt.hold=0,Mt.bits=0,Mt.lencode=Mt.lendyn=new E.Buf32(kA),Mt.distcode=Mt.distdyn=new E.Buf32(VA),Mt.sane=1,Mt.back=-1,nA):EA}function zA(Re){var Mt;return Re&&Re.state?((Mt=Re.state).wsize=0,Mt.whave=0,Mt.wnext=0,PA(Re)):EA}function Ee(Re,Mt){var FA,ci;return Re&&Re.state?(ci=Re.state,Mt<0?(FA=0,Mt=-Mt):(FA=1+(Mt>>4),Mt<48&&(Mt&=15)),Mt&&(Mt<8||15=Pi.wsize?(E.arraySet(Pi.window,Mt,FA-Pi.wsize,Pi.wsize,0),Pi.wnext=0,Pi.whave=Pi.wsize):(ci<(xn=Pi.wsize-Pi.wnext)&&(xn=ci),E.arraySet(Pi.window,Mt,FA-ci,xn,Pi.wnext),(ci-=xn)?(E.arraySet(Pi.window,Mt,FA-ci,ci,0),Pi.wnext=ci,Pi.whave=Pi.wsize):(Pi.wnext+=xn,Pi.wnext===Pi.wsize&&(Pi.wnext=0),Pi.whave>>8&255,FA.check=D(FA.check,Bg,2,0),Ft=Ut=0,FA.mode=2;break}if(FA.flags=0,FA.head&&(FA.head.done=!1),!(1&FA.wrap)||(((255&Ut)<<8)+(Ut>>8))%31){Re.msg="incorrect header check",FA.mode=30;break}if((15&Ut)!=8){Re.msg="unknown compression method",FA.mode=30;break}if(Ft-=4,ja=8+(15&(Ut>>>=4)),FA.wbits===0)FA.wbits=ja;else if(ja>FA.wbits){Re.msg="invalid window size",FA.mode=30;break}FA.dmax=1<>8&1),512&FA.flags&&(Bg[0]=255&Ut,Bg[1]=Ut>>>8&255,FA.check=D(FA.check,Bg,2,0)),Ft=Ut=0,FA.mode=3;case 3:for(;Ft<32;){if(ji===0)break A;ji--,Ut+=ci[Pi++]<>>8&255,Bg[2]=Ut>>>16&255,Bg[3]=Ut>>>24&255,FA.check=D(FA.check,Bg,4,0)),Ft=Ut=0,FA.mode=4;case 4:for(;Ft<16;){if(ji===0)break A;ji--,Ut+=ci[Pi++]<>8),512&FA.flags&&(Bg[0]=255&Ut,Bg[1]=Ut>>>8&255,FA.check=D(FA.check,Bg,2,0)),Ft=Ut=0,FA.mode=5;case 5:if(1024&FA.flags){for(;Ft<16;){if(ji===0)break A;ji--,Ut+=ci[Pi++]<>>8&255,FA.check=D(FA.check,Bg,2,0)),Ft=Ut=0}else FA.head&&(FA.head.extra=null);FA.mode=6;case 6:if(1024&FA.flags&&(ji<(Do=FA.length)&&(Do=ji),Do&&(FA.head&&(ja=FA.head.extra_len-FA.length,FA.head.extra||(FA.head.extra=new Array(FA.head.extra_len)),E.arraySet(FA.head.extra,ci,Pi,Do,ja)),512&FA.flags&&(FA.check=D(FA.check,ci,Do,Pi)),ji-=Do,Pi+=Do,FA.length-=Do),FA.length))break A;FA.length=0,FA.mode=7;case 7:if(2048&FA.flags){if(ji===0)break A;for(Do=0;ja=ci[Pi+Do++],FA.head&&ja&&FA.length<65536&&(FA.head.name+=String.fromCharCode(ja)),ja&&Do>9&1,FA.head.done=!0),Re.adler=FA.check=0,FA.mode=12;break;case 10:for(;Ft<32;){if(ji===0)break A;ji--,Ut+=ci[Pi++]<>>=7&Ft,Ft-=7&Ft,FA.mode=27;break}for(;Ft<3;){if(ji===0)break A;ji--,Ut+=ci[Pi++]<>>=1)){case 0:FA.mode=14;break;case 1:if(Oi(FA),FA.mode=20,Mt!==6)break;Ut>>>=2,Ft-=2;break A;case 2:FA.mode=17;break;case 3:Re.msg="invalid block type",FA.mode=30}Ut>>>=2,Ft-=2;break;case 14:for(Ut>>>=7&Ft,Ft-=7&Ft;Ft<32;){if(ji===0)break A;ji--,Ut+=ci[Pi++]<>>16^65535)){Re.msg="invalid stored block lengths",FA.mode=30;break}if(FA.length=65535&Ut,Ft=Ut=0,FA.mode=15,Mt===6)break A;case 15:FA.mode=16;case 16:if(Do=FA.length){if(ji>>=5,Ft-=5,FA.ndist=1+(31&Ut),Ut>>>=5,Ft-=5,FA.ncode=4+(15&Ut),Ut>>>=4,Ft-=4,286>>=3,Ft-=3}for(;FA.have<19;)FA.lens[CS[FA.have++]]=0;if(FA.lencode=FA.lendyn,FA.lenbits=7,kI={bits:FA.lenbits},Kl=N(0,FA.lens,0,19,FA.lencode,0,FA.work,kI),FA.lenbits=kI.bits,Kl){Re.msg="invalid code lengths set",FA.mode=30;break}FA.have=0,FA.mode=19;case 19:for(;FA.have>>16&255,bI=65535&Jg,!((Gr=Jg>>>24)<=Ft);){if(ji===0)break A;ji--,Ut+=ci[Pi++]<>>=Gr,Ft-=Gr,FA.lens[FA.have++]=bI;else{if(bI===16){for(nE=Gr+2;Ft>>=Gr,Ft-=Gr,FA.have===0){Re.msg="invalid bit length repeat",FA.mode=30;break}ja=FA.lens[FA.have-1],Do=3+(3&Ut),Ut>>>=2,Ft-=2}else if(bI===17){for(nE=Gr+3;Ft>>=Gr)),Ut>>>=3,Ft-=3}else{for(nE=Gr+7;Ft>>=Gr)),Ut>>>=7,Ft-=7}if(FA.have+Do>FA.nlen+FA.ndist){Re.msg="invalid bit length repeat",FA.mode=30;break}for(;Do--;)FA.lens[FA.have++]=ja}}if(FA.mode===30)break;if(FA.lens[256]===0){Re.msg="invalid code -- missing end-of-block",FA.mode=30;break}if(FA.lenbits=9,kI={bits:FA.lenbits},Kl=N(P,FA.lens,0,FA.nlen,FA.lencode,0,FA.work,kI),FA.lenbits=kI.bits,Kl){Re.msg="invalid literal/lengths set",FA.mode=30;break}if(FA.distbits=6,FA.distcode=FA.distdyn,kI={bits:FA.distbits},Kl=N(W,FA.lens,FA.nlen,FA.ndist,FA.distcode,0,FA.work,kI),FA.distbits=kI.bits,Kl){Re.msg="invalid distances set",FA.mode=30;break}if(FA.mode=20,Mt===6)break A;case 20:FA.mode=21;case 21:if(6<=ji&&258<=Br){Re.next_out=Vr,Re.avail_out=Br,Re.next_in=Pi,Re.avail_in=ji,FA.hold=Ut,FA.bits=Ft,v(Re,hs),Vr=Re.next_out,xn=Re.output,Br=Re.avail_out,Pi=Re.next_in,ci=Re.input,ji=Re.avail_in,Ut=FA.hold,Ft=FA.bits,FA.mode===12&&(FA.back=-1);break}for(FA.back=0;Hg=(Jg=FA.lencode[Ut&(1<>>16&255,bI=65535&Jg,!((Gr=Jg>>>24)<=Ft);){if(ji===0)break A;ji--,Ut+=ci[Pi++]<>Ec)])>>>16&255,bI=65535&Jg,!(Ec+(Gr=Jg>>>24)<=Ft);){if(ji===0)break A;ji--,Ut+=ci[Pi++]<>>=Ec,Ft-=Ec,FA.back+=Ec}if(Ut>>>=Gr,Ft-=Gr,FA.back+=Gr,FA.length=bI,Hg===0){FA.mode=26;break}if(32&Hg){FA.back=-1,FA.mode=12;break}if(64&Hg){Re.msg="invalid literal/length code",FA.mode=30;break}FA.extra=15&Hg,FA.mode=22;case 22:if(FA.extra){for(nE=FA.extra;Ft>>=FA.extra,Ft-=FA.extra,FA.back+=FA.extra}FA.was=FA.length,FA.mode=23;case 23:for(;Hg=(Jg=FA.distcode[Ut&(1<>>16&255,bI=65535&Jg,!((Gr=Jg>>>24)<=Ft);){if(ji===0)break A;ji--,Ut+=ci[Pi++]<>Ec)])>>>16&255,bI=65535&Jg,!(Ec+(Gr=Jg>>>24)<=Ft);){if(ji===0)break A;ji--,Ut+=ci[Pi++]<>>=Ec,Ft-=Ec,FA.back+=Ec}if(Ut>>>=Gr,Ft-=Gr,FA.back+=Gr,64&Hg){Re.msg="invalid distance code",FA.mode=30;break}FA.offset=bI,FA.extra=15&Hg,FA.mode=24;case 24:if(FA.extra){for(nE=FA.extra;Ft>>=FA.extra,Ft-=FA.extra,FA.back+=FA.extra}if(FA.offset>FA.dmax){Re.msg="invalid distance too far back",FA.mode=30;break}FA.mode=25;case 25:if(Br===0)break A;if(Do=hs-Br,FA.offset>Do){if((Do=FA.offset-Do)>FA.whave&&FA.sane){Re.msg="invalid distance too far back",FA.mode=30;break}Do>FA.wnext?(Do-=FA.wnext,Bl=FA.wsize-Do):Bl=FA.wnext-Do,Do>FA.length&&(Do=FA.length),GC=FA.window}else GC=xn,Bl=Vr-FA.offset,Do=FA.length;for(BrLi?(Yt=Bl[GC+VA[Mt]],Oi=Ft[oE+VA[Mt]]):(Yt=96,Oi=0),SA=1<>Vr)+(PA-=SA)]=Ui<<24|Yt<<16|Oi,PA!==0;);for(SA=1<>=1;if(SA!==0?(Ut&=SA-1,Ut+=SA):Ut=0,Mt++,--hs[Re]==0){if(Re===ci)break;Re=W[nA+VA[Mt]]}if(xn{const v=new Uint8Array(D).slice(4);let N;try{N=Nl.inflate(v,{to:"string"})}catch(P){console.error("inflate error",P)}return N})(s.data):function(D){const v=new Uint8Array(D);let N="",P=0;const{length:W}=v;for(;P0)for(let kA=0;kA{var u;const{uplinkData:E,canResend:f,resolve:D,reject:v,timeout:N}=r;if(f){this._pendingRequests.set(g,{resolve:D,reject:v,timestamp:Date.now(),uplinkData:E,timeout:N,canResend:f});const P=this._isBinarySupported?Fa(E).buffer:E;(u=this._socketAdapter)===null||u===void 0||u.send(P)}else this._pendingRequests.delete(g)})}_onConnect(s){const{socketId:r,event:g={}}=s||{};this._connectionId=r,this._connectionEstablishedTime=Date.now();const u=Date.now()-this._connectionStartTime,E=`${Bt}.onConnect cost:${u} ms. socketID:${r} res:${JSON.stringify(g)}`;if(this._ssoLog({method:"onConnect",message:E}),this._checkPendingRequestsAndResend(),this._sendHeartbeatIfReady(),this._isReconnecting){const f=`${Bt}.reconnect success`;this._ssoLog({method:"reconnectSuccess",message:f}),es.emitInnerEvent(Ke.RECONNECTED),this._isReconnecting=!1}this._resetReconnectDelay(),this._handleConnectStateChange({state:eo,shouldEmitEvent:!0,shouldAttemptReconnect:!1})}_sendAck(s){const r=pa({servcmd:"openim.ws_msg_push_ack",data:{SessionData:s}});this.sendPacket(r)}_executeScheduledTaskIfReady(){return mA(this,void 0,void 0,function*(){this._clearTimeoutRequest(),this._sendHeartbeatIfReady()})}_canSendHeartbeat(){var s;return((s=this._socketAdapter)===null||s===void 0?void 0:s.isConnected())&&Date.now()>=this._nextHeartbeatAt&&!this._isHeartbeatInProgress}_sendHeartbeat(){return mA(this,void 0,void 0,function*(){var s;const r=pa({servcmd:"heartbeat.alive",data:{}});try{const g=`${r.head.seq}${r.head.servcmd}`;yield this.sendPacket(r,{requestId:g,timeout:3e3})}catch(g){const u=(s=ro.get("netWorkMonitor"))===null||s===void 0?void 0:s.isNetworkOnline,E=`${Bt}.sendHeartbeat failed. isNetWorkOnline:${u} error: ${_n(g)}`;this._ssoLog({method:"sendHeartbeatError",message:E}),this._handleConnectStateChange({state:Ti,shouldEmitEvent:!0,shouldAttemptReconnect:!0})}})}_sendHeartbeatIfReady(){return mA(this,void 0,void 0,function*(){this._canSendHeartbeat()&&(this._isHeartbeatInProgress=!0,yield this._sendHeartbeat(),this._isHeartbeatInProgress=!1)})}_updateHeartbeatTime(){this._nextHeartbeatAt=ao?Date.now()+5e3:Date.now()+1e4}_handleNetworkStatusChange(s){const r=`${Bt}.networkStatusChange ${JSON.stringify(s)}`;this._ssoLog({method:"networkStatusChange",message:r});const{isNetworkOnline:g,networkType:u}=s;g&&u!=="none"?this._handleConnectStateChange({state:eo,shouldEmitEvent:!1,shouldAttemptReconnect:!0,reason:wg}):this._handleConnectStateChange({state:Ti,shouldEmitEvent:!1,shouldAttemptReconnect:!0,reason:wg})}isPrivateNetWork(){const s=ro.get("instance")||{};return s.proxyServer&&!s.fileDownloadProxy}_handleConnectStateChange(s){const{state:r,shouldAttemptReconnect:g,shouldEmitEvent:u,reason:E}=s,f=`${Bt}._handleConnectStateChange currentConnectState: ${this._currentConnectState} shouldAttemptReconnect: ${g} shouldEmitEvent: ${u} reason: ${E}`;this._currentConnectState!==r&&(this._ssoLog({method:"handleConnectStateChange",message:f}),u&&(Kt.info("_handleConnectStateChange",` from ${this._currentConnectState} to ${r}`),es.emitOuterEvent("netStateChange",{name:"netStateChange",data:{state:r}}),this._currentConnectState=r,r===Ti&&es.emitInnerEvent(Ke.SOCKET_DISCONNECTED)),g&&(this._resetReconnectDelay(),ws.addTask({id:$i,intervalMs:this._intendedDelay,callback:this._scheduleReconnectWithBackoff,context:this})))}_handleActivityStatusChange(s){var r,g;const u=(g=(r=this._socketAdapter)===null||r===void 0?void 0:r._ws)===null||g===void 0?void 0:g.readyState,E=`${Bt}.activityStatusChange ${JSON.stringify(s)} readyState: ${u}`;Kt.debug("activityStatusChange",E),u===3&&this._handleConnectStateChange({state:Ti,shouldEmitEvent:!0,shouldAttemptReconnect:!0,reason:Er})}_resetReconnectDelay(){var s;Kt.debug(`${Bt}._resetReconnectDelay`),ws.removeTask($i);const r=(s=ro.get("activityMonitor"))===null||s===void 0?void 0:s.isActive;this._intendedDelay=r?on:1e3}_scheduleReconnectWithBackoff(){var s;const r=(s=ro.get("activityMonitor"))===null||s===void 0?void 0:s.isActive;this._intendedDelay=r?Math.min(5e3,Math.max(on,1.5*this._intendedDelay)):Math.min(3e5,Math.max(1e3,1.5*this._intendedDelay));const g=new Date().toTimeString().slice(0,8),u=`${Bt}.scheduleReconnectWithBackoff timeStr: ${g} intendedDelay: ${this._intendedDelay}`;Kt.debug(u),this.reconnect(),ws.updateTaskInterval($i,this._intendedDelay)}_ssoLog(s){const{method:r,message:g}=s;Kt.info(r,g)}_diagnose(){this.isPrivateNetWork()||(this._lastDiagnoseAt=Date.now(),function(s){mA(this,void 0,void 0,function*(){const r=s.split("/")[2];if(!r.startsWith("ws"))return;const g=`https://${r}/v3/netcheck/getconninfo?${s.slice(s.indexOf("info?")+5)}&reqtime=${Date.now()}`;try{yield qi({method:"GET",url:g,data:{}})}catch(u){Kt.warn("diagnoseBySSO",`diagnoseBySSO failed. error:${u.message}`)}})}(this._url),function(s){mA(this,void 0,void 0,function*(){const r=`https://boce-cdn.my-imcloud.com/v3/netcheck/getconninfo?${s.slice(s.indexOf("info?")+5)}&reqtime=${Date.now()}`;try{yield qi({method:"GET",url:r,data:{}})}catch(g){Kt.warn(`diagnoseByCDN', 'diagnoseByCDN failed. error:${g.message}`)}})}(this._url),this._beforeSendInterceptors=[])}_clearTimeoutRequest(){for(const[s,r]of this._pendingRequests.entries()){const{reject:g,timestamp:u,timeout:E}=r;Date.now()-u>=E&&(this._pendingRequests.delete(s),Date.now()-this._lastDiagnoseAt>=3e4&&this._diagnose(),g({errorCode:Zs,errorInfo:"NETWORK_TIMEOUT",data:{requestId:s}}))}}_updateIsBinarySupported(){var s;if(!((s=ro.get("instance"))===null||s===void 0)&&s.devMode)return void(this._isBinarySupported=!1);const r=Vo();if((ii||Xe&&r==="windows"||wn)&&(this._isBinarySupported=!1),ao){const{uniRuntimeVersion:g=""}=no.getSystemInfoSync();(function(u){const E=u.split(".").map(Number),[f=0,D=0,v=0]=E;return f>2||!(f<2)&&(D>2||!(D<2)&&v>=6)})(g)||(this._isBinarySupported=!1)}}_isCompressedData(s){const r=new Uint8Array(s);return r[0]===67&&r[1]===79&&r[2]===77&&r[3]===80}};const Se={init:function(s){ro.set("instance",s),ve.init()},destroy:function(){ve.dispose(),ro.clear(),ws.dispose()},notificationCenter:es,channel:ve,store:ro,ssoLog:Kt,utils:$a,common:RA,constants:we},_g=s=>typeof s=="function";function cg(s,r,g){const u=g||[];if(!s||!r)return!1;const E=Object.keys(s).filter(D=>!u.includes(D)),f=Object.keys(r).filter(D=>!u.includes(D));return E.length===f.length&&E.every(D=>!!r.hasOwnProperty(D)&&(typeof s[D]=="object"&&s[D]!==null?cg(s[D],r[D],g):s[D]===r[D]))}var Tg;(function(s){s.SDK_READY="sdkStateReady",s.SDK_NOT_READY="sdkStateNotReady",s.SDK_DESTROY="sdkDestroy",s.MESSAGE_RECEIVED="onMessageReceived",s.ROOM_CUSTOM_DATA_RECEIVED="onRoomCustomDataReceived",s.MESSAGE_MODIFIED="onMessageModified",s.MESSAGE_REVOKED="onMessageRevoked",s.MESSAGE_READ_BY_PEER="onMessageReadByPeer",s.MESSAGE_READ_RECEIPT_RECEIVED="onMessageReadReceiptReceived",s.MESSAGE_EXTENSIONS_UPDATED="onMessageExtensionsUpdated",s.MESSAGE_EXTENSIONS_DELETED="onMessageExtensionsDeleted",s.MESSAGE_REACTIONS_UPDATED="onMessageReactionsUpdated",s.CONVERSATION_LIST_UPDATED="onConversationListUpdated",s.TOTAL_UNREAD_MESSAGE_COUNT_UPDATED="onTotalUnreadMessageCountUpdated",s.CONVERSATION_GROUP_LIST_UPDATED="onConversationGroupListUpdated",s.CONVERSATION_IN_GROUP_UPDATED="onConversationInGroupUpdated",s.GROUP_LIST_UPDATED="onGroupListUpdated",s.GROUP_ATTRIBUTES_UPDATED="groupAttributesUpdated",s.GROUP_COUNTER_UPDATED="onGroupCounterUpdated",s.TOPIC_CREATED="onTopicCreated",s.TOPIC_DELETED="onTopicDeleted",s.TOPIC_UPDATED="onTopicUpdated",s.PROFILE_UPDATED="onProfileUpdated",s.USER_STATUS_UPDATED="onUserStatusUpdated",s.BLACKLIST_UPDATED="blacklistUpdated",s.FRIEND_LIST_UPDATED="onFriendListUpdated",s.FRIEND_GROUP_LIST_UPDATED="onFriendGroupListUpdated",s.FRIEND_APPLICATION_LIST_UPDATED="onFriendApplicationListUpdated",s.MY_FOLLOWERS_LIST_UPDATED="onMyFollowersListUpdated",s.MY_FOLLOWING_LIST_UPDATED="onMyFollowingListUpdated",s.MUTUAL_FOLLOWERS_LIST_UPDATED="onMutualFollowersListUpdated",s.KICKED_OUT="kickedOut",s.ERROR="error",s.NET_STATE_CHANGE="netStateChange",s.ALL_RECEIVE_MESSAGE_OPT_UPDATED="onAllReceiveMessageOptUpdated",s.SERVER_CONFIG_UPDATED="onServerConfigUpdated",s.PINNED_GROUP_MESSAGE_UPDATED="onPinnedGroupMessageUpdated",s.WEB_PUSH_MESSAGE_RECEIVED="onWebPushMessageReceived",s.GROUP_ONLINE_MEMBER_COUNT_CHANGED="onGroupOnlineMemberCountChanged",s.RICH_STATUS_CHANGED="onRichStatusChanged"})(Tg||(Tg={}));var Ts,Rr=Tg;(function(s){s.LOGOUT="logout",s.DESTROY="destroy",s.CLOUD_CONFIG_UPDATE="cloud_config_update",s.PROFILE_UPDATE="profile_updated",s.ERROR="error",s.RECONNECTED="reconnected",s.FORCE_OFFLINE="im_open_status.stat_forceoffline",s.COMMERCIAL_CONFIG_PUSH="im_sdk_config_mgr.push_imsdk_purchase_bitsv2",s.OVERLOAD_PUSH="OverLoadPush.notify2",s.NEW_MESSAGE="new_message",s.MESSAGE_PUSH="im_open_push.msg_push",s.MESSAGE_DELETED="message_deleted",s.MESSAGE_REVOKED="message_revoked",s.MESSAGE_MODIFIED="message_modified",s.SOCKET_DISCONNECTED="socket_disconnected",s.CONVERSATION_UPDATED="conversation_updated",s.TOPIC_MESSAGE_DELETED="topic_message_deleted",s.TOPIC_MESSAGE_REVOKED="topic_message_revoked",s.TOPIC_MESSAGE_MODIFIED="topic_message_modified",s.TOPIC_NEW_MESSAGE="topic_new_message",s.QUALITY_STAT="quality_stat",s.SYNC_CONVERSATION_LIST="sync_conversation_list",s.HISTORY_MESSAGE_FETCHED="history_message_fetched"})(Ts||(Ts={}));var Ci,lo=Ts;(function(s){s.NEW_INVITATION_RECEIVED="newInvitationReceived",s.INVITEE_ACCEPTED="ts_invitee_accepted",s.INVITEE_REJECTED="ts_invitee_rejected",s.INVITATION_CANCELLED="ts_invitation_cancelled",s.INVITATION_TIMEOUT="ts_invitation_timeout",s.INVITATION_MODIFIED="ts_invitation_modified"})(Ci||(Ci={}));var Xc=Ci;const tc=Object.assign({},{KICKED_OUT_MULT_ACCOUNT:"multipleAccount",KICKED_OUT_MULT_DEVICE:"multipleDevice",KICKED_OUT_USERSIG_EXPIRED:"userSigExpired",KICKED_OUT_REST_API:"REST_API_Kick"}),Ng={MSG_TEXT:"TIMTextElem",MSG_IMAGE:"TIMImageElem",MSG_AUDIO:"TIMSoundElem",MSG_FILE:"TIMFileElem",MSG_FACE:"TIMFaceElem",MSG_VIDEO:"TIMVideoFileElem",MSG_LOCATION:"TIMLocationElem",MSG_GRP_TIP:"TIMGroupTipElem",MSG_GRP_SYS_NOTICE:"TIMGroupSystemNoticeElem",MSG_CUSTOM:"TIMCustomElem",MSG_MERGER:"TIMRelayElem",MSG_STREAM:"TIMStreamElem"};var qr;(function(s){s.UNSENT="unSend",s.SUCCESS="success",s.FAIL="fail"})(qr||(qr={}));const _c={modify:lo.MESSAGE_MODIFIED,delete:lo.MESSAGE_DELETED,revoke:lo.MESSAGE_REVOKED};var $c;(function(s){s[s.FORWARD=0]="FORWARD",s[s.BACKWARD=1]="BACKWARD"})($c||($c={}));const lg=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},Ng),{MSG_PRIORITY_HIGH:"High",MSG_PRIORITY_NORMAL:"Normal",MSG_PRIORITY_LOW:"Low",MSG_PRIORITY_LOWEST:"Lowest"}),{RECEIVE_WITH_OFFLINE_PUSH_EXCEPT_AT:"AcceptNotNotifyExceptAt",NOT_RECEIVE_OFFLINE_PUSH_EXCEPT_AT:"AcceptNotNotifyExceptAt",NOT_RECEIVE_MSG_EXCEPT_AT:"NotReceiveMsgExceptAt",MSG_AT_ALL:"__kImSDK_MesssageAtALL__"}),{MSG_REMIND_ACPT_AND_NOTE:"AcceptAndNotify",MSG_REMIND_ACPT_NOT_NOTE:"AcceptNotNotify",MSG_REMIND_DISCARD:"Discard"}),{MessageStatus:qr,Direction:$c}),Nu={[_c.modify]:lo.TOPIC_MESSAGE_MODIFIED,[_c.delete]:lo.TOPIC_MESSAGE_DELETED,[_c.revoke]:lo.TOPIC_MESSAGE_REVOKED},ME={GENDER_UNKNOWN:"Gender_Type_Unknown",GENDER_FEMALE:"Gender_Type_Female",GENDER_MALE:"Gender_Type_Male",USER_STATUS_UNKNOWN:0,USER_STATUS_ONLINE:1,USER_STATUS_OFFLINE:2,USER_STATUS_UNLOGINED:3,USER_NOT_FOUND:"@TLS#NOT_FOUND"},Gg=Object.assign({},ME),Pa={CONV_C2C:"C2C",CONV_GROUP:"GROUP",CONV_TOPIC:"TOPIC",CONV_SYSTEM:"@TIM#SYSTEM"},Tc=Object.assign(Object.assign(Object.assign(Object.assign({},Pa),{CONV_AT_ME:1,CONV_AT_ALL:2,CONV_AT_ALL_AT_ME:3}),{CONV_MARK_TYPE_STAR:1,CONV_MARK_TYPE_UNREAD:2,CONV_MARK_TYPE_FOLD:4,CONV_MARK_TYPE_HIDE:8}),{READ_ALL_C2C_MSG:"readAllC2CMessage",READ_ALL_GROUP_MSG:"readAllGroupMessage",READ_ALL_MSG:"readAllMessage"}),RE=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},{SNS_TYPE_NO_RELATION:"CheckResult_Type_NoRelation",SNS_TYPE_A_WITH_B:"CheckResult_Type_AWithB",SNS_TYPE_B_WITH_A:"CheckResult_Type_BWithA",SNS_TYPE_BOTH_WAY:"CheckResult_Type_BothWay"}),{ALLOW_TYPE_ALLOW_ANY:"AllowType_Type_AllowAny",ALLOW_TYPE_NEED_CONFIRM:"AllowType_Type_NeedConfirm",ALLOW_TYPE_DENY_ANY:"AllowType_Type_DenyAny"}),{SNS_ADD_TYPE_SINGLE:"Add_Type_Single",SNS_ADD_TYPE_BOTH:"Add_Type_Both"}),{SNS_DELETE_TYPE_SINGLE:"Delete_Type_Single",SNS_DELETE_TYPE_BOTH:"Delete_Type_Both"}),{SNS_APPLICATION_TYPE_BOTH:"Pendency_Type_Both",SNS_APPLICATION_SENT_TO_ME:"Pendency_Type_ComeIn",SNS_APPLICATION_SENT_BY_ME:"Pendency_Type_SendOut",SNS_APPLICATION_AGREE:"Response_Action_Agree",SNS_APPLICATION_AGREE_AND_ADD:"Response_Action_AgreeAndAdd"}),{SNS_CHECK_TYPE_BOTH:"CheckResult_Type_Both",SNS_CHECK_TYPE_SINGLE:"CheckResult_Type_Single"}),{FORBID_TYPE_NONE:"AdminForbid_Type_None",FORBID_TYPE_SEND_OUT:"AdminForbid_Type_SendOut"}),xa={GRP_WORK:"Private",GRP_PUBLIC:"Public",GRP_MEETING:"ChatRoom",GRP_AVCHATROOM:"AVChatRoom",GRP_COMMUNITY:"Community",GRP_ROOM:"Room",GRP_LIVE:"Live"},ga={COMMUNITY:"@TGS#_",TOPIC:"@TOPIC#_"},bg={JOINED:1,QUITTED:2,KICKED:3,ADMIN_SET:4,ADMIN_CANCELED:5,GROUP_PROFILE_UPDATED:6,GROUP_MEMBER_PROFILE_UPDATED:7,TOPIC_PROFILE_UPDATED:8},EI=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},xa),{GRP_MBR_ROLE_OWNER:"Owner",GRP_MBR_ROLE_ADMIN:"Admin",GRP_MBR_ROLE_MEMBER:"Member",GRP_MBR_ROLE_CUSTOM:"Custom"}),{GRP_TIP_MBR_JOIN:1,GRP_TIP_MBR_QUIT:2,GRP_TIP_MBR_KICKED_OUT:3,GRP_TIP_MBR_SET_ADMIN:4,GRP_TIP_MBR_CANCELED_ADMIN:5,GRP_TIP_GRP_PROFILE_UPDATED:6,GRP_TIP_MBR_PROFILE_UPDATED:7,GRP_TIP_BAN_AVCHATROOM_MEMBER:10,GRP_TIP_UNBAN_AVCHATROOM_MEMBER:11}),{JOIN_OPTIONS_FREE_ACCESS:"FreeAccess",JOIN_OPTIONS_NEED_PERMISSION:"NeedPermission",JOIN_OPTIONS_DISABLE_APPLY:"DisableApply",JOIN_STATUS_SUCCESS:"JoinedSuccess",JOIN_STATUS_ALREADY_IN_GROUP:"AlreadyInGroup",JOIN_STATUS_WAIT_APPROVAL:"WaitAdminApproval"}),{INVITE_OPTIONS_DISABLE_INVITE:"DisableInvite",INVITE_OPTIONS_NEED_PERMISSION:"NeedPermission",INVITE_OPTIONS_FREE_ACCESS:"FreeAccess"}),{GRP_PROFILE_OWNER_ID:"ownerID",GRP_PROFILE_CREATE_TIME:"createTime",GRP_PROFILE_LAST_INFO_TIME:"lastInfoTime",GRP_PROFILE_MEMBER_NUM:"memberNum",GRP_PROFILE_MAX_MEMBER_NUM:"maxMemberNum",GRP_PROFILE_JOIN_OPTION:"joinOption",GRP_PROFILE_INVITE_OPTION:"inviteOption",GRP_PROFILE_INTRODUCTION:"introduction",GRP_PROFILE_NOTIFICATION:"notification",GRP_PROFILE_MUTE_ALL_MBRS:"muteAllMembers"}),{GROUP_ID_PREFIX:ga,GROUP_TIPS_OPERATION_TYPE:bg}),Sn={IOS_OFFLINE_PUSH_NO_SOUND:"push.no_sound",IOS_OFFLINE_PUSH_DEFAULT_SOUND:"default"},Po=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},tc),lg),Gg),Tc),RE),EI),Sn),{NET_STATE_CONNECTING:"connecting",NET_STATE_DISCONNECTED:"disconnected",NET_STATE_CONNECTED:"connected"}),ma={NO_SDKAPPID:2e3,NO_TINYID:2022,NO_A2KEY:2023,USER_NOT_LOGGED_IN:2024,REPEAT_LOGIN:2025,MSG_SEND_FAIL:2100,MSG_SEND_FAIL_NOT_IN_AV:2101,MSG_SEND_GRP_WITH_TOPIC_FAIL:2115,MSG_INSTANCE_REQUIRED:2105,MSG_INVALID_CONV_TYPE:2106,MSG_REVOKE_FAIL:2110,MSG_DELETE_FAIL:2111,MSG_UNREAD_ALL_FAIL:2112,READ_RECEIPT_MSG_LIST_EMPTY:2114,CANNOT_DELETE_GRP_SYSTEM_NOTICE:2116,NOT_MY_FRIEND:2700,NETWORK_ERROR:2800,NETWORK_TIMEOUT:2801,NO_NETWORK:2805,UNCAUGHT_ERROR:2903,INVALID_OPERATION:2905,SDK_IS_NOT_READY:2999,LOGGING_IN:3e3,LOGIN_FAILED:3001,KICKED_OUT_MULT_DEVICE:3002,KICKED_OUT_MULT_ACCOUNT:3003,KICKED_OUT_USERSIG_EXPIRED:3004,LOGGED_OUT:3005,KICKED_OUT_REST_API:3006,NO_USE:3122,OPTIONS_IS_EMPTY:3153,MSG_A2KEY_EXPIRED:20002,ACCOUNT_A2KEY_EXPIRED:70001,HELLO_ANSWER_KICKED_OUT:1002,OPEN_SERVICE_OVERLOAD_ERROR:60022},dr={BASIC:"1",STANDARD:"2",PROFESSIONAL:"3",NODE:"4"},jt={SYNC_SERVER_INFO_AFTER_RE_ONLINE:"sync-server-info-after-re-online",SYNC_SERVER_INFO_AFTER_LOGIN:"sync-server-info-after-login",RECEIVE_C2C_NEW_MESSAGE:"receive-c2c-new-message",RECEIVE_GROUP_NEW_MESSAGE:"receive-group-new-message",RECEIVE_GROUP_TIPS_NOTIFICATION:"receive-group-tips-notification"},Xt={USER_STATUS_UPDATE:"user-status-update",CONVERSATION_RECOVER:"conversation-recover",HISTORY_MESSAGE_RECOVER:"history-message-recover",BLACKLIST_RECOVER:"blacklist-recover",FRIEND_RECOVER:"friend-recover",GROUP_ATTRIBUTE_CACHE_CLEAR:"group-attribute-cache-clear",UNREAD_MESSAGE_RECOVER:"unread-message-recover",HANDLE_NEW_MESSAGE:"handle-new-message",HANDLE_CONVERSATION_PROFILE_UPDATED:"handle-conversation-profile-updated",COMMERCIAL_CONFIG_UPDATE:"commercial-config-update",UNREAD_MESSAGE_SYNC:"unread-message-sync",FRIEND_AND_BLACKLIST_SYNC:"friend-and-blacklist-sync",SIGNALING_MESSAGE_RECOVER:"signaling-message-recover",GROUP_LIST_SYNC:"group-list-sync",CONVERSATION_LIST_SYNC:"conversation-list-sync",USER_PROFILE_SYNC:"user-profile-sync",CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED:"conversation-update-after-unread-sync-finished",CONVERSATION_UPDATE_AFTER_GROUP_LIST_SYNC_FINISHED:"conversation-update-after-group-list-sync-finished",HANDLE_C2C_NEW_MESSAGE:"handle-c2c-new-message",HANDLE_GROUP_NEW_MESSAGE:"handle-group-new-message",CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE:"create-or-update-conversation-by-receive-new-message",HANDLE_GROUP_TIPS_FROM_SYNC_UNREAD:"handle-group-tips-from-sync-unread",HANDLE_C2C_REVOKED_MESSAGE_FROM_SYNC_UNREAD:"handle-c2c-revoked-message-from-sync-unread",GROUP_REVOKED_NOTICE_RECOVER:"group-revoked-notice-recover",CLOUD_CONFIG_SYNC:"cloud-config-sync",UPDATE_GROUP_NEXT_SEQUENCE:"update-group-next-sequence",EMIT_C2C_MESSAGE_EVENT:"emit-c2c-message-event",EMIT_GROUP_MESSAGE_EVENT:"emit-group-message-event",CONVERSATION_GROUP_LIST_SYNC:"conversation-group-list-sync",CONVERSATION_GROUP_UPDATE:"conversation-group-update",UPDATE_TOPIC_AFTER_UNREAD_SYNC_FINISHED:"update-topic-after-unread-sync-finished",UPDATE_TOPIC_BY_RECEIVE_NEW_MESSAGE:"update-topic-by-received-new-message",TOPIC_REQUEST_INFO_RESET:"topic-request-info-reset",QUALITY_REPORT:"quality-report",GROUP_TIPS_RECOVER:"group-tips-recover",HANDLE_GROUP_TIPS_NOTIFICATION:"handle-group-tips-notification",C2C_HISTORY_MESSAGE_RECOVER:"c2c-history-message-recover",FRIEND_APPLICATION_LIST_RECOVER:"friend-application-list-recover",EMIT_GROUP_TIPS_EVENT:"emit-group-tips-event",STREAM_MESSAGE_RECOVER:"stream-message-recover"},kg={[jt.SYNC_SERVER_INFO_AFTER_RE_ONLINE]:[{stepId:Xt.USER_STATUS_UPDATE},{stepId:Xt.GROUP_ATTRIBUTE_CACHE_CLEAR},{stepId:Xt.UNREAD_MESSAGE_SYNC,dependency:Xt.C2C_HISTORY_MESSAGE_RECOVER},{stepId:Xt.CONVERSATION_RECOVER},{stepId:Xt.HISTORY_MESSAGE_RECOVER,dependency:Xt.CONVERSATION_RECOVER},{stepId:Xt.BLACKLIST_RECOVER},{stepId:Xt.FRIEND_RECOVER},{stepId:Xt.FRIEND_APPLICATION_LIST_RECOVER},{stepId:Xt.GROUP_REVOKED_NOTICE_RECOVER,dependency:Xt.HISTORY_MESSAGE_RECOVER},{stepId:Xt.GROUP_TIPS_RECOVER,dependency:Xt.HISTORY_MESSAGE_RECOVER},{stepId:Xt.TOPIC_REQUEST_INFO_RESET},{stepId:Xt.HANDLE_C2C_REVOKED_MESSAGE_FROM_SYNC_UNREAD,dependency:Xt.UNREAD_MESSAGE_SYNC},{stepId:Xt.HANDLE_GROUP_TIPS_FROM_SYNC_UNREAD,dependency:Xt.UNREAD_MESSAGE_SYNC},{stepId:Xt.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,dependency:[Xt.UNREAD_MESSAGE_SYNC,Xt.CONVERSATION_RECOVER]},{stepId:Xt.EMIT_C2C_MESSAGE_EVENT,dependency:[Xt.UNREAD_MESSAGE_SYNC,Xt.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED],skipIfDependencyMissing:!1},{stepId:Xt.C2C_HISTORY_MESSAGE_RECOVER,dependency:Xt.CONVERSATION_RECOVER},{stepId:Xt.STREAM_MESSAGE_RECOVER}],[jt.SYNC_SERVER_INFO_AFTER_LOGIN]:[{stepId:Xt.COMMERCIAL_CONFIG_UPDATE},{stepId:Xt.CLOUD_CONFIG_SYNC},{stepId:Xt.USER_PROFILE_SYNC},{stepId:Xt.UNREAD_MESSAGE_SYNC},{stepId:Xt.FRIEND_AND_BLACKLIST_SYNC},{stepId:Xt.GROUP_LIST_SYNC},{stepId:Xt.CONVERSATION_LIST_SYNC},{stepId:Xt.SIGNALING_MESSAGE_RECOVER,dependency:Xt.UNREAD_MESSAGE_SYNC},{stepId:Xt.UPDATE_TOPIC_AFTER_UNREAD_SYNC_FINISHED,dependency:[Xt.UNREAD_MESSAGE_SYNC]},{stepId:Xt.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,dependency:[Xt.UNREAD_MESSAGE_SYNC,Xt.CONVERSATION_LIST_SYNC]},{stepId:Xt.CONVERSATION_UPDATE_AFTER_GROUP_LIST_SYNC_FINISHED,dependency:[Xt.GROUP_LIST_SYNC,Xt.CONVERSATION_LIST_SYNC]},{stepId:Xt.CONVERSATION_GROUP_LIST_SYNC},{stepId:Xt.CONVERSATION_GROUP_UPDATE,dependency:[Xt.CONVERSATION_LIST_SYNC,Xt.CONVERSATION_GROUP_LIST_SYNC]},{stepId:Xt.QUALITY_REPORT}],[jt.RECEIVE_C2C_NEW_MESSAGE]:[{stepId:Xt.HANDLE_C2C_NEW_MESSAGE},{stepId:Xt.UNREAD_MESSAGE_SYNC},{stepId:Xt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,dependency:Xt.HANDLE_C2C_NEW_MESSAGE},{stepId:Xt.EMIT_C2C_MESSAGE_EVENT,dependency:[Xt.HANDLE_C2C_NEW_MESSAGE,Xt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE],skipIfDependencyMissing:!1},{stepId:Xt.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,dependency:[Xt.UNREAD_MESSAGE_SYNC]}],[jt.RECEIVE_GROUP_NEW_MESSAGE]:[{stepId:Xt.HANDLE_GROUP_NEW_MESSAGE},{stepId:Xt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,dependency:Xt.HANDLE_GROUP_NEW_MESSAGE},{stepId:Xt.UPDATE_GROUP_NEXT_SEQUENCE,dependency:Xt.HANDLE_GROUP_NEW_MESSAGE},{stepId:Xt.UPDATE_TOPIC_BY_RECEIVE_NEW_MESSAGE,dependency:Xt.HANDLE_GROUP_NEW_MESSAGE},{stepId:Xt.EMIT_GROUP_MESSAGE_EVENT,dependency:[Xt.HANDLE_GROUP_NEW_MESSAGE,Xt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE],skipIfDependencyMissing:!1}],[jt.RECEIVE_GROUP_TIPS_NOTIFICATION]:[{stepId:Xt.HANDLE_GROUP_TIPS_NOTIFICATION},{stepId:Xt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,dependency:Xt.HANDLE_GROUP_TIPS_NOTIFICATION},{stepId:Xt.EMIT_GROUP_TIPS_EVENT,dependency:[Xt.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,Xt.HANDLE_GROUP_TIPS_NOTIFICATION],skipIfDependencyMissing:!1}]},dI={MESSAGE_SEND_SUCCESS_RATE:"messageSendSuccessRate"},Cr={TOTAL_COUNT:"sendMessageTotalCount",SUCCESS_COUNT:"sendMessageSuccessCount",FAILED_COUNT:"sendMessageFailedCount",SEND_COST:"sendMessageCost"},zI=["login","getMyProfile","getUserProfile","updateMyProfile","setSelfStatus","getUserStatus","subscribeUserStatus","unsubscribeUserStatus","modifyMessage","deleteGroupMember","dismissGroup","getGroupMemberList","getGroupOnlineMemberCount","joinGroup","markGroupMemberList","quitGroup","searchCloudMessages","searchCloudGroups","searchCloudGroupMembers","searchCloudUsers","getMyFollowingList","getMyFollowersList","getMutualFollowersList","followUser","unfollowUser","getUserFollowInfo","checkFollowType","getFriendProfile","addFriend","deleteFriend","updateFriend","checkFriend","setFriendApplicationRead","createFriendGroup","deleteFriendGroup","addToFriendGroup","removeFromFriendGroup","renameFriendGroup","changeGroupOwner","createGroup","dismissGroup","getGroupList","getGroupOnlineMemberCount","getGroupProfile","searchGroupByID","updateGroupProfile","handleGroupApplication","deleteGroupAttributes","getGroupAttributes","initGroupAttributes","setGroupAttributes","addGroupMember","deleteGroupMember","getGroupMemberList","getGroupMemberProfile","setGroupMemberMuteTime","setGroupMemberNameCard","setGroupMemberRole","deleteMessage","revokeMessage","setMessageExtensions","getMessageExtensions","deleteMessageExtensions","getMessageList","addMessageReaction","removeMessageReaction","clearHistoryMessage","sendMessageReadReceipt","getMessageReadReceiptList","getGroupMessageReadMemberList","createMergerMessage","invite","accept","cancel","reject","modifyInvitation","deleteConversation","pinConversation","setMessageRead","setAllMessageRead","getConversationList","getTotalUnreadMessageCount","renameConversationGroup","deleteConversationGroup","markConversation","setConversationCustomData","deleteConversationsFromGroup","addConversationsToGroup","createConversationGroup"];var Ag=Object.freeze({__proto__:null,ERROR_CODE:ma,InnerEvent:lo,NEED_LOG_API:zI,OuterConstant:Po,OuterEvent:Rr,PUSH:Sn,QUALITY_METRICS:dI,SDK_EDITION:dr,SDK_INFO:{VERSION:"1.7.3",APPID:537048168},SEND_MESSAGE_STAT:Cr,SignalingEvent:Xc,WEB_PUSH_ACCOUNT_TYPE:1,WORKFLOW_DEFINITIONS:kg,WORKFLOW_NAME:jt,WORKFLOW_STEP:Xt}),ca,ps,Ns;(function(s){s[s.USER_INITIATED=0]="USER_INITIATED",s[s.KICKED_OUT=1]="KICKED_OUT"})(ca||(ca={})),function(s){s[s.multipleAccount=1]="multipleAccount",s[s.multipleDevice=2]="multipleDevice",s[s.restApi=3]="restApi"}(ps||(ps={})),function(s){s[s.multipleDevice=3002]="multipleDevice",s[s.multipleAccount=3003]="multipleAccount",s[s.usersigExpired=70001]="usersigExpired",s[s.restApi=20002]="restApi"}(Ns||(Ns={}));const Gu={[ps.multipleAccount]:"multipleAccount",[ps.multipleDevice]:"multipleDevice",[ps.restApi]:"REST_API_Kick",[Ns.multipleAccount]:"multipleAccount",[Ns.multipleDevice]:"multipleDevice",[Ns.restApi]:"REST_API_Kick",[Ns.usersigExpired]:"userSigExpired"},Lg="login_online_presence_task",{ERROR:Ya,DESTROY:Al,FORCE_OFFLINE:ZI}=lo,{KICKED_OUT_MULT_ACCOUNT:wE,KICKED_OUT_MULT_DEVICE:CI,KICKED_OUT_REST_API:bu,ACCOUNT_A2KEY_EXPIRED:Gl,MSG_A2KEY_EXPIRED:Nc}=ma;class ku{init(){const{notificationCenter:r}=Se;r.subscribeInnerEvent(ZI,this._handleForceOfflineFromServerPush,this),r.subscribeInnerEvent(Ya,Nc,this._handleForceOfflineFromResponse,this,this._isChatLoginEvent),r.subscribeInnerEvent(Ya,Gl,this._handleForceOfflineFromResponse,this,this._isChatLoginEvent),r.subscribeInnerEvent(Ya,wE,this._handleForceOfflineFromResponse,this),r.subscribeInnerEvent(Ya,CI,this._handleForceOfflineFromResponse,this),r.subscribeInnerEvent(Ya,bu,this._handleForceOfflineFromResponse,this),r.subscribeInnerEvent(Al,this._dispose,this)}_handleForceOfflineFromServerPush(r){var g;if(((g=Se.store.get("login"))===null||g===void 0?void 0:g.isLoggedIn)===!0){const{EventArray:u=[]}=r?.body||{};this._extractKickedOutMessages(u).forEach(E=>{const{KickoutMsgNotify:{KickType:f,NewInstInfo:D,Instid:v}}=E;this._isCurrentInstanceKickedOut(v)&&this._processKickedOutReasonInfo({kickedOutReasonCode:f,newInstanceInfo:D})})}}_extractKickedOutMessages(r){return r.reduce((g,u)=>[...g,...u.C2cNotifyMsgArray||[]],[]).filter(g=>{var u;return this._isKickedOut((u=g?.KickoutMsgNotify)===null||u===void 0?void 0:u.KickType)})}_handleForceOfflineFromResponse(r){const{errorCode:g}=r;this._processKickedOutReasonInfo({kickedOutReasonCode:g})}_processKickedOutReasonInfo(r){return mA(this,void 0,void 0,function*(){const{kickedOutReasonCode:g}=r,{ssoLog:u,utils:{safeStringify:E}}=Se;try{this._logKickedOutEvent(r),this._shouldLogoutAfterKickedOut(g)?yield Se.login.loginAction.logout(ca.KICKED_OUT):Se.login.loginAction.handleLogoutCompleted()}catch(f){u.debug("_processKickedOutReasonInfo",` fail ${E(f)}`)}finally{Se.notificationCenter.emitOuterEvent(Rr.KICKED_OUT,{data:{type:Gu[g]},name:Rr.KICKED_OUT})}})}_logKickedOutEvent(r){const{kickedOutReasonCode:g,newInstanceInfo:u={}}=r,E=`type:${Gu[g]} newInstanceInfo: ${JSON.stringify(u)}`;Se.ssoLog.warn("kickedOut",E)}_isKickedOut(r){return[ps.multipleAccount,ps.multipleDevice,ps.restApi].includes(r)}_isChatLoginEvent(r){const{requestHead:g}=r||{};return g?.idtype!==1}_shouldLogoutAfterKickedOut(r){return![Ns.usersigExpired,ps.restApi].includes(r)}_isCurrentInstanceKickedOut(r){const{isLoggedIn:g,statusInstanceId:u}=Se.store.get("login")||{};return g===!0&&r===u}_dispose(){const{notificationCenter:r}=Se;r.unSubscribeInnerEvent(ZI,this._handleForceOfflineFromServerPush,this),r.unSubscribeInnerEvent(Ya,Gl,this._handleForceOfflineFromResponse,this),r.unSubscribeInnerEvent(Ya,Nc,this._handleForceOfflineFromResponse,this),r.unSubscribeInnerEvent(Ya,wE,this._handleForceOfflineFromResponse,this),r.unSubscribeInnerEvent(Ya,CI,this._handleForceOfflineFromResponse,this),r.unSubscribeInnerEvent(Ya,bu,this._handleForceOfflineFromResponse,this),r.unSubscribeInnerEvent(Al,this._dispose,this)}}function Lu(s){return mA(this,void 0,void 0,function*(){const r="im_open_status.wslogin",g=Se.common.generateProtocolData({servcmd:r,data:{State:"Online",is_web_uniapp:0,InstType:0,CustomInfo:s}}),u=`${g.head.seq}${r}`,E=yield Se.channel.sendPacket(g,{timeout:9e4,requestId:u});if(E){const{HelloInterval:f,InstId:D,TinyId:v,TimeStamp:N,CustomStatus:P,PurchaseBits:W,A2Key:nA,RichMsgAuthKey:EA,ErrorCode:wA,ErrorInfo:kA,ActionStatus:VA}=E;return{helloInterval:f,instanceID:D,tinyID:v,timeStamp:N,customStatus:P,purchaseBits:W,a2Key:nA,authKey:EA,errorCode:wA,errorInfo:kA,actionStatus:VA}}})}function bl(){const{store:s}=Se;return Qa(s.get("instance").sdkAppId)!==Ye.CHINA}function dn(s){var r;try{const g=ro.getStorage("errorMessage");if(!s||!g)return"";const u=((r=JSON.parse(g))===null||r===void 0?void 0:r.errorMessage)||{},{code:E,replacement1:f="",replacement2:D=""}=s;if(!E)return"";const v=bl()?`${E}_en`:`${E}_cn`;let N=u[u[v]?v:E]||"";return N&&(f&&(N=N.replace("$replacement1",f)),D&&(N=N.replace("$replacement2",D))),N}catch(g){return console.warn("Error parsing stored error messages:",g),""}}class hn extends Error{constructor(r={}){r.code=r.code||r.errorCode;let{functionName:g="Unknown",code:u,message:E="",data:f="",moreMessage:D="",errorMessage:v=""}=r;v=(u?dn(r):"")||v||E;let N=u?`${g} failed. error: {"message": ${v}, "code": ${u}}`:`${g} failed. error: {"message": ${v}}`;N=`${N} ${D}`,super(),this.code=u,this.errorCode=u,this.errorMessage=v,this.message=N,this.data=f}}function dd(s,r){var g;if(s&&((g=Se.store.get("login"))===null||g===void 0?void 0:g.isLoggedIn)!==!0)throw new hn({code:ma.USER_NOT_LOGGED_IN,functionName:r})}function hI(s,r,g){if(Array.isArray(s))for(let u=0;u{return P===(W=u,Object.prototype.toString.call(W).match(/^\[object (.*)\]$/)[1].toLowerCase());var W})){for(let W=0;W{const{interceptor:E,context:f}=u;E.apply(f,[g])})}(s)}function Gc(s,r){_E.push({interceptor:s,context:r})}function el(s){const{params:r,auth:g}=s;r&&typeof r=="object"&&Object.assign(kl,r),g&&typeof g=="object"&&Object.assign(Cd,g)}function us(s){return Se.store.get("commercialConfig").get(s)}class Pn{constructor(){this._handlers=new Map,this._activeWorkflows=new Map,this._stepStartTimes=new Map,this._logHandlers={start:(r,g)=>{const u=Date.now();g?(this._stepStartTimes.set(`${r}-${g}`,u),Se.ssoLog.debug("_executeWorkflowStep",`[Workflow ${r}] Step ${g} started at ${new Date(u).toISOString()}`)):(this._workflowStartTimes.set(r,u),Se.ssoLog.debug("_executeWorkflowStep",`[Workflow ${r}] started at ${new Date(u).toISOString()}`))},success:(r,g)=>{const u=Date.now();if(g){const E=this._stepStartTimes.get(`${r}-${g}`),f=E?u-E:0;this._stepStartTimes.delete(`${r}-${g}`),Se.ssoLog.debug("_executeWorkflowStep",`[Workflow ${r}] Step ${g} completed successfully at ${new Date(u).toISOString()} (${f}ms)`)}else{const E=this._workflowStartTimes.get(r),f=E?u-E:0;this._workflowStartTimes.delete(r),Se.ssoLog.debug("_executeWorkflowStep",`[Workflow ${r}] completed successfully at ${new Date(u).toISOString()} (${f}ms)`)}},error:(r,g,u)=>{const{ssoLog:E,utils:{safeStringify:f}}=Se,D=Date.now();if(g){const v=this._stepStartTimes.get(`${r}-${g}`),N=v?D-v:0;this._stepStartTimes.delete(`${r}-${g}`),E.error("_executeWorkflowStep",`[Workflow ${r}] Step ${g} failed at ${new Date(D).toISOString()} (${N}ms) ${f(u)}`,{error:u})}else{const v=this._workflowStartTimes.get(r),N=v?D-v:0;this._workflowStartTimes.delete(r),E.error("_executeWorkflowStep",`[Workflow ${r}] failed at ${new Date(D).toISOString()} (${N}ms) ${f(u)}`,{error:u})}}}}static getInstance(){return Pn._instance||(Pn._instance=new Pn),Pn._instance}static setInstance(r){Pn._instance=r}init(){this._initializeWorkflows()}registerWorkflowStep(r,g,u,E){if(!this._handlers.has(r))return void Se.ssoLog.debug("registerWorkflowStep",`Workflow '${r}' not defined in core`);if(!kg[r].find(D=>D.stepId===g))return void Se.ssoLog.debug("registerWorkflowStep",`Step '${g}' not defined in workflow '${r}'`);const f=this._handlers.get(r);f.has(g)||f.set(g,E?u.bind(E):u)}executeWorkflow(r,g){return mA(this,void 0,void 0,function*(){if(!this._validateWorkflow(r))return;Se.ssoLog.debug("executeWorkflow",`[Workflow ${r}] Started execution at ${new Date().toISOString()}`);const u=kg[r],E={},f={cancelled:!1};this._activeWorkflows.set(r,{cancelToken:f});try{const D=new Map;u.forEach(N=>{D.set(N.stepId,N)});const v={workflowName:r,pendingSteps:new Set(u.map(N=>N.stepId)),completedSteps:new Set,runningSteps:new Set,stepMap:D,stepResults:E,data:g,cancelToken:f};yield new Promise((N,P)=>{const W=()=>{if(f.cancelled)return void N();this._getExecutableSteps({pendingSteps:v.pendingSteps,completedSteps:v.completedSteps,stepMap:v.stepMap,workflowName:r}).filter(nA=>!v.runningSteps.has(nA)).forEach(nA=>{v.completedSteps.has(nA)||v.runningSteps.has(nA)||this._executeWorkflowStep(nA,v,{onComplete:()=>{if(v.pendingSteps.size===0)return void N();this._getExecutableSteps({pendingSteps:v.pendingSteps,completedSteps:v.completedSteps,stepMap:v.stepMap,workflowName:r}).filter(EA=>!v.runningSteps.has(EA)).length===0&&v.runningSteps.size===0&&(Se.ssoLog.debug("executeWorkflow",`Workflow ${r} completed with some steps skipped due to dependency failures`),N())},onError:P,onStepComplete:W})})};W()}),Se.ssoLog.debug("executeWorkflow",`[Workflow ${r}] Completed execution at ${new Date().toISOString()}`)}catch(D){Se.ssoLog.error("executeWorkflow",`[Workflow ${r}] Failed execution at ${new Date().toISOString()}`,{error:D})}finally{this._activeWorkflows.delete(r)}})}_executeWorkflowStep(r,g,u){return mA(this,void 0,void 0,function*(){const{workflowName:E,runningSteps:f,stepMap:D,stepResults:v,data:N}=g;f.add(r),this._logWorkflowExecution(E,r,"start");try{const P=D.get(r);let W=null;P?.dependency&&(c(P.dependency)?W=v[P.dependency]:Array.isArray(P.dependency)&&(W={},P.dependency.forEach(EA=>{W[EA]=v[EA]})));const nA=this._handlers.get(E).get(r);if(nA){const EA=yield Promise.resolve(nA({data:N,result:W}));v[r]=EA,this._logWorkflowExecution(E,r,"success")}g.completedSteps.add(r)}catch(P){const W=`[Workflow].${E}.${r}`,{errorCode:nA,errorInfo:EA=`${W} failed`}=P||{},wA=new hn({functionName:W,code:nA,message:EA});Se.ssoLog.error(W,EA,{error:wA}),this._logWorkflowExecution(E,r,"error",P),u.onError(P)}finally{f.delete(r),g.pendingSteps.delete(r),u.onStepComplete(),u.onComplete()}})}reset(){this._cancelAllWorkflows()}destroy(){this.reset(),this._handlers.clear()}_initializeWorkflows(){Object.keys(kg).forEach(r=>{this._handlers.has(r)||this._handlers.set(r,new Map)})}_cancelWorkFlow(r){const g=this._activeWorkflows.get(r);if(!g)return;const{cancelToken:u}=g;u.cancelled=!0,this._activeWorkflows.delete(r)}_cancelAllWorkflows(){Object.keys(kg).forEach(r=>{this._cancelWorkFlow(r)})}_validateWorkflow(r){return kg[r]?!!this._handlers.get(r):!1}_getExecutableSteps(r){const{pendingSteps:g,completedSteps:u,stepMap:E,workflowName:f}=r;return Array.from(g).filter(D=>{const v=E.get(D)||{},{dependency:N,skipIfDependencyMissing:P=!0}=v;if(!N)return!0;if(c(N))return this._isStepRegistered({workflowName:f,stepId:N})?u.has(N):!P;if(C(N)){if(N.filter(W=>!this._isStepRegistered({workflowName:f,stepId:W})).length>0&&P)return!1;for(const W of N)if(!u.has(W))return!1;return!0}return!1})}_isStepRegistered(r){var g;const{workflowName:u,stepId:E}=r;return(g=this._handlers.get(u))===null||g===void 0?void 0:g.has(E)}_logWorkflowExecution(r,g,u,E){this._logHandlers[u](r,g)}}const fa=new Map,ea=({type:s,groupID:r})=>s===Po.GRP_COMMUNITY||`${r}`.startsWith(ga.COMMUNITY)&&!`${r}`.includes(ga.TOPIC),tl=(s="")=>{const r=s.startsWith("GROUP")?s.replace("GROUP",""):s;return r.startsWith(ga.COMMUNITY)&&`${r}`.includes(ga.TOPIC)},hd="openim",ic="million_group_open_http_svc";function Ig(s){return mA(this,void 0,void 0,function*(){const{servcmd:r,data:g}=function(f){const{data:D}=f;return TE(D)||oc(D)}(s)?function(f){let{servcmd:D,data:v}=f;return oc(v)?function(N){const{servcmd:P,data:W}=N;let{GroupId:nA=""}=W;const EA=nA;return[nA]=EA.split(ga.TOPIC),{servcmd:$s(P),data:Object.assign(Object.assign({},W),{GroupId:nA,TopicId:EA})}}(f):(TE(v)&&(D=$s(D)),{servcmd:D,data:v})}(s):s,u=Se.common.generateProtocolData({servcmd:r,data:g}),E=`${u.head.seq}${r}`;return Se.channel.sendPacket(u,{requestId:E,timeout:s.timeout})})}function TE(s){const{Type:r,GroupId:g,GroupIdList:u=[]}=s,E=g||u[0]||"";return ea({type:r,groupID:E})}function oc(s){const{GroupId:r=""}=s;return tl(r)}function $s(s){if(s.includes(hd))return s;const r=s.split(".")[1];return`${ic}.${r}`}function ar(){var s;return(s=Se.store.get("login"))===null||s===void 0?void 0:s.userId}const Va=s=>C(s)||m(s),Bd=(s,r,g,u)=>{if(!Va(s)||!Va(r))return 0;let E=0;const f=Object.keys(r);let D;for(let v=0,N=f.length;v{if(n(r))return"";if(s===Po.MSG_TEXT)return r.text||"";const g=XI[s];return g?Uu(g):""},ol=[{cmd:"ws_get_user_status",interval:5,count:20},{cmd:"ws_status_subscribe",interval:5,count:20},{cmd:"ws_status_unsubscribe",interval:5,count:20},{cmd:"get_group_self_member_info",interval:5,count:20},{cmd:"modify_group_base_info",interval:1,count:8},{cmd:"get_pendency",interval:1,count:15},{cmd:"set_group_attr",interval:5,count:10},{cmd:"modify_group_attr",interval:5,count:10},{cmd:"delete_group_attr",interval:5,count:10},{cmd:"clear_group_attr",interval:5,count:10},{cmd:"get_group_attr",interval:5,count:20},{cmd:"update_group_counter",interval:5,count:20},{cmd:"get_group_counter",interval:5,count:20},{cmd:"get_topic",interval:1,count:10},{cmd:"read_all_unread_msg",interval:1,count:1},{cmd:"query",interval:5,count:20}],$I="im_sdk_config_mgr.fetch_config",QI="im_sdk_config_mgr.push_configv2",nl="cloud-config",sl=2996,Ga=new class{init(s){this.core=s}};function Ug(s){return mA(this,void 0,void 0,function*(){const{sdkAppId:r}=Ga.core.store.get("instance")||{},g=Ga.core.helper.generateProtocolData({servcmd:$I,data:{uint32_sdkappid:r,uint64_version:s}}),u=`${g.head.seq}${$I}`;return Ga.core.channel.sendPacket(g,{requestId:u})})}var Nn=new class{constructor(){this._core=null,this._expirationTime=0,this._version=0,this._isFetching=!1,this._cmdFrequencyLimitMap=new Map,this._methodCallFrequencyMap=new Map}install(s){this._core=s;const{notificationCenter:r,InnerEvent:g,helper:u,constants:{WORKFLOW_NAME:E,WORKFLOW_STEP:f},channel:D}=s;r.subscribeInnerEvent(QI,this._handlePushedConfig,this),u.registerWorkflowStep(E.SYNC_SERVER_INFO_AFTER_LOGIN,f.CLOUD_CONFIG_SYNC,this._handleLoginSuccess,this),r.subscribeInnerEvent(g.LOGOUT,this._reset,this),r.subscribeInnerEvent(g.DESTROY,this._dispose,this),u.registerExperimentalAPI("getServerConfig",this),this._updateCmdFreqLimitMap(ol),D.registerBeforeSendInterceptor(this.checkMethodCallOverLimit,this)}getServerConfig(s){return mA(this,void 0,void 0,function*(){var r;const g={code:0,data:""};return s&&(g.data=((r=this._core.store.get("cloudConfig"))===null||r===void 0?void 0:r[s])||""),g})}checkMethodCallOverLimit(s){if(!this._cmdFrequencyLimitMap.has(s))return;if(!this._methodCallFrequencyMap.has(s))return void this._methodCallFrequencyMap.set(s,{startTime:Date.now(),methodCallCounter:1});const{count:r,interval:g}=this._cmdFrequencyLimitMap.get(s);let{startTime:u,methodCallCounter:E}=this._methodCallFrequencyMap.get(s);if(Date.now()-u>1e3*g)this._methodCallFrequencyMap.set(s,{startTime:Date.now(),methodCallCounter:1});else if(E+=1,this._methodCallFrequencyMap.set(s,{startTime:u,methodCallCounter:E}),E>r)throw new this._core.helper.ChatError({code:sl,replacement1:s})}_handlePushedConfig(s){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g}}=this._core;r.info("_handlePushedConfig",g(s)),yield this._updateCloudConfig(s)})}_handleLoginSuccess(){return mA(this,void 0,void 0,function*(){const{ssoLog:s,utils:{safeStringify:r}}=this._core;try{if(this._canFetch()){const g=yield Ug(this._version);s.info("_fetchCloudConfigIfLogin",r(g)),yield this._updateCloudConfig(g)}this._core.helper.taskScheduler.addTask({id:nl,intervalMs:1e3,callback:this._fetchCloudConfigIfReady,context:this})}catch(g){s.debug("_fetchCloudConfigIfLogin",r(g))}})}_fetchCloudConfigIfReady(){return mA(this,void 0,void 0,function*(){const{ssoLog:s,utils:{safeStringify:r}}=this._core;if(this._canFetch())try{const g=yield Ug(this._version);s.info("_fetchCloudConfigIfReady",r(g)),yield this._updateCloudConfig(g)}catch(g){s.error("_fetchCloudConfigIfReady",r(g))}})}_updateCloudConfig(s){return mA(this,void 0,void 0,function*(){const r=this._parseCloudConfig(s);r&&(this._core.store.set("cloudConfig",r),yield this._parseCmdFreqLimit(),this._core.notificationCenter.emitInnerEvent(this._core.InnerEvent.CLOUD_CONFIG_UPDATE,r),this._core.notificationCenter.emitOuterEvent(this._core.OuterEvent.SERVER_CONFIG_UPDATED,{name:this._core.OuterEvent.SERVER_CONFIG_UPDATED,data:{config:r}}))})}_canFetch(){const{isLoggedIn:s}=this._core.store.get("login")||{};return s&&!this._isFetching&&Date.now()>=this._expirationTime}_parseCloudConfig(s){const{int32_error_code:r,str_error_message:g,str_json_config:u,uint32_expired_time:E,uint32_sdkappid:f,uint64_version:D}=s;let v=null;if(r===0){if(this._version!==D)try{v=JSON.parse(u),this._version=D}catch{}this._expirationTime=Date.now()+1e3*E}else this._expirationTime=r===void 0?Date.now()+36e5:Date.now()+12e4;return v}_parseCmdFreqLimit(){return mA(this,void 0,void 0,function*(){var s;let r=(s=yield this.getServerConfig("cmd_frequency_limit"))===null||s===void 0?void 0:s.data;const{isEmpty:g}=this._core.utils;if(!g(r))try{r=JSON.parse(r),this._updateCmdFreqLimitMap(r)}catch(u){console.warn(u)}})}_updateCmdFreqLimitMap(s){s.forEach(r=>{this._cmdFrequencyLimitMap.set(r.cmd,{interval:r.interval,count:r.count})})}_reset(){this._core.helper.taskScheduler.removeTask(nl),this._core.store.clear("cloudConfig"),this._updateCmdFreqLimitMap(ol),this._methodCallFrequencyMap.clear(),this._expirationTime=0,this._version=0,this._isFetching=!1}_dispose(){const{notificationCenter:s,InnerEvent:r}=this._core;s.unSubscribeInnerEvent(QI,this._handlePushedConfig,this),s.unSubscribeInnerEvent(r.LOGOUT,this._reset,this),s.unSubscribeInnerEvent(r.DESTROY,this._dispose,this),this._reset()}};class Ar{constructor(r=0,g=0){this.high=r,this.low=g}equal(r){return r!==null&&this.low===r.low&&this.high===r.high}toString(){const r=Number(this.high).toString(16);let g=Number(this.low).toString(16);if(g.length<8){let u=8-g.length;for(;u;)g=`0${g}`,u--}return r+g}}const bc={SEARCH_GRP_SNS:new Ar(0,Math.pow(2,1)).toString(),AV_HISTORY_MSG:new Ar(0,Math.pow(2,2)).toString(),GRP_COMMUNITY:new Ar(0,Math.pow(2,3)).toString(),MSG_TO_SPECIFIED_GRP_MBR:new Ar(0,Math.pow(2,4)).toString(),AV_MBR_LIST:new Ar(0,Math.pow(2,6)).toString(),USER_STATUS:new Ar(0,Math.pow(2,7)).toString(),CONV_MARK:new Ar(0,Math.pow(2,9)).toString(),CONV_GROUP:new Ar(0,Math.pow(2,10)).toString(),AV_BAN_MBR:new Ar(0,Math.pow(2,11)).toString(),MSG_EXT:new Ar(0,Math.pow(2,13)).toString(),GRP_COUNTER:new Ar(0,Math.pow(2,15)).toString(),PLUGIN_TRANSLATE:new Ar(Math.pow(2,6)).toString(),PLUGIN_VOICE_TO_TEXT:new Ar(Math.pow(2,7)).toString(),PLUGIN_CS:new Ar(Math.pow(2,8)).toString(),PLUGIN_PUSH:new Ar(Math.pow(2,9)).toString(),PLUGIN_BOT:new Ar(Math.pow(2,10)).toString(),MSG_REACTION:new Ar(Math.pow(2,16)).toString(),FOLLOW:new Ar(Math.pow(2,20)).toString()},Au="CommercialConfig",eu="commercial-config";var NE=new class{constructor(){this._core=null,this._expirationTime=0,this._isFetching=!1,this._featureMap=new Map,this._methodKeyMap=new Map,this._purchaseBits="0"}install(s){this._core=s;const{helper:r,notificationCenter:g,constants:{WORKFLOW_NAME:u,WORKFLOW_STEP:E,InnerEvent:f}}=s;g.subscribeInnerEvent(f.COMMERCIAL_CONFIG_PUSH,this._handlePushedConfig,this),g.subscribeInnerEvent(f.LOGOUT,this._handleLogout,this),g.subscribeInnerEvent(f.DESTROY,this._dispose,this),r.registerWorkflowStep(u.SYNC_SERVER_INFO_AFTER_LOGIN,E.COMMERCIAL_CONFIG_UPDATE,this._syncCommercialConfig,this),s.helper.registerExperimentalAPI("isCommercialAbilityEnabled",this),s.helper.registerExperimentalAPI("queryCommercialAbility",this)}isCommercialAbilityEnabled(s){return mA(this,void 0,void 0,function*(){const r=parseInt(s,10).toString(2),{length:g}=r;let u,E=!0;for(let f=g-1,D=0;f>=0;f--,D++)if(r.charAt(f)==="1"&&(u=D<32?new Ar(0,2**D).toString():new Ar(2**(D-32),0).toString(),!this._featureMap.get(u))){E=!1;break}return this._core.ssoLog.debug("isFeatureEnabled",`${Au}.isFeatureEnabled decimalNumber:${s} key:${u} ret:${E}`),{code:0,data:{enabled:E}}})}queryCommercialAbility(){return this._purchaseBits}_fetchAndParseCommercialConfig(){return mA(this,void 0,void 0,function*(){var s;const{ssoLog:r,utils:{safeStringify:g},common:{buildAndSendPacket:u}}=this._core;try{this._isFetching=!0;const E=yield u({servcmd:"im_sdk_config_mgr.fetch_imsdk_purchase_bitsv2",data:{uint32_sdkappid:(s=this._core.store.get("instance"))===null||s===void 0?void 0:s.sdkAppId}});E&&(this._parseCommercialConfig(E),this._core.store.set("commercialConfig",this._methodKeyMap))}catch(E){r.error("_fetchAndParseCommercialConfig",g(E))}finally{this._isFetching=!1}})}_syncCommercialConfig(s){return mA(this,void 0,void 0,function*(){const{purchaseBits:r}=s?.data||{};r&&(this._parsePurchaseBits(r),this._core.store.set("commercialConfig",this._methodKeyMap)),this._canFetch()&&(yield this._fetchAndParseCommercialConfig()),this._core.helper.taskScheduler.addTask({id:eu,intervalMs:1e3,callback:this._fetchCommercialConfigIfReady,context:this})})}_canFetch(){var s;const r=(s=this._core.store.get("login"))===null||s===void 0?void 0:s.isLoggedIn,g=Date.now()>=this._expirationTime;return r&&!this._isFetching&&g}_handlePushedConfig(s){s?.body&&(this._parseCommercialConfig(s.body),this._core.store.set("commercialConfig",this._methodKeyMap))}_fetchCommercialConfigIfReady(){return mA(this,void 0,void 0,function*(){this._canFetch()&&(yield this._fetchAndParseCommercialConfig())})}_parseCommercialConfig(s){const{ssoLog:r}=this._core;if(typeof s!="object")return;const{int32_error_code:g,str_error_message:u,str_purchase_bits:E,uint32_expired_time:f}=s;g===0?(this._parsePurchaseBits(E),this._expirationTime=Date.now()+1e3*f):g===void 0?(r.warn("_parseCommercialConfig",`${Au}._parseCommercialConfig failed. Invalid message format:`,s),this._expirationTime=Date.now()+36e5):(r.warn("_parseCommercialConfig",`${Au}._parseCommercialConfig errorCode:${g} errorMessage:${u}`),this._expirationTime=Date.now()+12e4)}_isValidPurchaseBits(s){return s&&typeof s=="string"&&s.length>=1&&s.length<=64&&/[01]{1,64}/.test(s)}_parsePurchaseBits(s){const{ssoLog:r,utils:{safeStringify:g}}=this._core;if(this._isValidPurchaseBits(s)){this._purchaseBits=s,this._featureMap.clear(),this._methodKeyMap.clear();let u=null;for(let E=s.length-1,f=0;E>=0;E--,f++)if(u=f<32?new Ar(0,2**f).toString():new Ar(2**(f-32),0).toString(),s[E]==="1"){this._featureMap.set(u,!0);const D=this._getKeyByValue(bc,u);D&&this._methodKeyMap.set(D,!0)}else{this._featureMap.set(u,!1);const D=this._getKeyByValue(bc,u);D&&this._methodKeyMap.set(D,!1)}}else r.warn("_parsePurchaseBits",`${Au}.parsePurchaseBits invalid purchases:${g(s)}`)}_getKeyByValue(s,r){const g=Object.entries(s).find(([u,E])=>E===r);return g?g[0]:void 0}_handleLogout(){this._reset()}_dispose(){this._reset(),this._core.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.COMMERCIAL_CONFIG_PUSH,this._handlePushedConfig,this),this._core.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.LOGOUT,this._reset,this),this._core.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.DESTROY,this._dispose,this)}_reset(){this._core.helper.taskScheduler.removeTask(eu),this._core.store.set("commercialConfig",{}),this._expirationTime=0,this._isFetching=!1,this._featureMap.clear(),this._purchaseBits="0"}},lh=new class{constructor(){this._core=null,this._serverOverloadInfoMap=new Map}install(s){this._core=s;const{notificationCenter:r,InnerEvent:g,channel:u}=this._core;r.subscribeInnerEvent(g.OVERLOAD_PUSH,this._handleOverLoadPush,this),r.subscribeInnerEvent(g.LOGOUT,this._reset,this),r.subscribeInnerEvent(g.DESTROY,this._dispose,this),u.registerBeforeSendInterceptor(this.checkServerOverload,this)}checkServerOverload(s){if(!this._serverOverloadInfoMap.has(s))return;const{overloadStartTimestamp:r,delaySeconds:g}=this._serverOverloadInfoMap.get(s);if(Date.now()-r<=1e3*g)throw new this._core.helper.ChatError({functionName:s,message:"service is busy, please try again later"});this._serverOverloadInfoMap.delete(s)}_handleOverLoadPush(s){const{OverLoadServCmd:r,DelaySecs:g}=s;this._serverOverloadInfoMap.set(r,{overloadStartTimestamp:Date.now(),delaySeconds:g})}_reset(){this._serverOverloadInfoMap.clear()}_dispose(){this._reset();const{notificationCenter:s,InnerEvent:r}=this._core;s.unSubscribeInnerEvent(r.OVERLOAD_PUSH,this._handleOverLoadPush,this),s.unSubscribeInnerEvent(r.LOGOUT,this._reset,this),s.unSubscribeInnerEvent(r.DESTROY,this._dispose,this)}},dC=new class{constructor(){this.name="ConfigCenter"}install(s){Ga.init(s),Nn.install(s),NE.install(s),lh.install(s)}},Ih=new class{constructor(){this.name="ErrorMessage",this._core=null}install(s){return mA(this,void 0,void 0,function*(){if(this._core=s,this._canFetch()){const r=yield this._fetchErrorMessage();if(!r)return;const g=this._parseResponse(r);this._saveErrorMessage(g)}})}_canFetch(){const s=this._core.store.getStorage("errorMessage");return!s||this._isExpired(s)}_saveErrorMessage(s){this._core.store.setStorage("errorMessage",{errorMessage:s,errorMessageSavedTime:new Date().getTime()})}_fetchErrorMessage(){return mA(this,void 0,void 0,function*(){try{return yield this._core.helper.httpRequest({method:"GET",url:"https://web.sdk.qcloud.com/im/download/error-message/v3/0.0.6/tim-error-message.txt"})}catch(s){console.error(s)}})}_isExpired(s){if(!s)return!0;const{errorMessageSavedTime:r}=s;return r&&new Date().getTime()-r>=6048e5}_parseResponse(s){if(typeof s=="string"){const r=s.split(`;
+`),g={},u=new RegExp(/'/g);for(let E=0;E{var zA,Ee,Ie;const Li=function(Ui,Yt){const{From_Account:Oi,From_AccountHeadurl:Bn,From_AccountNick:Re,IsNeedReadReceipt:Mt,MsgBody:FA,MsgClientTime:ci,MsgRandom:xn,MsgSeq:Pi,MsgTimeStamp:Vr,SendMsgControl:ji,SupportMessageExtension:Br,To_Account:Ut,TinyId:Ft,MsgCheckResult:oE,CloudCustomData:hs,IsPeerRead:Do,MsgFlagBits:Bl,MsgVersion:GC,EventArray:Gr}=Ui;return{from:Oi,avatar:Bn,nick:Re,needReadReceipt:Mt===1,readReceiptSentByPeer:Do,clientTime:ci,messageFlagBits:Bl,random:xn,sequence:Pi,time:Vr,messageControlInfo:ji,isSupportExtension:Br,to:Ut,tinyID:Ft,checkResult:oE,cloudCustomData:hs,messageVersion:GC,eventArray:Gr,elements:Yt.message.messageHelper.parseServerPushMessageElement(FA)}}(PA,VA);if(!((Ie=(Ee=(zA=PA?.EventArray)===null||zA===void 0?void 0:zA[0])===null||Ee===void 0?void 0:Ee.hasOwnProperty)===null||Ie===void 0)&&Ie.call(Ee,"C2cNotifyMsgArray"))SA.push(...function(Ui){var Yt;const Oi=[];return(Yt=Ui.EventArray)===null||Yt===void 0||Yt.forEach(Bn=>{var Re,Mt;const{C2cNotifyMsgArray:FA}=Bn,ci=(Mt=(Re=FA?.[0])===null||Re===void 0?void 0:Re.WithdrawC2cMsgNotify)===null||Mt===void 0?void 0:Mt.C2cWithdrawInfoArray;Array.isArray(ci)&&Oi.push(...ci)}),Oi}(PA));else{const Ui=VA.message.messageFactory.createMessage(Object.assign(Object.assign({},Li),{conversationType:"C2C",flow:"in"})),{elements:Yt}=Li;Ui.setElement(Yt),LA.push(Ui)}}),{unreadMessageList:LA,revokedMessageList:SA}}(N.MsgList,r);return{syncFlag:N?.SyncFlag,unreadMessageList:EA,revokedMessageList:wA,unreadCountList:P,overflowUnreadCountList:W,cookie:N?.Cookie,groupTipList:nA}}catch(N){console.warn(N)}})}var Fg,Io;(function(s){s[s.START_SYNC=0]="START_SYNC",s[s.SYNCING=1]="SYNCING",s[s.SYNC_COMPLETE=2]="SYNC_COMPLETE"})(Fg||(Fg={})),function(s){s[s.LOGIN_SUCCESS=0]="LOGIN_SUCCESS",s[s.NEW_MESSAGE_RECEIVED=1]="NEW_MESSAGE_RECEIVED"}(Io||(Io={}));var CC=new class{constructor(){this.name="UnreadMessageSynchronizer",this._unreadDBMessageMap=new Map,this._cookie="",this._localConversationIDListBeforeDisconnect=[]}install(s){this._core=s;const{constants:r}=s;s.helper.registerWorkflowStep(r.WORKFLOW_NAME.SYNC_SERVER_INFO_AFTER_RE_ONLINE,r.WORKFLOW_STEP.UNREAD_MESSAGE_SYNC,this._syncUnreadDBMessageAfterReOnline,this),s.helper.registerWorkflowStep(r.WORKFLOW_NAME.RECEIVE_C2C_NEW_MESSAGE,r.WORKFLOW_STEP.UNREAD_MESSAGE_SYNC,this._syncUnreadDBMessageAfterNewMessageReceived,this),s.helper.registerWorkflowStep(r.WORKFLOW_NAME.SYNC_SERVER_INFO_AFTER_LOGIN,r.WORKFLOW_STEP.UNREAD_MESSAGE_SYNC,this._syncUnreadDBMessageAfterLogin,this),s.notificationCenter.subscribeInnerEvent(s.InnerEvent.SOCKET_DISCONNECTED,this._handleDisconnect,this),s.notificationCenter.subscribeInnerEvent(s.InnerEvent.LOGOUT,this._reset,this),s.notificationCenter.subscribeInnerEvent(s.InnerEvent.DESTROY,this._dispose,this)}_syncUnreadMessage(s){return mA(this,void 0,void 0,function*(){const{isAfterReOnline:r=!1,isAfterNewMessageReceived:g=!1,isAfterLogin:u=!1}=s||{};let E=Fg.START_SYNC;const f=[],D=[],v=[],N=[];for(;this._canContinueSync({cookie:this._cookie,syncFlag:E});){const P=yield this._fetchUnreadDBMessage({cookie:this._cookie,syncFlag:E,syncTriggerEvent:g?Io.NEW_MESSAGE_RECEIVED:Io.LOGIN_SUCCESS});if(!P)break;const{unreadMessageList:W=[],revokedMessageList:nA=[],overflowUnreadCountList:EA,unreadCountList:wA,groupTipList:kA}=P;if(this._cookie=P?.cookie||"",E=P?.syncFlag,this._parseAndSaveUnreadMessageList(W),v.push(...nA),this._updateConversationUnreadOptions({unreadCountList:wA,overflowUnreadCountList:EA,conversationUpdateFieldList:f}),Array.isArray(kA)&&D.push(...kA),r){const{messages:VA}=this._handleNewMessageList(W);N.push(...VA)}}return r?{conversationUpdateFieldList:f,revokedMessageList:v,unreadMessageMap:this._unreadDBMessageMap,groupTipList:D,messages:N,isUnreadC2CMessage:!0}:{conversationUpdateFieldList:f,isInstantMessage:!u,isUnreadC2CMessage:!0,revokedMessageList:v,unreadMessageMap:this._unreadDBMessageMap,groupTipList:D}})}_syncUnreadDBMessageAfterLogin(){return mA(this,void 0,void 0,function*(){return this._cookie="",this._syncUnreadMessage({isAfterLogin:!0})})}_syncUnreadDBMessageAfterNewMessageReceived(s){return mA(this,void 0,void 0,function*(){if(s.data.Flag===1)return this._syncUnreadMessage({isAfterNewMessageReceived:!0})})}_updateConversationUnreadOptions(s){const{unreadCountList:r,overflowUnreadCountList:g,conversationUpdateFieldList:u}=s,{constants:{OuterConstant:{CONV_C2C:E,CONV_SYSTEM:f}}}=this._core;r?.forEach(D=>{const{From_Account:v,UnreadCount:N}=D;if(v!==f){const P=u.find(({conversationID:W})=>W===`${E}${v}`);P?P.unreadCount=N:u.push({conversationID:`${E}${v}`,unreadCount:N,type:E})}}),g?.forEach(D=>{const{From_Account:v,LastMsgTime:N}=D;v!==f&&(u.find(({conversationID:P})=>P===`${E}${v}`)||u.push({conversationID:`${E}${v}`,type:E,lastMsgTime:N}))})}_syncUnreadDBMessageAfterReOnline(){return mA(this,void 0,void 0,function*(){return this._syncUnreadMessage({isAfterReOnline:!0})})}_updateMessageProfile(s){var r;const{messageDataHandler:g}=this._core.message||{},u=(r=this._core.store.get("login"))===null||r===void 0?void 0:r.userId,{from:E,nick:f,avatar:D,conversationID:v=""}=s;if(E!==u){const N=g.getLatestMsgSentByPeer(v);if(N){const{nick:P,avatar:W}=N;f&&D?f===P&&D===W||g.updateNickAndAvatarOfSentMessage({conversationID:v,latestNick:f,latestAvatar:D,isSentByMe:!1}):(s.nick=P,s.avatar=W)}}else{const N=g.getLatestMsgSentByMe(v);!N||f===N.nick&&D===N.avatar||g.updateNickAndAvatarOfSentMessage({conversationID:v,latestNick:f,latestAvatar:D,isSentByMe:!0})}}_handleNewMessageList(s){const{messageDataHandler:r}=this._core.message||{},g=new Map,u=[];return s.forEach(E=>{this._updateMessageProfile(E);let f=E.isModified===1;if(r.isMessageSentByCurrentInstance(E)?E.isModified=f:f=!1,E.isOnlineMessage())E._onlineOnlyFlag=!0,r.isMessageSentByCurrentInstance(E)||u.push(E);else if(this._shouldStoreUnreadMessage(E)){if(r.storeConversationMessage(E)){const{conversationID:D,conversationType:v,conversationSubType:N,flow:P,_isExcludedFromUnreadCount:W,_isExcludedFromLastMessage:nA}=E,EA=nA?"":E;g.has(D)?(g.get(D).lastMessage=EA,P==="in"&&(W||g.get(D).unreadCount++)):g.set(D,{conversationID:D,type:v,subType:N,unreadCount:W||P!=="in"?0:1,lastMessage:EA})}r.isMessageSentByCurrentInstance(E)&&!f||u.push(E)}}),{messages:u,conversationOptions:g}}_shouldStoreUnreadMessage(s){var r;const{conversationID:g}=s,{message:u,appStore:E,utils:{isEmpty:f}}=this._core||{},D=Array.from(((r=E.conversationStore.getConversationMap())===null||r===void 0?void 0:r.keys())||[]),v=this._getLocalLastMessageTime(g);return!u.messageDataHandler.isInMessageList(s)&&D.includes(g)&&this._localConversationIDListBeforeDisconnect.includes(g)&&!f(v)}_fetchUnreadDBMessage(s){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g}}=this._core;try{r.debug("_fetchUnreadDBMessage",`unread-message-synchronizer._fetchUnreadDBMessage options:${g(s)}`);const E=yield rl(s,this._core);if(!E)return null;const{syncFlag:f,unreadMessageList:D,revokedMessageList:v,cookie:N,unreadCountList:P,overflowUnreadCountList:W,groupTipList:nA}=E;return this._parseAndSaveUnreadMessageList(D),{syncFlag:f,cookie:N,unreadMessageList:D,revokedMessageList:v,unreadCountList:P,overflowUnreadCountList:W,groupTipList:nA}}catch(u){console.log(u)}})}_canContinueSync({cookie:s,syncFlag:r}){var g;return r===Fg.START_SYNC||r===Fg.SYNCING&&!(!((g=this._core)===null||g===void 0)&&g.helper.isEmpty(s))}_parseAndSaveUnreadMessageList(s){s.forEach(r=>{const{ID:g}=r;this._unreadDBMessageMap.set(g,r)})}_handleDisconnect(){var s;const{appStore:r}=this._core;this._localConversationIDListBeforeDisconnect=Array.from(((s=r.conversationStore.getConversationMap())===null||s===void 0?void 0:s.keys())||[])}_getLocalLastMessageTime(s){const{message:r}=this._core,g=r.messageDataHandler.getLocalMessageList(s),u=g[g.length-1];return u?.time}_reset(){this._cookie="",this._unreadDBMessageMap.clear()}_dispose(){var s,r;(s=this._core)===null||s===void 0||s.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.LOGOUT,this._reset,this),(r=this._core)===null||r===void 0||r.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.DESTROY,this._dispose,this),this._reset()}},GE=new class{init(s){var r;this._core=s,this._visibilityChangeHandler=this._handleVisibilityChange.bind(this),s.notificationCenter.subscribeInnerEvent(s.InnerEvent.DESTROY,this._dispose,this),document?.addEventListener("visibilitychange",this._visibilityChangeHandler),(r=this._core)===null||r===void 0||r.store.set("activityMonitor",{isActive:!0})}_handleVisibilityChange(){var s,r;const g=document?.visibilityState==="visible";(s=this._core)===null||s===void 0||s.store.set("activityMonitor",{isActive:g}),(r=this._core)===null||r===void 0||r.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:g})}_reset(){var s;(s=this._core)===null||s===void 0||s.store.clear("activityMonitor")}_dispose(){document?.removeEventListener("visibilitychange",this._visibilityChangeHandler);const{notificationCenter:s,InnerEvent:r}=this._core;s.unSubscribeInnerEvent(r.DESTROY,this._dispose,this),this._reset()}},bE=new class{init(s){var r;this._core=s,this._bindAppActivityEvent(),s.notificationCenter.subscribeInnerEvent(s.InnerEvent.DESTROY,this._dispose,this),(r=this._core)===null||r===void 0||r.store.set("activityMonitor",{isActive:!0})}_bindAppActivityEvent(){var s,r,g,u,E;const{MINI_APP_NAMESPACE:f,IN_TT_MINI_GAME:D,IN_WX_MINI_GAME:v}=((s=this._core)===null||s===void 0?void 0:s.utils)||{};D||v?((r=f?.onShow)===null||r===void 0||r.call(f,()=>{var N,P;(N=this._core)===null||N===void 0||N.store.set("activityMonitor",{isActive:!0}),(P=this._core)===null||P===void 0||P.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:!0})}),(g=f?.onHide)===null||g===void 0||g.call(f,()=>{var N,P;(N=this._core)===null||N===void 0||N.store.set("activityMonitor",{isActive:!1}),(P=this._core)===null||P===void 0||P.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:!1})})):((u=f?.onAppShow)===null||u===void 0||u.call(f,()=>{var N,P;(N=this._core)===null||N===void 0||N.store.set("activityMonitor",{isActive:!0}),(P=this._core)===null||P===void 0||P.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:!0})}),(E=f?.onAppHide)===null||E===void 0||E.call(f,()=>{var N,P;(N=this._core)===null||N===void 0||N.store.set("activityMonitor",{isActive:!1}),(P=this._core)===null||P===void 0||P.notificationCenter.emitInnerEvent("activityStatusChange",{isActive:!1})}))}_reset(){var s;(s=this._core)===null||s===void 0||s.store.clear("activityMonitor")}_dispose(){const{notificationCenter:s,InnerEvent:r}=this._core;s.unSubscribeInnerEvent(r.DESTROY,this._dispose,this),this._reset()}},Qd=new class{init(s){const{IN_MINI_APP:r,IN_WX_MINI_PLUGIN:g}=s.helper;g||(r?bE.init(s):GE.init(s))}};const kE="none",al="online";var pI=new class{init(s){this._core=s,this._activateNetworkMonitoring(),s.notificationCenter.subscribeInnerEvent(s.InnerEvent.DESTROY,this._dispose,this)}_activateNetworkMonitoring(){return mA(this,void 0,void 0,function*(){navigator.onLine?this._onOnline():this._onOffline(),this._onOnlineCallback=this._onOnline.bind(this),this._onOfflineCallback=this._onOffline.bind(this),window.addEventListener("online",this._onOnlineCallback),window.addEventListener("offline",this._onOfflineCallback)})}_deactivateNetworkMonitoring(){this._onOnlineCallback!==null&&(window.removeEventListener("online",this._onOnlineCallback),this._onOnlineCallback=null),this._onOfflineCallback!==null&&(window.removeEventListener("offline",this._onOfflineCallback),this._onOfflineCallback=null)}_onNetworkStatusChange(s){var r,g;const{isConnected:u,networkType:E}=s;(r=this._core)===null||r===void 0||r.store.set("netWorkMonitor",{isNetworkOnline:u,networkType:E}),(g=this._core)===null||g===void 0||g.notificationCenter.emitInnerEvent("networkStatusChange",{isNetworkOnline:u,networkType:E})}_onOnline(){this._onNetworkStatusChange({isConnected:!0,networkType:al})}_onOffline(){this._onNetworkStatusChange({isConnected:!1,networkType:kE})}_reset(){var s;this._deactivateNetworkMonitoring(),(s=this._core)===null||s===void 0||s.store.clear("netWorkMonitor")}_dispose(){var s,r;(s=this._core)===null||s===void 0||s.notificationCenter.unSubscribeInnerEvent((r=this._core)===null||r===void 0?void 0:r.InnerEvent.DESTROY,this._dispose,this),this._reset()}},Fu=new class{init(s){this._core=s,this._activateNetworkMonitoring(),s.notificationCenter.subscribeInnerEvent(s.InnerEvent.DESTROY,this._dispose,this)}_activateNetworkMonitoring(){return mA(this,void 0,void 0,function*(){try{const{utils:{MINI_APP_NAMESPACE:s}}=this._core;this._mpNetworkStatusCallback=this._onNetworkStatusChange.bind(this),s.onNetworkStatusChange(this._onNetworkStatusChange.bind(this))}catch(s){console.error(s)}})}_deactivateNetworkMonitoring(){if(this._mpNetworkStatusCallback!==null){const{utils:{MINI_APP_NAMESPACE:s}}=this._core;s.offNetworkStatusChange&&s.offNetworkStatusChange(this._mpNetworkStatusCallback),this._mpNetworkStatusCallback=null}}_onNetworkStatusChange(s){var r,g;const{isConnected:u,networkType:E}=s;(r=this._core)===null||r===void 0||r.store.set("netWorkMonitor",{isNetworkOnline:u,networkType:E}),(g=this._core)===null||g===void 0||g.notificationCenter.emitInnerEvent("networkStatusChange",{isNetworkOnline:u,networkType:E})}_reset(){var s;this._deactivateNetworkMonitoring(),(s=this._core)===null||s===void 0||s.store.clear("netWorkMonitor")}_dispose(){var s,r;(s=this._core)===null||s===void 0||s.notificationCenter.unSubscribeInnerEvent((r=this._core)===null||r===void 0?void 0:r.InnerEvent.DESTROY,this._dispose,this),this._reset()}},Ou=new class{init(s){const{IN_MINI_APP:r}=s.utils;r?Fu.init(s):pI.init(s)}},hC=new class{constructor(){this.name="SystemStateMonitor"}install(s){Qd.init(s),Ou.init(s)}};const Tr=new Set(["tui_room_svr.*","callkit_records_svr.*","room_engine_srv.*","room_engine_http_srv.*","room_engine_mic.*","live_engine_srv.*","live_engine_http_srv.*","live_engine_pk.*","trtc_ai_service.*","call_engine_srv.*"]),ug="tui_room_svr.*";var kc=new class{constructor(){this.name="BusinessCommandTransfer",this._transferredCommands=Tr}install(s){this._core=s;const{notificationCenter:r,InnerEvent:g,helper:u}=s;r.subscribeInnerEvent(g.CLOUD_CONFIG_UPDATE,this._onCloudConfigUpdate,this),r.subscribeInnerEvent(g.LOGOUT,this._reset,this),r.subscribeInnerEvent(g.DESTROY,this._dispose,this),r.subscribeInnerEvent("im_open_push.msg_push",r.InnerEventSubType.BUSINESS_COMMAND,this._onServerPushBusinessCommand,this),u.registerExperimentalAPI("sendTRTCCustomData",this,"transferBusinessCommand"),u.registerExperimentalAPI("sendRoomCustomData",this,"transferBusinessCommand")}transferBusinessCommand(s){return mA(this,void 0,void 0,function*(){const r="transferBusinessCommand";try{const{serviceCommand:g=ug}=s||{};if(!this._isValidTransferredCommand(g))throw new this._core.helper.ChatError({code:2995,functionName:r});return{code:0,data:(yield function(E,f){return mA(this,void 0,void 0,function*(){const{helper:D,channel:v}=f,{serviceCommand:N=ug,data:P}=E||{};let W={};try{W=typeof P=="string"?JSON.parse(P):P}catch(wA){console.warn(wA)}const nA=D.generateProtocolData({servcmd:N,data:W}),EA=`${nA.head.seq}${N}`;return v.sendPacket(nA,{requestId:EA,shouldRejectOnError:!1})})}(s,this._core))||{}}}catch(g){throw console.warn(g),new this._core.helper.ChatError({code:g?.errorCode,message:g?.errorInfo,data:{},functionName:r})}})}_onCloudConfigUpdate(s={}){try{if(typeof s.rtc_cmd!="string")return;const r=JSON.parse(s.rtc_cmd);Array.isArray(r)&&(this._transferredCommands=new Set([...this._transferredCommands,...r]))}catch(r){console.log(r)}}_isValidTransferredCommand(s=""){const r=`${s?.split(".")[0]}.*`;return this._transferredCommands.has(r)}_onServerPushBusinessCommand(s){const{OuterEvent:r,notificationCenter:g}=this._core,{MsgContent:u}=s||{},{ROOM_CUSTOM_DATA_RECEIVED:E}=r;g.emitOuterEvent(E,{name:E,data:u})}_reset(){this._transferredCommands=Tr}_dispose(){const{notificationCenter:s,InnerEvent:r}=this._core;this._reset(),s.unSubscribeInnerEvent(r.CLOUD_CONFIG_UPDATE,this._onCloudConfigUpdate,this),s.unSubscribeInnerEvent(r.LOGOUT,this._reset,this),s.unSubscribeInnerEvent(r.DESTROY,this._dispose,this),s.unSubscribeInnerEvent("im_open_push.msg_push",s.InnerEventSubType.BUSINESS_COMMAND,this._onServerPushBusinessCommand,this)}};const Pu=1,Ll=2,pd=3,ta=4,mI=5,Us="TIMCustomElem",BC="C2C",gl="GROUP",md="invite",fI="accept",Ha="cancel",QC="reject",Ja="modifyInvitation",fr="signaling",fd=8010,xu="signaling-timeout";function yr(s){return s.filter(r=>{if(r.type===Us){const{cloudCustomData:g="",payload:{data:u=""}={}}=r,E=g.match(/"type":"tsignaling"/),f=u.match(/inviteID/),D=u.match(/actionType/);return E||f&&D}return!1})}function Lc(s){const{data:r}=s.payload;try{return JSON.parse(r)}catch(g){return console.error(g),null}}function cl(s,r){return s.toString(16).padStart(r,"0")}function Og(s){if(s<0||s>53)throw new Error("Number of digits must be between 0 and 53");if(s<=30)return Math.floor(Math.random()*(1<0;const v=this._core.common.getCurrentUserID();return D.includes(v)}return!0}updateSignaling(s){const r=`${fr}.updateSignaling`,{inviteID:g,inviter:u,inviteeList:E,groupID:f}=s;if(console.log(`${r} inviteID:${g} inviter:${u} groupID:${f}`),f&&this.hasSignaling(g)){const D=E[0],{inviteeList:v}=this._onlineSignalingMap.get(g);v.includes(D)&&(v.splice(v.indexOf(D),1),console.log(`${r} remove ${D}. localInviteeList.length:${v.length}`)),v.length===0&&this.removeSignaling(g)}else this.removeSignaling(g)}setSignalingListenStatus(s){this._isSignalingListening=s}getSignalingListenStatus(){return this._isSignalingListening}_dispose(){var s,r;this._reset(),(s=this._core)===null||s===void 0||s.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.DESTROY,this._dispose,this),(r=this._core)===null||r===void 0||r.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.LOGOUT,this._reset,this),this._isSignalingListening=!1}_reset(){this._onlineSignalingMap.clear()}},nc=new class{init(s){this._core=s}createInviteSignaling(s){const r=this._generateInviteID(),g=this._createInviteSignalingData(Object.assign(Object.assign({},s),{inviteID:r})),{groupID:u,inviteeList:E}=g,f=u||E[0];return{signaling:this._createSignaling(g,f),signalingData:g,signalingExtensionOptions:this._createSignalingExtensionOptions(s)}}createAcceptSignaling(s){const r=this._createAcceptSignalingData(s),{groupID:g,inviter:u}=r,E=g||u;return{signaling:this._createSignaling(r,E),signalingData:r,signalingExtensionOptions:this._createSignalingExtensionOptions(s)}}createCancelSignaling(s){const r=this._createCancelSignalingData(s),{groupID:g,inviteeList:u}=r,E=g||u[0];return{signaling:this._createSignaling(r,E),signalingData:r,signalingExtensionOptions:this._createSignalingExtensionOptions(s)}}createRejectSignaling(s){const r=this._createRejectSignalingData(s),{groupID:g,inviter:u}=r,E=g||u;return{signaling:this._createSignaling(r,E),signalingData:r,signalingExtensionOptions:this._createSignalingExtensionOptions(s)}}createTimeoutSignaling(s){const{isInviter:r=!1}=s,g=this._createTimeoutSignalingData(s),{groupID:u,inviteeList:E,inviter:f}=g,D=u||(r?E[0]:f);return{signaling:this._createSignaling(g,D),signalingData:g,signalingExtensionOptions:this._createSignalingExtensionOptions(g)}}_createSignalingExtensionOptions(s){var r,g;const{data:u="",onlineUserOnly:E,inviteID:f="",offlinePushInfo:D,actionType:v}=s,N=((g=(r=Jo.getSignaling(f))===null||r===void 0?void 0:r.signaling)===null||g===void 0?void 0:g._onlineOnlyFlag)||!1;return{onlineUserOnly:E||N,offlinePushInfo:D,messageControlInfo:this._createMessageControlInfo(u,v)}}_createMessageControlInfo(s,r){const g=r===mI&&!!s.match(/excludeTimeoutSignalingFromHistoryMessage/),u=!!s.match(/excludeFromHistoryMessage/)||!!s.match(/excludeOriginalSignalingFromHistoryMessage/);return{excludedFromContentModeration:!0,excludedFromUnreadCount:g||u,excludedFromLastMessage:g||u}}_createInviteSignalingData(s){const r=`${fr}._createInviteSignalingData`,{userID:g,timeout:u=0,groupID:E="",inviteeList:f=[]}=s,D=this._core.common.getCurrentUserID(),v=Object.assign(Object.assign({},this._generateBaseSignalData(s)),{actionType:Pu,inviter:D,inviteeList:E?f:[g],timeout:u});return console.log(`${r} signalingData:`,v),v}_createAcceptSignalingData(s){const r=`${fr}._createAcceptSignalingData`,{inviteID:g}=s,u=this._core.common.getCurrentUserID(),{inviter:E,groupID:f}=Jo.getSignaling(g),D=Object.assign(Object.assign({},this._generateBaseSignalData(s)),{actionType:pd,groupID:f,inviter:E,inviteeList:[u]});return console.log(`${r} signalingData:`,D),D}_createCancelSignalingData(s){const r=`${fr}._createCancelSignalingData`,{inviteID:g}=s,u=this._core.common.getCurrentUserID(),{inviteeList:E,groupID:f}=Jo.getSignaling(g),D=Object.assign(Object.assign({},this._generateBaseSignalData(s)),{actionType:Ll,groupID:f,inviter:u,inviteeList:E});return console.log(`${r} signalingData:`,D),D}_createRejectSignalingData(s){const r=`${fr}._createRejectSignalingData`,{inviteID:g}=s,u=this._core.common.getCurrentUserID(),{inviter:E,groupID:f}=Jo.getSignaling(g),D=Object.assign(Object.assign({},this._generateBaseSignalData(s)),{actionType:ta,groupID:f,inviter:E,inviteeList:[u]});return console.log(`${r} signalingData:`,D),D}_createTimeoutSignalingData(s){const r=`${fr}._createTimeoutSignalingData`,{isInviter:g=!1,inviteID:u}=s,{inviteeList:E,inviter:f}=Jo.getSignaling(u),D=this._core.common.getCurrentUserID(),v=Object.assign(Object.assign({},this._generateBaseSignalData(s)),{actionType:mI,inviter:f,inviteeList:g?E:[D]});return console.log(`${r} signalingData:`,v),v}_createSignaling(s,r){var g,u,E;const{groupID:f=""}=s,D={to:r,conversationType:f?gl:BC,priority:"High",payload:{data:JSON.stringify(s)}};return(E=(u=(g=this._core)===null||g===void 0?void 0:g.message)===null||u===void 0?void 0:u.messageFactory)===null||E===void 0?void 0:E.createCustomMessage(D)}_generateInviteID(){return[cl(Og(32),8),cl(Og(16),4),cl(16384|Og(12),4),cl(32768|Og(14),4),cl(Og(48),12)].join("-")}_generateBaseSignalData(s){const{data:r="",inviteID:g="",groupID:u=""}=s;return{businessID:1,timeout:0,data:r,inviteID:g,groupID:u}}},eg=new class{constructor(){this._isProcessingSignaling=!1}init(s){this._core=s,s.helper.registerApi({apiName:"invite",context:this}),s.helper.registerApi({apiName:"accept",context:this}),s.helper.registerApi({apiName:"cancel",context:this}),s.helper.registerApi({apiName:"reject",context:this}),s.helper.registerApi({apiName:"modifyInvitation",context:this}),s.helper.registerApi({apiName:"getSignalingInfo",context:this}),s.helper.registerApi({apiName:"addSignalingListener",context:this}),s.helper.registerApi({apiName:"removeSignalingListener",context:this}),s.notificationCenter.subscribeInnerEvent(s.InnerEvent.DESTROY,this._dispose,this),s.notificationCenter.subscribeInnerEvent(s.InnerEvent.LOGOUT,this._reset,this)}invite(s){return mA(this,void 0,void 0,function*(){var r;try{this._validateBeforeInvite(s);const{signaling:g,signalingData:u,signalingExtensionOptions:E}=nc.createInviteSignaling(s),f=yield this._sendSignaling(g,E);if(f?.code===0){const{inviteID:D,timeout:v}=u;return Jo.saveSignaling(D,Object.assign(Object.assign({},u),{signaling:g})),v>0&&((r=this._core)===null||r===void 0||r.helper.taskScheduler.addOnceTask({id:`${xu}-${D}`,intervalMs:1e3*(v+5),callback:this.handleInvitationExpiryTimer.bind(this,D)})),Object.assign(Object.assign({},f),{inviteID:D})}return f}catch(g){throw g}})}accept(s){return mA(this,void 0,void 0,function*(){try{const{inviteID:r}=s;this._validateBeforeAccept(r),this._isProcessingSignaling=!0;const{signaling:g,signalingData:u,signalingExtensionOptions:E}=nc.createAcceptSignaling(s),f=yield this._sendSignaling(g,E);return f?.code===0?(Jo.updateSignaling(u),Object.assign(Object.assign({},f),{inviteID:r})):f}catch(r){throw r}finally{this._isProcessingSignaling=!1}})}cancel(s){return mA(this,void 0,void 0,function*(){try{const{inviteID:r}=s;this._validateBeforeCancel(r),this._isProcessingSignaling=!0;const{signaling:g,signalingExtensionOptions:u}=nc.createCancelSignaling(s),E=yield this._sendSignaling(g,u);return E?.code===0?(Jo.removeSignaling(r),Object.assign(Object.assign({},E),{inviteID:r})):E}catch(r){throw r}finally{this._isProcessingSignaling=!1}})}reject(s){return mA(this,void 0,void 0,function*(){try{const{inviteID:r}=s;this._validateBeforeReject(r),this._isProcessingSignaling=!0;const{signaling:g,signalingExtensionOptions:u}=nc.createRejectSignaling(s),E=yield this._sendSignaling(g,u);return E?.code===0?(Jo.removeSignaling(r),Object.assign(Object.assign({},E),{inviteID:r})):E}catch(r){throw r}finally{this._isProcessingSignaling=!1}})}modifyInvitation(s){return mA(this,void 0,void 0,function*(){var r,g;const{inviteID:u,data:E}=s;let f="";try{this._validateBeforeModifyInvitation(u);const D=Jo.getSignaling(u),{signaling:v}=D,N=vo(D,["signaling"]);f=v.payload.data,N.data=E,v.payload.data=JSON.stringify(N);const P=yield(g=(r=this._core)===null||r===void 0?void 0:r.message.messageAction)===null||g===void 0?void 0:g.modifyMessage(v);return Jo.hasSignaling(u)&&Jo.saveSignaling(u,Object.assign(Object.assign({},N),{signaling:v})),P}catch(D){if(f){const{signaling:v}=Jo.getSignaling(u);v.payload.data=f}throw D}})}getSignalingInfo(s){const{ssoLog:r,utils:{safeStringify:g}}=this._core;if(yr([s]).length===0)return;const u=Lc(s),E={businessID:u.businessID||1,inviteID:u.inviteID,groupID:u.groupID||"",inviter:u.inviter||"",inviteeList:u.inviteeList||[],data:u.data||"",actionType:u.actionType||Pu,timeout:u.timeout||0};return r.debug(`${fr} getSignalingInfo ${g(E)}`),E}addSignalingListener(s,r,g){var u,E;s===((u=this._core)===null||u===void 0?void 0:u.SignalingEvent.NEW_INVITATION_RECEIVED)&&Jo.setSignalingListenStatus(!0),(E=this._core)===null||E===void 0||E.notificationCenter.subscribeOuterEvent(s,r,g)}removeSignalingListener(s,r,g){var u,E;s===((u=this._core)===null||u===void 0?void 0:u.SignalingEvent.NEW_INVITATION_RECEIVED)&&Jo.setSignalingListenStatus(!1),(E=this._core)===null||E===void 0||E.notificationCenter.unSubscribeOuterEvent(s,r,g)}handleInvitationExpiryTimer(s){const r=Jo.getOnlineSignalingMap(),g=this._core.common.getCurrentUserID();if(!r.has(s))return;const u=r.get(s).inviter===g;this._sendTimeoutNotice({inviteID:s,isInviter:u})}_sendSignaling(s,r){return mA(this,void 0,void 0,function*(){var g,u,E;return(E=(u=(g=this._core)===null||g===void 0?void 0:g.message)===null||u===void 0?void 0:u.messageSender)===null||E===void 0?void 0:E.sendMessage(s,r)})}_sendTimeoutNotice(s){return mA(this,void 0,void 0,function*(){var r,g,u;this._core.ssoLog.debug("_sendTimeoutNotice",`${fr}._sendTimeoutNotice params:${JSON.stringify(s)}`);const{isInviter:E,inviteID:f}=s,{signaling:D,signalingData:v,signalingExtensionOptions:N}=nc.createTimeoutSignaling(s),P=yield this._sendSignaling(D,N);if(P?.code===0){const{data:W,groupID:nA,inviteeList:EA,inviter:wA}=v;(r=this._core)===null||r===void 0||r.notificationCenter.emitOuterEvent((g=this._core)===null||g===void 0?void 0:g.SignalingEvent.INVITATION_TIMEOUT,{name:(u=this._core)===null||u===void 0?void 0:u.SignalingEvent.INVITATION_TIMEOUT,data:{data:W,groupID:nA,inviteID:f,inviteeList:EA,inviter:wA,isSelfTimeout:!0,message:D}}),E?Jo.removeSignaling(f):Jo.updateSignaling(v)}})}_validateInviteId(s,r){if(!Jo.hasSignaling(r))throw new this._core.helper.ChatError({functionName:s,code:fd})}_validateProcessStatus(s){if(this._isProcessingSignaling)throw new this._core.helper.ChatError({functionName:s,message:"processing other signaling operations"})}_validateBeforeInvite(s){const r=md,{userID:g}=s,u=this._core.common.getCurrentUserID();if(g===u)throw new this._core.helper.ChatError({functionName:r,message:`cannot invite yourself, currentUserId:${u}, inviteeId:${g}`})}_validateBeforeAccept(s){const r=fI;this._validateInviteId(r,s),this._validateProcessStatus(r);const g=this._core.common.getCurrentUserID(),{inviteeList:u}=Jo.getSignaling(s);if(!u.includes(g)){const E=`userID:${g} not in inviteeList. inviteID:${s}`;throw new this._core.helper.ChatError({functionName:r,message:E})}}_validateBeforeCancel(s){const r=Ha;this._validateInviteId(r,s),this._validateProcessStatus(r);const g=this._core.common.getCurrentUserID(),{inviter:u}=Jo.getSignaling(s);if(u!==g){const E=`unmatched inviter:${u} and my userID:${g}`;throw new this._core.helper.ChatError({functionName:r,message:E})}}_validateBeforeReject(s){const r=QC;this._validateInviteId(r,s),this._validateProcessStatus(r);const g=this._core.common.getCurrentUserID(),{inviteeList:u}=Jo.getSignaling(s);if(!u.includes(g)){const E=`userID:${g} not in inviteeList. inviteID:${s}`;throw new this._core.helper.ChatError({functionName:r,message:E})}}_validateBeforeModifyInvitation(s){const r=Ja;this._validateInviteId(r,s)}_dispose(){var s,r;this._reset(),(s=this._core)===null||s===void 0||s.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.DESTROY,this._dispose,this),(r=this._core)===null||r===void 0||r.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.LOGOUT,this._reset,this)}_reset(){this._isProcessingSignaling=!1}},Ul=new class{constructor(){this._actionProcessor=new Map([[Pu,this._onNewInvitationReceived.bind(this)],[ta,this._onInviteeRejected.bind(this)],[pd,this._onInviteeAccepted.bind(this)],[Ll,this._onInvitationCancelled.bind(this)],[mI,this._onInvitationTimeout.bind(this)]])}init(s){this._core=s,s.notificationCenter.subscribeOuterEvent(s.OuterEvent.MESSAGE_RECEIVED,this._handleMessageReceived,this),s.notificationCenter.subscribeOuterEvent(s.OuterEvent.MESSAGE_MODIFIED,this._handleMessageModified,this),s.notificationCenter.subscribeInnerEvent(s.InnerEvent.DESTROY,this._dispose,this)}handleActionSignaling(s){s.forEach(r=>{const g=Lc(r);if(g){const u=this._actionProcessor.get(g.actionType);u?.(g,r)}})}_handleMessageReceived(s){if(!Jo.getSignalingListenStatus())return;const r=yr(s.data);r.length!==0&&this.handleActionSignaling(r)}_handleMessageModified(s){if(!Jo.getSignalingListenStatus())return;const r=yr(s.data);r.length>0&&r.forEach(g=>{const u=Lc(g);u&&this._onInvitationModified(u,g)})}_onNewInvitationReceived(s,r){var g,u;const E=`${fr}._onNewInvitationReceived`,{inviteID:f,inviteeList:D,groupID:v}=s,N=this._core.common.getCurrentUserID();if(this._core.ssoLog.debug("_onNewInvitationReceived",`${E} signalingData:${JSON.stringify(s)}}`),v&&!D.includes(N))return;let{timeout:P}=s;const W=Date.now()/1e3-r.time;P>0&&W>0&&P>W&&(P-=W);const nA=Jo.getSignaling(f);nA!==s&&(nA||Jo.saveSignaling(f,Object.assign(Object.assign({},s),{signaling:r})),P>0&&((g=this._core)===null||g===void 0||g.helper.taskScheduler.addOnceTask({id:`${xu}-${f}`,intervalMs:1e3*P,callback:eg.handleInvitationExpiryTimer.bind(eg,f)})),this._emitEvent({name:(u=this._core)===null||u===void 0?void 0:u.SignalingEvent.NEW_INVITATION_RECEIVED,data:Object.assign(Object.assign({},this._generateBaseEmitData(s)),{inviteeList:D})}))}_onInviteeRejected(s){var r;const g=`${fr}._onInviteeRejected`,{inviteID:u,inviter:E,groupID:f,inviteeList:D}=s,v=Jo.hasSignaling(u);this._core.ssoLog.debug("_onInviteeRejected",`${g} inviteID:${u} hasInviteID:${v} inviter:${E} groupID:${f}`),v&&(Jo.updateSignaling(s),this._emitEvent({name:(r=this._core)===null||r===void 0?void 0:r.SignalingEvent.INVITEE_REJECTED,data:Object.assign(Object.assign({},this._generateBaseEmitData(s)),{invitee:D[0]})}))}_onInviteeAccepted(s){var r;const g=`${fr}._onInviteeAccepted`,{inviteID:u,inviter:E,groupID:f,inviteeList:D}=s,v=Jo.hasSignaling(u);this._core.ssoLog.debug("_onInviteeAccepted",`${g} inviteID:${u} hasInviteID:${v} inviter:${E} groupID:${f}`),v&&(Jo.updateSignaling(s),this._emitEvent({name:(r=this._core)===null||r===void 0?void 0:r.SignalingEvent.INVITEE_ACCEPTED,data:Object.assign(Object.assign({},this._generateBaseEmitData(s)),{invitee:D[0]})}))}_onInvitationCancelled(s){var r;const g=`${fr}._onInvitationCancelled`,{inviteID:u,inviter:E,groupID:f}=s,D=Jo.hasSignaling(u);this._core.ssoLog.debug("_onInvitationCancelled",`${g} inviteID:${u} hasInviteID:${D} inviter:${E} groupID:${f}`),D&&(Jo.removeSignaling(u),this._emitEvent({name:(r=this._core)===null||r===void 0?void 0:r.SignalingEvent.INVITATION_CANCELLED,data:this._generateBaseEmitData(s)}))}_onInvitationTimeout(s){var r;const g=`${fr}._onInvitationTimeout`,{inviteID:u,inviteeList:E}=s,f=Jo.hasSignaling(u);this._core.ssoLog.debug("_onInvitationTimeout",`${g} inviteID:${u} hasInviteID:${f} data:${s.data}`),f&&(Jo.updateSignaling(s),this._emitEvent({name:(r=this._core)===null||r===void 0?void 0:r.SignalingEvent.INVITATION_TIMEOUT,data:Object.assign(Object.assign({},this._generateBaseEmitData(s)),{inviteeList:E,isSelfTimeout:!1})}))}_onInvitationModified(s,r){var g;const u=`${fr}._onInvitationModified`,{inviteID:E,data:f}=s,D=Jo.hasSignaling(E);this._core.ssoLog.debug("_onInvitationModified",`${u} inviteID:${E} data:${f}`),D&&(Jo.saveSignaling(E,Object.assign(Object.assign({},s),{signaling:r})),this._emitEvent({name:(g=this._core)===null||g===void 0?void 0:g.SignalingEvent.INVITATION_MODIFIED,data:{inviteID:E,data:f}}))}_emitEvent(s){var r;(r=this._core)===null||r===void 0||r.notificationCenter.emitOuterEvent(s.name,s)}_generateBaseEmitData(s){const{inviteID:r,inviter:g,groupID:u,data:E}=s;return{inviteID:r,inviter:g,groupID:u,data:E||""}}_dispose(){var s,r,g;(s=this._core)===null||s===void 0||s.notificationCenter.unSubscribeOuterEvent(this._core.OuterEvent.MESSAGE_RECEIVED,this._handleMessageReceived,this),(r=this._core)===null||r===void 0||r.notificationCenter.unSubscribeOuterEvent(this._core.OuterEvent.MESSAGE_MODIFIED,this._handleMessageModified,this),(g=this._core)===null||g===void 0||g.notificationCenter.unSubscribeOuterEvent(this._core.InnerEvent.DESTROY,this._dispose,this)}},ia=new class{constructor(){this._offlineSignalingMap=new Map}init(s){this._core=s;const{notificationCenter:r,helper:g,constants:{InnerEvent:u,WORKFLOW_STEP:E,WORKFLOW_NAME:f}}=s;r.subscribeInnerEvent(u.DESTROY,this._dispose,this),r.subscribeInnerEvent(u.LOGOUT,this._reset,this),g.registerWorkflowStep(f.SYNC_SERVER_INFO_AFTER_LOGIN,E.SIGNALING_MESSAGE_RECOVER,this._handleC2COfflineMessage,this)}_handleC2COfflineMessage(s){const{result:{unreadMessageMap:r}={}}=s||{};if(!(r?.size!==0&&Jo.getSignalingListenStatus()))return;const g=yr([...r.values()]);if(g.length!==0&&(g.forEach(u=>{this._handleC2CActionType(u)}),this._offlineSignalingMap.size>0)){const u=this._sortOfflineSignalingByTime();Ul.handleActionSignaling(u)}}_handleC2CActionType(s){const r=Lc(s);if(!r)return;const{actionType:g}=r;g===Pu?this._saveValidOfflineInvite(r,s):this._removeOfflineInvite(r)}_saveValidOfflineInvite(s,r){const{inviteID:g,inviteeList:u=[],timeout:E=0}=s,f=this._core.common.getCurrentUserID();if(!u.includes(f))return;const D=Date.now()/1e3-r.time;E>0&&D>E&&E!==0||this._offlineSignalingMap.set(g,Object.assign(Object.assign({},s),{signalingList:[r]}))}_removeOfflineInvite(s){const{inviteID:r=""}=s;this._offlineSignalingMap.has(r)&&this._offlineSignalingMap.delete(r)}_sortOfflineSignalingByTime(){let s=[];return this._offlineSignalingMap.forEach(r=>{s=[...s,...r.signalingList]}),s.sort((r,g)=>r.time-g.time)}_dispose(){var s,r;this._reset(),(s=this._core)===null||s===void 0||s.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.LOGOUT,this._reset,this),(r=this._core)===null||r===void 0||r.notificationCenter.unSubscribeInnerEvent(this._core.InnerEvent.DESTROY,this._dispose,this)}_reset(){this._offlineSignalingMap.clear()}};const uh={invite:{userID:{required:!0,rules:["string"],allowEmpty:!1},data:{required:!1,rules:["string"],allowEmpty:!0},timeout:{required:!1,rules:["number"],allowEmpty:!1},onlineUserOnly:{required:!1,rules:["boolean"],allowEmpty:!1},offlinePushInfo:{required:!1,rules:["object"],allowEmpty:!1}},cancel:{inviteID:{required:!0,rules:["string"],allowEmpty:!1},data:{required:!1,rules:["string"],allowEmpty:!0}},accept:{inviteID:{required:!0,rules:["string"],allowEmpty:!1},data:{required:!1,rules:["string"],allowEmpty:!0}},reject:{inviteID:{required:!0,rules:["string"],allowEmpty:!1},data:{required:!1,rules:["string"],allowEmpty:!0}},modifyInvitation:{inviteID:{required:!0,rules:["string"],allowEmpty:!1},data:{required:!1,rules:["string"],allowEmpty:!0}}},ss={invite:!0,cancel:!0,accept:!0,reject:!0,modifyInvitation:!0};var tu=new class{constructor(){this.name="Signaling"}install(s){eg.init(s),Ul.init(s),nc.init(s),Jo.init(s),ia.init(s),s.helper.registerValidateConfig({auth:ss,params:uh})}};const Wn=new class{init(s){this.core=s}};function Uc(s){let r;const{message:g}=Wn.core,{conversationID:u,messageID:E}=s;return r=g.messageDataHandler.getLocalMessageList(u).find(f=>f.ID===E),!r&&(r=g.messageDataHandler.getSparseMessageList(u).find(f=>f.ID===E)),r}function sc(s){return s.map(r=>{const{from:g,to:u,cloudCustomData:E,avatar:f,nick:D,ID:v,clientSequence:N,clientTime:P,messageRandom:W,messageSequence:nA,time:EA}=r;return{ClientSeq:N,CloudCustomData:E,From_Account:g,From_AccountHeadurl:f,From_AccountNick:D,Id:v,MsgBody:JSON.parse(JSON.stringify(r.transformElementsToServerFormat())),MsgClientTime:P,MsgRandom:W,Random:W,MsgSeq:nA,MsgTimeStamp:EA,ReceiverId:u,SenderId:g,To_Account:u}})}function Dr(s){var r;const{From_Account:g,From_AccountHeadurl:u,From_AccountNick:E,GroupId:f,MsgClientTime:D,ClientSeq:v,To_Account:N,MsgTimeStamp:P,TinyId:W,MsgRandom:nA,MsgSeq:EA}=s;return{from:g,avatar:u,nick:E,clientTime:D,time:P,tinyID:W,random:nA,sequence:EA,to:N,groupID:f,clientSequence:v,_elements:(r=s.MsgBody)===null||r===void 0?void 0:r.map(wA=>{const{MsgType:kA}=wA;return Wn.core.message.messageFactory.getElementClass(kA).parseServerPushElement(wA)})}}var Kr,tg;(function(s){s.MSG_TEXT="TIMTextElem",s.MSG_CUSTOM="TIMCustomElem",s.MSG_LOCATION="TIMLocationElem",s.MSG_FACE="TIMFaceElem",s.MSG_STREAM="TIMStreamElem"})(Kr||(Kr={})),function(s){s[s.FORWARD=0]="FORWARD",s[s.BACKWARD=1]="BACKWARD"}(tg||(tg={}));const LE="MSG_REACTION",pC="MSG_EXT",Eh=0,uo=1,Fc={ZH_CN:"zh (cmn-Hans-CN)",EN_US:"en-US",YUE_HK:"yue-Hant-HK",JA_JP:"ja-JP",ZH_PY:"zh-PY"},Fl="16k_zh",mC="16k_en",fC="16k_yue",Ol="16k_ja",iu="16k_zh-PY",yI={[Fc.ZH_CN]:Fl,[Fc.EN_US]:mC,[Fc.YUE_HK]:fC,[Fc.JA_JP]:Ol,[Fc.ZH_PY]:iu},DI=/\.(wav|pcm|ogg-opus|speex|silk|mp3|m4a|aac|amr)/,UE={READ:0,UNREAD:1},Pl=1,xl=2,Pg=3;var rc;(function(s){s.IN="in",s.OUT="out"})(rc||(rc={}));const yd=16,FE=17;var Oc;(function(s){s[s.DATA=0]="DATA",s[s.REVOKED=1]="REVOKED"})(Oc||(Oc={}));var ou;(function(s){s[s.NORMAL=0]="NORMAL",s[s.TIMEOUT=1]="TIMEOUT"})(ou||(ou={}));const ho="StreamMsg.PushStreamHttp";var OE=new class{constructor(){this._reactionsMap=new Map}init(s){this._core=s;const{helper:r,notificationCenter:g,InnerEvent:{MESSAGE_PUSH:u},InnerEventSubType:{MESSAGE_REACTION_UPDATED:E,MESSAGE_REACTION_UPDATED_SYNC:f}}=s;r.registerApi({apiName:"addMessageReaction",context:this}),r.registerApi({apiName:"removeMessageReaction",context:this}),r.registerApi({apiName:"getMessageReactions",context:this}),r.registerApi({apiName:"getAllUserListOfMessageReaction",context:this}),g.subscribeInnerEvent(u,E,this._handleReactionUpdated,this),g.subscribeInnerEvent(u,f,this._handleReactionSync,this)}addMessageReaction(s,r){return mA(this,void 0,void 0,function*(){const{OuterConstant:g,ssoLog:u,helper:E}=this._core;this._validateMessageReactionBusinessCapability();const{conversationID:f,ID:D,conversationType:v,from:N,to:P,clientSequence:W,random:nA,time:EA,sequence:wA}=s,kA=`conversationID:${f} messageID:${D} reactionID:${r}`;try{return this._recordMessageReactedByMe(D,r),v===g.CONV_C2C?yield function(VA,LA){return mA(this,void 0,void 0,function*(){var SA;const{from:PA,to:zA,clientSequence:Ee,random:Ie,time:Li,reactionID:Ui}=VA,Yt={From_Account:PA,To_Account:zA,MsgKey:`${Ee}_${Ie}_${Li}`,Reaction:Ui,Add_Account:[(SA=LA.store.get("login"))===null||SA===void 0?void 0:SA.userId]};return Wn.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.reaction_add",data:Yt})})}({from:N,to:P,clientSequence:W,random:nA,time:EA,reactionID:r},this._core):v===g.CONV_GROUP&&(yield function(VA,LA){return mA(this,void 0,void 0,function*(){var SA;const{to:PA,reactionID:zA,sequence:Ee}=VA,Ie={GroupId:PA,MsgSeq:Ee,Reaction:zA,Add_Account:[(SA=LA.store.get("login"))===null||SA===void 0?void 0:SA.userId]};return Wn.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.group_reaction_add",data:Ie})})}({to:P,reactionID:r,sequence:wA},this._core)),{code:0,successLog:{message:kA}}}catch(VA){this._removeMyReactionRecord(D,r);const{errorCode:LA}=VA||{};throw new E.ChatError({functionName:"addMessageReaction",code:LA,moreMessage:kA})}})}removeMessageReaction(s,r){return mA(this,void 0,void 0,function*(){const{OuterConstant:g,helper:u}=this._core;this._validateMessageReactionBusinessCapability();const{conversationID:E,ID:f,conversationType:D,from:v,to:N,clientSequence:P,random:W,time:nA,sequence:EA}=s,wA=`conversationID:${E} messageID:${f} reactionID:${r}`;try{return this._removeMyReactionRecord(f,r),D===g.CONV_C2C?yield function(kA,VA){return mA(this,void 0,void 0,function*(){var LA;const{from:SA,to:PA,clientSequence:zA,random:Ee,time:Ie,reactionID:Li}=kA,Ui={From_Account:SA,To_Account:PA,MsgKey:`${zA}_${Ee}_${Ie}`,Reaction:Li,Del_Account:[(LA=VA.store.get("login"))===null||LA===void 0?void 0:LA.userId]};return Wn.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.reaction_del",data:Ui})})}({from:v,to:N,clientSequence:P,random:W,time:nA,reactionID:r},this._core):D===g.CONV_GROUP&&(yield function(kA,VA){return mA(this,void 0,void 0,function*(){var LA;const{to:SA,reactionID:PA,sequence:zA}=kA,Ee={GroupId:SA,MsgSeq:zA,Reaction:PA,Del_Account:[(LA=VA.store.get("login"))===null||LA===void 0?void 0:LA.userId]};return Wn.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.group_reaction_del",data:Ee},VA)})}({to:N,reactionID:r,sequence:EA},this._core)),{code:0,successLog:{message:wA}}}catch(kA){const{errorCode:VA}=kA||{};throw new u.ChatError({functionName:"removeMessageReaction",code:VA,moreMessage:wA})}})}getAllUserListOfMessageReaction(s){return mA(this,void 0,void 0,function*(){this._validateMessageReactionBusinessCapability();const{message:r,reactionID:g,nextSeq:u=0}=s,E=s.count>100?100:s.count,{conversationID:f}=r,{ssoLog:D,helper:v,constants:N}=this._core;try{let P=null;if(P=f.startsWith(N.OuterConstant.CONV_C2C)?yield function(W){return mA(this,void 0,void 0,function*(){const{message:nA,nextSeq:EA,reactionID:wA,count:kA}=W,{from:VA,to:LA,clientSequence:SA,random:PA,time:zA}=nA,Ee={Reaction:wA,NextSeq:EA,Count:kA,From_Account:VA,To_Account:LA,MsgKey:`${SA}_${PA}_${zA}`};return Wn.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.reaction_iterate",data:Ee})})}({message:r,reactionID:g,nextSeq:u,count:E}):yield function(W){return mA(this,void 0,void 0,function*(){const{message:nA,nextSeq:EA,reactionID:wA,count:kA}=W,{sequence:VA,to:LA}=nA,SA={Reaction:wA,NextSeq:EA,GroupId:LA,Count:kA,MsgSeq:VA};return Wn.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.group_reaction_iterate",data:SA})})}({message:r,reactionID:g,nextSeq:u,count:E}),P){const{Reaction_Account:W,NextSeq:nA}=P,EA=yield this._getUserProfileList(W);return{code:0,data:{nextSeq:nA,isCompleted:u===0,userList:EA}}}}catch(P){const{errorCode:W}=P||{};throw new v.ChatError({functionName:"getAllUserListOfMessageReaction",code:W})}})}getMessageReactions(s){return mA(this,void 0,void 0,function*(){const{constants:r}=this._core;this._validateMessageReactionBusinessCapability();const{messageList:g,maxUserCountPerReaction:u=10}=s,E=g[0];let f=null;const D=new Map,{from:v,to:N,conversationType:P}=E,W=this._generateMessageKeyList(g,D);P===r.OuterConstant.CONV_C2C?f=yield function(kA){return mA(this,void 0,void 0,function*(){const{from:VA,to:LA,messageKeyList:SA,maxUserCountPerReaction:PA}=kA,zA={From_Account:VA,To_Account:LA,MsgKeyList:SA,Count:PA};return Wn.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.reaction_multi_stat",data:zA})})}({from:v,to:N,messageKeyList:W,maxUserCountPerReaction:u}):P===r.OuterConstant.CONV_GROUP&&(f=yield function(kA){return mA(this,void 0,void 0,function*(){const{groupId:VA,messageSequenceList:LA,maxUserCountPerReaction:SA}=kA,PA={GroupId:VA,MsgSeqList:LA,Count:SA};return Wn.core.common.buildAndSendPacket({servcmd:"openim_msg_ext_http_svc.group_reaction_multi_stat",data:PA})})}({groupId:N,messageSequenceList:W,maxUserCountPerReaction:u}));const{Results:nA=[]}=f||{},EA=this._extractUserIDsFromReactionResults(nA),wA=yield this._getUserProfileMap(EA);return{code:0,data:{resultList:nA.map(kA=>{const{ReactionList:VA,MsgSeq:LA,MsgKey:SA}=kA;return{messageID:this._generateMessageID({messageSequence:LA,messageKey:SA,messageIDMap:D}),reactionList:VA.map(PA=>{const{Reaction:zA,Count:Ee,Reaction_Account:Ie,ReactedByMe:Li}=PA;return{reactionID:zA,totalUserCount:Ee,partialUserList:this._generatePartialUserInfo({userIDList:Ie,userProfileMap:wA}),reactedByMyself:Li===1}})}})}}})}dispose(){this._reactionsMap.clear()}_extractUserIDsFromReactionResults(s){const r=[];return s?.forEach(g=>{const{ReactionList:u=[]}=g;u.forEach(E=>{E.Reaction_Account&&r.push(...E.Reaction_Account)})}),r}_getUserProfileList(s){return mA(this,void 0,void 0,function*(){var r;try{const g=yield(r=this._core.user.userProfile)===null||r===void 0?void 0:r.getUserProfile({userIDList:s});return g?g.data:[]}catch{return[]}})}_getUserProfileMap(s){return mA(this,void 0,void 0,function*(){const r=new Map;return(yield this._getUserProfileList(s)).forEach(g=>{const{nick:u,avatar:E,userID:f}=g;r.set(f,{nick:u,avatar:E,userID:f})}),r})}_recordMessageReactedByMe(s,r){const g=`${s}-${r}`;this._reactionsMap.has(g)?this._reactionsMap.get(g).reactedByMe=!0:this._reactionsMap.set(g,{reactedByMe:!0})}_removeMyReactionRecord(s,r){const g=`${s}-${r}`;this._reactionsMap.has(g)&&(this._reactionsMap.get(g).reactedByMe=!1)}_recordMessageReactionInfo(s){const{messageID:r,reactionID:g,reactionInfo:u}=s,E=`${r}-${g}`,f=this._reactionsMap.get(E)||{};this._reactionsMap.set(E,Object.assign(Object.assign({},f),u))}_validateMessageReactionBusinessCapability(){const{helper:s,constants:r}=this._core;if(!s.checkBusinessCapabilityBits(LE))throw new s.ChatError({functionName:"addMessageReaction",code:r.ERROR_CODE.NO_USE,replacement1:"addMessageReaction"})}_handleReactionUpdated(s){const{MsgReactionNotifyList:r}=s,{notificationCenter:g,constants:u}=this._core;r.forEach(E=>mA(this,void 0,void 0,function*(){const{C2CMsgInfo:f,GroupMsgInfo:D,MsgReactionSummary:v}=E,{TinyId:N,MsgClientTime:P,MsgRandom:W}=Object.assign(Object.assign({},f),D),nA=`${N}-${P}-${W}`,EA=this._extractUserIDsFromReactionResults([{ReactionList:v}]),wA=yield this._getUserProfileMap(EA),kA=v.map(VA=>{var LA;const{Reaction:SA,Reaction_Account:PA}=VA,zA=this._generatePartialUserInfo({userIDList:PA,userProfileMap:wA}),Ee=PA?VA.Count:0,Ie=((LA=this._reactionsMap.get(`${nA}-${SA}`))===null||LA===void 0?void 0:LA.reactedByMe)||!1;return this._recordMessageReactionInfo({messageID:nA,reactionID:SA,reactionInfo:{reactionID:SA,totalUserCount:Ee,partialUserList:zA}}),{reactionID:SA,totalUserCount:Ee,partialUserList:zA,reactedByMyself:Ie}});g.emitOuterEvent(u.OuterEvent.MESSAGE_REACTIONS_UPDATED,{name:u.OuterEvent.MESSAGE_REACTIONS_UPDATED,data:{messageID:nA,reactionList:kA}})}))}_handleReactionSync(s){var r;const{notificationCenter:g,constants:u}=this._core,{C2CMsgInfo:E={},GroupMsgInfo:f={},Reaction:D,OperateType:v}=s.MsgReactionNotify,{TinyId:N="",MsgClientTime:P=0,MsgRandom:W=0}=Object.assign(Object.assign({},E),f),nA=`${N}-${P}-${W}`,EA=`${nA}-${D}`;if(v===1?this._recordMessageReactedByMe(nA,D):this._removeMyReactionRecord(nA,D),(r=this._reactionsMap.get(EA))===null||r===void 0?void 0:r.reactionID){const wA=this._reactionsMap.get(EA);wA.reactedByMyself=v===1,g.emitOuterEvent(u.OuterEvent.MESSAGE_REACTIONS_UPDATED,{name:u.OuterEvent.MESSAGE_REACTIONS_UPDATED,data:{messageID:nA,reactionList:[wA]}})}}_generatePartialUserInfo({userIDList:s,userProfileMap:r}){const g=[];return s?.forEach(u=>{r.has(u)&&g.push(r.get(u))}),g}_generateMessageID(s){const{messageSequence:r,messageKey:g,messageIDMap:u}=s;return g?u.get(g):u.get(r)}_generateMessageKeyList(s,r){const{constants:g}=this._core,u=s[0],{conversationType:E}=u;let f=[];return E===g.OuterConstant.CONV_C2C?f=s.map(D=>{const{clientSequence:v,random:N,time:P,ID:W}=D,nA=`${v}_${N}_${P}`;return r.set(nA,W),nA}):E===g.OuterConstant.CONV_GROUP&&(f=s.map(D=>{const{ID:v,sequence:N}=D;return r.set(N,v),N})),f}},ig=new class{init(s){this._core=s;const{helper:r,InnerEvent:{MESSAGE_PUSH:g},InnerEventSubType:{C2C_MESSAGE_READ_RECEIPT:u,GROUP_MESSAGE_READ_RECEIPT:E},notificationCenter:f}=s;r.registerApi({apiName:"sendMessageReadReceipt",context:this}),r.registerApi({apiName:"getMessageReadReceiptList",context:this}),r.registerApi({apiName:"getGroupMessageReadMemberList",context:this}),f.subscribeInnerEvent(g,u,this._handleC2CMessageReadReceipt,this),f.subscribeInnerEvent(g,E,this._handleGroupMessageReadReceipt,this)}sendMessageReadReceipt(s){return mA(this,void 0,void 0,function*(){var r;const{common:g,constants:u}=this._core,E=this._filterValidMessageSendByOther(s);if(E.length===0)throw new g.ChatError({code:u.ERROR_CODE.READ_RECEIPT_MSG_LIST_EMPTY});try{const{conversationType:f}=E[0];return f===u.OuterConstant.CONV_C2C?yield function(D){return mA(this,void 0,void 0,function*(){const{common:v,constants:N}=Wn.core,P=D[0].conversationID.replace(N.OuterConstant.CONV_C2C,""),W=D.map(EA=>{const{from:wA,to:kA,sequence:VA,random:LA,time:SA,clientTime:PA}=EA;return{From_Account:wA,To_Account:kA,MsgSeq:VA,MsgRandom:LA,MsgTime:SA,MsgClientTime:PA}}),nA={Peer_Account:P,C2CMsgInfo:W};return v.buildAndSendPacket({servcmd:"openim.c2c_msg_read_receipt",data:nA})})}(E):yield function(D){return mA(this,void 0,void 0,function*(){const{common:v,constants:N}=Wn.core,P={GroupId:D[0].conversationID.replace(N.OuterConstant.CONV_GROUP,""),MsgSeqList:D.map(W=>({MsgSeq:W.sequence}))};return v.buildAndSendPacket({servcmd:"group_open_http_svc.group_msg_receipt",data:P})})}(E),{code:0,data:{}}}catch(f){const{errorCode:D,errorInfo:v}=f;throw new g.ChatError({code:D,message:v,moreMessage:`peerAccount:${(r=E?.[0])===null||r===void 0?void 0:r.conversationID}`})}})}getMessageReadReceiptList(s){return mA(this,void 0,void 0,function*(){const{common:r,constants:g}=this._core;try{const{conversationType:u}=s[0];if(u===g.OuterConstant.CONV_GROUP){const E=this._filterValidMessageSendByMe(s);if(E?.length>0){const f=yield function(v){return mA(this,void 0,void 0,function*(){const{common:N,constants:P}=Wn.core,W={GroupId:v[0].conversationID.replace(P.OuterConstant.CONV_GROUP,""),MsgSeqList:v.map(nA=>({MsgSeq:nA.sequence}))};return N.buildAndSendPacket({servcmd:"group_open_http_svc.get_group_msg_receipt",data:W})})}(E),{GroupMsgReceiptList:D}=f||{};this._updateGroupMessagesReadReceiptInfo({messageList:s,readReceiptList:D})}}return{code:0,data:{messageList:s}}}catch(u){const{errorCode:E,errorInfo:f}=u;throw new r.ChatError({code:E,message:f})}})}getGroupMessageReadMemberList(s){return mA(this,void 0,void 0,function*(){const{constants:r,common:g}=this._core,{message:u,filter:E=UE.READ,cursor:f=""}=s,{conversationID:D,sequence:v,ID:N}=u,P=D.replace(r.OuterConstant.CONV_GROUP,""),W=s.count>=100?100:s.count;try{const nA=yield function(EA){return mA(this,void 0,void 0,function*(){const{sequence:wA,groupID:kA,filter:VA,cursor:LA,count:SA}=EA,PA={MsgSeq:wA,GroupId:kA,Filter:VA,Cursor:LA,Num:SA};return Wn.core.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_group_msg_receipt_detail",data:PA})})}({groupID:P,sequence:v,filter:E,cursor:f,count:W});if(nA){const{Cursor:EA,IsFinish:wA,UnreadList:kA,ReadList:VA}=nA,LA={cursor:EA,isCompleted:wA===1,messageID:N,unreadUserIDList:[],readUserIDList:[]};return E===UE.READ?LA.readUserIDList=VA.map(SA=>SA.Read_Account):E===UE.UNREAD&&(LA.unreadUserIDList=kA.map(SA=>SA.Unread_Account)),{code:0,data:LA}}}catch(nA){const{errorCode:EA,errorInfo:wA}=nA;throw new g.ChatError({code:EA,message:wA})}})}_handleC2CMessageReadReceipt(s){const r=[],{constants:g,helper:u}=this._core,{C2cMsgInfo:E,PeerReadTime:f,Peer_Account:D}=s;if(u.isEmpty(E))return;const v=`${g.OuterConstant.CONV_C2C}${D}`;E?.forEach(N=>{const{TinyId:P,MsgClientTime:W,MsgRandom:nA}=N,EA=`${P}-${W}-${nA}`,wA=Uc({conversationID:v,messageID:EA});wA&&!wA.readReceiptInfo.isPeerRead&&(wA.readReceiptInfo.isPeerRead=!0,wA.readReceiptInfo.timestamp=f,r.push({userID:D,messageID:EA,isPeerRead:!0,timestamp:f}))}),this._emitReadReceiptEventIfNeed(r)}_updateGroupMessagesReadReceiptInfo(s){const{messageList:r,readReceiptList:g}=s,u=new Map;r.forEach(E=>{u.set(E.sequence,E)}),g?.forEach(E=>{if(E.Code===0){const{MsgSeq:f,ReadNum:D,UnreadNum:v}=E,N=u.get(f);N&&(N.readReceiptInfo.readCount=D,N.readReceiptInfo.unreadCount=v)}})}_handleGroupMessageReadReceipt(s){const r=[],{constants:g}=this._core,{GroupTips:u}=s;u.forEach(E=>{const{MsgBody:{GroupMsgReceiptList:f},GroupInfo:{GroupId:D}}=E,v=`${g.OuterConstant.CONV_GROUP}${D}`;f?.forEach(N=>{const{TinyId:P,MsgClientTime:W,MsgRandom:nA,ReadNum:EA,UnreadNum:wA}=N,kA=`${P}-${W}-${nA}`,VA=Uc({conversationID:v,messageID:kA}),LA={groupID:D,messageID:kA,readCount:0,unreadCount:0};VA&&(typeof EA=="number"&&(VA.readReceiptInfo.readCount=EA,LA.readCount=EA),typeof wA=="number"&&(VA.readReceiptInfo.unreadCount=wA,LA.unreadCount=wA),r.push(LA))})}),this._emitReadReceiptEventIfNeed(r)}_emitReadReceiptEventIfNeed(s){const{notificationCenter:r,OuterEvent:g}=this._core;s.length>0&&r.emitOuterEvent(g.MESSAGE_READ_RECEIPT_RECEIVED,{name:g.MESSAGE_READ_RECEIPT_RECEIVED,data:s})}_filterValidMessageSendByOther(s){return this._filterNeedReadReceiptMessages(s).filter(r=>{const{from:g}=r;return g!==this._core.common.getCurrentUserID()})}_filterValidMessageSendByMe(s){const{OuterConstant:r}=this._core.constants;return this._filterNeedReadReceiptMessages(s).filter(g=>{const{from:u,status:E}=g;return u===this._core.common.getCurrentUserID()&&E===r.MessageStatus.SUCCESS})}_filterNeedReadReceiptMessages(s){return s.filter(r=>r.needReadReceipt===!0)}dispose(){const{InnerEvent:{MESSAGE_PUSH:s},InnerEventSubType:{C2C_MESSAGE_READ_RECEIPT:r,GROUP_MESSAGE_READ_RECEIPT:g},notificationCenter:u}=this._core;u.unSubscribeInnerEvent(s,r,this._handleC2CMessageReadReceipt,this),u.unSubscribeInnerEvent(s,g,this._handleGroupMessageReadReceipt,this)}};function nu(s,r,g){return mA(this,void 0,void 0,function*(){const{common:{buildAndSendPacket:u}}=Wn.core,{from:E,to:f,clientSequence:D,random:v,time:N}=s;return u({servcmd:"openim_msg_ext_http_svc.set_key_values",data:{From_Account:E,To_Account:f,MsgKey:`${D}_${v}_${N}`,OperateType:g,ExtensionList:r}})})}function Yu(s,r,g){return mA(this,void 0,void 0,function*(){const{common:{buildAndSendPacket:u}}=Wn.core,{to:E,sequence:f}=s;return u({servcmd:"openim_msg_ext_http_svc.group_set_key_values",data:{GroupId:E,MsgSeq:f,OperateType:g,ExtensionList:r}})})}var Pc=new class{constructor(){this._messageExtensionsMap=new Map,this._extensionsLatestSequenceMap=new Map,this._completedFetchExtensions=new Set}init(s){this._core=s;const{notificationCenter:r,helper:{registerApi:g},InnerEvent:{MESSAGE_PUSH:u,LOGOUT:E},InnerEventSubType:{MESSAGE_EXTENSIONS_UPDATED:f}}=s;g({apiName:"setMessageExtensions",context:this}),g({apiName:"getMessageExtensions",context:this}),g({apiName:"deleteMessageExtensions",context:this}),r.subscribeInnerEvent(u,f,this._handleMessageExtensionsNotify,this),r.subscribeInnerEvent(E,this.reset,this)}setMessageExtensions(s,r){return mA(this,void 0,void 0,function*(){this._validateMessageExtensionBusinessCapability("setMessageExtensions");const{constants:{OuterConstant:g},ssoLog:u}=this._core,{ID:E,conversationID:f,sequence:D,time:v,conversationType:N}=s;let P=r;r.length>20&&(P=r.slice(0,20),u.warn("setMessageExtensions","the length of extensions cannot exceed 20"));const W=this._generateServerExtensions(s,P),nA=`convID:${f} messageID:${E} sequence:${D} time:${v} count:${P.length}`;try{let EA;if(N===g.CONV_C2C?EA=yield nu(s,W,Pl):N===g.CONV_GROUP&&(EA=yield Yu(s,W,Pl)),EA){const{resultList:wA,successCount:kA,failureCount:VA}=this._handleModifyMessageExtensions(s,EA);return{code:0,data:{extensions:wA},successLog:{message:`${nA} successCount:${kA} failCount:${VA}`}}}return{code:0,data:{extensions:[]}}}catch(EA){const{errorCode:wA}=EA;throw new this._core.helper.ChatError({functionName:"setMessageExtensions",code:wA,moreMessage:nA})}})}getMessageExtensions(s){return mA(this,void 0,void 0,function*(){const{utils:{isUndefined:r}}=this._core;this._validateMessageExtensionBusinessCapability("getMessageExtensions");const{conversationID:g,ID:u,sequence:E,time:f}=s,D=`convID:${g} messageID:${u} sequence:${E} time:${f}`;try{let v;this._completedFetchExtensions.has(u)&&(v=this._extensionsLatestSequenceMap.get(u));const N=yield this._fetchMessageExtensions(s,v);return r(v)&&N.length>1&&this._completedFetchExtensions.add(u),{code:0,data:{extensions:N},successLog:{message:D}}}catch(v){const{errorCode:N,errorInfo:P=""}=v||{};throw new this._core.common.ChatError({code:N,message:P,moreMessage:D})}})}deleteMessageExtensions(s,r){return mA(this,void 0,void 0,function*(){this._validateMessageExtensionBusinessCapability("deleteMessageExtensions");const{utils:{isEmpty:g},constants:{OuterConstant:u}}=this._core,{conversationType:E,conversationID:f,sequence:D,ID:v,time:N}=s;let P=Pg;const W=[];g(r)||(P=xl,r?.forEach(wA=>{W.push({key:wA,value:"",seq:0})}));const nA=`convID:${f} messageID:${v} sequence:${D} time:${N} operateType:${P}`,EA=this._generateServerExtensions(s,W);try{let wA;if(E===u.CONV_C2C?wA=yield nu(s,EA,P):E===u.CONV_GROUP&&(wA=yield Yu(s,EA,P)),wA){const{resultList:kA,successCount:VA,failureCount:LA}=this._handleModifyMessageExtensions(s,wA);return{code:0,data:{extensions:kA},successLog:{message:`${nA}successCount:${VA} failCount:${LA}`}}}return{code:0,data:{extensions:[]}}}catch(wA){const{errorCode:kA}=wA;throw new this._core.helper.ChatError({functionName:"deleteMessageExtensions",code:kA,moreMessage:nA})}})}reset(){this._messageExtensionsMap.clear(),this._extensionsLatestSequenceMap.clear(),this._completedFetchExtensions.clear()}dispose(){this.reset();const{notificationCenter:s,InnerEvent:{MESSAGE_PUSH:r,LOGOUT:g},InnerEventSubType:{MESSAGE_EXTENSIONS_UPDATED:u}}=this._core;s.unSubscribeInnerEvent(r,u,this._handleMessageExtensionsNotify,this),s.subscribeInnerEvent(g,this.reset,this)}_handleModifyMessageExtensions(s,r){const{ID:g}=s,{Seq:u}=r,E=r.ExtensionList||[],f=[];let D=0,v=0,N=[];return E.forEach(P=>{const{ErrorCode:W,Extension:nA}=P,{Key:EA,Value:wA,Seq:kA}=nA;f.push({code:W,key:EA,value:wA}),W===0?D++:v++,N.push({key:EA,value:wA,seq:kA})}),this._extensionsLatestSequenceMap.set(g,u),N.length>0&&this._updateLocalExtensions(s.ID,N),{resultList:f,successCount:D,failureCount:v}}_updateLocalExtensions(s,r){this._messageExtensionsMap.has(s)||this._messageExtensionsMap.set(s,new Map);const g=this._messageExtensionsMap.get(s);r?.forEach(u=>{const{key:E,seq:f,value:D=""}=u;g?.set(E,{value:D,seq:f})})}_fetchMessageExtensions(s,r){return mA(this,void 0,void 0,function*(){const{constants:{OuterConstant:g},utils:{isEmpty:u}}=this._core;try{let E;const{conversationType:f,ID:D}=s;if(f===g.CONV_C2C?E=yield function(v,N){const{common:{buildAndSendPacket:P}}=Wn.core,{from:W,to:nA,clientSequence:EA,random:wA,time:kA}=v;return P({servcmd:"openim_msg_ext_http_svc.get_key_values",data:{From_Account:W,To_Account:nA,MsgKey:`${EA}_${wA}_${kA}`,StartSeq:N}})}(s,r):f===g.CONV_GROUP&&(E=yield function(v,N){const{common:{buildAndSendPacket:P}}=Wn.core,{to:W,sequence:nA}=v;return P({servcmd:"openim_msg_ext_http_svc.group_get_key_values",data:{GroupId:W,MsgSeq:nA,StartSeq:N}})}(s,r)),E){const{LatestSeq:v,ClearSeq:N,CompleteFlag:P}=E,W=(E.ExtensionList||[]).map(EA=>({key:EA.Key,value:EA.Value,seq:EA.Seq}));if(this._updateLocalExtensions(D,W),this._clearLocationExtensions(D,N),this._extensionsLatestSequenceMap.set(D,v),P!==1){const EA=W[W.length-1].seq+1;return this._fetchMessageExtensions(s,EA)}const nA=[];if(this._messageExtensionsMap.has(D)){const EA=this._messageExtensionsMap.get(D);EA?.forEach((wA,kA)=>{const{value:VA}=wA;u(VA)||nA.push({key:kA,value:VA})})}return nA}}catch(E){throw E}})}_clearLocationExtensions(s,r){if(!(r<=0)&&this._messageExtensionsMap.has(s)){const g=this._messageExtensionsMap.get(s);g?.forEach((u,E)=>{u.seq<=r&&g.delete(E)})}}_generateServerExtensions(s,r){const{ID:g}=s;if(this._messageExtensionsMap.has(g)){const u=this._messageExtensionsMap.get(g);return r.map(E=>{var f;const{key:D,value:v}=E;let N=0;return u?.has(D)&&(N=(f=u.get(D))===null||f===void 0?void 0:f.seq),{Key:D,Value:v,Seq:N}})}return r.map(u=>({Key:u.key,Value:u.value,Seq:0}))}_validateMessageExtensionBusinessCapability(s){const{helper:r,constants:g}=this._core;if(!r.checkBusinessCapabilityBits(pC))throw new r.ChatError({functionName:s,code:g.ERROR_CODE.NO_USE,replacement1:s})}_handleMessageExtensionsNotify(s){const{SetKVInfo:r,DeleteKVInfo:g,ClearKVInfo:u,MsgOptType:E,TinyId:f,MsgLastSeq:D,ExtensionC2cMsgInfo:v,ExtensionGroupMsgInfo:N}=s?.MsgExtensionNotify||{},P=v||N||{},{MsgClientTime:W,MsgRandom:nA}=P,EA=`${f}-${W}-${nA}`;this._extensionsLatestSequenceMap.set(EA,D),E===Pl?this._handleMessageExtensionsUpdated({messageID:EA,updateMessageExtensionsInfo:r}):E===xl?this._handleMessageExtensionsDeleted({messageID:EA,deleteMessageExtensionsInfo:g}):E===Pg&&this._handleMessageExtensionsCleared({messageID:EA,clearMessageExtensionsInfo:u})}_handleMessageExtensionsUpdated(s){const{notificationCenter:r,OuterEvent:g}=this._core,{messageID:u,updateMessageExtensionsInfo:E=[]}=s,f=[];E.forEach(D=>{const{MsgKeyValue:v=[]}=D,N=v.map(P=>(f.push({key:P.Key,value:P.Value}),{key:P.Key,value:P.Value,seq:P.Seq}));this._updateLocalExtensions(u,N)}),r.emitOuterEvent(g.MESSAGE_EXTENSIONS_UPDATED,{name:g.MESSAGE_EXTENSIONS_UPDATED,data:{messageID:u,extensions:f}})}_handleMessageExtensionsDeleted(s){const{notificationCenter:r,OuterEvent:g}=this._core,{messageID:u,deleteMessageExtensionsInfo:E=[]}=s,f=[];E.forEach(D=>{const{MsgKeyValue:v=[]}=D,N=v.map(P=>(f.push(P.Key),{key:P.Key,seq:P.Seq}));this._updateLocalExtensions(u,N)}),r.emitOuterEvent(g.MESSAGE_EXTENSIONS_DELETED,{name:g.MESSAGE_EXTENSIONS_DELETED,data:{messageID:u,keyList:f}})}_handleMessageExtensionsCleared(s){const{notificationCenter:r,OuterEvent:{MESSAGE_EXTENSIONS_DELETED:g},utils:{isEmpty:u}}=this._core,{messageID:E,clearMessageExtensionsInfo:f=[]}=s,D=[];f.forEach(v=>{const{ClearMsgSeq:N}=v;this._messageExtensionsMap.has(E)&&(this._messageExtensionsMap.get(E)||[]).forEach((P,W)=>{P.seq<=N&&!u(P.value)&&D.push(W)}),this._clearLocationExtensions(E,N)}),r.emitOuterEvent(g,{name:g,data:{messageID:E,keyList:D}})}};const SI={key:"message",required:!0,rules:["object"],allowEmpty:!1,customValidator:s=>{const{constants:{OuterConstant:r}}=Wn.core;return s.status!==r.MessageStatus.SUCCESS?"message is not success":s.isSupportExtension===!0||"message is not support extension"}},ll={setMessageExtensions:[SI,{key:"extensions",required:!0,rules:["array"],allowEmpty:!1}],getMessageExtensions:[SI],deleteMessageExtensions:[SI]},Il=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({deleteMessage:[{required:!0,rules:["array"],allowEmpty:!1}],revokeMessage:[{required:!0,rules:["object"],allowEmpty:!1}],resendMessage:[{key:"message",required:!0,rules:["object"],allowEmpty:!1},{key:"options",required:!1,rules:["object"],allowEmpty:!1}],getMessageList:{conversationID:{required:!0,rules:["string"],allowEmpty:!1},nextReqMessageID:{required:!1,rules:["string"],allowEmpty:!0},count:{required:!1,rules:["number"],allowEmpty:!0}},getMessageListHopping:{conversationID:{required:!0,rules:["string"],allowEmpty:!1},sequence:{required:!1,rules:["number"],allowEmpty:!0},direction:{required:!1,rules:["number"],allowEmpty:!0},count:{required:!1,rules:["number"],allowEmpty:!0}},createTextAtMessage:{to:{required:!0,rules:["string"],allowEmpty:!1},conversationType:{required:!0,rules:["string"],allowEmpty:!1},payload:{required:!0,rules:["object"],allowEmpty:!1,customValidator:s=>{const r=function(g){var u;return typeof g?.text!="string"||typeof g.text=="string"&&((u=g?.text)===null||u===void 0?void 0:u.length)===0?"payload.text is invalid.":!0}(s);return r!==!0?r:!(s?.atUserList&&!Array.isArray(s.atUserList))||"atUserList should be an array or undefind."}}},findMessage:[{required:!0,rules:["string"],allowEmpty:!1}],translateText:{sourceTextList:{required:!0,rules:["array"],allowEmpty:!1},sourceLanguage:{required:!0,rules:["string"],allowEmpty:!1},targetLanguage:{required:!0,rules:["string"],allowEmpty:!1}},createForwardMessage:{to:{required:!0,rules:["string"],allowEmpty:!1},conversationType:{required:!0,rules:["string"],allowEmpty:!1,customValidator:s=>!(!s.startsWith("C2C")&&!s.startsWith("GROUP"))||"conversationType is invalid."},payload:{required:!0,rules:["object"],allowEmpty:!1}},createLocationMessage:{to:{required:!0,rules:["string"],allowEmpty:!1},conversationType:{required:!0,rules:["string"],allowEmpty:!1},payload:{required:!0,rules:["object"],allowEmpty:!1,customValidator:s=>{const{utils:{isString:r,isNumber:g}}=Wn.core;return r(s?.description)?g(s?.longitude)?!!g(s?.latitude)||"payload.latitude must be a number.":"payload.longitude must be a number.":"payload.description must be a string."}}}},{addMessageReaction:[{key:"message",required:!0,rules:["object"],allowEmpty:!1},{key:"reactionID",required:!0,rules:["string"],allowEmpty:!1}],removeMessageReaction:[{key:"message",required:!0,rules:["object"],allowEmpty:!1},{key:"reactionID",required:!0,rules:["string"],allowEmpty:!1}],getMessageReactions:{messageList:{required:!0,rules:["array"],allowEmpty:!1},maxUserCountPerReaction:{required:!1,rules:["number"],allowEmpty:!0,customValidator:s=>typeof s!="number"?"maxUserCountPerReaction is invalid.":!(s<0||s>10)||"maxUserCountPerReaction should between [0, 10]."}},getAllUserListOfMessageReaction:{message:{required:!0,rules:["object"],allowEmpty:!1,customValidator:s=>s.status==="success"||"message is invalid."},reactionID:{required:!0,rules:["string"],allowEmpty:!1},nextSeq:{required:!1,rules:["number"],allowEmpty:!0},count:{required:!1,rules:["number"],allowEmpty:!0}}}),{sendMessageReadReceipt:[{required:!0,rules:["array"],allowEmpty:!1}],getMessageReadReceiptList:[{required:!0,rules:["array"],allowEmpty:!1}],getGroupMessageReadMemberList:{message:{required:!0,rules:["object"],allowEmpty:!1},filter:{required:!1,rules:["number"],allowEmpty:!0},count:{required:!1,rules:["number"],allowEmpty:!0},cursor:{required:!1,rules:["string"],allowEmpty:!0}}}),ll),{pinGroupMessage:{groupID:{required:!0,rules:["string"],allowEmpty:!1},message:{required:!0,rules:["object"],allowEmpty:!1},isPinned:{required:!0,rules:["boolean"],allowEmpty:!1}},getPinnedGroupMessageList:[{key:"groupID",required:!0,rules:["string"],allowEmpty:!1}]}),{createQuoteMessage:[{key:"message",required:!0,rules:["object"],allowEmpty:!1},{key:"quotedMessage",required:!0,rules:["object"],allowEmpty:!1}]}),qa=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({deleteMessage:!0,revokeMessage:!0,resendMessage:!0,getMessageList:!0,getMessageListHopping:!0,createTextAtMessage:!0,findMessage:!0,translateText:!0,createForwardMessage:!0,createLocationMessage:!0},{addMessageReaction:!0,removeMessageReaction:!0,getMessageReactions:!0,getAllUserListOfMessageReaction:!0}),{sendMessageReadReceipt:!0,getMessageReadReceiptList:!0,getGroupMessageReadMemberList:!0}),{setMessageExtensions:!0,getMessageExtensions:!0,deleteMessageExtensions:!0}),{pinGroupMessage:!0,getPinnedGroupMessageList:!0}),{createQuoteMessage:!0});class PE{constructor(r){this._core=r}deleteMessage(r){return mA(this,void 0,void 0,function*(){const{to:g,messageIdentifiers:u}=r,E={From_Account:this._core.common.getCurrentUserID(),To_Account:g,MsgKeyList:u};return this._core.common.buildAndSendPacket({servcmd:"openim.delete_c2c_msg_ramble",data:E})})}revokeMessage(r){return mA(this,void 0,void 0,function*(){const{to:g,from:u,sequence:E,time:f,random:D}=r,v={MsgInfo:{From_Account:u,To_Account:g,MsgSeq:E,MsgRandom:D,MsgTimeStamp:f}};return this._core.common.buildAndSendPacket({servcmd:"openim.msgwithdraw",data:v})})}}class la{constructor(r){this._core=r}deleteMessage(r){return mA(this,void 0,void 0,function*(){const{to:g,messageIdentifiers:u}=r,E={GroupId:g,Deleter_Account:this._core.common.getCurrentUserID(),Seqs:u};return this._core.common.buildAndSendPacket({servcmd:"group_open_http_svc.delete_group_ramble_msg_by_seq",data:E})})}revokeMessage(r){return mA(this,void 0,void 0,function*(){const{to:g,sequence:u}=r,E={GroupId:g,MsgSeqList:[{MsgSeq:u}]};return this._core.common.buildAndSendPacket({servcmd:"group_open_http_svc.group_msg_recall",data:E})})}}const Gs=2116;class Or{constructor(r){this._core=r}generateRevokeMessage(r){const{conversationID:g,sequence:u,random:E,tinyID:f,clientTime:D,revokeReason:v,revoker:N}=r;let P={};const{messageDataHandler:W}=this._core.message;return P=W.revokeMessage({conversationID:g,sequence:u,random:E,revoker:N}),P||(P={conversationID:g,sequence:u},f&&D&&E&&(P.ID=`${f}-${D}-${E}`)),P.revoker=N,P.revokeReason=v,P.revokerInfo={userID:N,nick:"",avatar:""},P}updateRevokerInfo(r){return mA(this,void 0,void 0,function*(){const g=r.map(u=>u.revoker);try{const u=yield this._fetchUserInfos(g);u&&r.forEach(E=>{const{revoker:f}=E;u[f]&&(E.revokerInfo.nick=u[f].nick||"",E.revokerInfo.avatar=u[f].avatar||"",E.revokerInfo.userID=f)})}catch(u){console.debug(u)}})}_fetchUserInfos(r){return mA(this,void 0,void 0,function*(){var g,u;const E=yield(g=this._core.user.userProfile)===null||g===void 0?void 0:g.getUserProfile({userIDList:r});return E?.data?(u=E.data)===null||u===void 0?void 0:u.reduce((f,{userID:D,nick:v,avatar:N})=>(f[D]={nick:v||"",avatar:N||""},f),{}):null})}}var ul=new class{constructor(){this._core=null,this._c2cMessageAction=null,this._groupMessageAction=null}init(s){this._core=s,this._groupMessageAction=new la(s),this._c2cMessageAction=new PE(s),this._messageHelper=new Or(s);const{helper:r}=s;r.registerApi({apiName:"deleteMessage",context:this}),r.registerApi({apiName:"revokeMessage",context:this}),r.registerApi({apiName:"resendMessage",context:this}),r.registerApi({apiName:"findMessage",context:this}),r.registerApi({apiName:"createQuoteMessage",context:this})}deleteMessage(s){return mA(this,void 0,void 0,function*(){let r=[],g=[];const{conversationID:u,conversationType:E}=s[0],f=u.replace(E,"");if(E==="@TIM#SYSTEM")throw new this._core.helper.ChatError({code:Gs});if(s.forEach(D=>{const{conversationID:v,conversationType:N,status:P,_onlineOnlyFlag:W,sequence:nA,random:EA,time:wA}=D||{};if(P==="success"&&v===u&&N===E){if(!W){const kA=N==="C2C"?`${nA}_${EA}_${wA}`:String(nA);r.push(kA)}g.push(D)}}),r.length===0)return this._handleDeleteMessageSuccess(g),{code:0,data:{messageList:g}};r.length>30&&(r=r.slice(0,30),g=g.slice(0,30));try{return E==="C2C"?yield this._c2cMessageAction.deleteMessage({to:f,messageIdentifiers:r}):yield this._groupMessageAction.deleteMessage({to:f,messageIdentifiers:r}),this._handleDeleteMessageSuccess(g),{code:0,data:{messageList:g}}}catch(D){const{utils:{safeStringify:v}}=this._core,{errorCode:N,errorInfo:P}=D;throw new this._core.helper.ChatError({functionName:"deleteMessage",code:N,message:P,moreMessage:`messageIdentifiers: ${v(r)}`})}})}revokeMessage(s){return mA(this,void 0,void 0,function*(){var r;const{conversationType:g,isRevoked:u,ID:E,type:f,from:D,to:v}=s;let N=null;const P=`type:${f} from:${D} to:${v} ID:${E}`;if(g==="@TIM#SYSTEM")throw new this._core.helper.ChatError({message:"system message cannot be revoked"});if(u)throw new this._core.helper.ChatError({message:"message has been revoked",moreMessage:P});try{if(N=g==="C2C"?yield this._c2cMessageAction.revokeMessage(s):yield this._groupMessageAction.revokeMessage(s),N){const{RecallRetList:W}=N,nA=((r=W?.[0])===null||r===void 0?void 0:r.RetCode)||0;if(nA!==0)throw new this._core.helper.ChatError({code:nA,moreMessage:P});return s.isRevoked=!0,yield this._handleRevokeMessageSuccess(s),{code:0,data:{message:s},successLog:{message:P}}}}catch(W){const{errorCode:nA}=W;throw new this._core.helper.ChatError({functionName:"revokeMessage",code:nA,moreMessage:P})}})}resendMessage(s,r){return mA(this,void 0,void 0,function*(){var g,u;return s.isResend=!0,s.status="unSend",(u=(g=this._core)===null||g===void 0?void 0:g.apiMap)===null||u===void 0?void 0:u.sendMessage(s,r)})}findMessage(s){return this._core.message.messageDataHandler.findMessage(s)}createQuoteMessage(s,r){const{ID:g,time:u,sequence:E}=r;return s.quoteInfo={msgID:g,messageTime:u,messageSequence:E},s}_handleDeleteMessageSuccess(s){if(s.length===0)return;const{message:{messageDataHandler:r},common:{isTopic:g},notificationCenter:u,InnerEvent:E}=this._core;s.forEach(D=>{D.isDeleted=!0;const v=r.getLocalMessageList(D.conversationID);v?.forEach(N=>{N.ID===D.ID&&(N.isDeleted=!0)})});const{conversationID:f=""}=s[0];g(f)?u.emitInnerEvent(E.TOPIC_MESSAGE_DELETED,f):u.emitInnerEvent(E.MESSAGE_DELETED,f)}_handleRevokeMessageSuccess(s){return mA(this,void 0,void 0,function*(){var r;const g=(r=this._core.store.get("login"))===null||r===void 0?void 0:r.userId,{conversationID:u,sequence:E,random:f}=s;this._core.message.messageDataHandler.revokeMessage({conversationID:u,sequence:E,random:f,revoker:g}),yield this._messageHelper.updateRevokerInfo([s])})}};class Yl{static parseServerPushElement(r){const{MsgContent:g={}}=r,{Index:u,Data:E}=g;return new Yl({index:u,data:E})}constructor(r){this.type=Kr.MSG_FACE;const{index:g,data:u}=r;this.content={index:g,data:u}}validateBeforeSend(){var r,g;return typeof((r=this.content)===null||r===void 0?void 0:r.index)=="number"&&typeof((g=this.content)===null||g===void 0?void 0:g.data)=="string"?{isValid:!0}:{isValid:!1,error:{message:"content is invalid"}}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{index:E,data:f}=u;return{MsgType:this.type,MsgContent:{Index:E,Data:f}}}}class xc{static parseServerPushElement(r){const{MsgContent:g={}}=r,{Desc:u,Longitude:E,Latitude:f}=g;return new xc({description:u,longitude:E,latitude:f})}constructor(r){this.type=Kr.MSG_LOCATION;const{description:g,longitude:u,latitude:E}=r;this.content={description:g,longitude:u,latitude:E}}validateBeforeSend(){return{isValid:!0}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{description:E,longitude:f,latitude:D}=u;return{MsgType:this.type,MsgContent:{Desc:E,Longitude:f,Latitude:D}}}}class xE{static parseServerPushElement(r){const{MsgContent:g={}}=r,{StreamMsgID:u,CompatibleText:E,Markdown:f,BinaryData:D,ErrorCode:v,ErrorMsg:N}=g;return new xE({streamMessageID:u,compatibleText:E,markdown:f,binaryData:D,errorCode:v,errorMessage:N})}constructor(r){this.type=Kr.MSG_STREAM,this.content={streamMessageID:"",compatibleText:"",errorCode:0,errorMessage:"",isStreamEnded:!1},this._chunks=[],this._latestIndex=0;const{streamMessageID:g,compatibleText:u,markdown:E,binaryData:f,errorCode:D=0,errorMessage:v="",isStreamEnded:N=!1,chunks:P=[],latestIndex:W=0}=r;this.content.streamMessageID=g,this.content.compatibleText=u,this.content.markdown=E,this.content.binaryData=f,this.content.errorCode=D,this.content.errorMessage=v,this.content.isStreamEnded=N,this.content.chunks=P,this.content.latestIndex=W}updateChunks(r){if(!r||r.length===0)return;const g=r.sort((f,D)=>f.index-D.index),u=this._getMaxRevokedChunkIndex(g);u>=0&&(this._chunks=[],this._latestIndex=u,this._updateContent());const E=this._getValidChunks(g);if(E.length!==0&&(this._mergeAndSortChunks(E),this._chunks.length>0)){const f=this._chunks[this._chunks.length-1];this._latestIndex=f.index,this._updateContent(),this.content.isStreamEnded=f.isLast}}getLatestIndex(){return this._latestIndex}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{streamMessageID:E,chunks:f}=u,D=f?.map(v=>({EventType:v.eventType||"data",Index:v.index,Markdown:v.markdown,IsLast:v.isLast}));return{MsgType:this.type,MsgContent:{StreamMsgID:E,Chunks:D}}}validateBeforeSend(){var r,g;return((g=(r=this.content)===null||r===void 0?void 0:r.chunks)===null||g===void 0?void 0:g.length)>0?{isValid:!0}:{isValid:!1,error:{message:"content is invalid"}}}_filterContinuousChunks(r,g){if(r.length===0)return[];const u=[];let E=g;for(const f of r){if(f.index>E)break;f.index===E&&(u.push(f),E++)}return u}_mergeAndSortChunks(r){const g=new Map;this._chunks.forEach(u=>{g.set(u.index,u)}),r.forEach(u=>{g.set(u.index,u)}),this._chunks=Array.from(g.values()).sort((u,E)=>u.index-E.index)}_updateContent(){this.content.markdown=this._chunks.map(g=>g.markdown).join("");const r=this._chunks.map(g=>g.binaryData).filter(g=>g?.length>0);if(r.length===0)this.content.binaryData=new Uint8Array(0);else if(r.length===1)this.content.binaryData=r[0];else{const g=r.reduce((f,D)=>f+D.length,0),u=new Uint8Array(g);let E=0;for(const f of r)u.set(f,E),E+=f.length;this.content.binaryData=u}}_getMaxRevokedChunkIndex(r){let g=-1;for(let u=0;ug&&(g=E.index)}return g}_getValidChunks(r){const g=r.filter(u=>u.eventType===Oc.DATA&&u.index>this._latestIndex);return this._filterContinuousChunks(g,this._latestIndex+1)}}var Yc=new class{init(s){this._core=s,s.message.messageFactory.registerElementClass(Kr.MSG_FACE,Yl),s.message.messageFactory.registerElementClass(Kr.MSG_LOCATION,xc),s.message.messageFactory.registerElementClass(Kr.MSG_STREAM,xE),s.helper.registerApi({apiName:"createFaceMessage",context:this}),s.helper.registerApi({apiName:"createTextAtMessage",context:this}),s.helper.registerApi({apiName:"createForwardMessage",context:this}),s.helper.registerApi({apiName:"createLocationMessage",context:this})}createFaceMessage(s){if(!s)return null;const{index:r,data:g}=s?.payload||{},u=new Yl({index:r,data:g}),E=this._core.common.getCurrentUserID(),f=this._core.message.messageFactory.createMessage(Object.assign(Object.assign({},s),{from:E}));return f.setElement(u),f}createTextAtMessage(s){const{atUserList:r}=s?.payload||{},g=this._core.apiMap.createTextMessage(s),{OuterConstant:u}=this._core;if(!g)return null;if(Array.isArray(r)){const E=[],f=[];r.forEach(D=>{D!==u.MSG_AT_ALL?(E.push({GroupAtAllFlag:Eh,GroupAt_Account:D}),f.push(D)):(E.push({GroupAtAllFlag:uo}),f.push(u.MSG_AT_ALL))}),g._groupAtInfoList=E,g.atUserList=f}return g}createForwardMessage(s){const{helper:r,OuterConstant:g}=this._core,{to:u,conversationType:E,priority:f,payload:D,needReadReceipt:v,receiverList:N,cloudCustomData:P="",isSupportExtension:W=!1}=s;if(!Array.isArray(D._elements))throw new r.ChatError({functionName:"createForwardMessage",code:2454});if(D.type===g.MSG_GRP_TIP)throw new r.ChatError({functionName:"createForwardMessage",code:2453});const nA=this._core.common.getCurrentUserID(),EA=this._core.message.messageFactory.createMessage({to:u,from:nA,conversationType:E,isPlaceMessage:0,priority:f,payload:D,needReadReceipt:v,isSupportExtension:W,cloudCustomData:P,receiverList:N});return EA.setRelayFlag(!0),EA.setElement(D._elements[0]),EA}createLocationMessage(s){if(!s)return null;const{description:r,longitude:g,latitude:u}=s?.payload||{},E=new xc({description:r,longitude:g,latitude:u}),f=this._core.common.getCurrentUserID(),D=this._core.message.messageFactory.createMessage(Object.assign(Object.assign({},s),{from:f}));return D.setElement(E),D}};let Vu=class{init(s){this._messageHelper=new Or(s),this._core=s;const{notificationCenter:r,InnerEvent:{MESSAGE_PUSH:g},InnerEventSubType:{C2C_REVOKED_MESSAGE:u},helper:{registerWorkflowStep:E},constants:{WORKFLOW_NAME:f,WORKFLOW_STEP:D}}=s;r.subscribeInnerEvent(g,u,this._handleC2CNotifyMessage,this),E(f.SYNC_SERVER_INFO_AFTER_RE_ONLINE,D.HANDLE_C2C_REVOKED_MESSAGE_FROM_SYNC_UNREAD,this._handleC2CRevokeMessagesFromUnreadMessageSync,this)}_handleC2CNotifyMessage(s){const{C2cNotifyMsgArray:r}=s;r?.forEach(g=>{Object.keys(g).includes("WithdrawC2cMsgNotify")&&this._handleC2CRevokeMessage(g)})}_handleC2CRevokeMessage(s){return mA(this,void 0,void 0,function*(){try{const{WithdrawC2cMsgNotify:{C2cWithdrawInfoArray:r}}=s;yield this._parseAndEmitC2CRevokedMessages(r)}catch(r){console.debug(r)}})}_parseAndEmitC2CRevokedMessages(s){return mA(this,void 0,void 0,function*(){const r=[],{notificationCenter:g,OuterEvent:u,common:{getCurrentUserID:E}}=this._core;s.forEach(f=>{var D;const{MsgRand:v,MsgSeq:N,To_Account:P,From_Account:W,RevokerInfo:{Revoker_Account:nA,Revoke_Reason:EA}}=f,wA=E()===W?`C2C${P}`:`C2C${W}`,kA=((D=f?.RevokerInfo)===null||D===void 0?void 0:D.Reason)||EA,VA=this._messageHelper.generateRevokeMessage({conversationID:wA,sequence:N,random:v,revoker:nA,revokeReason:kA});r.push(VA)}),r.length>0&&(yield this._messageHelper.updateRevokerInfo(r),g.emitOuterEvent(u.MESSAGE_REVOKED,{name:u.MESSAGE_REVOKED,data:r}))})}_handleC2CRevokeMessagesFromUnreadMessageSync(s){return mA(this,void 0,void 0,function*(){const{revokedMessageList:r}=s.result;yield this._parseAndEmitC2CRevokedMessages(r)})}dispose(){const{notificationCenter:s,InnerEvent:{MESSAGE_PUSH:r},InnerEventSubType:{C2C_REVOKED_MESSAGE:g}}=this._core;s.unSubscribeInnerEvent(r,g,this._handleC2CNotifyMessage,this)}},yC=class{init(s){this._messageHelper=new Or(s),this._core=s;const{notificationCenter:r,InnerEvent:{MESSAGE_PUSH:g},InnerEventSubType:{GROUP_MESSAGE_REVOKED:u}}=s;r.subscribeInnerEvent(g,u,this._handleGroupNotifyMessage,this)}_handleGroupNotifyMessage(s){const{GroupTips:r}=s;r?.forEach(g=>{var u;Array.isArray((u=g?.MsgBody)===null||u===void 0?void 0:u.GroupWithdrawInfoArray)&&this._handleGroupRevokeMessage(g)})}_handleGroupRevokeMessage(s){return mA(this,void 0,void 0,function*(){try{const{RevokerInfo:r,MsgBody:{GroupWithdrawInfoArray:g},GroupInfo:u}=s,E=[],f=[],{notificationCenter:D,OuterEvent:v,utils:{isEmpty:N},common:{isCommunity:P}}=this._core;let W=!1;u&&(W=P({groupID:u.GroupId})||!N(u.TopicId)),g.forEach(nA=>{const{Random:EA,MsgSeq:wA,GroupId:kA,MsgClientTime:VA,TinyId:LA,TopicId:SA,RevokerInfo:{Revoker_Account:PA=r?.Revoker_Account||"",Reason:zA=r?.Reason||""}}=nA,Ee=SA?`GROUP${SA}`:`GROUP${kA}`,Ie=this._messageHelper.generateRevokeMessage({conversationID:Ee,sequence:wA,random:EA,tinyID:LA,clientTime:VA,revoker:PA,revokeReason:zA});W?(Ie.revokerInfo.nick=u.From_AccountNick,Ie.revokerInfo.avatar=u.From_AccountHeadurl,E.push(Ie)):f.push(Ie)}),f.length>0&&(yield this._messageHelper.updateRevokerInfo(f),E.push(...f)),E.length!==0&&D.emitOuterEvent(v.MESSAGE_REVOKED,{name:v.MESSAGE_REVOKED,data:E})}catch(r){console.debug(r)}})}dispose(){const{notificationCenter:s,InnerEvent:{MESSAGE_PUSH:r},InnerEventSubType:{GROUP_MESSAGE_REVOKED:g}}=this._core;s.unSubscribeInnerEvent(r,g,this._handleGroupNotifyMessage,this)}};var su=new class{constructor(){this._c2cMessageReceiver=new Vu,this._groupMessageReceiver=new yC}init(s){this._c2cMessageReceiver.init(s),this._groupMessageReceiver.init(s)}dispose(){this._c2cMessageReceiver.dispose(),this._groupMessageReceiver.dispose()}},dh=new class{constructor(){this._core=null}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"translateText",context:this})}translateText(s){return mA(this,void 0,void 0,function*(){try{const{sourceLanguage:r,sourceTextList:g,targetLanguage:u}=s,E=yield function(f,D){return mA(this,void 0,void 0,function*(){var v,N;const{sourceTextList:P,sourceLanguage:W,targetLanguage:nA}=f,{store:EA,common:wA}=D,kA={SourceText:P,Source:W,Target:nA,FromAccount:(v=EA.get("login"))===null||v===void 0?void 0:v.tinyID,SDKAppID:(N=EA.get("instance"))===null||N===void 0?void 0:N.sdkAppId},VA=yield wA.buildAndSendPacket({servcmd:"im_open_translate.ws_batch_trans_text",data:kA});if(VA){const{CmdErrorCode:LA,TargetText:SA}=VA;return{cmdErrorCode:LA,translatedTextList:SA}}})}({sourceLanguage:r,sourceTextList:g,targetLanguage:u},this._core);if(E){const{cmdErrorCode:{ErrorCode:f,ErrorInfo:D},translatedTextList:v}=E;if(f===0)return{code:0,data:{translatedTextList:v}};throw{errorCode:f,errorInfo:D,message:D}}}catch(r){const{errorCode:g,errorInfo:u}=r||{};throw new this._core.helper.ChatError({functionName:"translateText",code:g,message:u})}})}},Hu=new class{init(s){this._core=s,s.helper.registerApi({apiName:"convertVoiceToText",context:this})}convertVoiceToText(s){return mA(this,void 0,void 0,function*(){var r;const{message:g,language:u=Fc.ZH_PY}=s;let{url:E}=g.payload||{};const f=this._core.common.getCurrentUserID();g.from===f&&g.flow==="out"&&(E=g.payload.remoteAudioUrl),this._validateVoiceFormat(E);const D=((r=DI.exec(E))===null||r===void 0?void 0:r[1])||"mp3",v=yI[u]||iu;try{const N=yield function(P){var W;const{store:nA,common:EA}=Wn.core,{url:wA,format:kA,serverLanguageType:VA}=P,LA={BytesUrl:wA,BytesEngServiceType:VA,BytesVoiceFormat:kA,Uint32Sdkappid:(W=nA.get("instance"))===null||W===void 0?void 0:W.sdkAppId,Uint64SourceType:0};return EA.buildAndSendPacket({servcmd:"im_open_speech.ws_sentence_recognition",data:LA})}({url:E,format:D,serverLanguageType:v});if(N){const{CmdErrorCode:P,BytesResult:W}=N;if(P.ErrorCode===0)return{code:0,data:{result:W}};throw{code:P.ErrorCode,message:P.ErrorInfo}}}catch(N){const{code:P,message:W}=N||{};throw new this._core.common.ChatError({functionName:"convertVoiceToText",code:P,message:W})}})}_validateVoiceFormat(s){if(!DI.test(s))throw new this._core.common.ChatError({code:2119})}};class vI{constructor(r){const{constants:g,common:u,utils:E}=Wn.core,{CONV_C2C:f,CONV_GROUP:D}=g.OuterConstant,{ID:v,tinyID:N,from:P,to:W,clientTime:nA=u.timeManager.getServerTimeSeconds()||0,random:EA,sequence:wA,cloudCustomData:kA="",nick:VA="",avatar:LA="",clientSequence:SA,conversationType:PA,groupID:zA,_elements:Ee,time:Ie}=r;this.ID=v||`${N}-${nA}-${EA}`,this.messageRandom=EA,this.from=P,this.messageSender=P,this.time=Ie,this.messageSequence=wA,this.clientSequence=SA||wA,this.clientTime=nA,this.cloudCustomData=kA,this.messageReceiver=W,this.avatar=LA,this.nick=VA;const Li=E.deepCopyWithMethods(Ee);Li.forEach(Ui=>{Ui.payload=Ui.content,delete Ui.content}),this.messageBody=Li,v?PA.startsWith(f)?this.receiverUserID=W:PA.startsWith(D)&&(this.receiverGroupID=W):zA?(this.receiverGroupID=zA,this.messageReceiver=zA):W&&(this.receiverUserID=W,this.messageReceiver=W)}transformElementsToServerFormat(){return this.messageBody?Array.isArray(this.messageBody)?this.messageBody.map(r=>r.transformToServerFormat({isMergerMessage:!0})):this.messageBody.transformToServerFormat({isMergerMessage:!0}):null}}class El{static parseServerPushElement(r){const{MsgContent:g}=r,{MsgList:u=[],CompatibleText:E,AbstractList:f,Title:D,PbMsgKey:v,JsonMsgKey:N}=g||{},P=u.map(W=>Dr(W));return new El({messageList:P,title:D,abstractList:f,compatibleText:E,pbDownloadKey:v,downloadKey:N})}constructor(r){this.type=Wn.core.constants.OuterConstant.MSG_MERGER;const{messageList:g,title:u,abstractList:E,compatibleText:f,pbDownloadKey:D="",downloadKey:v="",version:N=0,layersOverLimit:P=!1}=r,W=[];g.forEach(nA=>{if(nA){const EA=new vI(nA);W.push(EA)}}),this.content={messageList:W,title:u,abstractList:E,compatibleText:f,version:N,downloadKey:v,pbDownloadKey:D,layersOverLimit:P}}validateBeforeSend(){const{isEmpty:r}=Wn.core.helper;return r(this.content.messageList)?{isValid:!1,error:{message:"content is invalid"}}:{isValid:!0}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{abstractList:E,compatibleText:f,downloadKey:D,layersOverLimit:v,pbDownloadKey:N,title:P,version:W,messageList:nA}=u;return{MsgType:this.type,MsgContent:{AbstractList:E,CompatibleText:f,JsonMsgKey:D,LayersOverLimit:v,PbMsgKey:N,Title:P,Version:W,MsgList:sc(nA)}}}}var DC=new class{init(s){this._core=s;const{message:r,helper:g,constants:{OuterConstant:u}}=s;r.messageFactory.registerElementClass(u.MSG_MERGER,El),g.registerApi({apiName:"createMergerMessage",context:this}),g.registerApi({apiName:"sendMessage",context:this,matcher:E=>E[0].type===u.MSG_MERGER}),g.registerApi({apiName:"downloadMergerMessage",context:this})}createMergerMessage(s){const{common:r}=this._core;if(!s)return null;const g=new El(s.payload),u=r.getCurrentUserID(),E=this._core.message.messageFactory.createMessage(Object.assign(Object.assign({},s),{from:u}));return E.setRelayFlag(!0),E.setElement(g),E}sendMessage(s,r){return mA(this,void 0,void 0,function*(){var g,u,E;try{const f=function(P){let W="utf-8";Wn.core.helper.IN_BROWSER&&document&&(W=document.charset.toLowerCase());let nA,EA=0,wA=0;if(wA=P.length,W==="utf-8"||W==="utf8")for(let kA=0;kA11264){D=this._core.utils.deepCopyWithMethods(s);try{const{JsonMsgKey:P,PbMsgKey:W}=yield function(EA){return mA(this,void 0,void 0,function*(){const{payload:{messageList:wA}}=EA,kA={MsgList:sc(wA)};return Wn.core.common.buildAndSendPacket({servcmd:"im_long_msg.save_relay_json_msg",data:kA})})}(D),{payload:nA}=D;v=new El(Object.assign(Object.assign({},nA),{messageList:[],downloadKey:P,pbDownloadKey:W})),D.setElement(v)}catch(P){console.error(P)}}const{data:{message:N}}=yield(E=(u=(g=this._core)===null||g===void 0?void 0:g.message)===null||u===void 0?void 0:u.messageSender)===null||E===void 0?void 0:E.sendMessage(D,r);return v&&N.setElement(s._elements),{code:0,data:{message:N}}}catch(f){const{errorCode:D}=f;throw new this._core.helper.ChatError({code:D})}})}downloadMergerMessage(s){return mA(this,void 0,void 0,function*(){const{ssoLog:r}=this._core,g=s.payload,{downloadKey:u,pbDownload:E,type:f,messageList:D}=g,v=vo(g,["downloadKey","pbDownload","type","messageList"]);try{const N=yield function(nA){return mA(this,void 0,void 0,function*(){return Wn.core.common.buildAndSendPacket({servcmd:"im_long_msg.get_relay_json_msg",data:{JsonMsgKey:nA}})})}(u),{MsgList:P}=N||{},W=P?.map(nA=>{const EA=Dr(nA);return new vI(EA)});return typeof s.isOnlineMessage=="function"?s.setElement({type:s.type,content:Object.assign({messageList:W},v)}):(s.payload.messageList=W,s.payload.downloadKey="",s.payload.pbDownloadKey=""),r.info("downloadMergerMessage",` success downloadKey:${u}`),s}catch(N){const{errorCode:P}=N;throw new this._core.helper.ChatError({functionName:"downloadMergerMessage",code:P,moreMessage:u})}})}},Ia=new class{init(s){this._core=s,this._core.helper.registerExperimentalAPI("sendComboMessage",this)}sendComboMessage(s){return mA(this,void 0,void 0,function*(){const{appStore:r,message:g,common:{getCurrentUserID:u},utils:{isArray:E}}=this._core,{GroupId:f,To_Account:D}=s;s.From_Account=s.From_Account||u();let v=null;if(f){v=this._generateGroupMessage(Object.assign(Object.assign({},s),{ToGroupId:f}));const N=r.userStore.getUserProfile(u());v.level=N?.level||0,E(D)&&D.length>0&&(v._receiverList=D)}else D&&(v=this._generateC2CMessage(s));return g.messageSender.sendMessage(v,s)})}_generateC2CMessage(s){const{message:r,OuterConstant:{CONV_C2C:g}}=this._core,u=g,E=r.messageHelper.parseServerPushMessage(s),f=r.messageFactory.createMessage(Object.assign(Object.assign({},E),{conversationType:u,flow:rc.OUT})),{elements:D}=E;return f.setElement(D),f}_generateGroupMessage(s){const{message:r,OuterConstant:{CONV_GROUP:g}}=this._core,u=g,E=r.messageHelper.parseServerGroupMessage(s),f=r.messageFactory.createMessage(Object.assign(Object.assign({},E),{conversationType:u,flow:rc.OUT})),{elements:D}=E;return f.setElement(D),f}},ac=new class{init(s){this._core=s;const{helper:r,notificationCenter:g,InnerEvent:{MESSAGE_PUSH:u},InnerEventSubType:{GROUP_MESSAGE_PINNED:E}}=s;g.subscribeInnerEvent(u,E,this._handleGroupMessagePinned,this),r.registerApi({apiName:"pinGroupMessage",context:this}),r.registerApi({apiName:"getPinnedGroupMessageList",context:this})}pinGroupMessage(s){return mA(this,void 0,void 0,function*(){const{ssoLog:r,common:{isTopic:g},OuterConstant:{GROUP_ID_PREFIX:u},helper:{ChatError:E}}=this._core;let{groupID:f,message:D,isPinned:v}=s;const{sequence:N}=D;try{return yield function(P){return mA(this,void 0,void 0,function*(){const{common:{buildAndSendPacket:W,getCurrentUserID:nA}}=Wn.core,{groupID:EA,sequence:wA,isPinned:kA}=P,VA=nA(),LA=kA?"group_open_http_svc.pin_message":"group_open_http_svc.unpin_message",SA={GroupId:EA,MsgSeq:wA};return kA?SA.Pinner_Account=VA:SA.UnPinner_Account=VA,W({servcmd:LA,data:SA})})}({groupID:f,sequence:N,isPinned:v}),{code:0,data:{}}}catch(P){const{errorCode:W,errorInfo:nA}=P||{};throw new E({code:W,message:nA})}})}getPinnedGroupMessageList(s){return mA(this,void 0,void 0,function*(){let r=[];try{const g=yield function(u){return mA(this,void 0,void 0,function*(){const{groupID:E}=u,{common:{buildAndSendPacket:f}}=Wn.core;return f({servcmd:"group_open_http_svc.get_pinned_messages",data:{GroupId:E}})})}({groupID:s});if(g){const{PinnedMsgList:u=[]}=g;r=yield this._updatePinnedMessageInfo({serverPinnedMessageList:u,groupID:s})}return{code:0,data:{messageList:r}}}catch(g){throw g}})}_handleGroupMessagePinned(s){const{message:{messageHelper:r,messageFactory:g},notificationCenter:u,OuterEvent:E,OuterConstant:f}=this._core;s.GroupTips.forEach(D=>{const{ToGroupId:v,MsgBody:{PinnedMsg:N,OpType:P,MsgOperatorMemberExtraInfo:W,SdkGroupMessageId:nA}}=D,{UserId:EA,NickName:wA="",ImageUrl:kA=""}=W;let VA=null,LA=!1;if(P===yd){LA=!0;const SA=r.parseServerGroupMessage(N);VA=g.createMessage(Object.assign(Object.assign({},SA),{conversationType:f.CONV_GROUP,flow:"in"})),VA.setElement(SA.elements),VA.pinnerInfo={userID:EA,nick:wA,avatar:kA}}else if(P===FE){const{ClientTime:SA,Random:PA,SenderTinyId:zA,ServerTime:Ee,MsgSeq:Ie}=nA;VA={ID:`${zA}-${SA}-${PA}`,sequence:Ie,random:PA,time:Ee,clientTime:SA}}VA&&u.emitOuterEvent(E.PINNED_GROUP_MESSAGE_UPDATED,{name:E.PINNED_GROUP_MESSAGE_UPDATED,data:{groupID:v,message:VA,isPinned:LA,operatorInfo:{userID:EA,nick:wA,avatar:kA}}})})}_findMessageBySequence(s,r){const{message:{messageDataHandler:g}}=this._core;return[...g.getLocalMessageList(s),...g.getSparseMessageList(s)].find(u=>u.sequence===r)}_updatePinnedMessageInfo(s){return mA(this,arguments,void 0,function*({serverPinnedMessageList:r,groupID:g}){const{OuterConstant:{CONV_GROUP:u},utils:{isEmpty:E}}=this._core,f=[],D=[],v=[],N=new Map,P=`${u}${g}`;for(let nA=0;nA{const{sequence:kA}=wA,VA=N.get(kA),LA=nA[VA]||{userID:VA,nick:"",avatar:""};wA.pinnerInfo=LA}),f.sort((wA,kA)=>wA.sequence-kA.sequence),f}return[]})}_fetchPinnedMessageInfo(s){return mA(this,void 0,void 0,function*(){var r,g;const{message:{messageHistory:u},user:{userProfile:E},utils:{isArray:f}}=this._core,{conversationID:D,messageSequenceList:v,pinnerIDList:N}=s,P=yield Promise.all([this._fetchMessageBySequence({conversationID:D,messageSequenceList:v}),E?.getUserProfile({userIDList:N})]);if(f(P)){const W={};return(((r=P[1])===null||r===void 0?void 0:r.data)||[]).forEach(nA=>{const{userID:EA,nick:wA="",avatar:kA=""}=nA;W[EA]={userID:EA,nick:wA,avatar:kA}}),{messageList:((g=P[0])===null||g===void 0?void 0:g.messageList)||[],pinnerInfoMap:W}}})}_fetchMessageBySequence(s){return mA(this,void 0,void 0,function*(){const{utils:{isEmpty:r},message:{messageHistory:g}}=this._core,{conversationID:u,messageSequenceList:E}=s;return r(E)?[]:g.getGroupRoamingMessagesByAnchor({conversationID:u,messageSequenceList:E,getType:3})})}};class Eg{constructor(r){this.eventType=Oc.DATA,this.index=0,this.markdown="",this.isLast=!1,this.binaryData=null;const{EventType:g,Index:u,Markdown:E,IsLast:f,BinaryData:D}=r;this.eventType=g,this.index=u,this.markdown=E,this.isLast=f,this.binaryData=D}}var MI=new class{constructor(){this._messageMap=new Map,this._retryCountMap=new Map}init(s){this._core=s;const{notificationCenter:r,OuterEvent:{MESSAGE_RECEIVED:g},InnerEvent:{HISTORY_MESSAGE_FETCHED:u},common:{workflowManager:E},constants:{WORKFLOW_NAME:f,WORKFLOW_STEP:D}}=s;r.subscribeInnerEvent(ho,this._handleStreamMessageChunkPush,this),r.subscribeOuterEvent(g,this._handleMessageReceived,this),r.subscribeInnerEvent(u,this.processHistoryMessage,this),E.registerWorkflowStep(f.SYNC_SERVER_INFO_AFTER_RE_ONLINE,D.STREAM_MESSAGE_RECOVER,this._recoverStreamMessage,this)}processHistoryMessage(s){const{utils:{isEmpty:r,safeStringify:g},ssoLog:u}=this._core;try{s?.forEach(E=>{var f;if(this._isValidStreamMessage(E)){const D=(f=E?._elements)===null||f===void 0?void 0:f[0],{streamMessageID:v,markdown:N,binaryData:P}=D?.content||{};r(N)&&r(P)?(this._messageMap.set(v,E),this._fetchStreamMessageChunks(E)):D.content.isStreamEnded=!0}})}catch(E){u.error("processHistoryMessage.error",g(E))}}_handleMessageReceived(s){const r=s.data;r?.forEach(g=>{var u,E;if(this._isValidStreamMessage(g)){const{streamMessageID:f}=((E=(u=g?._elements)===null||u===void 0?void 0:u[0])===null||E===void 0?void 0:E.content)||{};f&&(this._messageMap.set(f,g),this._fetchStreamMessageChunks(g))}})}_isValidStreamMessage(s){var r,g;const{utils:{isEmpty:u}}=this._core,{streamMessageID:E}=((g=(r=s?._elements)===null||r===void 0?void 0:r[0])===null||g===void 0?void 0:g.content)||{};return s.type===Kr.MSG_STREAM&&!u(E)}_fetchStreamMessageChunks(s){return mA(this,void 0,void 0,function*(){var r,g;const{constants:{ERROR_CODE:u},ssoLog:E,utils:{safeStringify:f}}=this._core,D=(r=s._elements)===null||r===void 0?void 0:r[0],v=(g=D?.content)===null||g===void 0?void 0:g.streamMessageID;try{const{from:N,to:P}=s,W=D.getLatestIndex();if(D.content.isStreamEnded)return;const nA=yield function(EA){return mA(this,void 0,void 0,function*(){const{from:wA,to:kA,streamMessageID:VA,index:LA}=EA,SA={From_Account:wA,To_Account:kA,StreamMsgID:VA,AckIndex:LA};return Wn.core.common.buildAndSendPacket({servcmd:"StreamMsg.GetStreamHttp",data:SA,timeout:5e3})})}({from:N,to:P,streamMessageID:v,index:W});if(nA){const{ErrorCode:EA,ErrorInfo:wA}=nA;if(EA!==0)throw D.content.errorCode=EA,D.content.errorMessage=wA,{errorCode:EA,errorMessage:wA}}}catch(N){if(N.errorCode===u.NETWORK_TIMEOUT&&this._shouldRetryFetch(v)){const P=this._retryCountMap.get(v)||0;E.debug("_fetchStreamMessageChunks.timeout",`error: ${f(N)} retried: ${P}`),this._retryCountMap.set(v,P+1),this._fetchStreamMessageChunks(s)}else E.error("_fetchStreamMessageChunks.error",f(N))}})}_shouldRetryFetch(s){const{utils:{isNumber:r}}=this._core;if(!this._retryCountMap.has(s))return this._retryCountMap.set(s,1),!0;const g=this._retryCountMap.get(s);return!!(r(g)&&g<=3)}_onStreamEnded(s,r,g){const{ssoLog:u}=this._core;g.content.isStreamEnded=!0,g.stopReason=r,this._messageMap.delete(s),u.debug("_onStreamEnded",`streamMessage end, StopReason: ${r}`)}_handleStreamMessageChunkPush(s){var r;const{ssoLog:g}=this._core,{StopReason:u,Chunks:E,StreamID:f}=s?.body||{},D=this._messageMap.get(f);if(!D)return void g.warn(`_handleStreamMessageChunkPush, unfounded message: ${f}`);const v=(r=D._elements)===null||r===void 0?void 0:r[0];if(v&&this._validateExpectedChunk(v,E)){if(E.length>0){const N=E.map(P=>new Eg(P));v.updateChunks(N)}this._emitMessageModify(D),function(N,P){mA(this,void 0,void 0,function*(){const{common:{generateProtocolData:W},utils:{safeStringify:nA},ssoLog:EA,channel:wA}=Wn.core,kA={StreamMsgID:N,AckIndex:P};try{const VA=W({servcmd:"StreamMsg.AckHttp",data:kA});wA.sendPacket(VA)}catch(VA){EA.debug("sendStreamChunkAck",nA(VA))}})}(f,v.getLatestIndex()),v.content.isStreamEnded&&this._onStreamEnded(f,u,v)}}_emitMessageModify(s){const{notificationCenter:r,OuterEvent:{MESSAGE_MODIFIED:g}}=this._core;r.emitOuterEvent(g,{name:g,data:[s]})}_validateExpectedChunk(s,r){const g=s.getLatestIndex()+1;let u=!1;for(let E=0;Ef.Index).join(", ")}]`),!1}return!0}_recoverStreamMessage(){this._retryCountMap.clear();const{ssoLog:s,utils:{safeStringify:r}}=this._core;try{const g=Array.from(this._messageMap.entries());for(let u=Math.max(0,g.length-300);u{const LA=this._getResponseBody(kA,E,nA&&EA),SA=this._buildResponse(kA,LA);if(kA.status===200)r(null,SA);else{if(EA&&!wA.includes(EA))return s.url=this._domainName2IP(wA,EA),s.uploadByIP=!0,this.request(s,r);r({code:kA.status,message:JSON.stringify(kA.responseText)},SA)}},kA.onerror=()=>{const LA=this._getResponseBody(kA,E,nA&&EA),SA=this._buildResponse(kA,LA),PA={code:kA.status,message:kA.status===0?"CORS blocked or network error":JSON.stringify(kA.responseText)};r(PA,SA)},s.onProgress&&kA.upload&&(kA.upload.onprogress=LA=>{const{total:SA,loaded:PA}=LA,zA=Math.min(Math.floor(100*PA/SA),100);s.onProgress({total:SA,loaded:PA,percent:zA/100})}),kA.send(P),kA})}_buildResponse(s,r){const g={};return s.getAllResponseHeaders().trim().split(`
+`).forEach(u=>{if(u){const[E,f]=u.split(":").map(D=>D.trim());g[E.toLowerCase()]=f}}),{statusCode:s.status,statusMessage:s.statusText,headers:g,data:r}}_getResponseBody(s,r,g){return s.status===200&&r?{location:r,uploadIP:g}:{response:s.responseText,uploadIP:g}}_queryString(s,r="&",g="="){var u;const{isEmpty:E,isPlainObject:f}=(u=this._core)===null||u===void 0?void 0:u.utils;return E(s)?"":f(s)?Object.keys(s).map(D=>{const v=encodeURIComponent(D)+g;return Array.isArray(s[D])?s[D].map(N=>v+encodeURIComponent(N)).join(r):v+encodeURIComponent(s[D])}).filter(Boolean).join(r):void 0}_domainName2IP(s,r){return s.replace(/^http(s)?:\/\/(.*?)\//,`https://${r}/`)}};const qu=["unknown","image","video","audio","log"];var RI=new class{init(s){this._core=s}request(s,r){var g;const{MINI_APP_NAMESPACE:u,IN_ALIPAY_MINI_APP:E,isUniIOSApp:f}=(g=this._core)===null||g===void 0?void 0:g.utils,{resources:D="",headers:v={},url:N,downloadUrl:P=""}=s;let W=N,nA=null;const EA=P?P.match(/^(https?:\/\/[^/]+\/)([^/]*\/?)(.*)$/):null;if(!EA)return void console.warn("message Invalid download URL format");const wA=decodeURIComponent(EA[3]),kA=wA.includes("?")?wA.split("?")[0]:wA||"",VA={key:s.fileKey||kA,success_action_status:200,"Content-Type":""},LA={};if(f()){const[PA,zA]=N.split("?sign=");zA&&(W=`${PA}?sign=${encodeURIComponent(zA)}`,LA.sign=decodeURIComponent(zA),LA.signature=decodeURIComponent(zA))}let SA={url:W,header:v,name:"file",filePath:D,formData:Object.assign(Object.assign({},VA),LA),timeout:s.timeout||3e5};if(E){const{name:PA}=SA,zA=vo(SA,["name"]);SA=Object.assign(Object.assign({},zA),{fileName:"file",fileType:s.fileType?qu[s.fileType]:"image"})}return nA=u.uploadFile(Object.assign(Object.assign({},SA),{success:PA=>{this._handleResponse({response:PA,downloadUrl:P,callback:r})},fail:PA=>{this._handleResponse({response:PA,downloadUrl:P,callback:r})}})),nA.onProgressUpdate&&nA.onProgressUpdate(PA=>{s.onProgress&&s.onProgress({total:PA.totalBytesExpectedToSend||0,loaded:PA.totalBytesSent||0,percent:PA.progress?Math.floor(PA.progress)/100:0})}),nA}_handleResponse(s){const{downloadUrl:r,response:g,callback:u}=s,E={};if(g.header)for(const D in g.header)g.header.hasOwnProperty(D)&&(E[D.toLowerCase()]=g.header[D]);const f=+g.statusCode;f===200?u(null,{statusCode:f,headers:E,data:Object.assign(Object.assign({},g.data),{location:r})}):u({code:f,message:JSON.stringify(g.data)},{statusCode:f,headers:E,data:void 0})}};function dl(s){return function(r){return Object.prototype.toString.call(r).match(/^\[object (.*)\]$/)[1].toLowerCase()}(s)==="file"}function Pr(s){const r=s||99999999;return Math.round(Math.random()*r)}function xr(s,r=!0,g=!0){const u=Date.now();return r?g?u-s+" ms":`${Math.round((u-s)/1e3)} s`:g?u-s:Math.round((u-s)/1e3)}function dg(s){return`${Array.from({length:8},()=>Math.floor(65536*(1+Math.random())).toString(16).substring(1)).join("")}-${s}`}function hr(s,r){return Math.round(Number(s)*10**r)/10**r}function Nr(s){return s<=1048576?`${hr(s/1024,1)}KB/s`:`${hr(s/1048576,1)}MB/s`}const gc="TIMImageElem",xg="TIMSoundElem",Ka="TIMFileElem",Vl="TIMVideoFileElem",ya="RichMediaMessagePlugin",wI=["rich.my-imcloud.com","imrich.qcloud.com"],ru=1,Da=2,Cl=3,VE=255;var au;(function(s){s.UNSENT="unSend",s.SUCCESS="success",s.FAIL="fail"})(au||(au={}));const HE={wechat:/^(wxfile:\/\/tmp_|http:\/\/temp\/|cloud:\/\/temp-)/,alipay:/^(https:\/\/resource\/|alipayfile:\/\/tmp\/)/,baidu:/^(http:\/\/tmp\/|swanfile:\/\/tmp_)/,bytedance:/^(ttfile:\/\/tmp_|\/(var|tmp)\/|tttemp:\/\/)/,qq:/^(qqfile:\/\/tmp_|http:\/\/qtemp\/)/},jr=Symbol("isCustomUpload");var gu,Vt=new class{init(s){this._core=s}addAuthToUrl(s=""){if(this._isMiniProgramTempFile(s))return s;const r=function(g){return g?g.startsWith("https://")?g:g.startsWith("http://")?g.replace("http://","https://"):g:""}(s);return this.processResourceUrl(r)}removeAuthToUrl(s){return function(r,g){const[u,E]=r.split("?");if(!E)return u;const f=E.split("&").reduce((v,N)=>{const[P,W]=N.split("=");return P&&P!==g&&(v[P]=W||""),v},{}),D=Object.keys(f).map(v=>`${v}${f[v]?`=${f[v]}`:""}`).join("&");return D?`${u}?${D}`:u}(s,"authKey")}_isMiniProgramTempFile(s){return!!this.getPlatformFlags().IN_MINI_APP&&Object.values(HE).some(r=>r.test(s))}extractFileFromInput(s){const{utils:{isArray:r}}=this._core;return dl(s)?s:function(g){if(typeof g!="object"||g===null)return!1;const u=Object.getPrototypeOf(g);if(u===null)return!0;let E=u;for(;Object.getPrototypeOf(E)!==null;)E=Object.getPrototypeOf(E);return u===E}(s)&&typeof uni<"u"?r(s.tempFiles)&&s.tempFiles.length>0?s.tempFiles[0]:r(s.files)?s.files[0]:s.tempFile?s.tempFile:null:s instanceof HTMLInputElement&&s.files&&s.files.length>0?s.files[0]:null}probeImageWidthHeight(s){return mA(this,void 0,void 0,function*(){var r;const{IN_MINI_APP:g,IN_BROWSER:u}=((r=this._core)===null||r===void 0?void 0:r.utils)||{};return this._shouldSkipProbing()?{width:0,height:0}:u?this._probeImageDimensionsWeb(s):g?this._probeImageDimensionsMiniApp(s):void 0})}isSimpleCos(){var s;const r=((s=this._core)===null||s===void 0?void 0:s.store.get("cloudConfig"))||{},{simple_cos:g}=r;return g!=="0"}getFileDNList(){var s;let r=wI;const g=((s=this._core)===null||s===void 0?void 0:s.store.get("cloudConfig"))||{},{file_dn_list:u}=g;if(u===void 0)return r;try{JSON.parse(u).forEach(E=>{r.includes(E)||r.push(E)})}catch(E){console.warn(E),r=wI}return r}getPlatform(){var s;return(s=this._core)===null||s===void 0?void 0:s.utils.platform}generateUUID(s,r){var g;let u=`${this.getSDKAppID()}-${this.getCurrentUserID()}-${(g=this._core)===null||g===void 0?void 0:g.utils.randomString()}`;if(r)return`${u}.${r}`;const E=s.name||s.value||s.url||s.tempFilePath,f=E&&E.slice(E.lastIndexOf(".")+1);return f&&(u=`${u}.${f}`),u}processResourceUrl(s){if(!s)return"";let r=s;const g=this.getFileDownloadProxy(),u=this.getAuthKey(),E=this.getFileDNList();return g&&(s.startsWith("http://")?r=s.replace(/^http:\/\/[^/]+/,g):s.startsWith("https://")&&(r=s.replace(/^https:\/\/[^/]+/,g))),u&&r.indexOf("authKey=")===-1&&function(D,v){let N=!1;if(D){const P=D.match(/:\/\/([0-9]?\.)?(.[^/:]+)/),W=P&&P[2]||"";if(W.includes("rich-dev"))return!0;for(let nA=0;nA-1?`${r}&authKey=${u}`:`${r}?authKey=${u}`),r}getCurrentUserID(){var s,r;return(r=(s=this._core)===null||s===void 0?void 0:s.store.get("login"))===null||r===void 0?void 0:r.userId}getSDKAppID(){var s,r;return(r=(s=this._core)===null||s===void 0?void 0:s.store.get("instance"))===null||r===void 0?void 0:r.sdkAppId}getFileDownloadProxy(){var s,r;return((r=(s=this._core)===null||s===void 0?void 0:s.store.get("instance"))===null||r===void 0?void 0:r.fileDownloadProxy)||""}getFileUploadProxy(){var s,r;return((r=(s=this._core)===null||s===void 0?void 0:s.store.get("instance"))===null||r===void 0?void 0:r.fileUploadProxy)||""}getAuthKey(){var s,r;return((r=(s=this._core)===null||s===void 0?void 0:s.store.get("login"))===null||r===void 0?void 0:r.authKey)||""}isPrivateNetWork(){var s,r;return(r=(s=this._core)===null||s===void 0?void 0:s.store.get("instance"))===null||r===void 0?void 0:r.proxyServer}getPlatformFlags(){var s;const{IN_BROWSER:r,IN_MINI_APP:g,IN_RN_APP:u,IN_UNI_NATIVE_APP:E}=(s=this._core)===null||s===void 0?void 0:s.utils;return{IN_BROWSER:r,IN_MINI_APP:g,IN_RN_APP:u,IN_UNI_NATIVE_APP:E}}isEmpty(s){var r;const{isEmpty:g}=(r=this._core)===null||r===void 0?void 0:r.utils;return g(s)}generateURL(s,r){const{needAddAuthToUrl:g=!0}=r||{};return g?this.addAuthToUrl(s):s}_probeImageDimensionsMiniApp(s){var r;const{MINI_APP_NAMESPACE:g}=((r=this._core)===null||r===void 0?void 0:r.utils)||{};return new Promise(u=>{g.getImageInfo({src:s,success:E=>u({width:E.width,height:E.height}),fail:()=>u({width:0,height:0})})})}_shouldSkipProbing(){var s;const{IN_RN_APP:r,IS_IE:g,IE_VERSION:u,IN_WX_MINI_GAME:E}=((s=this._core)===null||s===void 0?void 0:s.utils)||{};return r||g&&u===9||E}_probeImageDimensionsWeb(s){return new Promise(r=>{const g=new Image,u=()=>{g.onload=null,g.onerror=null,g.src=""};g.onload=()=>{r({width:g.width,height:g.height}),u()},g.onerror=()=>{r({width:0,height:0}),u()},g.src=s})}},Ku={exports:{}},ju=(gu||(gu=1,function(s){s.exports=function(r){var g=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];function u(LA,SA){var PA=LA[0],zA=LA[1],Ee=LA[2],Ie=LA[3];zA=((zA+=((Ee=((Ee+=((Ie=((Ie+=((PA=((PA+=(zA&Ee|~zA&Ie)+SA[0]-680876936|0)<<7|PA>>>25)+zA|0)&zA|~PA&Ee)+SA[1]-389564586|0)<<12|Ie>>>20)+PA|0)&PA|~Ie&zA)+SA[2]+606105819|0)<<17|Ee>>>15)+Ie|0)&Ie|~Ee&PA)+SA[3]-1044525330|0)<<22|zA>>>10)+Ee|0,zA=((zA+=((Ee=((Ee+=((Ie=((Ie+=((PA=((PA+=(zA&Ee|~zA&Ie)+SA[4]-176418897|0)<<7|PA>>>25)+zA|0)&zA|~PA&Ee)+SA[5]+1200080426|0)<<12|Ie>>>20)+PA|0)&PA|~Ie&zA)+SA[6]-1473231341|0)<<17|Ee>>>15)+Ie|0)&Ie|~Ee&PA)+SA[7]-45705983|0)<<22|zA>>>10)+Ee|0,zA=((zA+=((Ee=((Ee+=((Ie=((Ie+=((PA=((PA+=(zA&Ee|~zA&Ie)+SA[8]+1770035416|0)<<7|PA>>>25)+zA|0)&zA|~PA&Ee)+SA[9]-1958414417|0)<<12|Ie>>>20)+PA|0)&PA|~Ie&zA)+SA[10]-42063|0)<<17|Ee>>>15)+Ie|0)&Ie|~Ee&PA)+SA[11]-1990404162|0)<<22|zA>>>10)+Ee|0,zA=((zA+=((Ee=((Ee+=((Ie=((Ie+=((PA=((PA+=(zA&Ee|~zA&Ie)+SA[12]+1804603682|0)<<7|PA>>>25)+zA|0)&zA|~PA&Ee)+SA[13]-40341101|0)<<12|Ie>>>20)+PA|0)&PA|~Ie&zA)+SA[14]-1502002290|0)<<17|Ee>>>15)+Ie|0)&Ie|~Ee&PA)+SA[15]+1236535329|0)<<22|zA>>>10)+Ee|0,zA=((zA+=((Ee=((Ee+=((Ie=((Ie+=((PA=((PA+=(zA&Ie|Ee&~Ie)+SA[1]-165796510|0)<<5|PA>>>27)+zA|0)&Ee|zA&~Ee)+SA[6]-1069501632|0)<<9|Ie>>>23)+PA|0)&zA|PA&~zA)+SA[11]+643717713|0)<<14|Ee>>>18)+Ie|0)&PA|Ie&~PA)+SA[0]-373897302|0)<<20|zA>>>12)+Ee|0,zA=((zA+=((Ee=((Ee+=((Ie=((Ie+=((PA=((PA+=(zA&Ie|Ee&~Ie)+SA[5]-701558691|0)<<5|PA>>>27)+zA|0)&Ee|zA&~Ee)+SA[10]+38016083|0)<<9|Ie>>>23)+PA|0)&zA|PA&~zA)+SA[15]-660478335|0)<<14|Ee>>>18)+Ie|0)&PA|Ie&~PA)+SA[4]-405537848|0)<<20|zA>>>12)+Ee|0,zA=((zA+=((Ee=((Ee+=((Ie=((Ie+=((PA=((PA+=(zA&Ie|Ee&~Ie)+SA[9]+568446438|0)<<5|PA>>>27)+zA|0)&Ee|zA&~Ee)+SA[14]-1019803690|0)<<9|Ie>>>23)+PA|0)&zA|PA&~zA)+SA[3]-187363961|0)<<14|Ee>>>18)+Ie|0)&PA|Ie&~PA)+SA[8]+1163531501|0)<<20|zA>>>12)+Ee|0,zA=((zA+=((Ee=((Ee+=((Ie=((Ie+=((PA=((PA+=(zA&Ie|Ee&~Ie)+SA[13]-1444681467|0)<<5|PA>>>27)+zA|0)&Ee|zA&~Ee)+SA[2]-51403784|0)<<9|Ie>>>23)+PA|0)&zA|PA&~zA)+SA[7]+1735328473|0)<<14|Ee>>>18)+Ie|0)&PA|Ie&~PA)+SA[12]-1926607734|0)<<20|zA>>>12)+Ee|0,zA=((zA+=((Ee=((Ee+=((Ie=((Ie+=((PA=((PA+=(zA^Ee^Ie)+SA[5]-378558|0)<<4|PA>>>28)+zA|0)^zA^Ee)+SA[8]-2022574463|0)<<11|Ie>>>21)+PA|0)^PA^zA)+SA[11]+1839030562|0)<<16|Ee>>>16)+Ie|0)^Ie^PA)+SA[14]-35309556|0)<<23|zA>>>9)+Ee|0,zA=((zA+=((Ee=((Ee+=((Ie=((Ie+=((PA=((PA+=(zA^Ee^Ie)+SA[1]-1530992060|0)<<4|PA>>>28)+zA|0)^zA^Ee)+SA[4]+1272893353|0)<<11|Ie>>>21)+PA|0)^PA^zA)+SA[7]-155497632|0)<<16|Ee>>>16)+Ie|0)^Ie^PA)+SA[10]-1094730640|0)<<23|zA>>>9)+Ee|0,zA=((zA+=((Ee=((Ee+=((Ie=((Ie+=((PA=((PA+=(zA^Ee^Ie)+SA[13]+681279174|0)<<4|PA>>>28)+zA|0)^zA^Ee)+SA[0]-358537222|0)<<11|Ie>>>21)+PA|0)^PA^zA)+SA[3]-722521979|0)<<16|Ee>>>16)+Ie|0)^Ie^PA)+SA[6]+76029189|0)<<23|zA>>>9)+Ee|0,zA=((zA+=((Ee=((Ee+=((Ie=((Ie+=((PA=((PA+=(zA^Ee^Ie)+SA[9]-640364487|0)<<4|PA>>>28)+zA|0)^zA^Ee)+SA[12]-421815835|0)<<11|Ie>>>21)+PA|0)^PA^zA)+SA[15]+530742520|0)<<16|Ee>>>16)+Ie|0)^Ie^PA)+SA[2]-995338651|0)<<23|zA>>>9)+Ee|0,zA=((zA+=((Ie=((Ie+=(zA^((PA=((PA+=(Ee^(zA|~Ie))+SA[0]-198630844|0)<<6|PA>>>26)+zA|0)|~Ee))+SA[7]+1126891415|0)<<10|Ie>>>22)+PA|0)^((Ee=((Ee+=(PA^(Ie|~zA))+SA[14]-1416354905|0)<<15|Ee>>>17)+Ie|0)|~PA))+SA[5]-57434055|0)<<21|zA>>>11)+Ee|0,zA=((zA+=((Ie=((Ie+=(zA^((PA=((PA+=(Ee^(zA|~Ie))+SA[12]+1700485571|0)<<6|PA>>>26)+zA|0)|~Ee))+SA[3]-1894986606|0)<<10|Ie>>>22)+PA|0)^((Ee=((Ee+=(PA^(Ie|~zA))+SA[10]-1051523|0)<<15|Ee>>>17)+Ie|0)|~PA))+SA[1]-2054922799|0)<<21|zA>>>11)+Ee|0,zA=((zA+=((Ie=((Ie+=(zA^((PA=((PA+=(Ee^(zA|~Ie))+SA[8]+1873313359|0)<<6|PA>>>26)+zA|0)|~Ee))+SA[15]-30611744|0)<<10|Ie>>>22)+PA|0)^((Ee=((Ee+=(PA^(Ie|~zA))+SA[6]-1560198380|0)<<15|Ee>>>17)+Ie|0)|~PA))+SA[13]+1309151649|0)<<21|zA>>>11)+Ee|0,zA=((zA+=((Ie=((Ie+=(zA^((PA=((PA+=(Ee^(zA|~Ie))+SA[4]-145523070|0)<<6|PA>>>26)+zA|0)|~Ee))+SA[11]-1120210379|0)<<10|Ie>>>22)+PA|0)^((Ee=((Ee+=(PA^(Ie|~zA))+SA[2]+718787259|0)<<15|Ee>>>17)+Ie|0)|~PA))+SA[9]-343485551|0)<<21|zA>>>11)+Ee|0,LA[0]=PA+LA[0]|0,LA[1]=zA+LA[1]|0,LA[2]=Ee+LA[2]|0,LA[3]=Ie+LA[3]|0}function E(LA){var SA,PA=[];for(SA=0;SA<64;SA+=4)PA[SA>>2]=LA.charCodeAt(SA)+(LA.charCodeAt(SA+1)<<8)+(LA.charCodeAt(SA+2)<<16)+(LA.charCodeAt(SA+3)<<24);return PA}function f(LA){var SA,PA=[];for(SA=0;SA<64;SA+=4)PA[SA>>2]=LA[SA]+(LA[SA+1]<<8)+(LA[SA+2]<<16)+(LA[SA+3]<<24);return PA}function D(LA){var SA,PA,zA,Ee,Ie,Li,Ui=LA.length,Yt=[1732584193,-271733879,-1732584194,271733878];for(SA=64;SA<=Ui;SA+=64)u(Yt,E(LA.substring(SA-64,SA)));for(PA=(LA=LA.substring(SA-64)).length,zA=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],SA=0;SA>2]|=LA.charCodeAt(SA)<<(SA%4<<3);if(zA[SA>>2]|=128<<(SA%4<<3),SA>55)for(u(Yt,zA),SA=0;SA<16;SA+=1)zA[SA]=0;return Ee=(Ee=8*Ui).toString(16).match(/(.*?)(.{0,8})$/),Ie=parseInt(Ee[2],16),Li=parseInt(Ee[1],16)||0,zA[14]=Ie,zA[15]=Li,u(Yt,zA),Yt}function v(LA){var SA,PA,zA,Ee,Ie,Li,Ui=LA.length,Yt=[1732584193,-271733879,-1732584194,271733878];for(SA=64;SA<=Ui;SA+=64)u(Yt,f(LA.subarray(SA-64,SA)));for(PA=(LA=SA-64>2]|=LA[SA]<<(SA%4<<3);if(zA[SA>>2]|=128<<(SA%4<<3),SA>55)for(u(Yt,zA),SA=0;SA<16;SA+=1)zA[SA]=0;return Ee=(Ee=8*Ui).toString(16).match(/(.*?)(.{0,8})$/),Ie=parseInt(Ee[2],16),Li=parseInt(Ee[1],16)||0,zA[14]=Ie,zA[15]=Li,u(Yt,zA),Yt}function N(LA){var SA,PA="";for(SA=0;SA<4;SA+=1)PA+=g[LA>>8*SA+4&15]+g[LA>>8*SA&15];return PA}function P(LA){var SA;for(SA=0;SA"u"||ArrayBuffer.prototype.slice||function(){function LA(SA,PA){return(SA=0|SA||0)<0?Math.max(SA+PA,0):Math.min(SA,PA)}ArrayBuffer.prototype.slice=function(SA,PA){var zA,Ee,Ie,Li,Ui=this.byteLength,Yt=LA(SA,Ui),Oi=Ui;return PA!==r&&(Oi=LA(PA,Ui)),Yt>Oi?new ArrayBuffer(0):(zA=Oi-Yt,Ee=new ArrayBuffer(zA),Ie=new Uint8Array(Ee),Li=new Uint8Array(this,Yt,zA),Ie.set(Li),Ee)}}(),VA.prototype.append=function(LA){return this.appendBinary(W(LA)),this},VA.prototype.appendBinary=function(LA){this._buff+=LA,this._length+=LA.length;var SA,PA=this._buff.length;for(SA=64;SA<=PA;SA+=64)u(this._hash,E(this._buff.substring(SA-64,SA)));return this._buff=this._buff.substring(SA-64),this},VA.prototype.end=function(LA){var SA,PA,zA=this._buff,Ee=zA.length,Ie=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(SA=0;SA>2]|=zA.charCodeAt(SA)<<(SA%4<<3);return this._finish(Ie,Ee),PA=P(this._hash),LA&&(PA=kA(PA)),this.reset(),PA},VA.prototype.reset=function(){return this._buff="",this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},VA.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash.slice()}},VA.prototype.setState=function(LA){return this._buff=LA.buff,this._length=LA.length,this._hash=LA.hash,this},VA.prototype.destroy=function(){delete this._hash,delete this._buff,delete this._length},VA.prototype._finish=function(LA,SA){var PA,zA,Ee,Ie=SA;if(LA[Ie>>2]|=128<<(Ie%4<<3),Ie>55)for(u(this._hash,LA),Ie=0;Ie<16;Ie+=1)LA[Ie]=0;PA=(PA=8*this._length).toString(16).match(/(.*?)(.{0,8})$/),zA=parseInt(PA[2],16),Ee=parseInt(PA[1],16)||0,LA[14]=zA,LA[15]=Ee,u(this._hash,LA)},VA.hash=function(LA,SA){return VA.hashBinary(W(LA),SA)},VA.hashBinary=function(LA,SA){var PA=P(D(LA));return SA?kA(PA):PA},VA.ArrayBuffer=function(){this.reset()},VA.ArrayBuffer.prototype.append=function(LA){var SA,PA=wA(this._buff.buffer,LA),zA=PA.length;for(this._length+=LA.byteLength,SA=64;SA<=zA;SA+=64)u(this._hash,f(PA.subarray(SA-64,SA)));return this._buff=SA-64>2]|=zA[SA]<<(SA%4<<3);return this._finish(Ie,Ee),PA=P(this._hash),LA&&(PA=kA(PA)),this.reset(),PA},VA.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},VA.ArrayBuffer.prototype.getState=function(){var LA=VA.prototype.getState.call(this);return LA.buff=EA(LA.buff),LA},VA.ArrayBuffer.prototype.setState=function(LA){return LA.buff=nA(LA.buff,!0),VA.prototype.setState.call(this,LA)},VA.ArrayBuffer.prototype.destroy=VA.prototype.destroy,VA.ArrayBuffer.prototype._finish=VA.prototype._finish,VA.ArrayBuffer.hash=function(LA,SA){var PA=P(v(new Uint8Array(LA)));return SA?kA(PA):PA},VA}()}(Ku)),Ku.exports),SC=uI(ju),K=new class{constructor(){this.uploadFileTryCount=0,this.maxRetries=1,this.systemClockOffset=0,this.httpRequest=null,this.uploadFileType="",this.duration=900,this.fetchCosTryCount=0}init(s){var r;this._core=s;const{IN_MINI_APP:g}=s.utils;this.httpRequest=g?RI:Ju,(r=this.httpRequest)===null||r===void 0||r.init(s)}uploadToCOS(s){return mA(this,void 0,void 0,function*(){const r=`${ya} uploadToCOS`,{ssoLog:g,utils:{safeStringify:u}}=this._core,{file:E}=s;this.uploadFileType=s.uploadFileType,g.debug("uploadToCOS",`${r} options:${u(s)}`);try{const f=Date.now(),D=yield this._createCosOptions(s),v=D.fileExistsInCOS?{data:{location:D.downloadUrl}}:yield this._uploadFile(D);this._handleUploadError(v,s);const N=this._createUploadResult(E,v),P=Date.now()-f,W=function(EA){return EA<1024?`${EA}B`:EA<1048576?`${Math.floor(EA/1024)}KB`:`${Math.floor(EA/1048576)}MB`}(E.size),nA=`size:${W} time:${P}ms speed:${Nr(1e3*E.size/P)}`;return g.debug("uploadToCOS",`${r} ok. name:${E.name} ${nA}`),{uploadOptions:D,response:N}}catch(f){throw g.warn("uploadToCOS",`${r} failed, error:${u(f)}`),f}})}_handleUploadError(s,r){var g,u;const{ChatError:E}=(g=this._core)===null||g===void 0?void 0:g.helper;if(s.statusCode===403)throw r.url,!((u=s?.data)===null||u===void 0)&&u.uploadIP&&s.data.uploadIP,new E({message:"Upload failed with status 403"})}_createUploadResult(s,r){return{fileName:s.name,fileSize:s.size,fileType:s.type.slice(s.type.indexOf("/")+1).toLowerCase(),location:r.data.location||"",uploadTime:xr(Date.now(),!1),uploadSpeed:Nr(1e3*s.size/xr(Date.now(),!1))}}_createCosOptions(s){return mA(this,void 0,void 0,function*(){const{fileName:r,resources:g,uploadMethod:u}=yield this._prepareUploadParams(s),E=this._isC2CConversation(s.message.conversationID)?1:2;try{const f=yield this._fetchCosSignatureUrl({fileType:this.uploadFileType,fileName:r,uploadMethod:u,duration:this.duration,userID:s.message.from,conversationType:E}),{uploadUrl:D,downloadUrl:v,requestSnapshotUrl:N,thumbUrl:P,largeUrl:W,fileKey:nA,existFlag:EA}=f,wA=!Vt.isPrivateNetWork()&&f.uploadIP;return{url:this._getRawOrUploadProxyUrl(D),fileType:this.uploadFileType,fileName:r,resources:g,downloadUrl:v,requestSnapshotUrl:N,thumbUrl:P,largeUrl:W,fileKey:nA,uploadIP:wA||"",fileExistsInCOS:EA===1,onProgress:kA=>this._handleUploadProgress(kA,s)}}catch(f){throw console.error("Failed to create COS pre-signed URL options:",f),f}})}_prepareUploadParams(s){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g,isEmpty:u}}=this._core;r.debug("_prepareUploadParams",` prepareUploadParams:${g(s)}`);const{file:E}=s,{IN_MINI_APP:f,IN_RN_APP:D}=Vt.getPlatformFlags(),v=f||D,N=v&&s.message.type!==Ka,{name:P}=E,W=P.slice(P.lastIndexOf(".")),nA=`${Pr(999999)}${W}`,EA=N?E.name:nA,wA=yield this._generateHashFileName(E);return{fileName:u(wA)?dg(EA):`${wA}${W}`,resources:v?E.url:E,uploadMethod:v?1:0}})}_generateHashFileName(s){return mA(this,void 0,void 0,function*(){const{utils:{IN_MINI_APP:r,IN_BROWSER:g,IN_UNI_NATIVE_APP:u,isArray:E},ssoLog:f}=this._core,D=Date.now();let v="";return g&&(v=yield this._generateHashFileNameInWeb(s)),r&&(E(s.tempFiles)&&(s=s.tempFiles[0]),u||(v=yield this._generateFileNameInMiniProgram(s)),u&&(v=yield this._generateFileNameInUNINativeApp(s))),f.info("_generateHashFileName",`hashFileName:${v} costTime:${Date.now()-D}`),v})}_generateHashFileNameInWeb(s){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g}}=this._core;let u="";try{u=yield new Promise((E,f)=>{const D=File.prototype.slice||File.prototype.mozSlice||File.prototype.webkitSlice;D||(r.warn("_generateHashFileNameInWeb","Browser does not support file slicing"),E(""));const v=10485760,N=Math.ceil(s.size/v);let P=0;const W=new SC.ArrayBuffer,nA=new FileReader,EA=setTimeout(()=>{nA.abort(),r.warn("_generateHashFileNameInWeb","File hash generation timeout"),E("")},2e3);function wA(){const kA=P*v,VA=kA+v>=s.size?s.size:kA+v;nA.readAsArrayBuffer(D.call(s,kA,VA))}nA.onload=kA=>{r.debug("_generateHashFileNameInWeb",`read chunk nr ${P+1} of ${N}`),W.append(kA.target.result),P++,P{clearTimeout(EA),f(kA)},wA()})}catch(E){r.warn("_generateHashFileNameInWeb",g(E))}return u})}_generateFileNameInMiniProgram(s){return mA(this,void 0,void 0,function*(){const{utils:{MINI_APP_NAMESPACE:r,safeStringify:g,isEmpty:u},ssoLog:E}=this._core;let f="";if(u(s.url))return E.warn("_generateFileNameInMiniProgram","file.url is empty"),f;if(typeof r?.getFileSystemManager!="function")return E.warn("_generateFileNameInUNINativeApp","getFileSystemManager is not a function"),f;try{f=yield new Promise((D,v)=>{r.getFileSystemManager().getFileInfo({filePath:s.url,success:N=>{D(N.digest)},fail:N=>{v(N)}})})}catch(D){E.warn("_generateFileNameInMiniProgram",g(D))}return f})}_generateFileNameInUNINativeApp(s){return mA(this,void 0,void 0,function*(){var r;const{utils:{safeStringify:g,isEmpty:u},ssoLog:E}=this._core;let f="";if(u(s.url))return E.warn("_generateFileNameInUNINativeApp","file.url is empty"),f;if(typeof((r=plus==null?void 0:plus.io)===null||r===void 0?void 0:r.getFileInfo)!="function")return E.warn("_generateFileNameInUNINativeApp","plus.io.getFileInfo is not a function"),f;try{f=yield new Promise((D,v)=>{plus.io.getFileInfo({filePath:s.url,success:N=>{D(N.digest)},fail:N=>{v(N)}})})}catch(D){E.warn("_generateFileNameInMiniProgram",g(D))}return f})}_handleUploadProgress(s,r){if(typeof r.onProgress=="function")try{r.onProgress(s.percent)}catch(g){throw console.warn("Upload progress callback error:",g),g}}_fetchCosSignatureUrl(s){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g}}=this._core,u=Vt.isSimpleCos(),E=this._prepareCosRequestData(s),f=u?"im_cos_msg.simple_sig":"im_cos_msg.pre_sig";try{const D=yield function(N,P,W){return mA(this,void 0,void 0,function*(){try{const{helper:nA,channel:EA}=W,wA=nA.generateCosSpecifiedData({servcmd:N,data:P}),kA=`${wA.head.seq}${N}`;return yield EA.sendPacket(wA,{requestId:kA})}catch(nA){throw console.warn("getCosSig error:",nA),nA}})}(f,E,this._core);this.fetchCosTryCount=0;const v=this._processResponse(D);return r.debug("_fetchCosSignatureUrl",` ok. isSimpleCos:${u} data:${g(v)}`),v||{}}catch(D){if(this.fetchCosTryCount<1)return this.fetchCosTryCount++,this._fetchCosSignatureUrl(s);throw this.fetchCosTryCount=0,D}})}_processResponse(s){var r;const g=Vt.isSimpleCos(),u=g?(r=s?.rpt_pre_sig)===null||r===void 0?void 0:r[0]:s;if(!u)return{};if(g){const{str_final_ip:W,rpt_pre_sig:nA,uint32_file_id:EA,uint32_exist_flag:wA,str_download_url:kA,str_upload_url:VA,str_snapshot_url:LA,str_file_key:SA}=u;return{uploadIP:W,preSig:nA,fileID:EA,existFlag:wA,downloadUrl:kA,uploadUrl:VA,requestSnapshotUrl:LA,fileKey:SA}}const{upload_url:E,download_url:f,snapshot_url:D,thumb_url:v,large_url:N,file_key:P}=u;return{uploadUrl:E,downloadUrl:f,requestSnapshotUrl:D,thumbUrl:v,largeUrl:N,fileKey:P}}_prepareCosRequestData(s){return Vt.isSimpleCos()?{uint32_upload_method:s.uploadMethod,uint32_platform:Vt.getPlatform(),uint32_sdkappid:Vt.getSDKAppID(),str_user_id:s.userID,uint32_scene:s.conversationType,rpt_upload_object:[{uint32_file_id:1,uint32_file_type:s.fileType,str_file_name:s.fileName}]}:{file_type:s.fileType,file_name:s.fileName,upload_method:s.uploadMethod,Duration:s.duration}}_uploadFile(s){return mA(this,void 0,void 0,function*(){return new Promise((r,g)=>{this.httpRequest.request(s,(u,E)=>{u&&this.uploadFileTryCount=3e4}_syncSystemClock(s){var r,g,u;const E=((r=s.headers)===null||r===void 0?void 0:r.date)||((g=s.headers)===null||g===void 0?void 0:g.Date)||((u=s.error)===null||u===void 0?void 0:u.ServerTime);if(E){const f=Date.now(),D=Date.parse(E);this.systemClockOffset=D-f}}_getRawOrUploadProxyUrl(s){const r=Vt.getFileUploadProxy();let g=s;return r&&(g=s.replace(/^https:\/\/[^/]+/,r)),g}_isC2CConversation(s){return s.slice(0,3)==="C2C"}};const U=2108,sA=2251,k=2252,x=2253,iA=["jpg","jpeg","gif","png","bmp","image","webp"],uA={JPG:1,JPEG:1,GIF:2,PNG:3,BMP:4,UNKNOWN:255},_A=1,ie=2;class ye{constructor(r,g){this.instanceID=Pr(9999999),this.sizeType=r.type||0,this.type=0,this.size=r.size||0,this.width=r.width||0,this.height=r.height||0,this.imageUrl=Vt.addAuthToUrl(r.imageUrl||r.url||""),this.url=Vt.addAuthToUrl(r.url||g)}setSizeType(r){this.sizeType=r}setType(r){this.type=r}setImageUrl(r){r&&(this.imageUrl=Vt.addAuthToUrl(r))}getImageUrl(){return this.imageUrl}}function p(s){const{originUrl:r,originWidth:g,originHeight:u,min:E=198}=s,f=parseInt(g)||0,D=parseInt(u)||0,v={url:void 0,width:0,height:0};if((f<=D?f:D)<=E)v.url=r,v.width=f,v.height=D;else{D<=f?(v.width=Math.ceil(f*E/D),v.height=E):(v.width=E,v.height=Math.ceil(D*E/f));const N=r&&r.indexOf("?")>-1?`${r}&`:`${r}?`;v.url=E===198?`${N}imageView2/3/w/198/h/198`:`${N}imageView2/3/w/720/h/720`}if(r===void 0){const{url:N}=v;return vo(v,["url"])}return v}class B{constructor(r){this._imageMemoryURL="",this._percent=0,this.type=gc;const{uuid:g,file:u,imageFormat:E,imageInfoArray:f=[],isCustomUpload:D=!1}=r;this._imageMemoryURL=this.createImageDataAsURL(u),this.content={imageFormat:E,uuid:g,imageInfoArray:[]},this[jr]=D,this.initImageInfoArray(f),this.autoFixUrl()}static parseServerPushElement(r){const{MsgContent:g}=r,{ImageFormat:u,ImageInfoArray:E,UUID:f}=g,D=function(v){return v.map(N=>({size:N.Size,type:N.Type,width:N.Width,height:N.Height,url:N.URL}))}(E);return new B({imageFormat:u,imageInfoArray:D,uuid:f})}createImageDataAsURL(r){let g="";const{IN_MINI_APP:u,IN_RN_APP:E,IN_BROWSER:f}=Vt.getPlatformFlags();return r&&((u||E)&&(g=r.url),f&&(g=window.URL.createObjectURL(r))),g}initImageInfoArray(r=[]){const g={type:0,size:0,width:0,height:0,url:""};for(let u=0;u<3;u++){const E=r[u]||Object.assign({},g),f=new ye(E,this._imageMemoryURL);f.setSizeType(u+1),f.setType(u),this.addImageInfo(f)}this.updateAccessSideImageInfoArray()}autoFixUrl(){const r=["http","https"];this.content.imageInfoArray.forEach(g=>{if(!g.url||g.imageUrl==="")return;const[u,...E]=g.imageUrl.split("://"),f=E.join("://");r.includes(u)||g.setImageUrl(`https://${f}`)})}updatePercent(r){this._percent=Math.min(r,1)}updateImageFormat(r){this.content.imageFormat=uA[r.toUpperCase()]||uA.UNKNOWN}addImageInfo(r){this.content.imageInfoArray.length>=3||this.content.imageInfoArray.push(r)}updateImageInfoArray(r){const g=this.content.imageInfoArray.length;let u;for(let E=0;E({InstanceId:g.instanceID,Type:g.sizeType,MsgType:g.type,Size:g.size,Width:g.width,Height:g.height,URL:Vt.removeAuthToUrl(g.imageUrl)}))}}const M=new class{init(s){this.core=s}},G={[ru]:"i",[Cl]:"a",[Da]:"v",[VE]:"f"};let O=null,z=null;function X(s){var r;const{store:g,utils:{isNumber:u,safeStringify:E},ssoLog:f}=M.core;try{const D=((r=g.get("cloudConfig"))===null||r===void 0?void 0:r.upload_size_limit)||"";D!==z&&(z=D,O=JSON.parse(D)||{});const v=O?.[G[s]];if(u(v))return 1024*v*1024}catch(D){f.debug("getCloudControlUploadSizeLimit",E(D))}return null}var gA=new class{constructor(){this._messageOptionsMap=new Map}init(s){var r;this._core=s;const{notificationCenter:g,helper:u,InnerEvent:E,message:f}=s;u.registerApi({apiName:"createImageMessage",context:this}),u.registerExperimentalAPI("createImageMessage",this,"createCustomUploadImageMessage"),(r=f?.messageFactory)===null||r===void 0||r.registerElementClass(gc,B),g.subscribeInnerEvent(E.DESTROY,this._dispose,this)}createImageMessage(s){var r,g,u;try{const E=(r=this._core.store.get("login"))===null||r===void 0?void 0:r.userId,f=(u=(g=this._core)===null||g===void 0?void 0:g.message.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},s),{from:E})),D=this._processImage(s);s.payload.file=D;const v={imageFormat:uA.UNKNOWN,uuid:Vt.generateUUID(D),file:D,imageInfoArray:[]},N=new B(v);return f.setElement(N),this._messageOptionsMap.set(f.clientSequence,s),f}catch(E){throw E}}createCustomUploadImageMessage(s){var r,g,u,E;const{store:f,utils:{isEmpty:D}}=this._core,v=(r=f.get("login"))===null||r===void 0?void 0:r.userId,N=(u=(g=this._core)===null||g===void 0?void 0:g.message.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},s),{from:v})),{largeImageUuid:P,largeFileSize:W,largeImageWidth:nA,largeImageHeight:EA,largeImageUrl:wA,originImageUuid:kA,originFileSize:VA,originImageWidth:LA,originImageHeight:SA,originImageUrl:PA,thumbImageUuid:zA,thumbFileSize:Ee,thumbImageWidth:Ie,thumbImageHeight:Li,thumbImageUrl:Ui}=((E=s?.payload)===null||E===void 0?void 0:E.file)||{};if(D(PA)||D(kA))throw new Error("createImageMessageExperimental originImageUrl or originImageUuid is empty");const Yt=new B({imageFormat:uA.UNKNOWN,uuid:kA,imageInfoArray:[{instanceID:kA,size:VA,width:LA,height:SA,imageUrl:PA,url:PA},{instanceID:P,size:W,width:nA,height:EA,imageUrl:wA,url:wA},{instanceID:zA,size:Ee,width:Ie,height:Li,imageUrl:Ui,url:Ui}],isCustomUpload:!0});return N.setElement(Yt),this._messageOptionsMap.set(N.clientSequence,s),N._skipUpload=!0,N}upload(s){return mA(this,void 0,void 0,function*(){const r=s.getElements()[0],{file:g}=this._messageOptionsMap.get(s.clientSequence).payload;this._validateBeforeUploadImage(g);const u=yield this._performImageUpload(r,s,g),E=this._generateImageInfo(u);return r.updateImageFormat(u?.fileType),r.updateImageInfoArray(E),this._updateImageType(r.content.imageInfoArray),s})}_performImageUpload(s,r,g){return mA(this,void 0,void 0,function*(){const{to:u}=r,E={uploadFileType:ru,file:g,to:u,message:r,onProgress:v=>{var N,P;s.updatePercent(v),(P=(N=this._messageOptionsMap.get(r.clientSequence))===null||N===void 0?void 0:N.onProgress)===null||P===void 0||P.call(N,v)}},{uploadOptions:f,response:D}=yield K.uploadToCOS(E);return this._parseResponse(f,D)})}_generateImageInfo(s){const{location:r,fileSize:g,width:u,height:E,smallImageUrl:f,smallImageWidth:D,smallImageHeight:v,largeImageUrl:N,largeImageWidth:P,largeImageHeight:W,imageInfoArray:nA}=s,EA=Vt.addAuthToUrl(r),wA={size:g,url:EA,width:u,height:E};return nA?.length>0?this._processImageInfoArray(nA,g):f&&N?[Object.assign({},wA),{largeImageUrl:N,largeImageWidth:P,largeImageHeight:W},{smallImageUrl:f,smallImageWidth:D,smallImageHeight:v}]:[Object.assign({},wA),this._generateThumbInfo(EA,u,E,720),this._generateThumbInfo(EA,u,E,198)]}_generateThumbInfo(s,r,g,u){return p({originUrl:s,originWidth:r,originHeight:g,min:u})}_processImageInfoArray(s,r){let g,u,E;for(const f of s)f.type===1?(u=f,u.size=r):f.type===2?(E=f,E.size=r):(g=f,g.size=r);return[Object.assign({},g),Object.assign({},E),Object.assign({},u)]}_parseResponse(s,r){return mA(this,void 0,void 0,function*(){try{const{thumbUrl:g,largeUrl:u,downloadUrl:E}=s;if(g&&u&&(yield this._getImageInfoByUrl(g,r,"thumb"),yield this._getImageInfoByUrl(u,r,"large")),Vt.isSimpleCos()&&!Vt.isPrivateNetWork()&&(yield this._getImageInfoArray(E,r),r?.uploadIP)){const f=this._extractDomainFromUrl(E);f&&(yield this._getDownloadIP(f,r))}return r}catch(g){throw g}})}_extractDomainFromUrl(s){var r;try{const g=s.match(/:\/\/([^\/]+)/);return g?g[1]:null}catch(g){return(r=this._core)===null||r===void 0||r.ssoLog.warn("_extractDomainFromUrl",`Failed to extract domain from URL:${g.message}`),null}}_getImageInfoByUrl(s,r,g){return mA(this,void 0,void 0,function*(){var u;try{const E=Vt.addAuthToUrl(s),{width:f=0,height:D=0}=yield Vt.probeImageWidthHeight(E);r.width=f,r.height=D,g==="thumb"?(r.smallImageUrl=s,r.smallImageWidth=f,r.smallImageHeight=D):(r.largeImageUrl=s,r.largeImageWidth=f,r.largeImageHeight=D)}catch(E){(u=this._core)===null||u===void 0||u.ssoLog.warn("_getImageInfoByUrl",`Failed to get ${g} image info:${E.message}`)}})}_validateBeforeUploadImage(s){var r;const{ChatError:g}=(r=this._core)===null||r===void 0?void 0:r.helper;if(!s)throw new g({code:sA});this._checkImageType(s),this._checkImageSize(s)}_processImage(s){var r;try{const{IN_MINI_APP:g}=(r=this._core)===null||r===void 0?void 0:r.utils;let{file:u}=s.payload;return u=g?this._processMiniAppImageFile(u):this._processWebImageFile(u),u}catch(g){throw g}}_processMiniAppImageFile(s){dl(s)&&console.warn("FileUnsupportedInMiniApp","createImageMessage");const r=s.tempFiles[0].path||s.tempFiles[0].tempFilePath;return{url:r,name:r.slice(r.lastIndexOf("/")+1),size:s.tempFiles&&s.tempFiles[0].size||1,type:r.slice(r.lastIndexOf(".")+1).toLowerCase()}}_processWebImageFile(s){var r;const{ChatError:g}=(r=this._core)===null||r===void 0?void 0:r.helper,u=Vt.extractFileFromInput(s);if(!u)throw new g({message:"Invalid file. Pass either `e.target` (from file input) or a File object"});return u}_getDownloadIP(s,r){return mA(this,void 0,void 0,function*(){const g=`${ya} getDownloadIP domainName: ${s}`;try{const u=yield function(f,D){return mA(this,void 0,void 0,function*(){try{const{helper:v,channel:N}=D,P="im_cos_msg.get_final_ip",W={str_domain:f},nA=v.generateProtocolData({servcmd:P,data:W}),EA=`${nA.head.seq}${P}`;return yield N.sendPacket(nA,{requestId:EA})}catch(v){throw console.warn("getFinalIP error:",v),v}})}(s,this._core);if(!u||!u.str_final_ip)return;console.log(`${g} ok. downloadIP:${u}`);const E=r.location.split("/");E[0]=u.str_final_ip,r.location=E.join("/")}catch(u){console.warn(u)}})}_getImageInfoArray(s,r){return mA(this,void 0,void 0,function*(){try{const g=yield function(u,E){return mA(this,void 0,void 0,function*(){try{const{helper:f,channel:D}=E,v="im_cos_msg.get_imageinfo",N={str_image_url:u},P=f.generateProtocolData({servcmd:v,data:N}),W=`${P.head.seq}${v}`;return yield D.sendPacket(P,{requestId:W})}catch(f){throw console.warn("getImageInfo error:",f),f}})}(s,this._core);return r.imageInfoArray=this._processImageInfoResponse(g),r}catch(g){throw r.imageInfoArray=void 0,g}})}_processImageInfoResponse(s){if(!s)return[];const{rpt_msg_image_info:r}=s;return r.map(g=>({type:g.uint32_image_type,url:g.str_url,width:g.uint32_width,height:g.uint32_height,imageFormat:g.str_image_format}))}_checkImageType(s){const{utils:r,helper:g}=this._core;let u="";if(r.IN_MINI_APP&&(u=s.url.slice(s.url.lastIndexOf(".")+1)),r.IN_BROWSER&&(u=s.name.slice(s.name.lastIndexOf(".")+1)),iA.indexOf(u.toLowerCase())<0)throw new g.ChatError({code:k})}_checkImageSize(s){const{utils:r,helper:g,store:u}=this._core;let E=0;if(E=(r.IN_MINI_APP,s.size),E===0)throw new g.ChatError({code:U});if(E>=(X(ru)||20971520))throw new g.ChatError({code:x})}_updateImageType(s){s[1].type=ie,s[2].type=_A}_reset(){this._messageOptionsMap.clear()}_dispose(){this._reset();const{notificationCenter:s,InnerEvent:r}=this._core;s.unSubscribeInnerEvent(r.DESTROY,this._dispose,this)}};const DA=2108,GA=2401,KA=2402,re="2.5.0",Qe="1.18.0";function At(s,r){const g=s.split("."),u=r.split("."),E=Math.max(g.length,u.length);for(;g.lengthv)return 1;if(D0;return{isValid:r,error:r?null:{message:"content can not be empty"}}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{uuid:E,downloadFlag:f,fileUrl:D,fileName:v,fileSize:N}=u;return{MsgType:this.type,MsgContent:{Download_Flag:f,Url:Vt.removeAuthToUrl(D),FileName:v,FileSize:N,UUID:E}}}_getFileInfo(r){const{utils:{IN_UNI_NATIVE_APP:g}}=M.core;if(r.fileName&&r.fileSize)return{size:r.fileSize,name:r.fileName};const{file:u}=r;return u?(g&&this._processNativeAppFile(u),{size:u.size,name:u.name}):{size:0,name:""}}_processNativeAppFile(r){if(r.path&&r.path.includes(".")){const g=r.path.slice(r.path.lastIndexOf(".")+1).toLowerCase();r.type=g,r.name||(r.name=`${Pr(999999)}.${g}`)}r.name||(r.type="",r.name=r.path.slice(r.path.lastIndexOf("/")+1).toLowerCase()),r.suffix&&(r.type=r.suffix),r.url||(r.url=r.path)}}lt=jr;var xt=new class{constructor(){this._messageOptionsMap=new Map}init(s){var r;this._core=s;const{notificationCenter:g,helper:u,InnerEvent:E,message:f}=s;u.registerApi({apiName:"createFileMessage",context:this}),u.registerExperimentalAPI("createFileMessage",this,"createCustomUploadFileMessage"),(r=f?.messageFactory)===null||r===void 0||r.registerElementClass(Ka,dt),g.subscribeInnerEvent(E.DESTROY,this._dispose,this)}createFileMessage(s){var r,g,u;try{this._checkVersion();const E=this._processFile(s.payload.file);s.payload.file=E;const f=(r=this._core.store.get("login"))===null||r===void 0?void 0:r.userId,D=(u=(g=this._core)===null||g===void 0?void 0:g.message.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},s),{from:f})),v={uuid:Vt.generateUUID(E),file:E},N=new dt(v);return D.setElement(N),this._messageOptionsMap.set(D.clientSequence,s),D}catch(E){throw E}}createCustomUploadFileMessage(s){var r,g,u;try{const{store:E,message:f,utils:{isEmpty:D}}=this._core,v=(r=E.get("login"))===null||r===void 0?void 0:r.userId,{url:N,uuid:P,fileSize:W,fileName:nA=""}=((g=s?.payload)===null||g===void 0?void 0:g.file)||{};if(D(N))throw new Error("url is required");const EA=(u=f.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},s),{from:v})),wA=new dt({url:N,uuid:P,file:{size:W,name:nA},isCustomUpload:!0});return EA.setElement(wA),EA}catch(E){throw E}}upload(s){return mA(this,void 0,void 0,function*(){const{file:r}=this._messageOptionsMap.get(s.clientSequence).payload;this._validateBeforeUploadFile(r);const g=s.getElements()[0],u=yield this._performFileUpload(g,s,r),E=Vt.addAuthToUrl(u?.location);return g.updateFileUrl(E),s})}_validateBeforeUploadFile(s){const{helper:{ChatError:r}}=this._core;if(!s)throw new r({code:GA});const g=X(VE)||104857600;if(s.size>g)throw new r({code:KA});if(s.size===0)throw new r({code:DA})}_performFileUpload(s,r,g){return mA(this,void 0,void 0,function*(){const{to:u}=r,E={uploadFileType:VE,file:g,to:u,message:r,onProgress:D=>{var v,N;s.updatePercent(D),(N=(v=this._messageOptionsMap.get(r.clientSequence))===null||v===void 0?void 0:v.onProgress)===null||N===void 0||N.call(v,D)}},{response:f}=yield K.uploadToCOS(E);return f})}_processFile(s){var r,g;const{IN_BROWSER:u,IN_RN_APP:E,IN_WX_MINI_APP:f,IN_QQ_MINI_APP:D,IN_UNI_NATIVE_APP:v}=(r=this._core)===null||r===void 0?void 0:r.utils,{ChatError:N}=(g=this._core)===null||g===void 0?void 0:g.helper;if(u||v){const P=Vt.extractFileFromInput(s);if(!P)throw new N({message:"Invalid file. Pass either `e.target` (from file input) or a File object"});return P}if(f||D){const{tempFiles:P}=s;return Object.assign(Object.assign({},P[0]),{url:P[0].path})}return E?Object.assign(Object.assign({},s),{url:s.uri}):s}_checkVersion(){var s,r;const{MINI_APP_NAMESPACE:g,IN_MINI_APP:u,IN_WX_MINI_APP:E,IN_QQ_MINI_APP:f,IN_UNI_NATIVE_APP:D}=(s=this._core)===null||s===void 0?void 0:s.utils,{ChatError:v}=(r=this._core)===null||r===void 0?void 0:r.helper;if(u){if(!(E||f||D))throw new v({message:"Unsupported mini app environment"});const N=g.getSystemInfoSync().SDKVersion;if(E&&At(N,re)<0)throw new v({message:`WXChooseMessageFile requires SDK version ${re} or higher`});if(f&&At(N,Qe)<0)throw new v({message:`QQChooseMessageFile requires SDK version ${Qe} or higher`})}}_reset(){this._messageOptionsMap.clear()}_dispose(){this._reset();const{notificationCenter:s,InnerEvent:r}=this._core;s.unSubscribeInnerEvent(r.DESTROY,this._dispose,this)}};const Wt=2108,Ki=2351,Eo=2352,so=["mp4","quicktime","mov","video"];var hi;class qo{constructor(r){this.type=Vl,this.uploadProgress=0,this[hi]=!1;const g=typeof r?.videoSecond=="number"?r?.videoSecond:0;this[jr]=r.isCustomUpload||!1,this.content={remoteVideoUrl:Vt.addAuthToUrl(r.remoteVideoUrl||r.videoUrl||""),videoFormat:r.videoFormat,videoSecond:parseInt(g?.toString(),10),videoSize:r.videoSize,videoUrl:Vt.addAuthToUrl(r.videoUrl),videoDownloadFlag:2,videoUUID:r.videoUUID,thumbUUID:r.thumbUUID,thumbFormat:r.thumbFormat,thumbWidth:r.thumbWidth,snapshotWidth:r.thumbWidth,thumbHeight:r.thumbHeight,snapshotHeight:r.thumbHeight,thumbSize:r.thumbSize,snapshotSize:r.thumbSize,thumbDownloadFlag:2,thumbUrl:Vt.addAuthToUrl(r.thumbUrl),snapshotUrl:Vt.addAuthToUrl(r.thumbUrl)}}static parseServerPushElement(r){const{MsgContent:g}=r,{VideoUrl:u,VideoFormat:E,VideoSecond:f,VideoSize:D,VideoDownloadFlag:v,VideoUUID:N,ThumbUUID:P,ThumbFormat:W,ThumbWidth:nA,SnapshotWidth:EA,ThumbHeight:wA,SnapshotHeight:kA,ThumbSize:VA,SnapshotSize:LA,ThumbDownloadFlag:SA,ThumbUrl:PA,SnapshotUrl:zA}=g;return new qo({videoUrl:u,videoFormat:E,videoSecond:f,videoSize:D,videoDownloadFlag:v,videoUUID:N,thumbUUID:P,thumbFormat:W,thumbWidth:nA,snapshotWidth:EA,thumbHeight:wA,snapshotHeight:kA,thumbSize:VA,snapshotSize:LA,thumbDownloadFlag:SA,thumbUrl:PA,snapshotUrl:zA})}updatePercent(r){this.uploadProgress=Math.min(r,1)}updateVideoUrl(r){r&&(this.content.remoteVideoUrl=r)}updateSnapshotInfo(r){const{snapshotUrl:g,snapshotWidth:u,snapshotHeight:E}=r;Vt.isEmpty(g)||(this.content.thumbUrl=this.content.snapshotUrl=g),Vt.isEmpty(u)||(this.content.thumbWidth=this.content.snapshotWidth=Number(u)),Vt.isEmpty(E)||(this.content.thumbHeight=this.content.snapshotHeight=Number(E))}validateBeforeSend(){if(this[jr])return{isValid:!0};const r=this.content.remoteVideoUrl!=="";return{isValid:r,error:r?null:{message:"content can not be empty"}}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{remoteVideoUrl:E,videoFormat:f,videoSecond:D,videoSize:v,videoDownloadFlag:N,videoUUID:P,thumbUUID:W,thumbFormat:nA,thumbWidth:EA,snapshotWidth:wA,thumbHeight:kA,snapshotHeight:VA,thumbSize:LA,snapshotSize:SA,thumbDownloadFlag:PA,thumbUrl:zA,snapshotUrl:Ee}=u;return{MsgType:this.type,MsgContent:{VideoUrl:Vt.removeAuthToUrl(E),VideoFormat:f,VideoSecond:D,VideoSize:v,VideoDownloadFlag:N,VideoUUID:P,ThumbUUID:W,ThumbFormat:nA,ThumbWidth:EA,SnapshotWidth:wA,ThumbHeight:kA,SnapshotHeight:VA,ThumbSize:LA,SnapshotSize:SA,ThumbDownloadFlag:PA,ThumbUrl:Vt.removeAuthToUrl(zA),SnapshotUrl:Vt.removeAuthToUrl(Ee)}}}}hi=jr;var cn,yi=new class{constructor(){this._messageOptionsMap=new Map}init(s){var r;this._core=s;const{notificationCenter:g,helper:u,InnerEvent:E,message:f}=s;u.registerApi({apiName:"createVideoMessage",context:this}),u.registerExperimentalAPI("createVideoMessage",this,"createCustomUploadVideoMessage"),(r=f?.messageFactory)===null||r===void 0||r.registerElementClass(Vl,qo),g.subscribeInnerEvent(E.DESTROY,this._dispose,this)}createVideoMessage(s){var r,g,u;try{const E=this._processVideo(s);s.payload.file=E;const f=(r=this._core.store.get("login"))===null||r===void 0?void 0:r.userId,D=(u=(g=this._core)===null||g===void 0?void 0:g.message.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},s),{from:f})),v={videoFormat:E.videoFile.type,videoSecond:hr(E.videoFile.second,0),videoSize:E.videoFile.size,remoteVideoUrl:"",videoUrl:E.videoFile.url,videoUUID:Vt.generateUUID(E.videoFile),thumbUUID:Vt.generateUUID(E.videoFile,"jpg"),thumbWidth:E.width||200,thumbHeight:E.height||200,thumbUrl:E.thumbUrl,thumbSize:E.thumbSize,thumbFormat:"jpg"},N=new qo(v);return D.setElement(N),this._messageOptionsMap.set(D.clientSequence,s),D}catch(E){throw E}}createCustomUploadVideoMessage(s){var r,g,u;try{const{store:E,message:f}=this._core;this._validateCustomUploadVideoMessage(s);const D=(r=E.get("login"))===null||r===void 0?void 0:r.userId,{videoUrl:v,videoUuid:N,duration:P,snapshotUrl:W,snapshotUuid:nA,videoFileSize:EA,videoType:wA,snapshotWidth:kA,snapshotHeight:VA,snapshotFileSize:LA,snapshotType:SA="jpg"}=((g=s?.payload)===null||g===void 0?void 0:g.file)||{},PA=(u=f.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},s),{from:D})),zA=new qo({videoFormat:wA,videoSecond:P||0,videoSize:EA,remoteVideoUrl:v,videoUrl:v,videoUUID:N,thumbUUID:nA,thumbWidth:kA||200,thumbHeight:VA||200,thumbUrl:W,thumbSize:LA,thumbFormat:SA,isCustomUpload:!0});return PA.setElement(zA),this._messageOptionsMap.set(PA.clientSequence,s),PA}catch(E){throw E}}upload(s){return mA(this,void 0,void 0,function*(){const r=s.getElements()[0],{file:g}=this._messageOptionsMap.get(s.clientSequence).payload;this._validateBeforeUploadVideo(g);const u=yield this._performVideoUpload(r,s,g),{location:E,snapshotInfo:f}=u,D=Vt.addAuthToUrl(E);return r.updateVideoUrl(D),Vt.isEmpty(f)||r.updateSnapshotInfo(f),s})}_validateBeforeUploadVideo(s){const{helper:{ChatError:r}}=this._core,g=X(Da)||104857600;if(s.videoFile.size>g)throw new r({code:Ki});if(s.videoFile.size===0)throw new r({code:Wt});if(so.indexOf(s.videoFile.type)===-1)throw new r({code:Eo})}_validateCustomUploadVideoMessage(s){var r;const{utils:{isEmpty:g,isNumber:u}}=this._core,{videoUrl:E,videoUuid:f,duration:D,snapshotUrl:v,snapshotUuid:N}=((r=s?.payload)===null||r===void 0?void 0:r.file)||{};if(g(E)||g(f)||!u(D)||g(v)||g(N))throw new Error("Invalid video message options: missing required fields (videoUrl, videoUuid, duration, snapshotUrl, snapshotUuid)")}_performVideoUpload(s,r,g){return mA(this,void 0,void 0,function*(){const{to:u}=r,E={uploadFileType:Da,file:g,to:u,message:r,onProgress:v=>{var N,P;s.updatePercent(v),(P=(N=this._messageOptionsMap.get(r.clientSequence))===null||N===void 0?void 0:N.onProgress)===null||P===void 0||P.call(N,v)}},{response:f,uploadOptions:D}=yield K.uploadToCOS(E);return{snapshotInfo:yield this._getSnapshotInfoByUrl(D.requestSnapshotUrl),location:f.location}})}_processVideo(s){var r,g;try{const{ChatError:u}=(r=this._core)===null||r===void 0?void 0:r.helper,{IN_MINI_APP:E,IN_BROWSER:f}=(g=this._core)===null||g===void 0?void 0:g.utils;let{file:D}=s.payload,v={};if(E&&(v=this._processMiniVideoFile(D),D.name=v.name,D.url=v.url,D.type=v.type),f){const N=Vt.extractFileFromInput(D);if(!N)throw new u({message:"Invalid file. Pass either `e.target` (from file input) or a File object"});D=N,v=this._processWebVideoFile(D)}return D.videoFile=v,D.thumbUrl="",D.thumbSize=0,D}catch(u){throw console.warn(`${ya} _processFile error:`,u),u}}_processMiniVideoFile(s){const{utils:{IN_UNI_NATIVE_APP:r},helper:{ChatError:g}}=this._core;if(dl(s))throw new g({message:"FileUnsupportedInMiniApp"});Array.isArray(s.tempFiles)&&(s=s.tempFiles[0]);let u=s.tempFilePath.slice(s.tempFilePath.lastIndexOf(".")+1).toLowerCase();return r&&(u=s.fileType||u),{url:s.tempFilePath,name:s.tempFilePath.slice(s.tempFilePath.lastIndexOf("/")+1),size:s.size||1,second:s.duration||0,type:u}}_processWebVideoFile(s){const{name:r,size:g=1,duration:u=0,type:E}=s,f=E.split("/")[1];return{url:window.URL.createObjectURL(s),name:r,size:g,second:u,type:f}}_getSnapshotInfoByUrl(s){return mA(this,void 0,void 0,function*(){const{ssoLog:r}=this._core;try{r.debug("_getSnapshotInfoByUrl",`${ya} _getSnapshotInfoByUrl url:${s}`);const g={version:1,platform:Vt.getPlatform(),cover_name:dg(Pr(99999)),snapshot_url:s},u=yield function(N,P){return mA(this,void 0,void 0,function*(){try{const W="im_cos_msg.video_cover",{helper:nA,channel:EA}=P,wA=nA.generateCosSpecifiedData({servcmd:W,data:N}),kA=`${wA.head.seq}${W}`;return yield EA.sendPacket(wA,{requestId:kA})}catch(W){throw console.warn("getSnapshotInfo error:",W),W}})}(g,this._core),{download_url:E}=u||{};if(r.debug("_getSnapshotInfoByUrl",`${ya} _getSnapshotInfoByUrl OK snapshotUrl:${E}`),Vt.isEmpty(E))return{};const f=Vt.addAuthToUrl(E),{width:D=0,height:v=0}=yield Vt.probeImageWidthHeight(f);return{snapshotUrl:f,snapshotWidth:D,snapshotHeight:v}}catch(g){throw g}})}_reset(){this._messageOptionsMap.clear()}_dispose(){this._reset();const{notificationCenter:s,InnerEvent:r}=this._core;s.unSubscribeInnerEvent(r.DESTROY,this._dispose,this)}};class to{constructor(r){this.uploadProgress=0,this.type=xg,this[cn]=!1,this[jr]=r.isCustomUpload||!1,this.content={downloadFlag:2,second:r.second,size:r.size,url:Vt.generateURL(r.url,{needAddAuthToUrl:!this[jr]}),remoteAudioUrl:Vt.addAuthToUrl(r.url||""),uuid:r.uuid}}static parseServerPushElement(r){const{MsgContent:g}=r,{Url:u,Download_Flag:E,Second:f,Size:D,UUID:v}=g;return new to({url:u,downloadFlag:E,second:f,size:D,uuid:v})}updatePercent(r){this.uploadProgress=Math.min(r,1)}updateAudioUrl(r){this.content.remoteAudioUrl=r}validateBeforeSend(){if(this[jr])return{isValid:!0};const r=this.content.remoteAudioUrl!=="";return{isValid:r,error:r?null:{message:"content can not be empty"}}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{uuid:E,downloadFlag:f,remoteAudioUrl:D,size:v,second:N}=u;return{MsgType:this.type,MsgContent:{Url:Vt.removeAuthToUrl(D),Download_Flag:f,Second:N,Size:v,UUID:E}}}}cn=jr;const rs=2108,be=2300,bt=2301;var OA=new class{constructor(){this._messageOptionsMap=new Map}init(s){var r;this._core=s;const{notificationCenter:g,helper:u,InnerEvent:E,message:f}=s;u.registerApi({apiName:"createAudioMessage",context:this}),u.registerExperimentalAPI("createAudioMessage",this,"createCustomUploadAudioMessage"),(r=f?.messageFactory)===null||r===void 0||r.registerElementClass(xg,to),g.subscribeInnerEvent(E.DESTROY,this._dispose,this)}createAudioMessage(s){var r,g,u;try{let{file:E}=s.payload;E=this._processAudioFile(s.payload.file),s.payload.file=E;const f=(r=this._core.store.get("login"))===null||r===void 0?void 0:r.userId,D=(u=(g=this._core)===null||g===void 0?void 0:g.message.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},s),{from:f})),v={second:Math.max(1,Math.round((E.duration||E.second)/1e3)),size:E.fileSize||E.size||1,url:E.tempFilePath||E.uri||E.url,uuid:Vt.generateUUID(E)},N=new to(v);return D.setElement(N),this._messageOptionsMap.set(D.clientSequence,s),D}catch(E){throw E}}createCustomUploadAudioMessage(s){var r,g,u;try{this._validateCustomUploadOptions(s);const{store:E,message:f}=this._core,D=(r=E.get("login"))===null||r===void 0?void 0:r.userId,{url:v,uuid:N,duration:P,fileSize:W}=((g=s?.payload)===null||g===void 0?void 0:g.file)||{},nA=(u=f.messageFactory)===null||u===void 0?void 0:u.createMessage(Object.assign(Object.assign({},s),{from:D})),EA=new to({second:P,size:W||1,url:v,uuid:N,isCustomUpload:!0});return nA.setElement(EA),this._messageOptionsMap.set(nA.clientSequence,s),nA}catch(E){throw E}}upload(s){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g}}=this._core;r.debug("upload",`${ya} uploadAudio message:${g(s)}`);const{file:u}=this._messageOptionsMap.get(s.clientSequence).payload;this._validateBeforeUploadAudio(u);const E=s.getElements()[0],f=yield this._performAudioUpload(E,s,u),D=Vt.addAuthToUrl(f?.location);return E.updateAudioUrl(D),s})}_validateBeforeUploadAudio(s){const{helper:{ChatError:r},store:g}=this._core;if(!s)throw new r({code:be});const u=X(Cl)||20971520;if(s.size>u)throw new r({code:bt});if(s.size===0)throw new r({code:rs})}_performAudioUpload(s,r,g){return mA(this,void 0,void 0,function*(){const{to:u}=r,E={uploadFileType:Cl,file:g,to:u,message:r,onProgress:D=>{var v,N;s.updatePercent(D),(N=(v=this._messageOptionsMap.get(r.clientSequence))===null||v===void 0?void 0:v.onProgress)===null||N===void 0||N.call(v,D)}},{response:f}=yield K.uploadToCOS(E);return f})}_processAudioFile(s){var r;const{IN_MINI_APP:g,IN_BROWSER:u}=(r=this._core)===null||r===void 0?void 0:r.utils;return g?this._processMiniFile(s):u?this._processWebFile(s):void 0}_processMiniFile(s){return{url:s.tempFilePath,name:s.tempFilePath.slice(s.tempFilePath.lastIndexOf("/")+1),size:s.fileSize,second:s.duration,type:s.tempFilePath.slice(s.tempFilePath.lastIndexOf(".")+1).toLowerCase()}}_processWebFile(s){if(s.tempFilePath||s.uri)return s;const r=URL.createObjectURL(s);return s.tempFilePath=r,s}_validateCustomUploadOptions(s){var r;const{utils:{isEmpty:g}}=this._core,{url:u,uuid:E,duration:f}=((r=s?.payload)===null||r===void 0?void 0:r.file)||{};if(g(u)||g(E)||g(f))throw new Error("Invalid audio message options")}_reset(){this._messageOptionsMap.clear()}_dispose(){this._reset();const{notificationCenter:s,InnerEvent:r}=this._core;s.unSubscribeInnerEvent(r.DESTROY,this._dispose,this)}};const oi={to:{required:!0,rules:["string"],allowEmpty:!1},conversationType:{required:!0,rules:["string"],allowEmpty:!1},payload:{required:!0,rules:["object"],allowEmpty:!1},cloudCustomData:{required:!1,rules:["string"],allowEmpty:!1},priority:{required:!1,rules:["string"],allowEmpty:!1},customModerationConfigurationID:{required:!1,rules:["string"],allowEmpty:!1},onProgress:{required:!1,rules:["function"],allowEmpty:!1}},ms={createImageMessage:oi,createAudioMessage:oi,createVideoMessage:oi,createFileMessage:oi},si={createImageMessage:!0,createAudioMessage:!0,createVideoMessage:!0,createFileMessage:!0},Dn={[gc]:gA,[Ka]:xt,[Vl]:yi,[xg]:OA};var Ni=new class{constructor(){this.name="RichMediaMessage"}install(s){this._core=s;const{constants:{OuterConstant:{MSG_AUDIO:r,MSG_FILE:g,MSG_IMAGE:u,MSG_VIDEO:E}}}=s;M.init(s),gA.init(s),xt.init(s),yi.init(s),OA.init(s),K.init(s),Vt.init(s),s.helper.registerApi({apiName:"sendMessage",context:this,matcher:f=>[r,g,u,E].includes(f[0].type)}),s.helper.registerValidateConfig({auth:si,params:ms})}sendMessage(s,r){return mA(this,void 0,void 0,function*(){var g,u,E;try{return this._isCustomUpload(s)||(yield this._upload(s)),yield(E=(u=(g=this._core)===null||g===void 0?void 0:g.message)===null||u===void 0?void 0:u.messageSender)===null||E===void 0?void 0:E.sendMessage(s,r)}catch(f){throw f}})}_upload(s){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{safeStringify:g}}=this._core;if(r.debug("_upload",` uploadFile message:${g(s)}`),s._relayFlag!==!0)try{const u=Dn[s.type];u&&(yield u.upload(s),r.info("_upload",` type:${s.type}`))}catch(u){throw s.status=au.FAIL,u instanceof Error&&(u.data={message:s}),this._core.message.messageDataHandler.storeConversationMessage(s),u}})}_isCustomUpload(s){var r,g;return((g=(r=s._elements)===null||r===void 0?void 0:r[0])===null||g===void 0?void 0:g[jr])===!0}};const yo=new class{init(s){this.core=s}};class yt{constructor(r){this.conversationID=r.conversationID||"",this.unreadCount=r.unreadCount||0,this.type=r.type||"",this.lastMessage=yo.core.common.buildLastMessage(r.lastMessage),this.peerReadTime=r.peerReadTime||0,this.groupAtInfoList=[],this.remark=r.remark||"",this.isPinned=r.isPinned||!1,this.messageRemindType=r.messageRemindType,this.markList=r.markList||[],this.customData=r.customData||"",this.conversationGroupList=r.conversationGroupList||[],this.draftText=r.draftText||"",this.userProfile=r.userProfile,this.groupProfile=r.groupProfile,this.subType=r.subType||"",this._isInfoCompleted=!1,this._init()}_init(){var r;const{core:{OuterConstant:g,utils:{isUndefined:u}}}=yo;u(this.userProfile)&&this.type===g.CONV_C2C?this.userProfile={userID:this.conversationID.replace(g.CONV_C2C,"")}:this.type===g.CONV_GROUP&&(!this.subType&&(!((r=this.groupProfile)===null||r===void 0)&&r.type)&&(this.subType=this.groupProfile.type),u(this.groupProfile)&&(this.groupProfile={groupID:this.conversationID.replace(g.CONV_GROUP,""),selfInfo:{},lastMessage:{},type:this.subType}))}updateUnreadCount(r){var g;const{core:{OuterConstant:u,utils:{isUndefined:E},store:f}}=yo,{nextUnreadCount:D,isFromGetConversations:v,isUnreadC2CMessage:N}=r;if(E(D))return;if(this.subType===u.GRP_AVCHATROOM)return void(this.unreadCount=0);if(v&&this.type===u.CONV_GROUP)return void(this.unreadCount=D);if(N&&this.type===u.CONV_C2C)return void(this.unreadCount=D);const P=((g=f.get("cloudConfig"))===null||g===void 0?void 0:g.support_unread_count_for_meeting)==="1";this.subType!==u.GRP_MEETING||P?this.unreadCount+=D:this.unreadCount=0}updateLastMessage(r){this.lastMessage=yo.core.common.buildLastMessage(r)}reduceUnreadCount(){return this.unreadCount>=1&&(this.unreadCount-=1,!0)}isLastMessageRevoked(r){const{core:{OuterConstant:g}}=yo,{sequence:u,time:E}=r;return this.type===g.CONV_C2C&&u===this.lastMessage.lastSequence&&E===this.lastMessage.lastTime||this.type===g.CONV_GROUP&&u===this.lastMessage.lastSequence}setLastMessageRevoked(r){this.lastMessage.isRevoked=r}setLastMessageRevoker(r){this.lastMessage.revoker=r}setDraftText(r){this.draftText=r}updateGroupAtInfoList(r){const{core:{common:{updateGroupAtInfo:g}}}=yo;g(r,this.groupAtInfoList)}clearGroupAtInfoList(){this.groupAtInfoList.length=0}getProfileCompleted(){return this._isInfoCompleted}setProfileCompleted(){this._isInfoCompleted=!0}}const St=s=>{const{core:{OuterConstant:r,utils:{isString:g}}}=yo;return g(s)&&s.slice(0,3)===r.CONV_C2C},Cg=s=>{const{core:{OuterConstant:r,utils:{isString:g}}}=yo;return g(s)&&s.slice(0,5)===r.CONV_GROUP},qn=s=>{const{core:{OuterConstant:r,utils:{isString:g}}}=yo;return g(s)&&s===r.CONV_SYSTEM};function io(s){const{OuterConstant:r}=yo.core;let g="";return s===0?g=r.MSG_REMIND_ACPT_AND_NOTE:s===1?g=r.MSG_REMIND_DISCARD:s===2?g=r.MSG_REMIND_ACPT_NOT_NOTE:s===3&&(g=r.NOT_RECEIVE_OFFLINE_PUSH_EXCEPT_AT),g}function Wr(s){const{OuterConstant:r}=yo.core;let g;return s.startsWith(r.CONV_C2C)&&(g=s.replace(r.CONV_C2C,"")),g==="@TLS#ERROR"||g==="@TLS#NOT_FOUND"}function cc(s,r){const{helper:g}=yo.core,u=new g.ChatError({functionName:s,code:r?.errorCode||r?.code,message:r?.errorInfo||r?.message});throw console.error(`${s} fail:`,u),u}var In,ua;(function(s){s[s.OFF=0]="OFF",s[s.ON=1]="ON"})(In||(In={})),function(s){s[s.ONLY_CONVERSATIONID=1]="ONLY_CONVERSATIONID"}(ua||(ua={}));var Sa;(function(s){s[s.CONV_NOT_FOUND=2500]="CONV_NOT_FOUND",s[s.USER_OR_GRP_NOT_FOUND=2501]="USER_OR_GRP_NOT_FOUND",s[s.CONV_UN_RECORDED_TYPE=2502]="CONV_UN_RECORDED_TYPE"})(Sa||(Sa={}));const oa=0,q=1;var QA=new class{constructor(){this._name="GetC2CMessageRemindType"}init(s){this._core=s}get(s){return mA(this,void 0,void 0,function*(){try{const{common:r}=this._core,g=yield function(E,f){return mA(this,void 0,void 0,function*(){const{toAccount:D,userIDList:v}=E,N={To_Account:D,Peer_Account:v};return f.common.buildAndSendPacket({servcmd:"openim.get_c2c_peer_mute_notifications",data:N})})}({toAccount:r.getCurrentUserID(),userIDList:s},this._core),{MuteNotificationsList:u=[]}=g||{};u.forEach(E=>{const{Peer_Account:f,MuteNotifications:D}=E,v=`${this._core.OuterConstant.CONV_C2C}${f}`,N=io(D);NA.patchMessageRemindType([v],N)})}catch(r){console.error(`${this._name}.get fail:`,r)}})}},yA=new class{constructor(){this._name="GetGroupMessageRemindType"}init(s){this._core=s}get(s){return mA(this,void 0,void 0,function*(){if(s.length!==0)try{const r=yield function(u,E){return mA(this,void 0,void 0,function*(){const{groupIDList:f,responseFilter:D}=u,v={GroupIdList:f,ResponseFilter:D};return E.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_group_self_member_info",data:v})})}({groupIDList:s,responseFilter:{MemberInfoFilter:["MsgFlag"]}},this._core),{GroupInfo:g=[]}=r||{};g.forEach(u=>{var E;const{GroupId:f,MemberList:D}=u,v=((E=D[0])===null||E===void 0?void 0:E.MsgFlag)||"",N=`${this._core.OuterConstant.CONV_GROUP}${f}`;NA.patchMessageRemindType([N],v)})}catch(r){console.error(`${this._name}.get fail:`,r)}})}},NA=new class{constructor(){this._name="ConversationDataHandler",this._totalUnreadCount=0,this._groupAtTipsList=[]}init(s){this._core=s;const{helper:r,notificationCenter:g,appStore:{conversationStore:u},constants:{WORKFLOW_NAME:E,WORKFLOW_STEP:f},InnerEvent:{SYNC_CONVERSATION_LIST:D,MESSAGE_PUSH:v,NEW_MESSAGE:N,MESSAGE_DELETED:P,MESSAGE_REVOKED:W,MESSAGE_MODIFIED:nA,CONVERSATION_UPDATED:EA,LOGOUT:wA,DESTROY:kA},InnerEventSubType:{C2C_MESSAGE_PEER_READ:VA}}=s;this._conversationStore=u,r.registerWorkflowStep(E.SYNC_SERVER_INFO_AFTER_LOGIN,f.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,this._handleUnreadSyncFinished,this),r.registerWorkflowStep(E.SYNC_SERVER_INFO_AFTER_LOGIN,f.CONVERSATION_UPDATE_AFTER_GROUP_LIST_SYNC_FINISHED,this._handleGroupListSyncFinished,this),r.registerWorkflowStep(E.RECEIVE_C2C_NEW_MESSAGE,f.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,this._handleNewMessage,this),r.registerWorkflowStep(E.RECEIVE_C2C_NEW_MESSAGE,f.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,this._handleUnreadSyncFinished,this),r.registerWorkflowStep(E.RECEIVE_GROUP_NEW_MESSAGE,f.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,this._handleNewMessage,this),r.registerWorkflowStep(E.SYNC_SERVER_INFO_AFTER_RE_ONLINE,f.CONVERSATION_UPDATE_AFTER_UNREAD_SYNC_FINISHED,this._handleUnreadSyncFinished,this),r.registerWorkflowStep(E.RECEIVE_GROUP_TIPS_NOTIFICATION,f.CREATE_OR_UPDATE_CONVERSATION_BY_RECEIVE_NEW_MESSAGE,this._handleNewMessage,this);const{InnerEventSubType:{GROUP_AT_TIPS:LA}}=g;g.subscribeInnerEvent(D,this._handleConversationSynced,this),g.subscribeInnerEvent(N,this._handleNewMessage,this),g.subscribeInnerEvent(v,LA,this._handleNewGroupAtTips,this),g.subscribeInnerEvent(P,this._handleMessageDeleted,this),g.subscribeInnerEvent(W,this._handleMessageRevoked,this),g.subscribeInnerEvent(nA,this._handleMessageModified,this),g.subscribeInnerEvent(EA,this._handleConversationUpdated,this),g.subscribeInnerEvent(v,VA,this._handleMessageRead,this),g.subscribeInnerEvent(wA,this._reset,this),g.subscribeInnerEvent(kA,this._dispose,this),s.ssoLog.debug(`${this._name}.init`)}_handleConversationSynced(s){this.updateLocalConversationList({conversationUpdateFieldList:s.conversationUpdateFieldList||[],isFromGetConversations:!0,updateUnreadCount:!0}),this.emitConversationListUpdate()}_handleUnreadSyncFinished(s){const{constants:{WORKFLOW_STEP:r}}=this._core,{conversationUpdateFieldList:g=[],groupTipList:u=[],isUnreadC2CMessage:E}=s.result[r.UNREAD_MESSAGE_SYNC]||{};let f=!1;g.forEach(D=>{const{conversationID:v,unreadCount:N}=D,P=this.getLocalConversation(v);P&&P.unreadCount!==N&&(P.updateUnreadCount({nextUnreadCount:N,isUnreadC2CMessage:E}),f=!0)}),f&&this.emitConversationListUpdate(),this._handleGroupAtTipsSynced(u)}_handleGroupAtTipsSynced(s){var r;for(let g=0;g0&&this._handleNewGroupAtTips({GroupTips:v._groupAtInfoList}),f=!0}f&&this.emitConversationListUpdate()}_handleNewMessage(s){const{conversationUpdateFieldList:r=[],isInstantMessage:g=!0,isUnreadC2CMessage:u=!1,updateUnreadCount:E=!0}=s.result||{};if(r.length===0)return;const{common:{isTopic:f}}=this._core;f(r[0].conversationID)||(this.updateLocalConversationList({conversationUpdateFieldList:r,isInstantMessage:g,isUnreadC2CMessage:u,isFromGetConversations:!1,updateUnreadCount:E}),r.filter(D=>this._isConversationNeedShow(D.conversationID)).length>0&&this.emitConversationListUpdate())}_handleNewGroupAtTips(s){const{GroupTips:r=[]}=s;r.forEach(g=>{const{GroupAtTips:u,MsgBody:E,MsgRandom:f,ClientSeq:D}=g;let v={};u?v=this._convertGroupAtTipsKey(u):E?v=Object.assign({},this._convertGroupAtTipsKey(E)):g.groupAtType&&(v=Object.assign({},g)),v.__random=f,v.__sequence=D,this._groupAtTipsList.push(v)}),console.log(`${this._name}._handleNewGroupAtTips groupAtTipsList: ${JSON.stringify(this._groupAtTipsList)}`),this._updateGroupAtInfoList()}_convertGroupAtTipsKey(s){const{From_Account:r,GroupId:g,MsgSeq:u,GroupAtType:E}=s;return{from:r,groupID:g,sequence:u,groupAtType:E}}_updateGroupAtInfoList(){if(this._groupAtTipsList.length===0)return;const{common:s,OuterConstant:r}=this._core,g=s.getCurrentUserID();let u=!1;this._groupAtTipsList.forEach(E=>{const{groupID:f,from:D}=E;if(D!==g){const v=this.getLocalConversation(`${r.CONV_GROUP}${f}`);v&&(v.updateGroupAtInfoList(E),u=!0)}}),u&&this.emitConversationListUpdate(),this._groupAtTipsList.length=0}_handleMessageDeleted(s){var r,g;console.log(`${this._name}._handleMessageDeleted, conversationID:`,s);const{message:{messageDataHandler:u},OuterConstant:E}=this._core,f=u?.getLocalMessageList(s)||[];let D={};for(let P=(f.length||0)-1;P>=0;P--)if(!f[P].isDeleted&&f[P]._isExcludedFromLastMessage!==!0){D=f[P];break}const v=this.getLocalConversation(s);if(!v)return;let N=!1;v.lastMessage.lastSequence===D.sequence&&v.lastMessage.lastTime===D.time||(!((g=(r=this._core)===null||r===void 0?void 0:r.helper)===null||g===void 0)&&g.isEmpty(D)&&(D=void 0),v.updateLastMessage(D),N=!0),s.startsWith(E.CONV_C2C)&&this.updateUnreadCount(s),N&&(this.emitConversationListUpdate(),console.log(`${this._name}._handleMessageDeleted. update conversationID:${s} with lastMessage:`,v.lastMessage))}_handleMessageRevoked(s){const{messageList:r=[],updateUnreadCount:g=!0}=s;if(console.log(`${this._name}._handleMessageRevoked messageList:${r.length}`),r.length===0)return;let u=null,E=!1;r.forEach(f=>{u=this.getLocalConversation(f.conversationID),u&&(g&&u.reduceUnreadCount()&&(E=!0),u.isLastMessageRevoked({sequence:f.sequence,time:f.time})&&(u.setLastMessageRevoked(!0),u.setLastMessageRevoker(f.revoker),E=!0))}),E&&this.emitConversationListUpdate()}_handleMessageModified(s){const{utils:{isEmpty:r},common:{getMessagePreviewText:g},ssoLog:u}=this._core;u.debug(`${this._name}._handleMessageModified`,JSON.stringify(s));const{conversationID:E,messageList:f}=s,D=this.getLocalConversation(E);if(r(D))return;const{lastMessage:v}=D;if(v){const N=f?.[0]||{};v.lastTime===N.time&&v.lastSequence===N.sequence&&v.version!==N.version&&(v.type=N.type,v.payload=N.payload,v.messageForShow=g(N.type,N.payload),v.cloudCustomData=N.cloudCustomData,v.version=N.version,this.emitConversationListUpdate(),console.log(`${this._name} conversationID:${E} lastMessage updated`))}}_handleConversationUpdated(s){this.emitConversationListUpdate(s?.needSort)}updateLocalConversationList(s){const{isFromGetConversations:r}=s,{newConversationList:g}=this._getTmpConversationListMapping(s);this._sortConversationList(),r||this._updateNewConversationProfile(g),this._core.ssoLog.debug("updateLocalConversationList",` newConversationList: ${g.length}`)}_getTmpConversationListMapping(s){const{OuterConstant:r}=this._core,{conversationUpdateFieldList:g,isFromGetConversations:u,isInstantMessage:E,isUnreadC2CMessage:f=!1,updateUnreadCount:D}=s,v=[],N=g?.length;for(let P=0;P{v[1].isPinned===!0?s(v[1].lastMessage.lastTime)?u.push(v):g.push(v):s(v[1].lastMessage.lastTime)?f.push(v):E.push(v)});const D=g.sort((v,N)=>N[1].lastMessage.lastTime-v[1].lastMessage.lastTime).concat(u).concat(E.sort((v,N)=>N[1].lastMessage.lastTime-v[1].lastMessage.lastTime)).concat(f);this._updateConversationMapFromList(D)}_updateNewConversationProfile(s){if(s.length===0)return;const r=[],g=[],{OuterConstant:{CONV_GROUP:u,CONV_C2C:E}}=this._core;s.forEach(f=>{const{conversationID:D,type:v}=f;if(v===E){const N=D.replace(E,"");r.push(N)}else if(v===u){const N=D.replace(u,"");g.push(N)}}),r.length>0&&this._updateC2CConversation(r),g.length>0&&this._updateGroupConversation(g)}_updateC2CConversation(s){var r;const{OuterConstant:{CONV_C2C:g},appStore:{userStore:u},user:E}=this._core;let f=!1;(r=E.userProfile)===null||r===void 0||r.getUserProfile({userIDList:s}).then(D=>{(D?.data||[]).forEach(v=>{var N;const{userID:P}=v,W=this.getLocalConversation(`${g}${P}`);if(W){const nA=((N=u.getFriend(P))===null||N===void 0?void 0:N.remark)||"";W.remark=nA,W.userProfile=v,f=!0}}),f&&this.emitConversationListUpdate()}).catch(D=>{}),QA.get(s)}_updateGroupConversation(s){return mA(this,void 0,void 0,function*(){const{OuterConstant:{CONV_GROUP:r},appStore:{groupStore:g},utils:{safeStringify:u},ssoLog:E,apiMap:{getGroupProfile:f}}=this._core;let D=!1;try{yield Promise.all(s.map(v=>mA(this,void 0,void 0,function*(){const N=g.getGroup(v),P=this.getLocalConversation(`${r}${v}`);N&&P&&(P.groupProfile=N,D=!0),P&&!P.getProfileCompleted()&&typeof f=="function"&&(yield f({groupID:v}))}))),yA.get(s),D&&this.emitConversationListUpdate()}catch(v){E.debug("_updateGroupConversation",u(v))}})}_handleMessageRead(s){const{OuterConstant:{CONV_C2C:r}}=this._core,{C2cNotifyMsgArray:g=[]}=s||{};g.forEach(u=>{const{To_Account:E,UinPairReadArray:f=[]}=u?.C2cReadedReceipt||{};f?.forEach(D=>{const{LastReadTime:v}=D,N=`${r}${E}`;this._updateConversationReadInfo({conversationID:N,peerReadTime:v}),this._updateMessageListPeerRead({conversationID:N,peerReadTime:v})})})}_updateConversationReadInfo(s){const{appStore:r,utils:{isEmpty:g},common:{getCurrentUserID:u}}=this._core,{conversationID:E,peerReadTime:f}=s,D=r.conversationStore.getConversationMap();if(D.has(E)){const v=D.get(E);v.peerReadTime=f;const N=v?.lastMessage;g(N)||N.fromAccount===u()&&N.lastTime<=f&&!N.isPeerRead&&(N.isPeerRead=!0,r.conversationStore.updateConversation(E,{lastMessage:N}))}}_updateMessageListPeerRead(s){const{notificationCenter:r,OuterEvent:g,message:u}=this._core,{conversationID:E,peerReadTime:f}=s,D=u.messageDataHandler.getLocalMessageList(E),v=u.messageDataHandler.getSparseMessageList(E),N=[];D.forEach(P=>{P.time<=f&&!P.isPeerRead&&P.flow==="out"&&(P.isPeerRead=!0,N.push(P))}),v.forEach(P=>{P.time<=f&&!P.isPeerRead&&P.flow==="out"&&(P.isPeerRead=!0,N.push(P))}),r.emitOuterEvent(g.MESSAGE_READ_BY_PEER,{name:g.MESSAGE_READ_BY_PEER,data:N})}_isConversationNeedShow(s){var r,g;const{OuterConstant:{CONV_GROUP:u,GRP_ROOM:E,GRP_LIVE:f},utils:{isUndefined:D}}=this._core,v=this.getLocalConversation(s);if(D(v))return!0;const N=v.type===u&&((r=v.groupProfile)===null||r===void 0?void 0:r.type)===E,P=v.type===u&&((g=v.groupProfile)===null||g===void 0?void 0:g.type)===f;return!(N||P)}updateUnreadCount(s,r=!0){var g,u;let E=!1;const f=this.getLocalConversation(s),D=(u=(g=this._core)===null||g===void 0?void 0:g.message.messageDataHandler)===null||u===void 0?void 0:u.getLocalMessageList(s);if(!f)return E;const v=f.unreadCount,N=D?.filter(P=>!P.isRead&&!P._onlineOnlyFlag&&!P.isDeleted).length;return console.log(`${this._name}._updateUnreadCount conversationID:${s} currentUnreadCount:${v} newUnreadCount:${N}`),v!==N&&(f.unreadCount=N,E=!0,r===!0&&this.emitConversationListUpdate()),E}emitConversationListUpdate(s=!1){var r,g;s&&this._sortConversationList();const{OuterEvent:{CONVERSATION_LIST_UPDATED:u},conversation:E}=this._core,f=this.getLocalConversationList();this._emitEvent({name:u,data:f,isSyncCompleted:(g=(r=E?.syncConversationHandler)===null||r===void 0?void 0:r.isSyncCompleted)===null||g===void 0?void 0:g.call(r)}),this._emitTotalUnreadCountUpdate()}_emitTotalUnreadCountUpdate(){var s;const r=this.getTotalUnreadMessageCount();this._totalUnreadCount!==r&&(this._core.ssoLog.debug("_emitTotalUnreadCountUpdate",` from ${this._totalUnreadCount} to ${r}`),this._totalUnreadCount=r,this._emitEvent({name:(s=this._core)===null||s===void 0?void 0:s.OuterEvent.TOTAL_UNREAD_MESSAGE_COUNT_UPDATED,data:r}))}_emitEvent(s){var r;(r=this._core)===null||r===void 0||r.notificationCenter.emitOuterEvent(s.name,s)}getTotalUnreadMessageCount(){const{OuterConstant:s,utils:{isEmpty:r}}=this._core,g=this.getLocalConversationList();let u=0;return g.forEach(E=>{E.type!==s.CONV_SYSTEM&&(r(E.messageRemindType)||E.messageRemindType===s.MSG_REMIND_ACPT_AND_NOTE)&&(u+=E.unreadCount)}),u}getLocalConversationList(){return[...this._conversationStore.getConversationMap().values()].filter(s=>this._isConversationNeedShow(s.conversationID))}hasLocalConversation(s){return this._conversationStore.getConversationMap().has(s)}getLocalConversation(s){return this._conversationStore.getConversationMap().get(s)}setLocalConversation(s,r){return this._conversationStore.getConversationMap().set(s,r)}deleteLocalConversation(s){this._conversationStore.getConversationMap().delete(s)}_updateConversationMapFromList(s){this._clearConversationMap();for(const[r,g]of s)this.setLocalConversation(r,g)}_clearConversationMap(){this._conversationStore.getConversationMap().clear()}patchMessageRemindType(s,r){let g=!1;s.forEach(u=>{const E=this.getLocalConversation(u);E?.messageRemindType!==r&&(E.messageRemindType=r,g=!0)}),console.log(`${this._name}.patchMessageRemindType conversationIDList:${s} messageRemindType:${r} hasUpdated:${g}`),g&&this.emitConversationListUpdate()}markMessageAsRead(s){const{message:{messageDataHandler:r}}=this._core,{conversationID:g,lastReadTime:u=0,lastReadSequence:E=0}=s,f=r?.getLocalMessageList(g);if(f.length===0)return;const{length:D}=f;for(let v=D-1;v>=0;v--){const N=f[v],P=u&&N.time>u,W=E&&N.sequence>E;if(!P&&!W){if(N.flow==="in"&&N.isRead)break;N.setIsRead(!0)}}}appendToPinnedConversation(s){const r=[...this._conversationStore.getConversationMap().entries()],g=r.findIndex(u=>u[1].isPinned===!1);r.splice(g,0,[s.conversationID,s]),this._updateConversationMapFromList(r),this.emitConversationListUpdate()}_reset(){this._clearConversationMap(),this._totalUnreadCount=0,this._groupAtTipsList=[]}_dispose(){const{notificationCenter:s,InnerEvent:{NEW_MESSAGE:r,MESSAGE_DELETED:g,MESSAGE_REVOKED:u,MESSAGE_MODIFIED:E,CONVERSATION_UPDATED:f,LOGOUT:D,DESTROY:v,SYNC_CONVERSATION_LIST:N}}=this._core,{InnerEventSubType:{GROUP_AT_TIPS:P}}=s;s.unSubscribeInnerEvent(r,this._handleNewMessage,this),s.unSubscribeInnerEvent(r,P,this._handleNewGroupAtTips,this),s.unSubscribeInnerEvent(g,this._handleMessageDeleted,this),s.unSubscribeInnerEvent(u,this._handleMessageRevoked,this),s.unSubscribeInnerEvent(E,this._handleMessageModified,this),s.unSubscribeInnerEvent(f,this._handleConversationUpdated,this),s.unSubscribeInnerEvent(N,this._handleConversationSynced,this),s.unSubscribeInnerEvent(D,this._reset,this),s.unSubscribeInnerEvent(v,this._dispose,this)}},ee=new class{constructor(){this._name="GetConversationList"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"getConversationList",context:this})}getConversationList(s){return mA(this,void 0,void 0,function*(){return{code:0,data:{conversationList:this._getConversationList(s),isSyncCompleted:this._core.conversation.syncConversationHandler.isSyncCompleted()}}})}_getConversationList(s){const{utils:{isUndefined:r,isArray:g,isPlainObject:u}}=this._core;if(r(s))return NA.getLocalConversationList();if(g(s))return s.length===0?[]:NA.getLocalConversationList().filter(E=>s.includes(E.conversationID));if(u(s)){const{type:E,markType:f,groupName:D,hasUnreadCount:v,hasGroupAtInfo:N}=s;return NA.getLocalConversationList().filter(P=>this._filterType(P,E)&&this._filterMarkType(P,f)&&this._filterGroupName(P,D)&&this._filterUnreadCount(P,v)&&this._filterGroupAtInfo(P,N))}return[]}_filterType(s,r){const{OuterConstant:g}=this._core;return r!==g.CONV_C2C&&r!==g.CONV_GROUP||s.type===r}_filterGroupName(s,r){const{utils:{isString:g}}=this._core;return!g(r)||(r===""?s.conversationGroupList.length===0:s.conversationGroupList.includes(r))}_filterMarkType(s,r){const{utils:{isNumber:g}}=this._core;return!g(r)||(r===0?s.markList.length===0:s.markList.includes(r))}_filterUnreadCount(s,r){let g=!0;return r===!0?g=s.unreadCount>=1:r===!1&&(g=s.unreadCount===0),g}_filterGroupAtInfo(s,r){let g=!0;return r===!0?g=s.groupAtInfoList.length>=1:r===!1&&(g=s.groupAtInfoList.length===0),g}},Ne=new class{constructor(){this._name="GetConversationProfile"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"getConversationProfile",context:this})}getConversationProfile(s){return mA(this,void 0,void 0,function*(){const{OuterConstant:{CONV_C2C:r,CONV_GROUP:g,GRP_AVCHATROOM:u},appStore:{groupStore:E},utils:{isEmpty:f}}=this._core,D={code:0,data:{}};let v=NA.getLocalConversation(s);if(qn(s))return D.data.conversation=v,D;let N=!1;const P=St(s)?r:g;if(f(v)&&(N=!0,v=new yt({conversationID:s,type:P})),console.log(`${this._name}.getConversationProfile conversationID:${s} isNewConversation:${N}`),D.data.conversation=v,v?.getProfileCompleted())return D;if(P===r){const W=s.replace(r,"");yield this._handleC2CConversation(v,W),N&&(yield QA.get([W]))}if(P===g){const W=s.replace(g,"");if(!E.getGroup(W))return D;yield this._handleGroupConversation(v,W),N&&v.groupProfile.type!==u&&(yield yA.get([W]))}return D})}_handleC2CConversation(s,r){return mA(this,void 0,void 0,function*(){var g,u;const{user:E,helper:f,utils:{isEmpty:D},appStore:{conversationStore:v,userStore:N}}=this._core,{conversationID:P}=s,W=yield(g=E.userProfile)===null||g===void 0?void 0:g.getUserProfile({userIDList:[r]});if(W?.data.length===0)throw new f.ChatError({code:Sa.USER_OR_GRP_NOT_FOUND});s.userProfile=W?.data[0];const nA=(u=N.getFriend(r))===null||u===void 0?void 0:u.remark;D(nA)||s.remark===nA||(s.remark=nA),s.setProfileCompleted();const EA=NA.hasLocalConversation(P);console.log(`${this._name}._handleC2CConversation conversationID:${P} hasLocalConversation: ${EA}`),EA?v.updateConversation(P,s):NA.appendToPinnedConversation(s)})}_handleGroupConversation(s,r){return mA(this,void 0,void 0,function*(){const{apiMap:{getGroupProfile:g},appStore:{conversationStore:u}}=this._core,{conversationID:E}=s,f=yield g({groupID:r});s.groupProfile=f?.data.group,s.setProfileCompleted();const D=NA.hasLocalConversation(E);console.log(`${this._name}._handleGroupConversation conversationID:${E} hasLocalConversation: ${D}`),D?u.updateConversation(E,s):NA.appendToPinnedConversation(s)})}},he=new class{init(s){const{helper:r}=s;r.registerApi({apiName:"getTotalUnreadMessageCount",context:this})}getTotalUnreadMessageCount(){return NA.getTotalUnreadMessageCount()}},Ue=new class{constructor(){this._serverGroupConversationLastReadSeqMap=new Map,this._name="SetMessageRead"}init(s){this._core=s;const{helper:r,common:{isTopic:g},notificationCenter:u,InnerEvent:{MESSAGE_PUSH:E},InnerEventSubType:{ALL_MESSAGE_READ:f}}=s;r.registerApi({apiName:"setMessageRead",context:this,matcher:D=>!g(D[0].conversationID)}),r.registerApi({apiName:"setAllMessageRead",context:this}),u.subscribeInnerEvent(E,f,this._handleAllMessageRead,this)}handleC2CMessageReadSync(s){const{helper:{isEmpty:r},OuterConstant:g}=this._core;s.forEach(u=>{const{ReadC2cMsgNotify:E}=u;if(!r(E)){const{UinPairReadArray:f=[]}=E;f.forEach(D=>{const{From_Account:v,LastReadTime:N}=D,P=`${g.CONV_C2C}${v}`;console.log(`${this._name}.handleC2CMessageReadSync conversationID:${P} lastReadTime:${N}`),NA.markMessageAsRead({conversationID:P,lastReadTime:N}),NA.updateUnreadCount(P)})}})}handleGroupMessageReadSync(s){const{OuterConstant:r,utils:{isUndefined:g}}=this._core;s.forEach(u=>{const{GroupReadInfoArray:E}=u.MsgBody;g(E)||E.forEach(f=>{const{GroupId:D,LastReadMsgSeq:v}=f,N=`${r.CONV_GROUP}${D}`;console.log(`${this._name}.handleGroupMessageReadSync conversationID:${N} lastReadSequence:${v}`),NA.markMessageAsRead({conversationID:N,lastReadSequence:v}),NA.updateUnreadCount(N),this._clearGroupAtInfoList(N)})})}setMessageRead(s){return mA(this,void 0,void 0,function*(){var r,g;const{OuterConstant:u}=this._core,{conversationID:E}=s,f={code:0,data:{}},D=NA.getLocalConversation(E);let v=`${this._name}.setMessageRead conversationID:${E} unreadCount:${D?.unreadCount||0}`;if(f.successLog={message:v},!D)return f;const N=!(!((g=(r=this._core)===null||r===void 0?void 0:r.helper)===null||g===void 0)&&g.isEmpty(D.groupAtInfoList));if(D.type===u.CONV_GROUP&&N&&this._deleteGroupAtTips(E),D.unreadCount===0)return f;const{helper:{ChatError:P}}=this._core;try{if(D.type===u.CONV_C2C){const W=this._getLocalMessageMaxTime(D);v+=`lastMessageTime:${W}`,yield this._setC2CMessageRead(E,W)}if(D.type===u.CONV_GROUP){const W=this._getLocalMessageMaxSequence(D);v+=`lastMessageSequence:${W}`,yield this._setGroupMessageRead(E,W)}}catch(W){const{errorCode:nA,errorInfo:EA}=W;throw new P({functionName:"setMessageRead",code:nA,message:EA,moreMessage:v})}return D.type===u.CONV_SYSTEM&&(D.unreadCount=0),NA.emitConversationListUpdate(),Object.assign(Object.assign({},f),{successLog:{message:v}})})}setAllMessageRead(){return mA(this,arguments,void 0,function*(s={}){const{OuterConstant:{READ_ALL_MSG:r},utils:{safeStringify:g}}=this._core;let u=`scope:${s.scope}`;s.scope||(s.scope=r);const{scope:E}=s,f=this._generateSetAllMessageReadRequestData(E);if(f.allC2CMessageReadStatus===oa&&f.groupMessageReadInfoList.length===0)return{code:0};try{const D=yield function(v){return mA(this,void 0,void 0,function*(){const{allC2CMessageReadStatus:N,groupMessageReadInfoList:P}=v,W={C2CReadAllMsg:N,GroupReadInfo:P};return yo.core.common.buildAndSendPacket({servcmd:"openim.read_all_unread_msg",data:W})})}(f);if(D){const{GroupReadInfoArray:v,C2CReadAllMsg:N}=D,P=this._parseGroupReadInfo(v);this._updateAllConversationReadStatus({allC2CMessageReadStatus:N})>0&&NA.emitConversationListUpdate(),u+=`failureGroupInfoList:${g(P)}`}return{code:0,successLog:{message:u}}}catch(D){const{errorCode:v}=D;throw new this._core.helper.ChatError({functionName:"setAllMessageRead",code:v,moreMessage:u})}})}_handleAllMessageRead(s){const{GroupReadInfoArray:r,C2CReadAllMsg:g}=s;this._parseGroupReadInfo(r),this._updateAllConversationReadStatus({allC2CMessageReadStatus:g})>0&&NA.emitConversationListUpdate()}_updateAllConversationReadStatus(s){const{OuterConstant:{CONV_C2C:r,CONV_GROUP:g},appStore:u}=this._core,E=u.conversationStore.getConversationMap(),{allC2CMessageReadStatus:f}=s;let D=0;for(const[v,N]of E)if(N.unreadCount>=1){if(f===q&&N.type===r){const P=this._getLocalMessageMaxTime(N);NA.markMessageAsRead({conversationID:v,lastReadTime:P})}else if(N.type===g){const P=v.replace(g,"");if(this._serverGroupConversationLastReadSeqMap.has(P)){const W=this._serverGroupConversationLastReadSeqMap.get(P);NA.markMessageAsRead({conversationID:v,lastReadSequence:W})}}NA.updateUnreadCount(v,!1)&&(D+=1)}return D}_generateSetAllMessageReadRequestData(s){const{OuterConstant:{CONV_C2C:r,CONV_GROUP:g,READ_ALL_C2C_MSG:u},appStore:E}=this._core,f={allC2CMessageReadStatus:oa,groupMessageReadInfoList:[]},D=E.conversationStore.getConversationMap();for(const[,v]of D){const{type:N,unreadCount:P}=v;if(this._shouldSetAllMessageRead({scope:s,type:N,unreadCount:P})){if(N===r&&f.allC2CMessageReadStatus===oa){if(f.allC2CMessageReadStatus=q,s===u)break}else if(N===g){const W=this._getLocalMessageMaxSequence(v),{groupID:nA}=v.groupProfile;f.groupMessageReadInfoList.push({GroupId:nA,MsgSeq:W})}}}return f}_parseGroupReadInfo(s){const{utils:{isUndefined:r}}=this._core,g=[];return s?.forEach(u=>{const{GroupId:E,MsgSeq:f,RetCode:D,LastReadMsgSeq:v}=u;r(D)?this._serverGroupConversationLastReadSeqMap.set(E,v):(this._serverGroupConversationLastReadSeqMap.set(E,f),D!==0&&g.push(`${E}-${f}-${D}`))}),g}_deleteGroupAtTips(s){return mA(this,void 0,void 0,function*(){console.log(`${this._name}._deleteGroupAtTips conversationID:${s}`);const r=NA.getLocalConversation(s);if(!r)return;const g=r?.groupAtInfoList||[];if(g.length!==0)try{const{common:{getCurrentUserID:u,isCommunity:E},OuterConstant:{CONV_GROUP:f,CONV_AT_ALL:D}}=this._core;let v=[...g];if(E({groupID:s.replace(f,"")})&&(v=g.filter(P=>!P.atTypeArray.includes(D)),v.length===0))return void this._clearGroupAtInfoList(s,!1);const N=v.map(P=>({From_Account:P.from,To_Account:u(),MsgSeq:P.__sequence,MsgRandom:P.__random,GroupId:P.groupID}));yield function(P,W){return mA(this,void 0,void 0,function*(){const{messageListToDelete:nA}=P,EA={DelMsgList:nA};return W.common.buildAndSendPacket({servcmd:"openim.deletemsg",data:EA})})}({messageListToDelete:N},this._core),console.log(`${this._name}._deleteGroupAtTips ok. count:${g.length}`),this._clearGroupAtInfoList(s)}catch(u){console.error(`${this._name}._deleteGroupAtTips fail:`,u)}})}_clearGroupAtInfoList(s,r=!0){const g=NA.getLocalConversation(s);g&&(g.groupAtInfoList.length>0&&(g.clearGroupAtInfoList(),console.log(`${this._name}._clearGroupAtInfoList conversationID:${s} needEmitConversationUpdate:${r}`)),r&&NA.emitConversationListUpdate())}_getLocalMessageMaxTime(s){var r;const{conversationID:g}=s,u=this._core.message.messageDataHandler.getLocalMessageList(g),E=Math.max(...u.map(D=>D.time));let f=((r=s?.lastMessage)===null||r===void 0?void 0:r.lastTime)||0;return E>f&&(console.log(`${this._name}._getLocalMessageMaxTime update lastMessageTime from ${f} to ${E}`),f=E),f}_getLocalMessageMaxSequence(s){var r;const{conversationID:g}=s,u=this._core.message.messageDataHandler.getLocalMessageList(g),E=Math.max(...u.map(D=>D.sequence));let f=((r=s?.lastMessage)===null||r===void 0?void 0:r.lastSequence)||0;return E>f&&(console.log(`${this._name}._getLocalMessageMaxSequence update lastMessageSequence from ${f} to ${E}`),f=E),f}_setC2CMessageRead(s,r){return mA(this,void 0,void 0,function*(){try{yield function(g,u){return mA(this,void 0,void 0,function*(){return u.common.buildAndSendPacket({servcmd:"openim.msgreaded",data:g})})}({C2CMsgReaded:{Cookie:"",C2CMsgReadedItem:[{To_Account:s.replace("C2C",""),LastedMsgTime:r,Receipt:1}]}},this._core),console.log(`${this._name}._setC2CMessageRead ok, lastReadTime:${r}`),NA.markMessageAsRead({conversationID:s,lastReadTime:r}),NA.updateUnreadCount(s)}catch(g){throw console.warn(`${this._name}._setC2CMessageRead fail:`,g),g}})}_setGroupMessageRead(s,r){return mA(this,void 0,void 0,function*(){try{yield function(g,u){return mA(this,void 0,void 0,function*(){const{groupID:E,lastMessageSequence:f}=g,D={GroupId:E,MsgReadedSeq:f};return u.common.buildAndSendPacket({servcmd:"group_open_http_svc.msg_read_report",data:D})})}({groupID:s.replace("GROUP",""),lastMessageSequence:r},this._core),console.log(`${this._name}._setGroupMessageRead ok, lastReadSequence:${r}`),NA.markMessageAsRead({conversationID:s,lastReadSequence:r}),NA.updateUnreadCount(s)}catch(g){throw console.warn(`${this._name}._setGroupMessageRead fail:`,g),g}})}_shouldSetAllMessageRead(s){const{OuterConstant:{CONV_C2C:r,CONV_GROUP:g,READ_ALL_MSG:u,READ_ALL_C2C_MSG:E,READ_ALL_GROUP_MSG:f}}=this._core,{type:D,scope:v,unreadCount:N}=s;return!(N<=0)&&(!(D!==r||![u,E].includes(v))||!(D!==g||![u,f].includes(v)))}},de=new class{constructor(){this._name="PinConversation"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"pinConversation",context:this})}handleConversationPinned(s,r){const{utils:{isArray:g}}=this._core;if(!g(s))return;const{OuterConstant:u}=this._core;let E=!1;s.forEach(f=>{const{Type:D,Peer_Account:v,GroupId:N}=f;let P;D===1?P=NA.getLocalConversation(`${u.CONV_C2C}${v}`):D===2&&(P=NA.getLocalConversation(`${u.CONV_GROUP}${N}`)),P&&(console.log(`${this._name}.handleConversationPinned conversationID:${P.conversationID} localPinned:${P.isPinned} remotePinned:${r}`),r&&!P.isPinned&&(P.isPinned=!0,E=!0),!r&&P.isPinned&&(P.isPinned=!1,E=!0))}),E&&NA.emitConversationListUpdate(!0)}pinConversation(s){return mA(this,void 0,void 0,function*(){const{OuterConstant:r,common:g,helper:{ChatError:u}}=this._core,{conversationID:E,isPinned:f}=s,D={code:0,data:{conversationID:E}},v=NA.getLocalConversation(E);if(v&&v.isPinned===f)return D;if(qn(E))return v&&(v.isPinned=f),NA.emitConversationListUpdate(!0),D;const N=`conversationID:${E} isPinned:${f}`;try{let P=null;if(St(E)?P={Type:1,To_Account:E.replace(r.CONV_C2C,"")}:Cg(E)&&(P={Type:2,GroupId:E.replace(r.CONV_GROUP,"")}),yield function(nA,EA){return mA(this,void 0,void 0,function*(){const{fromAccount:wA,operationType:kA,itemList:VA}=nA,LA={From_Account:wA,OperationType:kA,RecentContactItem:VA};return EA.common.buildAndSendPacket({servcmd:"recentcontact.top",data:LA})})}({fromAccount:g.getCurrentUserID(),operationType:f===!0?1:2,itemList:[P]},this._core)){if(v)v.isPinned!==f&&(v.isPinned=f);else{const nA=new yt({conversationID:E,type:St(E)?r.CONV_C2C:r.CONV_GROUP,isPinned:f});NA.setLocalConversation(E,nA)}NA.emitConversationListUpdate(!0)}return Object.assign(Object.assign({},D),{successLog:{message:N}})}catch(P){const{errorCode:W,errorInfo:nA}=P;throw new u({functionName:"pinConversation",code:W,message:nA,moreMessage:N})}})}},Ve=new class{constructor(){this._name="DeleteConversation"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"deleteConversation",context:this})}handleConversationDeleted(s){const{utils:{isArray:r}}=this._core;if(!r(s))return;const{OuterConstant:g}=this._core,u=[];s.forEach(E=>{const{Type:f,Peer_Account:D,GroupId:v}=E;f===1&&u.push(`${g.CONV_C2C}${D}`),f===2&&u.push(`${g.CONV_GROUP}${v}`)}),console.log(`${this._name}.handleConversationDeleted conversationIDList:${u}`),this._deleteLocalConversationList(u)}deleteConversation(s){return mA(this,void 0,void 0,function*(){const{utils:{isString:r}}=this._core;if(r(s))return this._deleteConversation({conversationIDList:[s],flag:ua.ONLY_CONVERSATIONID});const g=Object.assign({},s);return g.conversationIDList.length>100&&(g.conversationIDList=g.conversationIDList.slice(0,100)),this._deleteConversation(g)})}_deleteConversation(s){return mA(this,void 0,void 0,function*(){const{conversationIDList:r,clearHistoryMessage:g=!0,flag:u=0}=s,{helper:{ChatError:E}}=this._core,f=`conversationIDList:${r} clearHistoryMessage:${g}`;try{const D=yield Promise.all([this._deleteConversationFromLocal(r),this._deleteConversationFromServer(r,g)]),v=[...D[0],...D[1]];if(v.length===0)throw new this._core.helper.ChatError({code:Sa.CONV_NOT_FOUND});return{code:0,data:u===ua.ONLY_CONVERSATIONID?{conversationID:v[0]}:{conversationIDList:v},successLog:{message:f}}}catch(D){const{errorCode:v,errorInfo:N}=D;throw new E({code:v,message:N,moreMessage:f})}})}_deleteConversationFromLocal(s){const{OuterConstant:r}=this._core;return s.filter(g=>{var u;if(!NA.hasLocalConversation(g))return!1;const E=(u=NA.getLocalConversation(g))===null||u===void 0?void 0:u.type;return E!==r.CONV_GROUP||this._hasLocalGroup(g)?E===r.CONV_SYSTEM&&(this._deleteLocalConversation(g),!0):(this._deleteLocalConversation(g),!0)})}_deleteConversationFromServer(s,r){return mA(this,void 0,void 0,function*(){const{OuterConstant:g,common:u}=this._core,E={fromAccount:u.getCurrentUserID(),conversationList:[],clearHistoryMessage:r?1:0};if(s.forEach(D=>{var v;if(NA.hasLocalConversation(D)){const N=((v=NA.getLocalConversation(D))===null||v===void 0?void 0:v.type)||"",P=D.replace(N,"");N===g.CONV_C2C?E.conversationList.push({To_Account:P,Type:1}):N===g.CONV_GROUP&&this._hasLocalGroup(D)&&E.conversationList.push({ToGroupid:P,Type:2})}}),E.conversationList.length===0)return[];const f=yield function(D,v){return mA(this,void 0,void 0,function*(){const{fromAccount:N,conversationList:P,clearHistoryMessage:W}=D,nA={From_Account:N,ContactItem:P,ClearRamble:W};return v.common.buildAndSendPacket({servcmd:"recentcontact.batch_delete",data:nA})})}(E,this._core);if(f){const{ResultItem:D=[]}=f,v=[];return D.length>0&&D.forEach(N=>{if(N.ResultCode===0){const P=N.Type===1?`${g.CONV_C2C}${N.To_Account}`:`${g.CONV_GROUP}${N.ToGroupid}`;v.push(P)}}),this._deleteLocalConversationList(v),v}return[]})}_deleteLocalConversationList(s){let r=!1;s.forEach(g=>{NA.hasLocalConversation(g)&&(this._deleteLocalConversation(g,!1),r=!0)}),console.log(`${this._name}._deleteLocalConversationList isUpdate:${r}`),r&&NA.emitConversationListUpdate()}_deleteLocalConversation(s,r=!0){const g=NA.hasLocalConversation(s);console.log(`${this._name}._deleteLocalConversation conversationID:${s} has:${g}`),g&&(NA.deleteLocalConversation(s),this._deleteConversationLocalMessage(s),r&&NA.emitConversationListUpdate())}_hasLocalGroup(s){const{OuterConstant:{CONV_GROUP:r},appStore:{groupStore:g}}=this._core,u=s.replace(r,"");return!!g.getGroup(u)}_deleteConversationLocalMessage(s){console.log(`${this._name}._deleteConversationLocalMessage conversationID:${s}`),this._core.message.messageDataHandler.deleteConversationMessageList(s),this._core.message.messageHistory.completedHistoryConversations.delete(s)}},_t=new class{constructor(){this._name="SetConversationDraft"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"setConversationDraft",context:this})}setConversationDraft(s){return mA(this,void 0,void 0,function*(){const{conversationID:r,draftText:g}=s;if(console.log(`${this._name} conversationID:${r} draftText:${g}`),!NA.hasLocalConversation(r))throw new this._core.helper.ChatError({code:Sa.CONV_NOT_FOUND});const u=NA.getLocalConversation(r);return u?.setDraftText(g),NA.emitConversationListUpdate(),{code:0,data:{conversation:u}}})}},ti=new class{constructor(){this._name="SetC2CMessageRemindType"}init(s){this._core=s}set(s,r){return mA(this,void 0,void 0,function*(){s.length>30&&(console.warn(`${this._name}.set userIDList length:${s.length} exceeds limit 30`),s.splice(30));const g=function(){const{MSG_REMIND_ACPT_AND_NOTE:P,MSG_REMIND_DISCARD:W,MSG_REMIND_ACPT_NOT_NOTE:nA}=yo.core.OuterConstant;return{[P]:0,[W]:1,[nA]:2}}()[r],u=yield function(P,W){return mA(this,void 0,void 0,function*(){const{userIDList:nA,receiveMessageOption:EA}=P,wA={Peer_Account:nA,Mute_Notifications:EA};return W.common.buildAndSendPacket({servcmd:"openim.set_c2c_peer_mute_notifications",data:wA})})}({userIDList:s,receiveMessageOption:g},this._core),{ErrorList:E=[]}=u||{},f=[];E.forEach(P=>{const{Peer_Account:W,ErrorCode:nA}=P;f.push({userID:W,code:nA});const EA=s.indexOf(W);EA>-1&&s.splice(EA,1)});const D=[],v=[],{OuterConstant:N}=this._core;return s.forEach(P=>{v.push(`${N.CONV_C2C}${P}`),D.push({userID:P})}),NA.patchMessageRemindType(v,r),{code:0,data:{successUserIDList:D,failureUserIDList:f}}})}},ui=new class{constructor(){this._name="SetGroupMessageRemindType"}init(s){this._core=s}set(s,r){return mA(this,void 0,void 0,function*(){const{common:{getCurrentUserID:g,isTopic:u},OuterConstant:E}=this._core;if(yield function(f,D){return mA(this,void 0,void 0,function*(){const{groupID:v,userID:N,receiveMessageOption:P}=f,W={GroupId:v,Member_Account:N,MsgFlag:P};return D.common.buildAndSendPacket({servcmd:"group_open_http_svc.modify_group_member_info",data:W})})}({groupID:s,userID:g(),receiveMessageOption:r},this._core),!u(s)){const f=`${E.CONV_GROUP}${s}`;NA.patchMessageRemindType([f],r)}return{code:0,data:{groupID:s,messageRemindType:r}}})}},Rt=new class{constructor(){this._name="SetMessageRemindType"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"setMessageRemindType",context:this})}handleC2CMessageRemindTypeSync(s){const{helper:{isEmpty:r},OuterConstant:g,ssoLog:u}=this._core;s.forEach(E=>{const{MuteNotificationsSync:f}=E;if(!r(f)){const{To_Account:D,MuteNotifications:v}=f,N=D.map(W=>`${g.CONV_C2C}${W}`),P=io(v);u.debug(`${this._name}.handleC2CMessageRemindTypeSync conversationIDList:${N} messageRemindType:${P}`),NA.patchMessageRemindType(N,P)}})}setMessageRemindType(s){return mA(this,void 0,void 0,function*(){const r="setMessageRemindType",{groupID:g,userIDList:u,messageRemindType:E}=s,{helper:f,utils:{isUndefined:D},ssoLog:v}=this._core;try{if(!D(g))return v.debug(`${this._name}.${r} groupID:${g} messageRemindType:${E}`),yield ui.set(g,E);if(!D(u))return v.debug(`${this._name}.${r} userIDList:${u} messageRemindType:${E}`),yield ti.set(u,E);throw new f.ChatError({functionName:r,message:"userIDList or groupID is required"})}catch(N){throw new f.ChatError({functionName:r,code:N?.errorCode,message:N?.errorInfo,moreMessage:`groupID:${g} userIDList:${u} messageRemindType:${E}`})}})}},fi=new class{init(s){s.ssoLog.debug("ConversationAction.init"),this._core=s,ee.init(s),Ne.init(s),he.init(s),Ue.init(s),de.init(s),Ve.init(s),_t.init(s),Rt.init(s);const{notificationCenter:r,InnerEvent:{MESSAGE_PUSH:g,DESTROY:u}}=this._core,{InnerEventSubType:{CONV_MODIFIED:E,C2C_MESSAGE_READ_SYNC:f,GROUP_MESSAGE_READ_SYNC:D,C2C_REMIND_TYPE_SYNC:v}}=r;r.subscribeInnerEvent(g,E,this._onConversationModified,this),r.subscribeInnerEvent(g,f,this._onC2CMessageReadSync,this),r.subscribeInnerEvent(g,v,this._onC2CMessageRemindTypeSync,this),r.subscribeInnerEvent(g,D,this._onGroupMessageReadSync,this),r.subscribeInnerEvent(u,this._dispose,this)}_onConversationModified(s){const{constants:{ConvModifyPushType:r}}=this._core,{RecentContactMod:g=[]}=s;g.forEach(u=>{const{PushType:E}=u;if(E===r.CONV_DELETED){const{RecentContactList:f}=u.RecentContactDeleteItem;Ve.handleConversationDeleted(f)}if(E===r.CONV_PINED){const{RecentContactList:f}=u.RecentContactTopItem;de.handleConversationPinned(f,!0)}if(E===r.CONV_UNPINED){const{RecentContactList:f}=u.RecentContactTopItem;de.handleConversationPinned(f,!1)}})}_onC2CMessageReadSync(s){const{C2cNotifyMsgArray:r=[]}=s;Ue.handleC2CMessageReadSync(r)}_onC2CMessageRemindTypeSync(s){const{C2cNotifyMsgArray:r=[]}=s;Rt.handleC2CMessageRemindTypeSync(r)}_onGroupMessageReadSync(s){const{GroupTips:r=[]}=s;Ue.handleGroupMessageReadSync(r)}_dispose(){const{notificationCenter:s,InnerEvent:{MESSAGE_PUSH:r,DESTROY:g}}=this._core,{InnerEventSubType:{CONV_MODIFIED:u,C2C_MESSAGE_READ_SYNC:E,GROUP_MESSAGE_READ_SYNC:f,C2C_REMIND_TYPE_SYNC:D}}=s;s.unSubscribeInnerEvent(r,u,this._onConversationModified,this),s.unSubscribeInnerEvent(r,E,this._onC2CMessageReadSync,this),s.unSubscribeInnerEvent(r,D,this._onC2CMessageRemindTypeSync,this),s.unSubscribeInnerEvent(r,f,this._onGroupMessageReadSync,this),s.unSubscribeInnerEvent(g,this._dispose,this)}},go=new class{init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"setAllReceiveMessageOpt",context:this})}setAllReceiveMessageOpt(s){return mA(this,void 0,void 0,function*(){try{const{OuterConstant:{MSG_REMIND_ACPT_NOT_NOTE:r}}=this._core,{messageRemindType:g=r,isRepeated:u=!0}=s,{startTime:E=0,endTime:f=0}=this._calcStartAndEndTime(s),D=yield function(v){return mA(this,void 0,void 0,function*(){const{common:N}=yo.core,{startTime:P,endTime:W,isRepeated:nA,messageRemindType:EA}=v,wA={StartTime:P,EndTime:W,IsRepeated:nA,Level:EA};return N.buildAndSendPacket({servcmd:"im_msg_db_logic.ws_set_do_not_disturb",data:wA})})}({messageRemindType:this._getType(g),startTime:E,endTime:f,isRepeated:u?In.ON:In.OFF});return{code:0,data:{errorCode:D.ErrorCode,errorInfo:D.ErrorInfo}}}catch(r){cc("setAllReceiveMessageOpt",r)}})}_calcStartAndEndTime(s){const{startHour:r=0,startMinute:g=0,startSecond:u=0,duration:E=0,isRepeated:f=!0}=s,D=new Date,v=new Date(D.getFullYear(),D.getMonth(),D.getDate(),r,g,u),N=Math.round(v.getTime()/1e3);let P=N+E;return f&&E>=86400&&(P=N+86400),{startTime:N,endTime:P}}_getType(s){const{OuterConstant:r}=this._core;return{[r.MSG_REMIND_ACPT_AND_NOTE]:0,[r.MSG_REMIND_DISCARD]:1,[r.MSG_REMIND_ACPT_NOT_NOTE]:2}[s]}},fn=new class{init(s){this._core=s;const{helper:r,notificationCenter:g,InnerEvent:u}=s;r.registerApi({apiName:"getAllReceiveMessageOpt",context:this}),g.subscribeInnerEvent(u.MESSAGE_PUSH,g.InnerEventSubType.ALL_RECEIVE_MESSAGE_OPTION,this.onAllReceiveMsgOptionNotify,this)}onAllReceiveMsgOptionNotify(s){const r=this._handleResult(s),{notificationCenter:g,OuterEvent:{ALL_RECEIVE_MESSAGE_OPT_UPDATED:u}}=this._core;g.emitOuterEvent(u,{name:u,data:r})}getAllReceiveMessageOpt(){return mA(this,void 0,void 0,function*(){try{const s=yield function(){return mA(this,void 0,void 0,function*(){const{common:r}=yo.core,g={To_Account:r.getCurrentUserID()};return r.buildAndSendPacket({servcmd:"im_msg_db_logic.ws_get_do_not_disturb",data:g})})}();return{code:0,data:this._handleResult(s)}}catch(s){cc("getAllReceiveMessageOpt",s)}})}_handleResult(s){const{OuterConstant:r}=this._core,{MSG_REMIND_ACPT_AND_NOTE:g,MSG_REMIND_DISCARD:u,MSG_REMIND_ACPT_NOT_NOTE:E}=r,f={0:g,1:u,2:E},{Level:D,StartTime:v,EndTime:N,IsRepeated:P}=s;return{messageRemindType:f[D]||g,startTime:v,endTime:N,isRepeated:P===In.ON}}},xo=new class{init(s){s.ssoLog.debug("ReceiveMessageOptions.init"),this._core=s,ti.init(s),ui.init(s),QA.init(s),yA.init(s),go.init(s),fn.init(s)}};const ai=s=>!St(s)&&!Cg(s)&&!qn(s),Yr={getConversationProfile:[{key:"conversationID",required:!0,rules:["string"],allowEmpty:!1,customValidator:s=>!ai(s)||"conversationID is invalid."}],setMessageRead:{conversationID:{required:!0,rules:["string"],allowEmpty:!1,customValidator:s=>!ai(s)||"conversationID is invalid."}},pinConversation:{conversationID:{required:!0,rules:["string"],allowEmpty:!1,customValidator:s=>!ai(s)||"conversationID is invalid."},isPinned:{required:!0,rules:["boolean"],allowEmpty:!1}},deleteConversation:[{key:"options",required:!0,rules:["string","object"],allowEmpty:!1,customValidator:s=>{const{core:{utils:{isArray:r,isObject:g,isString:u}}}=yo;if(!u(s)&&!g(s))return"options is String or Object.";if(u(s)&&ai(s))return"conversationID is invalid.";if(g(s)){if(!r(s.conversationIDList))return"conversationIDList is not Array.";if(s.conversationIDList.length===0)return"conversationIDList is empty.";if(s.conversationIDList.some(E=>{if(ai(E))return!0}))return"conversationIDList includes invalid conversationID.";if(s.clearHistoryMessage&&typeof s.clearHistoryMessage!="boolean")return"clearHistoryMessage is not Boolean."}return!0}}],setConversationDraft:{conversationID:{required:!0,rules:["string"],allowEmpty:!1,customValidator:s=>!(!St(s)&&!Cg(s))||"conversationID is invalid."},draftText:{required:!0,rules:["string"],allowEmpty:!0}},setAllReceiveMessageOpt:{messageRemindType:{required:!1,rules:["string"],allowEmpty:!0},startHour:{required:!1,rules:["number"],allowEmpty:!0},startMinute:{required:!1,rules:["number"],allowEmpty:!0},startSecond:{required:!1,rules:["number"],allowEmpty:!0},duration:{required:!1,rules:["number"],allowEmpty:!0},isRepeated:{required:!1,rules:["boolean"],allowEmpty:!0}}},nn={getConversationList:!0,getConversationProfile:!0,getTotalUnreadCount:!0,setMessageRead:!0,pinConversation:!0,deleteConversation:!0,setConversationDraft:!0,setMessageRemindType:!0,getAllReceiveMessageOpt:!0,setAllReceiveMessageOpt:!0};var er=new class{constructor(){this.name="Conversation"}install(s){yo.init(s),fi.init(s),xo.init(s),NA.init(s),s.helper.registerValidateConfig({auth:nn,params:Yr})}};const tr=new class{init(s){this.core=s}},na="AVChatRoom",zr="AV_HISTORY_MSG",lc="GRP_COUNTER",Wu="Set",Rm="Increase",Gi="Decrease",gi=0,_o=1,Es=2,un=["Type","Name","Introduction","Notification","FaceUrl","Owner_Account","CreateTime","InfoSeq","LastInfoTime","LastMsgTime","MemberNum","MaxMemberNum","ApplyJoinOption","NextMsgSeq","ShutUpAllMember","InviteJoinOption","LastRecallTime"],hg=["Type","Name","Introduction","Notification","FaceUrl","CreateTime","Owner_Account","LastInfoTime","LastMsgTime","NextMsgSeq","MemberNum","MaxMemberNum","ApplyJoinOption","InviteJoinOption"],Hl=["Role","JoinTime","MsgFlag","MsgSeq"],Dd=["Role","JoinTime","MsgSeq","MsgFlag","NameCard"],Vc=0,_r=1,_I="notStart",cu="resolved",Yg="rejected",lu=10018,TI=11e3,Hc=2,zu=["Owner","Admin","Member"],wm=["Role","JoinTime","NameCard","ShutUpUntil","OnlineStatus"],_m=0,Tm=1,Nm=2,QD=4,pD=1,KM=2,mD=3,fD=4,jM=5,_T=1,Sd=0,TT=4,yD=6,NT=400,DD=300,GT={from:!0,groupID:!0,groupName:!0,to:!0},WM={from:!0,groupID:!0,groupName:!0,to:!0,type:!0},bT=2,zM=4,kT=5,LT=7,SD=8,vD=15,UQ=20,Gm=21,bm=2600,vd=2602,UT=2603,FT=2620,km=2621,MD=2623,Ch=2660,OT=2661,PT=2681,Lm=2683,ZM=2684,RD=2685,Um=2687,XM=3122,xT=10018,YT={0:"DisableInvite",1:"NeedPermission",2:"FreeAccess"},$M=s=>s===tr.core.OuterConstant.GRP_PUBLIC,Md=s=>s===tr.core.OuterConstant.GRP_AVCHATROOM,Fm=(s,r)=>{const{isArray:g}=tr.core.utils;if(!g(s)||!g(r))return!1;let u=!1;return r.forEach(({key:E,value:f})=>{const D=s.find(v=>v.key===E);D?D.value!==f&&(D.value=f,u=!0):(s.push({key:E,value:f}),u=!0)}),u},Rd=s=>{const r=[];if(!s)return r;for(let g=0,u=s.length;g{const r=[];for(let g=0,u=s.length;g0&&v.members.forEach(N=>{N.userID===this.selfInfo.userID&&D(this.selfInfo,N,["sequence"])})}updateSelfInfo(r){const{nameCard:g,joinTime:u,role:E,messageRemindType:f,readedSequence:D,excludedUnreadSequenceList:v}=r,{common:{deepMerge:N}}=tr.core;N(this.selfInfo,{nameCard:g,joinTime:u,role:E,messageRemindType:f,readedSequence:D,excludedUnreadSequenceList:v},[],["",null,void 0,0,NaN])}setSelfNameCard(r){this.selfInfo.nameCard=r}}var Wi=new class{constructor(){this._name="GroupDataHandler"}init(s){this._core=s;const{appStore:{groupStore:r}}=s;this._groupMap=r.getGroupMap()}hasLocalGroup(s){return this._groupMap.has(s)}getLocalGroup(s){return this._groupMap.get(s)}updateLocalGroup(s){const{common:{getCurrentUserID:r}}=this._core;let g;s.forEach(E=>{var f;g=E.groupID,this.hasLocalGroup(g)?(f=this.getLocalGroup(g))===null||f===void 0||f.updateGroup(E):(this._groupMap.set(g,new Zu(E)),this._clearGroupLocalMessage(g))});const u=r();for(const[,E]of this._groupMap)E.selfInfo.userID=u,E.selfInfo.role==="Owner"&&(E.ownerID=u)}deleteLocalGroup(s){this._groupMap.delete(s)}getLocalGroupList(){const{OuterConstant:{GRP_ROOM:s,GRP_LIVE:r}}=this._core;return[...this._groupMap.values()].filter(g=>{const{type:u}=g;return u!==s&&u!==r})}clearLocalGroup(){this._groupMap.clear()}emitGroupListUpdate(){const s=this.getLocalGroupList(),{OuterEvent:{GROUP_LIST_UPDATED:r},notificationCenter:g}=this._core;g.emitOuterEvent(r,{name:r,data:s})}updateConversationGroupProfile(s){const{appStore:{conversationStore:r},OuterConstant:{CONV_GROUP:g}}=this._core,u=`${g}${s}`,E=r.getConversation(u);if(E){const f=this.getLocalGroup(s);E.setProfileCompleted(),r.updateConversation(u,{groupProfile:f})}}reset(){this.clearLocalGroup()}_clearGroupLocalMessage(s){const{message:{messageHistory:r,messageDataHandler:g},OuterConstant:{CONV_GROUP:u},ssoLog:E}=this._core;E.debug("_clearGroupLocalMessage",`groupID:${s}`);const f=`${u}${s}`;r.completedHistoryConversations.delete(f),g.deleteConversationMessageList(f)}};function Pm(s,r){return mA(this,void 0,void 0,function*(){const{type:g,limit:u,offset:E,supportTopic:f=0,memberAccount:D,responseFilter:v}=s,N={Type:g,Limit:u,Offset:E,Member_Account:D,ResponseFilter:v,SupportTopic:f,NeedAppDefineData:1};return r.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_joined_group_list",data:N})})}const fs=function(s,r){return{code:0,data:s||{},successLog:r}};var AR=new class{constructor(){this._name="GetGroupList",this._pagingStatus=_I,this.PAGING_GRP_COUNT_LIMIT=200}init(s){this._core=s;const{helper:r,constants:{WORKFLOW_NAME:g,WORKFLOW_STEP:u}}=s;r.registerApi({apiName:"getGroupList",context:this}),r.registerWorkflowStep(g.SYNC_SERVER_INFO_AFTER_LOGIN,u.GROUP_LIST_SYNC,this._syncGroupList,this)}getGroupList(){return mA(this,arguments,void 0,function*(s=!1){if(s){const g=[];return yield this._pagingGetJoinedCommunityList({limit:this.PAGING_GRP_COUNT_LIMIT,offset:0,groupList:g}),Wi.updateLocalGroup(g),Wi.getLocalGroupList()}if(this._core.ssoLog.debug("getGroupList",`${this._name}.getGroupList pagingStatus:${this._pagingStatus}`),this._pagingStatus===Yg||this._pagingStatus===_I)return this._syncGroupList().then(()=>{const g=Wi.getLocalGroupList();return fs({groupList:g,isSyncCompleted:this._isSyncCompleted()})}).catch(g=>{throw g});const r=Wi.getLocalGroupList();return fs({groupList:r,isSyncCompleted:this._isSyncCompleted()},{message:`return group count:${r.length}`})})}_syncGroupList(){return mA(this,void 0,void 0,function*(){this._pagingStatus===_I&&Wi.clearLocalGroup();const s=this.PAGING_GRP_COUNT_LIMIT,r=[];try{yield this._pagingGetGroupList({limit:s,offset:0,groupList:r}),this._pagingStatus=cu,this._groupListTreeShaking(r),Wi.updateLocalGroup(r);const g=Wi.getLocalGroupList();return this._core.ssoLog.debug("_syncGroupList",`${this._name}._syncGroupList ok, count:${g.length}`),Wi.emitGroupListUpdate(),g}catch(g){throw this._pagingStatus=Yg,g}})}_pagingGetGroupList(s){return mA(this,void 0,void 0,function*(){const{ssoLog:r}=this._core,{isCommunityRelay:g=!1,groupList:u}=s;let E,{limit:f,offset:D}=s;const v=[...un];g&&(E=this._core.OuterConstant.GRP_COMMUNITY,v.push("AtInfoList"));try{const N=yield Pm({type:E,limit:f,offset:D,memberAccount:this._core.store.get("login").userId,responseFilter:{GroupBaseInfoFilter:v,SelfInfoFilter:[...Hl]}},this._core),{GroupIdList:P=[],TotalCount:W=0}=N||{},nA=this._convertGroupKey(P);u.push(...nA);const EA=D+f,wA=!(W>EA),kA=`offset:${D} limit:${f} total:${W} isCompleted:${wA} current:${u.length} isCommunityRelay:${g}`;return r.debug("_pagingGetGroupList",`${this._name}._pagingGetGroupList ok. ${kA}`),g?wA?u:(D=EA,this._pagingGetGroupList({isCommunityRelay:!0,limit:f,offset:D,groupList:u})):wA?(r.debug("_pagingGetGroupList",`${this._name}._pagingGetGroupList start to get community list`),D=0,this._pagingGetGroupList({isCommunityRelay:!0,limit:f,offset:D,groupList:u})):(D=EA,this._pagingGetGroupList({limit:f,offset:D,groupList:u}))}catch(N){if(N.ErrorCode===lu)return r.warn("_pagingGetGroupList",`${this._name}._pagingGetGroupList response size exceeds the limit, request count:${f}`),f=50,this._pagingGetGroupList({isCommunityRelay:g,limit:f,offset:D,groupList:u});if(g)return N.code===TI&&r.debug("_pagingGetGroupList",`${this._name}._pagingGetGroupList ok. community unavailable`),u;throw N}})}_pagingGetJoinedCommunityList(s){return mA(this,void 0,void 0,function*(){const{common:{getCurrentUserID:r},OuterConstant:g,ssoLog:u}=this._core,{groupList:E}=s;let{limit:f,offset:D}=s;try{const v=yield Pm({limit:f,offset:D,type:g.GRP_COMMUNITY,memberAccount:r(),supportTopic:1,responseFilter:{GroupBaseInfoFilter:[...un],SelfInfoFilter:[...Hl]}},this._core),{GroupIdList:N=[],TotalCount:P=0}=v||{},W=this._convertGroupKey(N);E.push(...W);const nA=D+f,EA=!(P>nA),wA=`offset:${D} limit:${f} total:${P} isCompleted:${EA} current:${E.length}`;return u.debug("_pagingGetJoinedCommunityList",`${this._name}._pagingGetJoinedCommunityList ok. ${wA}`),EA?E:(D=nA,this._pagingGetJoinedCommunityList({limit:f,offset:D,groupList:E}))}catch(v){if(v.code===xT)return u.warn("_pagingGetJoinedCommunityList",`${this._name}._pagingGetJoinedCommunityList response size exceeds the limit, request count:${f}`),f=50,this._pagingGetJoinedCommunityList({limit:f,offset:D,groupList:E});throw v}})}_groupListTreeShaking(s){const r=new Map([...Wi.getLocalGroupList()]);for(let u=0,E=s.length;u{const{AtFlagList:E,AtMsgSeq:f,From_Account:D}=u;g.push({groupID:s,groupAtType:E,sequence:f,from:D})}),g}},Xu=new class{constructor(){this._name="CreateGroup"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"createGroup",context:this})}createGroup(s){return mA(this,void 0,void 0,function*(){var r;this._preCheckParams(s);const{helper:{ChatError:g}}=this._core;try{const{utils:{isEmpty:u},common:{getCurrentUserID:E},OuterConstant:{GRP_AVCHATROOM:f}}=this._core,D=yield function(nA,EA){return mA(this,void 0,void 0,function*(){const{name:wA,type:kA,groupID:VA,introduction:LA,notification:SA,avatar:PA,maxMemberNum:zA,joinOption:Ee,inviteOption:Ie,memberList:Li,groupCustomField:Ui,isSupportTopic:Yt}=nA;let Oi,Bn;Li&&(Oi=Li.map(Mt=>{const{userID:FA,memberCustomField:ci}=Mt;return{Member_Account:FA,AppMemberDefinedData:ci?JE(ci):void 0}})),Ui&&(Bn=JE(Ui));const Re={Name:wA,Type:kA,GroupId:VA,Introduction:LA,Notification:SA,FaceUrl:PA,MaxMemberCount:zA,ApplyJoinOption:Ee,InviteJoinOption:Ie,MemberList:Oi,AppDefinedData:Bn,SupportTopic:Yt,webPushFlag:1};return EA.common.buildAndSendPacket({servcmd:"group_open_http_svc.create_group",data:Re})})}(Object.assign(Object.assign({},s),{ownerID:E()}),this._core),{GroupId:v,OverJoinedGroupLimit_Account:N=[]}=D||{},P=`${this._name}.createGroup ok, type:${s.type} groupID:${v} overLimitUserIDList:${N}`;if(u(s.memberList)||u(N)||(s.memberList=(r=s.memberList)===null||r===void 0?void 0:r.filter(nA=>N.includes(nA.userID))),s.type===f)return fs({group:new Zu(Object.assign(Object.assign({},s),{groupID:v}))},{message:P});Wi.updateLocalGroup([Object.assign(Object.assign({},s),{groupID:v})]);const W=Wi.getLocalGroup(v);return this._notNeedSendCustomMessage(s)||(this._sendCustomMessage(v,s.type),Wi.emitGroupListUpdate()),fs({group:W},{message:P})}catch(u){const{errorCode:E,errorInfo:f}=u;throw new g({functionName:"createGroup",code:E,message:f,moreMessage:` groupID:${s.groupID}`})}})}_preCheckParams(s){const{type:r,groupID:g}=s,{utils:{isEmpty:u,isUndefined:E},common:{isCommunity:f}}=this._core,D=!u(g);if(!(()=>{const{GRP_PUBLIC:v,GRP_WORK:N,GRP_MEETING:P,GRP_AVCHATROOM:W,GRP_COMMUNITY:nA}=tr.core.OuterConstant;return[v,N,P,W,nA]})().includes(r))throw new this._core.helper.ChatError({code:bm});if(!f({type:r})){if(D&&f({groupID:g}))throw new this._core.helper.ChatError({code:vd});E(s.isSupportTopic)||(s.isSupportTopic=void 0)}if(this._canIUseMemberList(r)||E(s.memberList)||(s.memberList=void 0),this._canIUseJoinOption(r)||E(s.joinOption)||(s.joinOption=void 0),f({type:r})){if(D&&!f({groupID:g}))throw new this._core.helper.ChatError({code:vd});s.isSupportTopic=this._canIUseTopic(s)?1:0}}_canIUseMemberList(s){return!Md(s)}_canIUseJoinOption(s){return $M(s)||this._core.common.isCommunity({type:s})}_canIUseTopic(s){const{isSupportTopic:r}=s;return r===!0}_notNeedSendCustomMessage(s){const{type:r,isSupportTopic:g}=s,{OuterConstant:{GRP_AVCHATROOM:u,GRP_COMMUNITY:E}}=this._core;return r===u||r===E&&g===1}_sendCustomMessage(s,r){var g,u,E,f,D,v;const{OuterConstant:N,common:{t:P}}=this._core;let W=P("CREATE_GROUP"),nA=Vc;r===N.GRP_COMMUNITY&&(W=P("CREATE_COMMUNITY"),nA=_r);const EA={to:s,conversationType:"GROUP",payload:{data:JSON.stringify({businessID:"group_create",content:W,cmd:nA,opUser:this._core.store.get("login").userId,version:4})}},wA=(E=(u=(g=this._core)===null||g===void 0?void 0:g.message)===null||u===void 0?void 0:u.messageFactory)===null||E===void 0?void 0:E.createCustomMessage(EA);(v=(D=(f=this._core)===null||f===void 0?void 0:f.message)===null||D===void 0?void 0:D.messageSender)===null||v===void 0||v.sendMessage(wA,{})}},as=new class{constructor(){this._name="AttributesDataHandler",this._groupAttributesCache=new Map,this._groupAttributesCacheValuesCopy={}}init(s){this._core=s;const{helper:r,constants:g}=s;r.registerWorkflowStep(g.WORKFLOW_NAME.SYNC_SERVER_INFO_AFTER_RE_ONLINE,g.WORKFLOW_STEP.GROUP_ATTRIBUTE_CACHE_CLEAR,this.clearLocalMainSequence,this)}clearLocalMainSequence(){this._groupAttributesCache.forEach(s=>{s.localMainSequence=0})}isGroupAttributesUpdated(s){const{elements:{newGroupProfile:r}}=s,{utils:{isEmpty:g,isUndefined:u}}=this._core;return!u(r)&&!g(r.groupAttributeOption)}handleGroupAttributesUpdated(s){const{groupID:r,groupAttributeOption:g}=s,{serverMainSequence:u,groupAttributeList:E=[],operation:f}=g;this._core.ssoLog.debug("handleGroupAttributesUpdated",`${this._name}.handleGroupAttributesUpdated groupID:${r} operation:${f}`);const{utils:{isUndefined:D}}=this._core;D(f)||(this.refreshGroupAttributesCache({groupID:r,serverMainSequence:u,groupAttributeList:E,operation:f}),this.emitGroupAttributesUpdated(r))}initGroupAttributesCache(s){const{groupID:r,avChatRoomKey:g}=s;this._groupAttributesCache.set(r,{lastUpdateTime:0,localMainSequence:0,serverMainSequence:0,avChatRoomKey:g,values:new Map}),this._core.ssoLog.debug("initGroupAttributesCache",`${this._name}.initGroupAttributesCache. groupID:${r} avChatRoomKey:${g}`)}hasGroupAttributesCache(s){return this._groupAttributesCache.has(s)}getGroupAttributesCache(s){return this.hasGroupAttributesCache(s)||this.initGroupAttributesCache({groupID:s}),this._groupAttributesCache.get(s)}deleteGroupAttributesCache(s){this.hasGroupAttributesCache(s)&&this._groupAttributesCache.delete(s)}refreshGroupAttributesCache(s){const{groupID:r,serverMainSequence:g,groupAttributeList:u,operation:E}=s;if(this.hasGroupAttributesCache(r)){const f=this.getGroupAttributesCache(r),{localMainSequence:D}=f;E!==jM&&g-D!==1||(f.serverMainSequence=g,f.localMainSequence=g,f.lastUpdateTime=Date.now(),this._updateGroupAttributesCacheValues({groupAttributes:f,groupAttributeList:u,operation:E})),g-D>1&&(f.serverMainSequence=g),this._groupAttributesCache.set(r,f),this._core.ssoLog.debug("refreshGroupAttributesCache",`${this._name}.refreshGroupAttributesCache. operation:${E} localMainSequence:${D} serverMainSequence:${g}`)}}_updateGroupAttributesCacheValues(s){const{groupAttributes:r,groupAttributeList:g=[],operation:u}=s;u!==mD?u!==fD?(u===pD&&r.values.clear(),g.forEach(E=>{const{key:f,value:D,sequence:v}=E;r.values.set(f,{value:D,sequence:v})})):g.forEach(E=>{r.values.delete(E.key)}):r.values.clear()}getGroupAttributesCacheValues(s){var r;const{groupID:g,keyList:u=[]}=s,E={};if(this.hasGroupAttributesCache(g)){const{values:f}=this.getGroupAttributesCache(g);if(u.length===0){for(const D of f.keys())E[D]=((r=f.get(D))===null||r===void 0?void 0:r.value)||"";return E}return u.forEach(D=>{var v;f.has(D)&&(E[D]=((v=f.get(D))===null||v===void 0?void 0:v.value)||"")}),E}return E}saveGroupAttributesCacheValuesCopy(s){this._groupAttributesCacheValuesCopy=this.getGroupAttributesCacheValues({groupID:s})}emitGroupAttributesUpdated(s){var r,g;const{OuterConstant:{GRP_ROOM:u,GRP_LIVE:E}}=this._core,f=this.getGroupAttributesCacheValues({groupID:s}),D=this._core.appStore.groupStore.getGroup(s),{updatedKeyList:v,deletedKeyList:N}=this._computeValuesChangedData(f);v.length===0&&N.length===0||([u,E].includes(D.type)?(this._core.ssoLog.debug("RICH_STATUS_CHANGED",`${this._name}.emitRichStatusChanged update count:${v.length}, delete count:${N.length}`),this._emitEvent({name:(r=this._core)===null||r===void 0?void 0:r.OuterEvent.RICH_STATUS_CHANGED,data:{groupID:s,richStatus:f,updatedKeyList:v,deletedKeyList:N}})):(this._core.ssoLog.debug("emitGroupAttributesUpdated",`${this._name}.emitGroupAttributesUpdated update count:${v.length}, delete count:${N.length}`),this._emitEvent({name:(g=this._core)===null||g===void 0?void 0:g.OuterEvent.GROUP_ATTRIBUTES_UPDATED,data:{groupID:s,groupAttributes:f,updatedKeyList:v,deletedKeyList:N}})))}_computeValuesChangedData(s){const{utils:{isUndefined:r}}=this._core,g=[],u=[];return Object.keys(s).forEach(E=>{s[E]!==this._groupAttributesCacheValuesCopy[E]&&g.push(E)}),Object.keys(this._groupAttributesCacheValuesCopy).forEach(E=>{r(s[E])&&u.push(E)}),this._groupAttributesCacheValuesCopy={},{updatedKeyList:g,deletedKeyList:u}}_emitEvent(s){var r;(r=this._core)===null||r===void 0||r.notificationCenter.emitOuterEvent(s.name,s)}convertKeyValueMapToList(s){const r=[];return Object.keys(s).forEach(g=>{r.push({key:g,value:s[g]})}),r}reset(){this._groupAttributesCache.clear(),this._groupAttributesCacheValuesCopy={}}},Bh=new class{constructor(){this._name="DismissGroup"}init(s,r){this._core=s;const{helper:g}=s;g.registerApi({apiName:"dismissGroup",context:this,matcher:()=>!r.getInstalledSubPlugins().includes(na)})}dismissGroup(s){return mA(this,void 0,void 0,function*(){const{helper:{ChatError:r}}=this._core;try{yield function(u,E){return mA(this,void 0,void 0,function*(){const f={GroupId:u};return E.common.buildAndSendPacket({servcmd:"group_open_http_svc.destroy_group",data:f})})}(s,this._core);const{type:g}=Wi.getLocalGroup(s);return Wi.deleteLocalGroup(s),Wi.emitGroupListUpdate(),as.deleteGroupAttributesCache(s),fs({groupID:s,type:g},{message:s})}catch(g){const{errorCode:u,errorInfo:E}=g;throw new r({functionName:"dismissGroup",code:u,message:E})}})}},Jl=new class{constructor(){this._name="GetGroupProfile"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"getGroupProfile",context:this})}getGroupProfile(s){return mA(this,void 0,void 0,function*(){const{groupID:r,groupCustomFieldFilter:g}=s,u={groupIDList:[r],responseFilter:{GroupBaseInfoFilter:[...un],AppDefinedDataFilter_Group:g,MemberInfoFilter:[...Dd]}},{helper:{ChatError:E}}=this._core;try{const f=yield this.getGroupProfileAdvance(u),{successGroupList:D,failureGroupList:v}=f;if(v.length>0)throw v[0];let N;return!Wi.hasLocalGroup(r)&&Md(D[0].type)?N=new Zu(D[0]):(Wi.updateLocalGroup(D),N=Wi.getLocalGroup(r)),N.isSupportTopic||Wi.updateConversationGroupProfile(r),fs({group:N},{message:`groupID:${r}`})}catch(f){const{code:D,message:v}=f;throw new E({functionName:"getGroupProfile",code:D,message:v})}})}getGroupProfileAdvance(s){return mA(this,void 0,void 0,function*(){const{groupIDList:r}=s,{common:{isCommunity:g}}=this._core,u=r.filter(N=>!g({groupID:N})),E=r.filter(N=>g({groupID:N}));u.length>50&&(u.length=50),E.length>50&&(E.length=50);const f=yield Promise.all([this._getGroupProfileAdvance(Object.assign(Object.assign({},s),{groupIDList:u})),this._getGroupProfileAdvance(Object.assign(Object.assign({},s),{groupIDList:E,isCommunityProfile:!0}))]),D=[],v=[];return f.forEach(N=>{D.push(...N.successGroupList),v.push(...N.failureGroupList)}),{successGroupList:D,failureGroupList:v}})}_getGroupProfileAdvance(s){return mA(this,void 0,void 0,function*(){const{ssoLog:r,utils:{isUndefined:g}}=this._core,{isCommunityProfile:u=!1}=s,E=vo(s,["isCommunityProfile"]);if(E.groupIDList.length===0)return{successGroupList:[],failureGroupList:[]};try{const f=yield function(W,nA){return mA(this,void 0,void 0,function*(){const{groupIDList:EA,responseFilter:wA}=W,kA={GroupIdList:EA,ResponseFilter:wA};return nA.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_group_self_member_info",data:kA})})}(E,this._core),{GroupInfo:D=[]}=f||{},v=this._convertGroupProfileKey(D),N=v.filter(W=>g(W.errorCode)||W.errorCode===0),P=v.filter(W=>W.errorCode&&W.errorCode!==0).map(W=>({code:W.errorCode,message:W.errorInfo,data:{groupID:W.groupID}}));return r.debug("_getGroupProfileAdvance",`${this._name}._getGroupProfileAdvance ok, groupID:${E.groupIDList.join(",")}`),{successGroupList:N,failureGroupList:P}}catch(f){if(u)return{successGroupList:[],failureGroupList:[]};throw f}})}_convertGroupProfileKey(s){const r=[];for(let g=0,u=s.length;g0&&u{const{Key:N,Value:P=0}=v;E.set(N,P)}),this._groupCountersMap.set(r,{lastUpdateTime:Date.now(),groupCounterSeq:u,counters:E,avChatRoomKey:f})}}initGroupCountersCache(s){const{groupID:r,avChatRoomKey:g}=s;this._groupCountersMap.set(r,{lastUpdateTime:0,groupCounterSeq:0,counters:new Map,avChatRoomKey:g})}getLocalCounters(s,r){const g={};if(!this._hasLocalGroupCounters(s))return g;const{counters:u}=this.getLocalGroupCounters(s);if(r.length>0)r.forEach(E=>{u.has(E)&&(g[E]=u.get(E))});else for(const E of u.keys())g[E]=u.get(E);return g}deleteLocalGroupCounters(s){const{groupID:r,counterList:g=[],groupCounterSeq:u}=s;if(this._hasLocalGroupCounters(r)){const{counters:E,avChatRoomKey:f}=this.getLocalGroupCounters(r);g.forEach(D=>{E.delete(D.key)}),this._groupCountersMap.set(r,{lastUpdateTime:Date.now(),groupCounterSeq:u,counters:E,avChatRoomKey:f})}}setGroupCounters(s,r){if(!this._hasLocalGroupCounters(s))return;const g=this.getLocalGroupCounters(s),{counters:u}=g;let E=!1;Object.entries(r).forEach(([f,D])=>{u.has(f)&&u.get(f)!==D&&(u.set(f,D),E=!0)}),E&&this._groupCountersMap.set(s,Object.assign(Object.assign({},g),{lastUpdateTime:Date.now(),counters:u}))}_hasLocalGroupCounters(s){return this._groupCountersMap.has(s)}reset(){this._groupCountersMap.clear()}},qE=new class{constructor(){this._name="JoinGroup"}init(s,r){this._core=s;const{helper:g}=s;g.registerApi({apiName:"joinGroup",context:this,matcher:()=>!r.getInstalledSubPlugins().includes(na)})}joinGroup(s){return mA(this,void 0,void 0,function*(){const{groupID:r}=s,{helper:{ChatError:g},OuterConstant:u,ssoLog:E}=this._core;try{if(Wi.hasLocalGroup(r))try{return yield Jl.getGroupProfile({groupID:r}),fs({status:u.JOIN_STATUS_ALREADY_IN_GROUP,group:Wi.getLocalGroup(r)},{message:`groupID:${r} joinedStatus:${u.JOIN_STATUS_ALREADY_IN_GROUP}`})}catch{return E.warn("joinGroup",`${this._name}.joinGroup ${r} was unjoined, start to join!`),Wi.deleteLocalGroup(r),yield this._applyJoinGroup(s)}return yield this._applyJoinGroup(s)}catch(f){const{errorCode:D,errorInfo:v}=f;throw new g({functionName:"joinGroup",code:D,message:v,moreMessage:`groupID:${r}`})}})}_applyJoinGroup(s){return mA(this,void 0,void 0,function*(){const{OuterConstant:r,helper:g,ssoLog:u}=this._core,{groupID:E}=s,f=Object.assign({},s),D=g.checkBusinessCapabilityBits(zr);D&&(f.historyMessageFlag=1);const v=yield function(SA,PA){return mA(this,void 0,void 0,function*(){const{groupID:zA,applyMessage:Ee,historyMessageFlag:Ie}=SA,Li={GroupId:zA,ApplyMsg:Ee,HugeGroupHistoryMsgFlag:Ie};return PA.common.buildAndSendPacket({servcmd:"group_open_http_svc.apply_join_group",data:Li})})}(f,this._core),{Type:N,JoinedStatus:P,LongPollingKey:W,StartSeq:nA,HugeGroupFlag:EA,AVChatRoomKey:wA,RspMsgList:kA=[]}=v||{},VA=`groupID:${E} joinedStatus:${P} longPollingKey:${W} startSeq:${nA} avChatRoomFlag:${EA} canGetAVChatRoomHistoryMsg:${D}, historyMessageCount:${kA.length}`;u.debug("_applyJoinGroup",`${this._name}._applyJoinGroup ok, ${VA}`);let LA=new Zu({groupID:E,type:N});if(P===r.JOIN_STATUS_WAIT_APPROVAL)return fs({status:r.JOIN_STATUS_WAIT_APPROVAL,group:LA});if(P===r.JOIN_STATUS_SUCCESS){try{LA=(yield Jl.getGroupProfile({groupID:E})).data.group}catch(SA){u.warn("_applyJoinGroup",`${this._name}._applyJoinGroup getGroupProfile failed, groupID: ${E}, errorCode:${SA?.code}`)}return this._handleJoinResult({group:LA,avChatRoomFlag:EA,longPollingKey:W,startSequence:nA,avChatRoomKey:wA,historyMessageList:kA})}throw new this._core.helper.ChatError({code:Ch})})}_handleJoinResult(s){const{group:r,avChatRoomFlag:g,avChatRoomKey:u}=s;return g===1?(as.initGroupAttributesCache({groupID:r.groupID,avChatRoomKey:u}),Ic.initGroupCountersCache({groupID:r.groupID,avChatRoomKey:u}),fs(s)):(Wi.updateLocalGroup([r]),Wi.emitGroupListUpdate(),fs({status:this._core.OuterConstant.JOIN_STATUS_SUCCESS,group:r},{message:`groupID:${r.groupID}`}))}},FQ=new class{constructor(){this._name="QuitGroup"}init(s,r){this._core=s;const{helper:g}=s;g.registerApi({apiName:"quitGroup",context:this,matcher:()=>!r.getInstalledSubPlugins().includes(na)})}quitGroup(s){return mA(this,void 0,void 0,function*(){if(!Wi.hasLocalGroup(s))throw new this._core.helper.ChatError({code:MD});const{helper:{ChatError:r}}=this._core;try{yield function(u,E){return mA(this,void 0,void 0,function*(){const f={GroupId:u};return E.common.buildAndSendPacket({servcmd:"group_open_http_svc.quit_group",data:f})})}(s,this._core);const{type:g}=Wi.getLocalGroup(s);return Wi.deleteLocalGroup(s),Wi.emitGroupListUpdate(),as.deleteGroupAttributesCache(s),fs({groupID:s,type:g},{message:`groupID:${s}`})}catch(g){const{errorCode:u,errorInfo:E}=g;throw new r({functionName:"quitGroup",code:u,message:E,moreMessage:`groupID:${s}`})}})}},EB=new class{constructor(){this._name="SearchGroup"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"searchGroupByID",context:this})}searchGroupByID(s){return mA(this,void 0,void 0,function*(){try{const r=yield function(PA,zA){return mA(this,void 0,void 0,function*(){const Ee={GroupIdList:[PA],GroupBasePublicInfoFilter:[...hg]};return zA.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_group_public_info",data:Ee})})}(s,this._core),{GroupInfo:g=[]}=r||{},{AppDefinedData:u=[],ApplyJoinOption:E,CreateTime:f,FaceUrl:D,Introduction:v,InviteJoinOption:N,MaxMemberNum:P,MemberNum:W,Name:nA,Owner_Account:EA,Type:wA,ErrorCode:kA,ErrorInfo:VA}=g[0];if(kA!==0)throw new this._core.helper.ChatError({code:kA,message:VA});const LA=Rd(u),SA=new Zu({groupID:s,name:nA,avatar:D,introduction:v,joinOption:E,inviteOption:N,maxMemberCount:P,memberCount:W,type:wA,ownerID:EA,createTime:f,groupCustomField:LA});return fs({group:SA})}catch(r){const{errorCode:g,errorInfo:u}=r;throw new this._core.helper.ChatError({functionName:"searchGroupByID",code:g,message:u})}})}},VT=new class{constructor(){this._name="UpdateGroupProfile"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"updateGroupProfile",context:this})}updateGroupProfile(s){return mA(this,void 0,void 0,function*(){const{groupID:r}=s,{utils:{isUndefined:g,safeStringify:u},ssoLog:E,helper:f}=this._core;let D=Wi.getLocalGroup(r);if(D){const{type:v}=D;this._canIUseJoinOption(v)||g(s.joinOption)||(E.warn("updateGroupProfile",`${this._name}.updateGroupProfile groupID:${r} joinOption is unavailable for Work/Meeting/AVChatRoom`),s.joinOption=void 0)}g(s.muteAllMembers)||(s.muteAllMembers=s.muteAllMembers===!0?"On":"Off");try{return yield function(v,N){return mA(this,void 0,void 0,function*(){const{groupID:P,name:W,avatar:nA,introduction:EA,notification:wA,muteAllMembers:kA,joinOption:VA,inviteOption:LA,groupCustomField:SA}=v,PA={GroupId:P,Name:W,FaceUrl:nA,Introduction:EA,Notification:wA,ShutUpAllMember:kA,ApplyJoinOption:VA,InviteJoinOption:LA,AppDefinedData:SA?JE(SA):void 0};return N.common.buildAndSendPacket({servcmd:"group_open_http_svc.modify_group_base_info",data:PA})})}(s,this._core),D?(D.updateGroup(s),Wi.emitGroupListUpdate()):D=new Zu(s),fs({group:D},{message:`groupID:${r}`})}catch(v){const{errorCode:N,errorInfo:P}=v;throw new f.ChatError({code:N,message:P,moreMessage:`options:${u(s)}`})}})}_canIUseJoinOption(s){return $M(s)||this._core.common.isCommunity({type:s})}},HT=new class{constructor(){this._name="ChangeGroupOwner"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"changeGroupOwner",context:this})}changeGroupOwner(s){return mA(this,void 0,void 0,function*(){const r="changeGroupOwner",{groupID:g,newOwnerID:u}=s,E=Wi.getLocalGroup(g),{helper:f,OuterConstant:D,common:{getCurrentUserID:v}}=this._core;if(E?.type===D.GRP_AVCHATROOM)throw new f.ChatError({functionName:r,code:FT});if(u===v())throw new f.ChatError({functionName:r,code:km});try{return yield function(N,P){return mA(this,void 0,void 0,function*(){const{groupID:W,newOwnerID:nA}=N,EA={GroupId:W,NewOwner_Account:nA};return P.common.buildAndSendPacket({servcmd:"group_open_http_svc.change_group_owner",data:EA})})}(s,this._core),E.ownerID=u,Wi.emitGroupListUpdate(),fs({group:E})}catch(N){throw new f.ChatError({functionName:r,code:N?.errorCode,message:N?.errorInfo})}})}},OQ=new class{constructor(){this._name="GetGroupOnlineMemberCount",this._onlineMemberCountMap=new Map}init(s,r){this._core=s;const{helper:g}=s;g.registerApi({apiName:"getGroupOnlineMemberCount",context:this,matcher:()=>!r.getInstalledSubPlugins().includes(na)})}getGroupOnlineMemberCount(s){return mA(this,void 0,void 0,function*(){const r="getGroupOnlineMemberCount";if(!Wi.hasLocalGroup(s))return fs({memberCount:0});const g=Date.now();if(this._onlineMemberCountMap.has(s)){const u=this._onlineMemberCountMap.get(s),{lastReqTime:E=0,memberCount:f=0}=u||{};if(g-E<=6e4)return fs({memberCount:f})}try{const u=yield function(D,v){return mA(this,void 0,void 0,function*(){const N={GroupId:D};return v.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_online_member_num",data:N})})}(s,this._core),{OnlineMemberNum:E=0}=u||{};this._onlineMemberCountMap.set(s,{lastReqTime:Date.now(),memberCount:E});const f=`${this._name}.${r} ok. groupID:${s} memberCount:${E}`;return fs({memberCount:E},{message:f})}catch(u){throw new this._core.helper.ChatError({functionName:r,code:u?.errorCode,message:u?.errorInfo})}})}},PQ=new class{init(s,r){s.ssoLog.debug("GroupAction.init"),AR.init(s),Xu.init(s),Bh.init(s,r),qE.init(s,r),FQ.init(s,r),EB.init(s),Jl.init(s),VT.init(s),HT.init(s),OQ.init(s,r)}dismissGroup(s){return Bh.dismissGroup(s)}joinGroup(s){return qE.joinGroup(s)}quitGroup(s){return FQ.quitGroup(s)}getGroupOnlineMemberCount(s){return OQ.getGroupOnlineMemberCount(s)}},eR=new class{constructor(){this._name="GetGroupApplicationList"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"getGroupApplicationList",context:this})}getGroupApplicationList(){return mA(this,void 0,void 0,function*(){const s="getGroupApplicationList";try{const r=yield Promise.all([this._getGroupApplicationList(),this._getGroupApplicationList({type:this._core.OuterConstant.GRP_COMMUNITY})]);this._core.ssoLog.debug("getGroupApplicationList",`${this._name}.${s} ok.`);const g=this._handleGroupApplicationResult([...r[0],...r[1]]);return fs({applicationList:g})}catch(r){throw new this._core.helper.ChatError({functionName:s,code:r?.errorCode,message:r?.errorInfo})}})}_getGroupApplicationList(s){return mA(this,void 0,void 0,function*(){const{type:r,startTime:g=0,limit:u=20}=s||{},{common:E}=this._core;let f;try{f=yield function(P,W){return mA(this,void 0,void 0,function*(){const{type:nA,startTime:EA,limit:wA,handleAccount:kA}=P,VA={Type:nA,StartTime:EA,Limit:wA,Handle_Account:kA};return W.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_pendency",data:VA})})}({type:r,startTime:g,limit:u,handleAccount:E.getCurrentUserID()},this._core)}catch(P){if(P?.errorCode!==11e3)throw P;f={}}const{NextStartTime:D=0,PendencyList:v=[]}=f||{};if(D===0)return v;const N=yield this._getGroupApplicationList(Object.assign(Object.assign({},s),{startTime:D}));return[...v,...N]})}_handleGroupApplicationResult(s){const r=[];return s.forEach(g=>{const u=this._convertApplicationData(g),{handled:E}=u,f=vo(u,["handled"]);E===0&&r.push(f)}),r}_convertApplicationData(s){const{Handled:r,AddTime:g,ApplyInviteMsg:u,Authentication:E,FromUserNickName:f,From_Account:D,GroupId:v,GroupName:N,PendencyType:P,To_Account:W}=s;return{handled:r,messageKey:g,applicant:D,applicantNick:f,groupID:v,groupName:N,authentication:E,applicationType:P,userID:W,note:u,addTime:g}}},tR=new class{constructor(){this._name="HandleGroupApplication"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"handleGroupApplication",context:this})}handleGroupApplication(s){return mA(this,void 0,void 0,function*(){const{application:r}=s,g=this._handleParams(s);try{r?.applicationType===Hc?yield function(E,f){return mA(this,void 0,void 0,function*(){const{groupID:D,handleAction:v,handleMessage:N,applicant:P,authentication:W,invitee:nA}=E,EA={GroupId:D,HandleMsg:v,ApprovalMsg:N,Applicant_Account:P,Authentication:W,Invited_Account:nA};return f.common.buildAndSendPacket({servcmd:"group_open_http_svc.handle_invite_join_permission_group",data:EA})})}(g,this._core):yield function(E,f){return mA(this,void 0,void 0,function*(){const{groupID:D,handleAction:v,handleMessage:N,applicant:P,authentication:W,messageKey:nA}=E,EA={GroupId:D,HandleMsg:v,ApprovalMsg:N,Applicant_Account:P,Authentication:W,MsgKey:nA};return f.common.buildAndSendPacket({servcmd:"group_open_http_svc.handle_apply_join_group",data:EA})})}(g,this._core);const u=Wi.getLocalGroup(g.groupID);return fs({group:u})}catch(u){throw new this._core.helper.ChatError({functionName:"handleGroupApplication",code:u?.errorCode,message:u?.errorInfo})}})}_handleParams(s){var r;const{handleAction:g,handleMessage:u,message:E,application:f}=s;let D,v,N,P,W;if(E){const{payload:nA}=E||{};D=nA.operatorID,v=(r=nA.groupProfile)===null||r===void 0?void 0:r.groupID,N=nA.authentication,P=nA.messageKey}else D=f?.applicant||"",v=f?.groupID||"",N=f?.authentication||"",P=f?.messageKey||0;return f?.applicationType===Hc&&(W=f.userID),{handleAction:g,handleMessage:u,applicant:D,invitee:W,groupID:v,authentication:N,messageKey:P}}},wD=new class{init(s){s.ssoLog.debug("GroupApplication.init"),eR.init(s),tR.init(s)}};let MC=class{constructor(s){this.userID="",this.avatar="",this.nick="",this.role="",this.joinTime="",this.nameCard="",this.muteUntil=0,this.memberCustomField=[],this.isOnline=!1,this.updateMember(s)}updateMember(s){const{core:{utils:{isUndefined:r},common:{deepMerge:g}}}=tr;r(s.muteTime)||(this.muteUntil=Math.floor((Date.now()+1e3*s.muteTime)/1e3)),r(s.onlineStatus)||(this.isOnline=s.onlineStatus==="Online");const u=[null,void 0,"",0,NaN];s.memberCustomField&&Fm(this.memberCustomField,s.memberCustomField),g(this,s,["memberCustomField","marks","onlineStatus","muteTime"],u)}};function dB(s,r){return mA(this,void 0,void 0,function*(){const{groupID:g,userID:u,muteTime:E,role:f,nameCard:D,memberCustomField:v}=s;let N;v&&(N=JE(v));const P={GroupId:g,Member_Account:u,ShutUpTime:E,Role:f,NameCard:D,AppMemberDefinedData:N};return r.common.buildAndSendPacket({servcmd:"group_open_http_svc.modify_group_member_info",data:P})})}var _D=new class{constructor(){this._name="GetGroupMemberList"}init(s,r){this._core=s;const{helper:g}=s;g.registerApi({apiName:"getGroupMemberList",context:this,matcher:()=>!r.getInstalledSubPlugins().includes(na)})}getGroupMemberList(s){return mA(this,void 0,void 0,function*(){const r="getGroupMemberList",{groupID:g,offset:u=0,count:E=100,role:f="",filter:D=""}=s,v=Wi.getLocalGroup(g),N=E>100?100:E,P={groupID:g,offset:u,limit:N,memberRoleFilter:zu.includes(f)?[f]:void 0,memberInfoFilter:wm};try{const W=yield function(Ie,Li){return mA(this,void 0,void 0,function*(){const{isCommunity:Ui}=Li.common,{groupID:Yt,offset:Oi,limit:Bn,memberRoleFilter:Re,memberInfoFilter:Mt}=Ie,FA={GroupId:Yt,Limit:Bn,MemberRoleFilter:Re,MemberInfoFilter:Mt};return Ui({groupID:Yt})?FA.Next=String(Oi):FA.Offset=Oi,Li.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_group_member_info",data:FA})})}(P,this._core),{MemberList:nA,MemberNum:EA,Next:wA}=W||{},kA=`${this._name}.${r} ok, totalMemberCount:${EA} next:${wA}`,{utils:{isArray:VA,isEmpty:LA},common:{isCommunity:SA}}=this._core;if(v&&(v.memberCount=EA),!VA(nA)||nA.length===0)return fs({memberList:[],offset:0},{message:kA});let PA=u+N;SA({groupID:g})&&(PA=LA(wA)?0:wA),nA.lengthD.userID),u=yield(r=this._core.user.userProfile)===null||r===void 0?void 0:r.getUserProfile({userIDList:g}),E=u?.data||[],f=new Map(E.map(D=>[D.userID,D]));return s.forEach(D=>{if(f.has(D.userID)){const{nick:v="",avatar:N=""}=f.get(D.userID);D.nick=v,D.avatar=N}}),s})}_generateGroupMember(s){const r=[];for(let g=0,u=s.length;g50&&(N.warn("getGroupMemberProfile",`${this._name}.${r} userIDList length:${u.length} exceeds limit 50`),u.splice(50));const P=`userIDList length:${u.length} groupID:${g}`;try{const W=yield function(kA,VA){return mA(this,void 0,void 0,function*(){const{groupID:LA,userIDList:SA,memberInfoFilter:PA,memberCustomFieldFilter:zA}=kA,Ee={GroupId:LA,Member_List_Account:SA,MemberInfoFilter:PA,AppDefinedDataFilter_GroupMember:zA};return VA.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_specified_group_member_info",data:Ee})})}({groupID:g,userIDList:u,memberCustomFieldFilter:E,memberInfoFilter:[...wm]},this._core),{MemberList:nA}=W||{};if(!v(nA)||nA.length===0)return fs({memberList:[]});let EA=this._convertMemberInfo(nA);EA=yield this._getMemberAvatarAndNick(EA);const wA=this._generateGroupMember(EA);return fs({memberList:wA},{message:P})}catch(W){throw new D.ChatError({functionName:r,code:W?.errorCode,message:W?.errorInfo,moreMessage:P})}})}_convertMemberInfo(s){const r=[];for(let g=0,u=s.length;gD.userID),u=yield(r=this._core.user.userProfile)===null||r===void 0?void 0:r.getUserProfile({userIDList:g}),E=u?.data||[],f=new Map(E.map(D=>[D.userID,D]));return s.forEach(D=>{if(f.has(D.userID)){const{nick:v="",avatar:N=""}=f.get(D.userID);D.nick=v,D.avatar=N}}),s})}_generateGroupMember(s){const r=[];for(let g=0,u=s.length;g({Member_Account:v}));try{const v=yield function(wA,kA){return mA(this,void 0,void 0,function*(){const{groupID:VA,userIDList:LA}=wA,SA={GroupId:VA,MemberList:LA};return kA.common.buildAndSendPacket({servcmd:"group_open_http_svc.add_group_member",data:SA})})}({groupID:g,userIDList:D},this._core),{MemberList:N=[]}=v||{},{failureUserIDList:P,successUserIDList:W,existedUserIDList:nA,overLimitUserIDList:EA}=this._handleResult(N);return fs({failureUserIDList:P,successUserIDList:W,existedUserIDList:nA,overLimitUserIDList:EA,group:E},{message:` groupID:${g} successUserIDList:${W} failureUserIDList:${P} existedUserIDList:${nA} overLimitUserIDList:${EA}`})}catch(v){throw new f.ChatError({functionName:r,code:v?.errorCode,message:v?.errorInfo})}})}_handleResult(s){const r=[],g=[],u=[],E=[];return s.forEach(f=>{const{Result:D,Member_Account:v}=f;D===_m?r.push(v):D===Tm?g.push(v):D===Nm?u.push(v):D===QD&&E.push(v)}),{failureUserIDList:r,successUserIDList:g,existedUserIDList:u,overLimitUserIDList:E}}},_d=new class{constructor(){this._name="DeleteGroupMember"}init(s,r){this._core=s;const{helper:g}=s;g.registerApi({apiName:"deleteGroupMember",context:this,matcher:()=>!r.getInstalledSubPlugins().includes(na)})}deleteGroupMember(s){return mA(this,void 0,void 0,function*(){const r="deleteGroupMember",{groupID:g,userIDList:u}=s,E=Wi.getLocalGroup(g),{helper:f,utils:{isUndefined:D},ssoLog:v}=this._core;if(D(E))throw new f.ChatError({functionName:r,code:UT});u.length>20&&(v.warn("deleteGroupMember",`${this._name}.${r} userIDList length:${u.length} exceeds limit 20`),u.splice(20));try{return yield function(N,P){return mA(this,void 0,void 0,function*(){const{groupID:W,userIDList:nA,reason:EA}=N,wA={GroupId:W,MemberToDel_Account:nA,Reason:EA};return P.common.buildAndSendPacket({servcmd:"group_open_http_svc.delete_group_member",data:wA})})}({groupID:g,userIDList:u},this._core),fs({group:E,userIDList:u},{message:`groupID:${g} userIDList length:${u.length}`})}catch(N){throw new f.ChatError({functionName:r,code:N?.errorCode,message:N?.errorInfo})}})}},iR=new class{constructor(){this._name="SetGroupMemberMuteTime"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"setGroupMemberMuteTime",context:this})}setGroupMemberMuteTime(s){return mA(this,void 0,void 0,function*(){const{helper:r}=this._core,{groupID:g,userID:u,muteTime:E}=s,f=` groupID:${g} userID:${u} muteTime:${E}`;this._preCheckSettingMuteParams(s);try{yield dB(s,this._core);const D=Wi.getLocalGroup(g),v=new MC({userID:u,muteTime:E});return fs({group:D,member:v},{message:f})}catch(D){throw new r.ChatError({functionName:"setGroupMemberMuteTime",code:D?.errorCode,message:D?.errorInfo,moreMessage:f})}})}_preCheckSettingMuteParams(s){const{userID:r}=s,{store:g,helper:u}=this._core;if(r===g.get("login").userId)throw new u.ChatError({functionName:"setGroupMemberMuteTime",code:RD})}},YQ=new class{constructor(){this._name="SetGroupMemberRole"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"setGroupMemberRole",context:this})}setGroupMemberRole(s){return mA(this,void 0,void 0,function*(){const r="setGroupMemberRole",{helper:g}=this._core,{groupID:u,userID:E,role:f}=s,D=`${this._name}.${r} ok, groupID:${u} userID:${E} role:${f}`;this._preCheckSettingRoleParams(s);try{yield dB(s,this._core);const v=Wi.getLocalGroup(u),N=new MC({userID:E,role:f});return fs({group:v,member:N},{message:D})}catch(v){throw new g.ChatError({functionName:r,code:v?.errorCode,message:v?.errorInfo,moreMessage:D})}})}_preCheckSettingRoleParams(s){var r;const{groupID:g,userID:u,role:E}=s,{store:f,helper:D,OuterConstant:v,common:{isCommunity:N}}=this._core,P=Wi.getLocalGroup(g);if(((r=P?.selfInfo)===null||r===void 0?void 0:r.role)!==v.GRP_MBR_ROLE_OWNER)throw new D.ChatError({functionName:"setGroupMemberRole",code:PT});if(u===f.get("login").userId)throw new D.ChatError({functionName:"setGroupMemberRole",code:ZM});const W=[...zu];if(N({groupID:g})&&W.push(v.GRP_MBR_ROLE_CUSTOM),!W.includes(E))throw new D.ChatError({functionName:"setGroupMemberRole",code:Lm})}},TD=new class{constructor(){this._name="SetGroupMemberNameCard"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"setGroupMemberNameCard",context:this})}setGroupMemberNameCard(s){return mA(this,void 0,void 0,function*(){var r;const g="setGroupMemberNameCard",{helper:u,common:{getCurrentUserID:E}}=this._core,{groupID:f,userID:D=E(),nameCard:v}=s,N=`${this._name}.${g} ok, groupID:${f} userID:${D} nameCard:${v}`;this._preCheckSettingNameCardParams(s);try{yield dB({groupID:f,userID:D,nameCard:v},this._core);const W=Wi.getLocalGroup(f);D===((r=W?.selfInfo)===null||r===void 0?void 0:r.userID)&&(W.updateSelfInfo({nameCard:v}),Wi.emitGroupListUpdate(),Wi.updateConversationGroupProfile(f));const nA=new MC({userID:D,nameCard:v});return fs({group:W,member:nA},{message:N})}catch(P){throw new u.ChatError({functionName:g,code:P?.errorCode,message:P?.errorInfo,moreMessage:N})}})}_preCheckSettingNameCardParams(s){const{groupID:r}=s,{helper:g}=this._core,u=Wi.getLocalGroup(r);if(Md(u?.type))throw new g.ChatError({functionName:"setGroupMemberNameCard",code:Um})}},xm=new class{constructor(){this._name="SetGroupMemberCustomField"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"setGroupMemberCustomField",context:this})}setGroupMemberCustomField(s){return mA(this,void 0,void 0,function*(){const r="setGroupMemberCustomField",{helper:g,common:{getCurrentUserID:u}}=this._core;this._preCheckSettingCustomFiledParams(s);const{groupID:E,userID:f=u(),memberCustomField:D}=s,v=`${this._name}.${r} ok, groupID:${E}userID:${f} memberCustomField:${JSON.stringify(D)}`;try{yield dB({groupID:E,userID:f,memberCustomField:D},this._core);const P=Wi.getLocalGroup(E),W=new MC({userID:f,memberCustomField:D});return fs({group:P,member:W},{message:v})}catch(N){throw new g.ChatError({functionName:r,code:N?.errorCode,message:N?.errorInfo,moreMessage:v})}})}_preCheckSettingCustomFiledParams(s){const{groupID:r}=s,{helper:g}=this._core,u=Wi.getLocalGroup(r);if(Md(u?.type))throw new g.ChatError({functionName:"setGroupMemberCustomField",code:Um})}},oR=new class{init(s,r){s.ssoLog.debug("GroupMember.init"),_D.init(s,r),xQ.init(s),wd.init(s),_d.init(s,r),iR.init(s),YQ.init(s),TD.init(s),xm.init(s)}getGroupMemberList(s){return _D.getGroupMemberList(s)}deleteGroupMember(s){return _d.deleteGroupMember(s)}},JT=new class{init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"getGroupCounters",context:this})}getGroupCounters(s){return mA(this,void 0,void 0,function*(){const r="getGroupCounters";try{Om(r,lc);const{groupID:g,keyList:u=[]}=s,{avChatRoomKey:E,lastUpdateTime:f}=Ic.getLocalGroupCounters(g);if(!(Date.now()-f>=this._getExpireTime()))return{code:0,data:{counters:Ic.getLocalCounters(g,u)}};const D=yield function(P){return mA(this,void 0,void 0,function*(){const{groupID:W,GroupCounterKeys:nA,avChatRoomKey:EA}=P,{common:wA}=tr.core,kA={GroupId:W,keyList:nA,BytesKey:EA};return wA.buildAndSendPacket({servcmd:"group_open_http_svc.get_group_counter",data:kA})})}({groupID:g,keyList:u,avChatRoomKey:E}),{GroupCounter:v=[],GroupCounterSeq:N}=D;return Ic.updateLocalGroupCounters({groupID:g,counterList:v,groupCounterSeq:N}),{code:0,data:{counters:Ic.getLocalCounters(g,u)}}}catch(g){vC(r,g)}})}_getExpireTime(){const{store:s,utils:{isUndefined:r}}=this._core,g=s.get("cloudConfig")||{},{grp_counter_expire_time:u}=g;return r(u)?3e4:Number(u)}},Ym=new class{init(s){const{helper:r}=s;r.registerApi({apiName:"setGroupCounters",context:this}),r.registerApi({apiName:"increaseGroupCounter",context:this}),r.registerApi({apiName:"decreaseGroupCounter",context:this})}setGroupCounters(s){return mA(this,void 0,void 0,function*(){return this._handleCounterOperation(Wu,s)})}increaseGroupCounter(s){return mA(this,void 0,void 0,function*(){return this._handleCounterOperation(Rm,s)})}decreaseGroupCounter(s){return mA(this,void 0,void 0,function*(){return this._handleCounterOperation(Gi,s)})}_handleCounterOperation(s,r){return mA(this,void 0,void 0,function*(){const g=`${s}GroupCounter`;try{Om(g,lc);const{groupID:u,key:E,value:f=0}=r,{avChatRoomKey:D}=Ic.getLocalGroupCounters(u),v=s===Wu?this._convertObjectToList(r.counters):[{Key:E,Value:f}],N=yield this._updateGroupCounters({groupID:u,counterList:v,avChatRoomKey:D,mode:s});return Ic.setGroupCounters(u,N),{code:0,data:{counters:N}}}catch(u){vC(g,u)}})}_updateGroupCounters(s){return mA(this,void 0,void 0,function*(){const r=yield function(E){const{groupID:f,counterList:D,mode:v,avChatRoomKey:N}=E,{common:P}=tr.core,W={GroupId:f,GroupCounter:D,Mode:v,BytesKey:N};return P.buildAndSendPacket({servcmd:"group_open_http_svc.update_group_counter",data:W})}(s),{GroupCounter:g=[]}=r,u={};return g.forEach(E=>{const{Key:f,Value:D=0}=E;u[f]=D}),u})}_convertObjectToList(s){return Object.entries(s).map(([r,g])=>({Key:r,Value:g||0}))}},CB=new class{init(s){this._core=s,JT.init(s),Ym.init(s)}isGroupCounterUpdated(s){const{elements:{groupCounterInfo:r}}=s,{utils:{isEmpty:g}}=this._core;return!g(r)}handleGroupCounterUpdated(s){const{to:r,elements:{groupCounterInfo:g}}=s;g.forEach(u=>{const{type:E,groupCounterSeq:f,counterList:D=[]}=u;E!==gi&&E!==Es||this._processAndNotifyCounterUpdate(r,f,D),E===_o&&Ic.deleteLocalGroupCounters({groupID:r,groupCounterSeq:f,counterList:D})})}_processAndNotifyCounterUpdate(s,r,g){const{OuterEvent:u,notificationCenter:E}=this._core;Ic.updateLocalGroupCounters({groupID:s,groupCounterSeq:r,counterList:g}),g.forEach(({Key:f,Value:D=0})=>{E.emitOuterEvent(u.GROUP_COUNTER_UPDATED,{name:u.GROUP_COUNTER_UPDATED,data:{groupID:s,key:f,value:D}})})}reset(){Ic.reset()}},Vm=new class{constructor(){this._name="InitGroupAttributes"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"initGroupAttributes",context:this})}initGroupAttributes(s){return mA(this,void 0,void 0,function*(){const{groupID:r,groupAttributes:g}=s,{serverMainSequence:u,avChatRoomKey:E}=as.getGroupAttributesCache(r),f=as.convertKeyValueMapToList(g);try{const D=yield function(W,nA){return mA(this,void 0,void 0,function*(){const{groupID:EA,mainSequence:wA,groupAttributeList:kA,avChatRoomKey:VA}=W,LA={GroupId:EA,AttrMainSeq:wA,GroupAttr:kA,BytesKey:VA,AttrControl:["RaceConflict"]};return nA.common.buildAndSendPacket({servcmd:"group_open_http_svc.set_group_attr",data:LA})})}({groupID:r,avChatRoomKey:E,groupAttributeList:f,mainSequence:u},this._core),{AttrMainSeq:v,GroupAttr:N}=D||{},P=N.map(W=>{const{Key:nA,seq:EA}=W;return{key:nA,value:g[nA],sequence:EA}});return as.saveGroupAttributesCacheValuesCopy(r),as.refreshGroupAttributesCache({groupID:r,serverMainSequence:v,groupAttributeList:P,operation:pD}),as.emitGroupAttributesUpdated(r),fs({groupAttributes:g},{message:` groupID:${r} serverMainSequence:${v}`})}catch(D){throw new this._core.helper.ChatError({functionName:"initGroupAttributes",code:D?.errorCode,message:D?.errorInfo})}})}},qT=new class{constructor(){this._name="SetGroupAttributes"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"setGroupAttributes",context:this}),r.registerExperimentalAPI("setRichStatus",this)}setGroupAttributes(s){return mA(this,void 0,void 0,function*(){const{groupID:r,groupAttributes:g,richStatusMode:u}=s,{serverMainSequence:E,avChatRoomKey:f,values:D}=as.getGroupAttributesCache(r),v=as.convertKeyValueMapToList(g).map(N=>{var P;const{key:W,value:nA}=N;return{key:W,value:nA,seq:((P=D.get(N.key))===null||P===void 0?void 0:P.sequence)||0}});try{const N=yield function(EA,wA){return mA(this,void 0,void 0,function*(){const{groupID:kA,mainSequence:VA,groupAttributeList:LA,avChatRoomKey:SA,richStatusMode:PA}=EA,zA={GroupId:kA,AttrMainSeq:VA,GroupAttr:LA,BytesKey:SA,AttrControl:["RaceConflict"],AllowRoomEngineOpt:PA};return wA.common.buildAndSendPacket({servcmd:"group_open_http_svc.modify_group_attr",data:zA})})}({groupID:r,avChatRoomKey:f,groupAttributeList:v,mainSequence:E,richStatusMode:u},this._core),{AttrMainSeq:P,GroupAttr:W}=N||{},nA=W.map(EA=>{const{Key:wA,seq:kA}=EA;return{key:wA,value:g[wA],sequence:kA}});return as.saveGroupAttributesCacheValuesCopy(r),as.refreshGroupAttributesCache({groupID:r,serverMainSequence:P,groupAttributeList:nA,operation:KM}),as.emitGroupAttributesUpdated(r),fs({groupAttributes:g},{message:` groupID:${r} serverMainSequence:${P}`})}catch(N){throw new this._core.helper.ChatError({functionName:"setGroupAttributes",code:N?.errorCode,message:N?.errorInfo})}})}setRichStatus(s){return mA(this,void 0,void 0,function*(){const{groupID:r,richStatus:g}=s;return this.setGroupAttributes({groupID:r,groupAttributes:g,richStatusMode:!0})})}},ND=new class{constructor(){this._name="DeleteGroupAttributes"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"deleteGroupAttributes",context:this}),r.registerExperimentalAPI("deleteRichStatus",this)}deleteGroupAttributes(s){return mA(this,void 0,void 0,function*(){const r="deleteGroupAttributes",{groupID:g,keyList:u=[],richStatusMode:E}=s;try{let f;f=u.length===0?yield this._clearGroupAttributes(g,{richStatusMode:E}):yield this._deleteGroupAttributes(g,{keyList:u,richStatusMode:E});const{resultList:D,serverMainSequence:v,operation:N,groupAttributeList:P}=f||{},W=`${this._name}.${r} ok. groupID:${g} operation: ${N}`;return as.saveGroupAttributesCacheValuesCopy(g),as.refreshGroupAttributesCache({groupID:g,serverMainSequence:v,groupAttributeList:P,operation:N}),as.emitGroupAttributesUpdated(g),fs({keyList:D},{message:W})}catch(f){throw new this._core.helper.ChatError({functionName:r,code:f?.errorCode,message:f?.errorInfo})}})}deleteRichStatus(s){return mA(this,void 0,void 0,function*(){return this.deleteGroupAttributes(Object.assign(Object.assign({},s),{richStatusMode:!0}))})}_deleteGroupAttributes(s,r){return mA(this,void 0,void 0,function*(){const{serverMainSequence:g,avChatRoomKey:u,values:E}=as.getGroupAttributesCache(s),{keyList:f,richStatusMode:D}=r,v=[],N=[];f.forEach(nA=>{if(E.has(nA)){const{sequence:EA=0}=E.get(nA)||{};N.push({key:nA,seq:EA}),v.push(nA)}});const P=yield function(nA,EA){return mA(this,void 0,void 0,function*(){const{groupID:wA,mainSequence:kA,groupAttributeList:VA,avChatRoomKey:LA,richStatusMode:SA}=nA,PA={GroupId:wA,AttrMainSeq:kA,GroupAttr:VA,BytesKey:LA,AttrControl:["RaceConflict"],AllowRoomEngineOpt:SA};return EA.common.buildAndSendPacket({servcmd:"group_open_http_svc.delete_group_attr",data:PA})})}({groupID:s,avChatRoomKey:u,groupAttributeList:N,mainSequence:g,richStatusMode:D},this._core),{AttrMainSeq:W}=P||{};return{resultList:v,serverMainSequence:W,groupAttributeList:N,operation:fD}})}_clearGroupAttributes(s,r){return mA(this,void 0,void 0,function*(){const{serverMainSequence:g,avChatRoomKey:u,values:E}=as.getGroupAttributesCache(s),{richStatusMode:f}=r||{},D=[...E.keys()],v=yield function(P,W){return mA(this,void 0,void 0,function*(){const{groupID:nA,mainSequence:EA,avChatRoomKey:wA,richStatusMode:kA}=P,VA={GroupId:nA,AttrMainSeq:EA,BytesKey:wA,AttrControl:["RaceConflict"],AllowRoomEngineOpt:kA};return W.common.buildAndSendPacket({servcmd:"group_open_http_svc.clear_group_attr",data:VA})})}({groupID:s,avChatRoomKey:u,mainSequence:g,richStatusMode:f},this._core),{AttrMainSeq:N}=v||{};return{resultList:D,serverMainSequence:N,operation:mD}})}},GD=new class{constructor(){this._name="GetGroupAttributes"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"getGroupAttributes",context:this}),r.registerExperimentalAPI("getRichStatus",this,"getGroupAttributes")}getGroupAttributes(s){return mA(this,void 0,void 0,function*(){const{groupID:r}=s,{avChatRoomKey:g,lastUpdateTime:u,localMainSequence:E,serverMainSequence:f}=as.getGroupAttributesCache(r),{helper:{ChatError:D}}=this._core,v=`groupID:${r} localMainSequence:${E} serverMainSequence:${f} keyList:${s.keyList}`;if(Date.now()-u>=3e4||E{const{key:nA,value:EA,seq:wA}=W;return{key:nA,value:EA,sequence:wA}});return as.refreshGroupAttributesCache({groupID:u,serverMainSequence:v,groupAttributeList:P,operation:jM}),{serverGroupAttributeList:N}})}},VQ=new class{init(s){s.ssoLog.debug("GroupAttribute.init"),Vm.init(s),qT.init(s),ND.init(s),GD.init(s),as.init(s)}isGroupAttributesUpdated(s){return as.isGroupAttributesUpdated(s)}handleGroupAttributesUpdated(s){const{to:r,elements:{newGroupProfile:g}}=s,{groupAttributeOption:u}=g,{serverMainSequence:E,withChangedAttributeInfo:f}=u,{localMainSequence:D}=as.getGroupAttributesCache(r),v=E-D;if(console.log(`GroupAttribute.handleGroupAttributesUpdated groupID:${r} withChangedAttributeInfo:${f} diffSequence:${v}`),v!==0)if(as.saveGroupAttributesCacheValuesCopy(r),f!==1||v!==1){if(as.hasGroupAttributesCache(r)){const{avChatRoomKey:N}=as.getGroupAttributesCache(r);GD.getGroupAttributesFromServer({groupID:r,avChatRoomKey:N}).then(()=>{as.emitGroupAttributesUpdated(r)}).catch(()=>{})}}else as.handleGroupAttributesUpdated({groupID:r,groupAttributeOption:u})}reset(){as.reset()}};function KE(s,r="tips"){const{ClientSeq:g,From_Account:u,MsgClientTime:E,MsgPriority:f,MsgRandom:D,MsgSeq:v,MsgTimeStamp:N,TinyId:P,ToGroupId:W,GroupInfo:nA,MsgBody:EA}=s,wA=function(kA){const{GroupCode:VA,GroupId:LA,GroupName:SA,GroupType:PA,MsgFrom_AccountExtraInfo:zA,From_Account:Ee,To_Account:Ie}=kA;return{groupCode:VA,groupID:LA,groupName:SA,type:PA,messageFromAccountExtraInformation:zA,from:Ee,to:Ie}}(nA);return{clientSequence:g,from:u,clientTime:E,priority:f,random:D,sequence:v,time:N,tinyID:P,to:W,groupProfile:wA,elements:r==="tips"?$u(EA):Qh(EA)}}function $u(s){const r={};return Object.keys(s).forEach(g=>{var u,E;switch(g){case"MemberNum":r.memberCount=s[g];break;case"OpType":r.operationType=s[g];break;case"Operator_Account":r.operatorID=s[g];break;case"List_Account":r.userIDList=s[g];break;case"MsgMemberExtraInfo":r.memberInfoList=(u=s[g])===null||u===void 0?void 0:u.map(f=>bD(f));break;case"MsgOperatorMemberExtraInfo":r.operatorInfo=bD(s[g]);break;case"MsgGroupNewInfo":r.newGroupProfile=function(f){const D={};return Object.keys(f).forEach(v=>{switch(v){case"GroupIntroduction":D.introduction=f[v];break;case"GroupName":D.groupName=f[v];break;case"GroupFaceUrl":D.avatar=f[v];break;case"GroupNotification":D.notification=f[v];break;case"ApplyJoinOption":D.joinOption=f[v];break;case"InviteJoinOption":D.inviteOption=f[v];break;case"ShutupAll":D.muteAllMembers=f[v];break;case"Owner_Account":D.ownerID=f[v];break;case"GroupAttrOption":D.groupAttributeOption=function(P){const{BytesChangedKeys:W,GroupAttrSeq:nA,OpType:EA,PushChangedAttrValFlag:wA,GroupAttrInfo:kA}=P,VA=kA.map(LA=>{const{Key:SA,Val:PA,SubKeySeq:zA}=LA;return{key:SA,value:PA,sequence:zA}});return{changedKeyList:W,groupAttributeList:VA,serverMainSequence:nA,operation:EA,withChangedAttributeInfo:wA}}(f[v]);break;case"MsgAppDefinedData":D.groupCustomField=(N=f[v])==null?void 0:N.map(P=>({key:P.Key,value:P.Value}));break;case"InviteOption":D.inviteOption=YT[f[v]]||f[v]}var N}),D}(s[g]);break;case"MsgMemberInfo":r.msgMemberInfo=(E=s[g])===null||E===void 0?void 0:E.map(f=>function(D){const{ShutupTime:v,User_Account:N}=D;return{muteTime:v,userID:N}}(f));break;case"OnlineMemberInfo":r.onlineMemberInfo=function(f){const{ExpireTime:D,OnlineMemberNum:v}=f;return{expireTime:D,onlineMemberNum:v}}(s[g]);break;case"GroupCounterInfo":r.groupCounterInfo=function(f){return f.map(D=>{const{GroupCounterSeq:v,GroupCounter:N,Type:P}=D;return{type:P,groupCounterSeq:v,counterList:N}})}(s[g])}}),r}function bD(s){const{ImageUrl:r,NickName:g,Role:u,UserId:E}=s;return{avatar:r,nick:g,role:u,userID:E}}function Qh(s){const r={};return Object.keys(s).forEach(g=>{switch(g){case"MsgKey":r.messageKey=s[g];break;case"Operator_Account":r.operatorID=s[g];break;case"ReportType":r.operationType=s[g];break;case"Authentication":r.authentication=s[g];break;case"MsgFlag":r.messageRemindType=s[g];break;case"UserDefinedField":r.userDefinedField=s[g];break;case"RemarkInfo":r.remarkInfo=s[g];break;case"BanDuration":r.duration=s[g];break;case"MuteTime":r.muteTime=s[g];break;case"MsgMemberExtraInfoList":r.inviteeInfoList=(u=s[g]||[])==null?void 0:u.map(E=>{const{UserId:f,ImageUrl:D,NickName:v}=E;return{userID:f,avatar:D,nick:v}});break;case"MemberList_Account":r.inviteeList=s[g]}var u}),r}class Hm{constructor(r){this.type=tr.core.OuterConstant.MSG_GRP_TIP,this.content={},this._initContent(r)}static parseServerPushElement(r){const g=$u(r);return new Hm(g)}_initContent(r){Object.keys(r).forEach(g=>{switch(g){case"groupProfile":this._initGroupProfile(r[g]);break;case"operatorInfo":this._initOperatorInfo(r[g]);break;case"memberInfoList":case"msgMemberInfo":this._updateMemberList(r[g]);break;case"newGroupProfile":this._initNewGroupProfile(r[g]);break;case"memberExtraInfo":case"remarkInfo":case"onlineMemberInfo":break;default:this.content[g]=r[g]}}),this.content.userIDList||(this.content.userIDList=[this.content.operatorID])}_initGroupProfile(r){this.content.groupProfile={};const g=Object.keys(r);for(let u=0;u{r.forEach(u=>{g.userID===u.userID&&Object.assign(g,u)})}):this.content.memberList=r}_initNewGroupProfile(r){this.content.newGroupProfile={};const g=Object.keys(r);for(let u=0;u0&&this._handleGroupTipMessage(g),{conversationUpdateFieldList:u,messageList:g}}_emitGroupTipsEvent(s){var r;const{constants:{WORKFLOW_STEP:g}}=this._core,{messageList:u=[]}=((r=s?.result)===null||r===void 0?void 0:r[g.HANDLE_GROUP_TIPS_NOTIFICATION])||{};if(u.length>0){const{notificationCenter:E,OuterEvent:f}=this._core;E.emitOuterEvent(f.MESSAGE_RECEIVED,{name:f.MESSAGE_RECEIVED,data:u})}}_handleGroupTips(s,r=!0){const{Event:g,GroupTips:u}=s,E=new Map,f=[],D=[];for(let v=0,N=u.length;v{const{operationType:u}=g.payload;switch(u){case r.JOINED:this._handleNewMemberJoined(g);break;case r.QUITTED:this._handleMemberQuitted(g);break;case r.KICKED:this._handleMemberKicked(g);break;case r.GROUP_PROFILE_UPDATED:this._handleGroupProfileUpdated(g);break;case r.ADMIN_SET:this._handleMemberGrantAdmin(g);break;case r.ADMIN_CANCELED:this._handleMemberRevokeAdmin(g)}})}_handleNewMemberJoined(s){this._handleGroupMemberCountUpdated(s)}_handleMemberQuitted(s){this._handleGroupMemberCountUpdated(s)}_handleMemberKicked(s){this._handleGroupMemberCountUpdated(s)}_handleGroupProfileUpdated(s){var r;const{newGroupProfile:g,groupProfile:u,operatorInfo:E}=s.payload,{groupID:f}=u,D=Wi.getLocalGroup(f);Object.keys(g).forEach(N=>{switch(N){case"ownerID":this._handleGroupOwnerChanged(f,g);break;case"groupName":D.name=g[N];break;case"groupCustomField":Array.isArray(D[N])&&Array.isArray(g[N])?Fm(D[N],g[N]):D[N]=g[N];break;default:D[N]=g[N]}});const{utils:{isUndefined:v}}=this._core;v(E)||((r=D?.selfInfo)===null||r===void 0?void 0:r.userID)!==E.userID||Object.keys(E).forEach(N=>{N==="nameCard"&&D.updateSelfInfo({nameCard:E[N]}),N==="role"&&this._updateSelfRole(D,E[N])}),Wi.emitGroupListUpdate(),Wi.updateConversationGroupProfile(f)}_handleGroupOwnerChanged(s,r){const{common:g,OuterConstant:u}=this._core,E=Wi.getLocalGroup(s),f=g.getCurrentUserID(),{ownerID:D}=r;f===D&&E.updateGroup({ownerID:D,selfInfo:{role:u.GRP_MBR_ROLE_OWNER}})}_updateSelfRole(s,r){const{OuterConstant:g}=this._core;let u=g.GRP_MBR_ROLE_MEMBER;r===NT?u=g.GRP_MBR_ROLE_OWNER:r===DD&&(u=g.GRP_MBR_ROLE_ADMIN),s.updateSelfInfo({role:u})}_handleGroupMemberCountUpdated(s){const{memberCount:r,groupProfile:{groupID:g}}=s.payload,u=Wi.getLocalGroup(g),{utils:{isNumber:E}}=this._core;u&&E(r)&&u.memberCount!==r&&(u.memberCount=r,Wi.emitGroupListUpdate(),Wi.updateConversationGroupProfile(g))}_handleGroupTipsRecover(s){const{utils:{isArray:r}}=this._core,{groupTipList:g}=s?.result||{};r(g)&&g.forEach(u=>{const{messageList:E}=this._handleGroupTips({Event:u.Event,GroupTips:[u]},!1);this._handleGroupTipMessage(E)})}_handleMemberGrantAdmin(s){const{OuterConstant:r}=this._core,{groupProfile:g,userIDList:u}=s.payload,E=this._core.common.getCurrentUserID(),{groupID:f}=g,D=Wi.getLocalGroup(f);D&&u.includes(E)&&(D.updateSelfInfo({role:r.GRP_MBR_ROLE_ADMIN}),Wi.emitGroupListUpdate(),Wi.updateConversationGroupProfile(f))}_handleMemberRevokeAdmin(s){const{OuterConstant:r}=this._core,{groupProfile:g,userIDList:u}=s.payload,E=this._core.common.getCurrentUserID(),{groupID:f}=g,D=Wi.getLocalGroup(f);D&&u.includes(E)&&(D.updateSelfInfo({role:r.GRP_MBR_ROLE_MEMBER}),Wi.emitGroupListUpdate(),Wi.updateConversationGroupProfile(f))}};class HQ{constructor(r){this.type=tr.core.OuterConstant.MSG_GRP_SYS_NOTICE,this.content={},this._initContent(r)}static parseServerPushElement(r){const g=Qh(r);return new HQ(g)}_initContent(r){Object.keys(r).forEach(g=>{switch(g){case"remarkInfo":this.content.handleMessage=r[g];break;case"groupProfile":this._initGroupProfile(r[g]);break;case"memberInfoList":break;default:this.content[g]=r[g]}})}_initGroupProfile(r){this.content.groupProfile={};const g=Object.keys(r);for(let u=0;u0&&this._handleGroupSysTemMessage(g,E),g===!0&&E.length>0&&f.emitOuterEvent(D.MESSAGE_RECEIVED,{name:D.MESSAGE_RECEIVED,data:E})}_handleGroupSystemNotification(s,r){const g=[];let u={};for(let E=0;E0?[u]:[],messageList:g}}_assembleMessage(s){const{message:{messageFactory:r},OuterConstant:g,utils:{randomInt:u}}=this._core;s.flow="in",s.conversationType=g.CONV_SYSTEM,s.conversationSubType=s.groupProfile.type,s.conversationID=g.CONV_SYSTEM;const E=r.createMessage(s),f=new HQ(Object.assign(Object.assign({},s.elements),{groupProfile:Object.assign({},s.groupProfile)}));E.setElement(f),E.isSystemMessage=!0;const D=E.sequence===1&&E.random===1,v=E.sequence===2&&E.random===2;return(D||v)&&(E.sequence=u(),E.random=u(),E.generateMessageID()),E}_handleConversationOptions(s,r){const{OuterConstant:g}=this._core,u={conversationID:g.CONV_SYSTEM,unreadCount:0,type:g.CONV_SYSTEM,subType:s.conversationSubType,lastMessage:null};return r&&u.unreadCount++,u}_handleGroupSysTemMessage(s,r){s&&r.forEach(g=>{const{operationType:u}=g.payload;switch(u){case bT:this._handleGroupJoinResult(g);break;case zM:this._handleMemberKicked(g);break;case kT:this._handleGroupDismissed(g);break;case LT:this._handleGroupInvitedResult(g);break;case SD:this._handleGroupQuitResult(g);break;case UQ:this._handleMessageRemindTypeSynced(g);break;case Gm:this._handleAVChatRoomMemberBanned(g)}})}_handleGroupJoinResult(s){const{groupProfile:r}=s.payload,{groupID:g,type:u}=r,E=Wi.hasLocalGroup(g);this._core.ssoLog.debug("_handleGroupJoinResult",` groupID:${g} type:${u} hasLocalGroup:${E}`),E||Md(u)||(Wi.updateLocalGroup([Object.assign({},r)]),Wi.emitGroupListUpdate())}_handleMemberKicked(s){const{groupProfile:{groupID:r,type:g}}=s.payload;Wi.hasLocalGroup(r)&&this._deleteLocalGroup(r,g),this._updateConversationProfile(r,{unreadCount:0})}_handleGroupDismissed(s){const{groupProfile:{groupID:r,type:g}}=s.payload;Wi.hasLocalGroup(r)&&this._deleteLocalGroup(r,g),this._updateConversationProfile(r,{unreadCount:0})}_handleGroupInvitedResult(s){const{groupProfile:r}=s.payload,{groupID:g}=r,u=Wi.hasLocalGroup(g);this._core.ssoLog.debug("_handleGroupInvitedResult",` groupID:${g} hasLocalGroup:${u}`),u||Jl.getGroupProfile({groupID:g}).then(E=>{const{data:{group:f}}=E;Wi.updateLocalGroup([Object.assign({},f)]),Wi.emitGroupListUpdate()})}_handleGroupQuitResult(s){const{groupProfile:{groupID:r,type:g}}=s.payload,u=Wi.hasLocalGroup(r);this._core.ssoLog.debug("_handleGroupQuitResult",` groupID:${r} type:${g} hasLocalGroup:${u}`),u&&this._deleteLocalGroup(r,g),this._updateConversationProfile(r,{unreadCount:0})}_handleMessageRemindTypeSynced(s){const{groupProfile:{groupID:r},messageRemindType:g}=s.payload;this._updateConversationProfile(r,{messageRemindType:g})}_handleAVChatRoomMemberBanned(s){const{groupProfile:{groupID:r,type:g}}=s.payload;this._deleteLocalGroup(r,g)}_deleteLocalGroup(s,r){if(Md(r)){const{appStore:{conversationStore:g},OuterConstant:{CONV_GROUP:u}}=this._core;g.deleteConversation(`${u}${s}`)}Wi.deleteLocalGroup(s),Wi.emitGroupListUpdate()}_updateConversationProfile(s,r){const{appStore:{conversationStore:g},OuterConstant:{CONV_GROUP:u}}=this._core,E=`${u}${s}`;g.getConversation(E)&&g.updateConversation(E,r)}},kD=new class{init(s){this._core=s,s.ssoLog.debug("GroupNotificationHandler.init"),nR.init(s),sR.init(s);const{notificationCenter:r,InnerEvent:g}=s,{InnerEventSubType:u}=r;r.subscribeInnerEvent(g.MESSAGE_PUSH,u.GROUP_TIPS_NOTIFICATION,this._onNewGroupTipsNotification,this),r.subscribeInnerEvent(g.MESSAGE_PUSH,u.GROUP_SYSTEM_NOTIFICATION,this._onNewGroupSystemNotification,this),r.subscribeInnerEvent(g.DESTROY,this._dispose,this)}_onNewGroupTipsNotification(s){const{common:{workflowManager:r},constants:{WORKFLOW_NAME:g}}=this._core;r.executeWorkflow(g.RECEIVE_GROUP_TIPS_NOTIFICATION,s)}_onNewGroupSystemNotification(s){sR.onNewGroupSystemNotification(s)}_dispose(){const{notificationCenter:s,InnerEvent:r}=this._core,{InnerEventSubType:g}=s;s.unSubscribeInnerEvent(r.MESSAGE_PUSH,g.GROUP_TIPS_NOTIFICATION,this._onNewGroupTipsNotification,this),s.unSubscribeInnerEvent(r.MESSAGE_PUSH,g.GROUP_SYSTEM_NOTIFICATION,this._onNewGroupSystemNotification,this)}};const bs={required:!0,rules:["string"],allowEmpty:!1},JQ={required:!0,rules:["number"],allowEmpty:!1},Td={required:!0,rules:["array"],allowEmpty:!1},LD={required:!0,rules:["object"],allowEmpty:!1},KT={createGroup:{name:bs,type:bs},dismissGroup:[Object.assign({key:"groupID"},bs)],joinGroup:{groupID:bs,applyMessage:{required:!1,rules:["string"],allowEmpty:!0}},quitGroup:[Object.assign({key:"groupID"},bs)],searchGroupByID:[Object.assign({key:"groupID"},bs)],getGroupProfile:{groupID:bs,groupCustomFieldFilter:{required:!1,rules:["array"],allowEmpty:!0}},updateGroupProfile:{groupID:bs,muteAllMembers:{required:!1,rules:["boolean"],allowEmpty:!1}},changeGroupOwner:{groupID:bs,newOwnerID:bs},getGroupOnlineMemberCount:[Object.assign({key:"groupID"},bs)],handleGroupApplication:{handleAction:bs},getGroupMemberList:{groupID:bs},getGroupMemberProfile:{groupID:bs,userIDList:Td,memberCustomFieldFilter:{required:!1,rules:["array"],allowEmpty:!0}},addGroupMember:{groupID:bs,userIDList:Td},deleteGroupMember:{groupID:bs,userIDList:Td},setGroupMemberMuteTime:{groupID:bs,userID:bs,muteTime:Object.assign(Object.assign({},JQ),{customValidator:s=>!(s<0)||"muteTime must be a non-negative number."})},setGroupMemberRole:{groupID:bs,userID:bs,role:bs},setGroupMemberNameCard:{groupID:bs,userID:{required:!1,rules:["string"],allowEmpty:!1},nameCard:bs},setGroupMemberCustomField:{groupID:bs,userID:{required:!1,rules:["string"],allowEmpty:!1},memberCustomField:Td},markGroupMemberList:{groupID:bs,markType:Object.assign(Object.assign({},JQ),{customValidator:s=>!(s<1e3)||"markType must be greater than or equal to 1000."}),enableMark:{required:!0,rules:["boolean"],allowEmpty:!1},userIDList:Td},initGroupAttributes:{groupID:bs,groupAttributes:LD},setGroupAttributes:{groupID:bs,groupAttributes:LD},deleteGroupAttributes:{groupID:bs,keyList:Object.assign(Object.assign({},Td),{allowEmpty:!0})},getGroupAttributes:{groupID:bs,keyList:Object.assign(Object.assign({},Td),{allowEmpty:!0})},getGroupCounters:{groupID:bs,keyList:{required:!1,rules:["array"],allowEmpty:!0}},setGroupCounters:{groupID:bs,counters:LD},increaseGroupCounter:{groupID:bs,key:bs,value:JQ},decreaseGroupCounter:{groupID:bs,key:bs,value:JQ}},jT={getGroupList:!0,createGroup:!0,dismissGroup:!0,joinGroup:!0,quitGroup:!0,searchGroupByID:!0,getGroupProfile:!0,updateGroupProfile:!0,changeGroupOwner:!0,getGroupOnlineMemberCount:!0,getGroupApplicationList:!0,handleGroupApplication:!0,getGroupMemberList:!0,getGroupMemberProfile:!0,addGroupMember:!0,deleteGroupMember:!0,setGroupMemberMuteTime:!0,setGroupMemberRole:!0,setGroupMemberNameCard:!0,setGroupMemberCustomField:!0,markGroupMemberList:!0,initGroupAttributes:!0,setGroupAttributes:!0,getGroupAttributes:!0,deleteGroupAttributes:!0,getGroupCounters:!0,setGroupCounters:!0,increaseGroupCounter:!0,decreaseGroupCounter:!0};var WT=new class{constructor(){this._installedSubPlugins=[],this.groupDataHandler=Wi,this.groupAction=PQ,this.groupAttribute=VQ,this.groupMember=oR,this.groupCounter=CB,this.name="Group"}install(s,r=[]){this._core=s,tr.init(s),Wi.init(s),PQ.init(s,this),oR.init(s,this),wD.init(s),CB.init(s),VQ.init(s),kD.init(s),s.helper.registerValidateConfig({auth:jT,params:KT}),this._installSubPlugins(r);const{notificationCenter:g,InnerEvent:u}=s;g.subscribeInnerEvent(u.LOGOUT,this._reset,this),g.subscribeInnerEvent(u.DESTROY,this._dispose,this)}getInstalledSubPlugins(){return this._installedSubPlugins}_installSubPlugins(s){const{utils:{isArray:r}}=this._core;s&&r(s)&&s.forEach(g=>{var u;this._installedSubPlugins.includes(g.name)||((u=g.install)===null||u===void 0||u.call(g,this._core,this),this._installedSubPlugins.push(g.name))})}_reset(){Wi.reset(),VQ.reset(),CB.reset()}_dispose(){this._reset();const{notificationCenter:s,InnerEvent:r}=this._core;s.unSubscribeInnerEvent(r.LOGOUT,this._reset,this),s.unSubscribeInnerEvent(r.DESTROY,this._dispose,this)}};const hB=new class{init(s){this.core=s}},rR="AV_MBR_LIST",zT="AV_BAN_MBR",jE={NORMAL_MESSAGE:3,GROUP_TIPS_HAS_ROAMING:4,GROUP_SYSTEM_MESSAGE:5,GROUP_TIPS_HAS_NO_ROAMING:6,BROADCAST_MESSAGE:17,MESSAGE_REVOKED:20,MESSAGE_REACTION:21,LIVE_CUSTOM_DATA:100},ph={GROUP_DISMISSED:5,QUIT_GROUP:8,AVCHATROOM_MEMBER_BANNED:21},UD=60,FD=2603,ZT=2686,XT=2688,qQ=3122;class aR{constructor(r){const{core:g,manager:u,groupID:E,getRequestParams:f,onSuccess:D,onFail:v}=r;this._name="Polling",this._core=g,this._manager=u,this._timeoutID=-1,this._isRunning=!1,this._groupID=E,this._getRequestParams=f,this._onSuccess=D,this._onFail=v}start(){this._isRunning=!0,this._request(),console.log(`${this._name}.start pollingInterval:${this._manager.getCurrentPollingInterval(this._groupID)}`)}isRunning(){return this._isRunning}_request(){return mA(this,void 0,void 0,function*(){try{const r=this._getRequestParams(this._groupID),g=yield function(E,f){return mA(this,void 0,void 0,function*(){const{longPollingKey:D,startSequence:v,startBroadcastSeq:N,simplifiedMessage:P}=E,W={Key:D,StartSeq:v,StartBroadcastSeq:N,DownsizeFlag:P,USP:1,HoldTime:90};return f.common.buildAndSendPacket({servcmd:"group_open_long_polling_http_svc.get_msg",data:W})})}(r,this._core);this._onSuccess(this._groupID,g);const u=this._manager.getCurrentPollingInterval(this._groupID);this._runNextPolling(u)}catch(r){this._onFail(this._groupID,r),this._runNextPolling(2e3)}})}_runNextPolling(r){this.isRunning()&&(this._timeoutID>-1&&clearTimeout(this._timeoutID),this._timeoutID=setTimeout(this._request.bind(this),r))}stop(){console.log(`${this._name}.stop timerID:${this._timeoutID}`),this._timeoutID>-1&&(clearTimeout(this._timeoutID),this._timeoutID=-1),this._isRunning=!1}}class mh{constructor(r){this._maxLength=r,this._map=new Map}set(r){var g;if(this._map.size>=this._maxLength){const u=((g=this._map.entries().next().value)===null||g===void 0?void 0:g[0])||"";this._map.delete(u)}this._map.set(r,1)}has(r){return this._map.has(r)}delete(r){this.has(r)&&this._map.delete(r)}clear(){this._map.clear()}}const AE=s=>s===jE.GROUP_TIPS_HAS_NO_ROAMING||s===jE.GROUP_TIPS_HAS_ROAMING,KQ=s=>s===jE.GROUP_SYSTEM_MESSAGE;function Jm(s){const r=function(g){const{E:u,MCT:E,MR:f,MP:D,MTS:v,GId:N,MS:P,CCD:W,F_Account:nA,IsSys:EA,GInf:wA,MsgBody:kA}=g,VA=vo(g,["E","MCT","MR","MP","MTS","GId","MS","CCD","F_Account","IsSys","GInf","MsgBody"]);return Object.assign({Event:u,MsgClientTime:E,MsgRandom:f,MsgPriority:D,MsgTimeStamp:v,ToGroupId:N,MsgSeq:P,CloudCustomData:W,From_Account:nA,IsSystemMsg:EA,GroupInfo:OD(wA),MsgBody:$T(kA)},VA)}(s);return function(g){const{Event:u}=g;(AE(u)||KQ(u))&&(g.From_Account=g.From_Account||"@TIM#SYSTEM"),E=u,(E===jE.BROADCAST_MESSAGE||(f=>f===jE.NORMAL_MESSAGE)(u))&&function(f){const{core:{OuterConstant:D}}=hB;f.CloudCustomData=f.CloudCustomData||"",f.MsgBody=f.MsgBody.map(v=>{if(v.MsgType===D.MSG_CUSTOM){const{content:N={}}=v;v.content=Object.assign({Data:"",Desc:"",Ext:""},N)}return v})}(g);var E;AE(u)&&function(f){const{GroupJoinType:D,MsgOperatorMemberExtraInfo:v={},MsgMemberExtraInfo:N,Operator_Account:P,List_Account:W,OpType:nA}=f.MsgBody||{};typeof D=="number"||nA!==1&&nA!==2||(f.MsgBody.GroupJoinType=nA===2?0:1),N||(f.MsgBody.MsgMemberExtraInfo=W?.map(EA=>({UserId:EA}))),nA!==1||N||(f.MsgBody.MsgMemberExtraInfo=[{UserId:v.UserId}]),f.MsgBody.MsgOperatorMemberExtraInfo=Object.assign({Operator_Account:P,ImageUrl:"",NickName:""},v)}(g),KQ(u)&&function(f){const{MsgOperatorMemberExtraInfo:D={},Operator_Account:v}=f.MsgBody||{};f.MsgBody.MsgMemberExtraInfo=Object.assign({UserId:v,ImageUrl:"",NickName:""},D),f.MsgBody=Object.assign({Authentication:"",RemarkInfo:"",MsgKey:1e3*f.MsgTimeStamp},f.MsgBody),f.MsgBody=Object.keys(f.MsgBody).filter(N=>N!=="MsgOperatorMemberExtraInfo").reduce((N,P)=>Object.assign(Object.assign({},N),{[P]:f.MsgBody[P]}),{})}(g)}(r),r}function OD(s){const r=s||{},{GN:g,GT:u,F_Hd:E,F_NN:f,F_Ll:D}=r,v=vo(r,["GN","GT","F_Hd","F_NN","F_Ll"]),N=Object.assign({GroupName:g,GroupType:u},v);return E&&(N.From_AccountHeadurl=E),f&&(N.From_AccountNick=f),D&&(N.From_AccountLevel=D),N}function $T(s){let r=s;Array.isArray(s)||(r=[s]);const g=r.map(u=>{const{O_Account:E,Opt:f,L_Account:D,RT:v,UDF:N,OpInf:P,OnlineInf:W,MsgMemberExtraInfo:nA}=u,EA=vo(u,["O_Account","Opt","L_Account","RT","UDF","OpInf","OnlineInf","MsgMemberExtraInfo"]),wA=Object.assign({Operator_Account:E,OpType:f,List_Account:D,ReportType:v,UserDefinedField:N},EA);return P&&(wA.MsgOperatorMemberExtraInfo=function(kA){const{Img:VA,NN:LA}=kA,SA=vo(kA,["Img","NN"]);return Object.assign({ImageUrl:VA,NickName:LA},SA)}(P)),nA&&(wA.MsgMemberExtraInfo=function(kA){return kA?.map(VA=>{const{Img:LA,NN:SA}=VA,PA=vo(VA,["Img","NN"]);return Object.assign({ImageUrl:LA,NickName:SA},PA)})}(nA)),W&&(wA.OnlineMemberInfo=function(kA){const{ET:VA,Num:LA}=kA;return{ExpireTime:VA,OnlineMemberNum:LA}}(W)),wA});return Array.isArray(s)?g:g[0]}var fh=new class{constructor(){this._name="MessageParser",this._sequenceList=new mh(200),this._messageIDList=new mh(100),this._broadcastMessageIDMap=new Map,this._reportMessageStackedCount=0}init(s,r){this._core=s,this._avChatRoomHandler=r}onMessageReceived(s,r,g=!1){this._sortServerMessageList({groupID:s,serverMessageList:r,isHistoryMessage:g});const u=this._handleMessageList(s,r);if(u.length===0)return;if(!g){const{appStore:{conversationStore:N},OuterConstant:{CONV_GROUP:P},common:{buildLastMessage:W}}=this._core,nA=W(u[u.length-1]);N.updateConversation(`${P}${s}`,{lastMessage:nA})}this._checkMessageStacked(u);const E=u.filter(N=>N.isModified===!0),f=u.filter(N=>N.isModified===!1),{OuterEvent:{MESSAGE_RECEIVED:D,MESSAGE_MODIFIED:v}}=this._core;E.length>0&&this._emitEvent({name:v,data:E}),f.length>0&&this._emitEvent({name:D,data:f})}_sortServerMessageList(s){const{groupID:r,serverMessageList:g,isHistoryMessage:u}=s;let E=[];this._avChatRoomHandler.isPollingSimplifiedMessage()&&!u?(g.sort((f,D)=>f.MS-D.MS),E=g.map(f=>f.MS)):(g.sort((f,D)=>f.MsgSeq-D.MsgSeq),E=g.map(f=>f.MsgSeq)),console.log(`${this._name}._sortServerMessageList groupID:${r} count:${E.length} sequenceList:${E}`),E.length=0}_handleMessageList(s,r){var g;const{message:{messageDataHandler:u,messageHelper:E}}=this._core,f=this._avChatRoomHandler.isPollingSimplifiedMessage(),D=[],v=r.length;for(let N=0;Ng===jE.MESSAGE_REVOKED)(r)?(this._handleMessageRevoked(s),null):(g=>g===jE.LIVE_CUSTOM_DATA)(r)?(this._onLiveCustomData(s),null):(g=>g===jE.MESSAGE_REACTION)(r)?null:s:(console.warn(`${this._name}.onMessageReceived unknown event:${r}`),null)}_createMessage(s){const{message:{messageFactory:r},OuterConstant:g}=this._core;let u=g.CONV_GROUP;s.elements.type===g.MSG_GRP_SYS_NOTICE&&(u=g.CONV_SYSTEM);const E=!!s.isSystemMessage,f=r.createMessage(Object.assign(Object.assign({},s),{conversationType:u,isSystemMessage:E,flow:"in"}));return f.setElement(s.elements),f}_filterDuplicateMessage(s){const{common:r}=this._core;if(!r.isUnlimitedAVChatRoom()){if(this._sequenceList.has(s.sequence))return null;this._sequenceList.set(s.sequence)}const g=this._messageIDList.has(s.ID);return g?(console.warn(`${this._name}_filterDuplicateMessageItem ID:${s.ID} has:${g}`),null):(this._messageIDList.set(s.ID),s)}_handleMessageRevoked(s){const{OuterConstant:r,OuterEvent:{MESSAGE_REVOKED:g}}=this._core,{ToGroupId:u,MsgBody:{RevokeMsgList:E},RevokerInfo:{Revoker_Account:f,Reason:D=""}}=s,v=[];E.forEach(N=>{const{TinyId:P,MsgClientTime:W,Random:nA,MsgSeq:EA}=N,wA={conversationID:`${r.CONV_GROUP}${u}`,ID:`${P}-${W}-${nA}`,revoker:f,revokeReason:D,revokerInfo:{userID:f,nick:"",avatar:""},sequence:EA};v.push(wA)}),v.length!==0&&this._emitEvent({name:g,data:v})}_onLiveCustomData(s){const{OuterEvent:{ROOM_CUSTOM_DATA_RECEIVED:r}}=this._core,{ToGroupId:g,MsgSeq:u,MsgTimeStamp:E,MsgBody:f}=s,D=f?.Content||f?.MsgContent||"";this._emitEvent({name:r,data:D}),console.log(`${this._name}._onLiveCustomData groupID:${g} sequence:${u} time:${E} data:${D}`)}_onGroupDismissed(s){this._avChatRoomHandler.reset(s)}_checkMessageStacked(s){const{length:r}=s;if(r>=100&&this._reportMessageStackedCount<5){const g=this._avChatRoomHandler.getJoinedGroups();this._core.ssoLog.info("MessageStacked",`count:${r} groupID:${g.join(",")}`),this._reportMessageStackedCount+=1}}_emitEvent(s){this._core.notificationCenter.emitOuterEvent(s.name,s)}onBroadcastMessageReceived(s){const{message:{messageHelper:r},OuterEvent:{MESSAGE_RECEIVED:g}}=this._core,u=this._avChatRoomHandler.isPollingSimplifiedMessage(),E=[],f=s.length;for(let D=0;D0&&this._emitEvent({name:g,data:E})}_updateLocalOnlineMemberCountFromTips(s){const{utils:{isEmpty:r}}=this._core,{ToGroupId:g,MsgBody:{OnlineMemberInfo:u}}=s;if(r(u))return;const{OnlineMemberNum:E=0,ExpireTime:f=UD}=u,D=Date.now();let v=this._avChatRoomHandler.getLocalOnlineMemberCount(g);r(v)?v={lastReqTime:0,lastSyncTime:0,latestUpdateTime:D,memberCount:E,expireTime:f}:(v.latestUpdateTime=D,v.memberCount=E),this._avChatRoomHandler.updateLocalOnlineMemberCount(g,v)}reset(){this._reportMessageStackedCount=0,this._sequenceList.clear(),this._messageIDList.clear(),this._broadcastMessageIDMap.clear()}};const BB=s=>{const{core:{store:r}}=hB;return(r.get("cloudConfig")||{})[s]},yh=s=>{const{core:{utils:{isUndefined:r}}}=hB;return!r(s)},jQ=()=>{const s=BB("polling_interval");return yh(s)?parseInt(s,10):300},QB=()=>{const s=BB("polling_simplified_msg");return yh(s)?parseInt(s,10):0};var gR=new class{constructor(){this._name="GetAVChatRoomOnlineMemberCount"}init(s,r){this._core=s,this._parentPlugin=r;const{helper:g}=s;g.registerApi({apiName:"getGroupOnlineMemberCount",context:this,matcher:()=>r.getInstalledSubPlugins().length>0})}getGroupOnlineMemberCount(s){return mA(this,void 0,void 0,function*(){const{appStore:{groupStore:r},OuterConstant:g}=this._core,u=r.getGroup(s);return u?u.type===g.GRP_AVCHATROOM?this._getOnlineMemberCount(s):this._parentPlugin.groupAction.getGroupOnlineMemberCount(s):{code:0,data:{memberCount:0}}})}_getOnlineMemberCount(s){return mA(this,void 0,void 0,function*(){const r="_getOnlineMemberCount",{utils:{isEmpty:g}}=this._core,u=Vg.getLocalOnlineMemberCount(s);if(g(u)||this._isExpired(s)){const{memberCount:E=0}=yield this._getOnlineMemberCountFromServer(s);return console.log(`${this._name}.${r} ok, groupID:${s} memberCount:${E} from server.`),{code:0,data:{memberCount:E}}}return console.log(`${this._name}.${r} ok, groupID:${s} memberCount:${u.memberCount} from local.`),{code:0,data:{memberCount:u.memberCount}}})}_isExpired(s){const r=Vg.getLocalOnlineMemberCount(s),g=Date.now(),u=g-r.lastSyncTime>1e3*r.expireTime,E=g-r.latestUpdateTime>1e4,f=g-r.lastReqTime>3e3;return u&&E&&f}_getOnlineMemberCountFromServer(s){return mA(this,void 0,void 0,function*(){const r="_getOnlineMemberCountFromServer";try{const g=yield function(v,N){return mA(this,void 0,void 0,function*(){const P={GroupId:v};return N.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_online_member_num",data:P})})}(s,this._core),{OnlineMemberNum:u=0,ExpireTime:E=UD}=g||{},f=Date.now(),D={lastSyncTime:f,latestUpdateTime:f,lastReqTime:f,memberCount:u,expireTime:E};return Vg.updateLocalOnlineMemberCount(s,D),{memberCount:u}}catch(g){const u=new this._core.helper.ChatError({functionName:r,code:g?.errorCode,message:g?.errorInfo});throw console.error(`${this._name}.${r} fail:`,u),u}})}},Vg=new class{constructor(){this._name="AVChatRoomHandler",this._joinedGroupMap=new Map,this._pollingRequestInfoMap=new Map,this._pollingInstanceMap=new Map,this._onlineMemberCountMap=new Map,this._pollingIntervalMap=new Map,this._pollingNoMessageCountMap=new Map,this._membersReqInfoMap=new Map,this._startBroadcastSequence=1}init(s,r){this._core=s,this._parentPlugin=r,fh.init(s,this),s.ssoLog.debug("AVChatRoomHandler.init")}onAVChatRoomSystemNotification(s){const{OuterConstant:{GRP_AVCHATROOM:r}}=this._core,{GroupTips:g=[]}=s;for(let u=0;u0&&(r=[...this._joinedGroupMap.values()].filter(g=>g.type===s)),r}handleJoinGroupResult(s){return mA(this,void 0,void 0,function*(){const{utils:{isUndefined:r},OuterConstant:{CONV_GROUP:g},apiMap:{getConversationProfile:u},OuterConstant:E}=this._core,{longPollingKey:f,group:D,historyMessageList:v=[]}=s,{groupID:N}=D;return yield this._preCheck(D),this._joinedGroupMap.set(N,D),this._parentPlugin.groupDataHandler.updateLocalGroup([D]),this._parentPlugin.groupDataHandler.emitGroupListUpdate(),u(`${g}${N}`),gR.getGroupOnlineMemberCount(N),v.length>0&&fh.onMessageReceived(N,v,!0),r(f)?{code:0,data:{status:E.JOIN_STATUS_SUCCESS,group:D}}:{code:0,data:this.startMessageLongPolling(s)}})}isGroupCounterUpdated(s){return this._parentPlugin.groupCounter.isGroupCounterUpdated(s)}handleGroupCounterUpdated(s){this._parentPlugin.groupCounter.handleGroupCounterUpdated(s)}_preCheck(s){return mA(this,void 0,void 0,function*(){const{common:r,OuterConstant:g,helper:u,apiMap:{quitGroup:E},ssoLog:f}=this._core;if(r.isUnlimitedAVChatRoom()){if(this._pollingInstanceMap.size>(()=>{const N=BB("polling_count_limit");return yh(N)&&N>0?parseInt(N,10):20})())throw new u.ChatError({code:XT,message:"the count of longPolling exceeds the max limit"});return}if(this._joinedAVChatRoomCount()===0||s.type===g.GRP_LIVE)return;const[D,v]=this._joinedGroupMap.entries().next().value;if(v.selfInfo.role===g.GRP_MBR_ROLE_OWNER)this._parentPlugin.groupDataHandler.deleteLocalGroup(D);else try{yield E(D)}catch(N){f.debug("quitGroup",`${this._name}._preCheck quitGroup failed, groupID:${D} info:`,N)}this.reset(D)})}startMessageLongPolling(s){const{OuterConstant:r}=this._core,{longPollingKey:g,startSequence:u=1,group:E}=s,{groupID:f}=E;return this._pollingRequestInfoMap.set(f,{longPollingKey:g,startSequence:u}),this._pollingIntervalMap.set(f,jQ()),this._startPolling(f),this._reportLongPollingCount(),{status:r.JOIN_STATUS_SUCCESS,group:E}}_startPolling(s){if(this._core.ssoLog.debug("_startPolling",`${this._name}._startPolling groupID:${s}`),this._pollingInstanceMap.has(s)){const g=this._pollingInstanceMap.get(s);return void(g?.isRunning()||g==null||g.start())}const r=new aR({core:this._core,manager:this,groupID:s,getRequestParams:this._handleRequestParams.bind(this),onSuccess:this._handleSuccess.bind(this),onFail:this._handleFailure.bind(this)});r.start(),this._pollingInstanceMap.set(s,r)}_handleRequestParams(s){const{longPollingKey:r,startSequence:g}=this._pollingRequestInfoMap.get(s)||{};return s===[...this._pollingInstanceMap.keys()][0]?{longPollingKey:r,startSequence:g,startBroadcastSeq:this._startBroadcastSequence,simplifiedMessage:QB()}:{longPollingKey:r,startSequence:g,simplifiedMessage:QB()}}_handleSuccess(s,r){const{ErrorCode:g}=r;if(g!==0){const{longPollingKey:u,startSequence:E}=this._pollingRequestInfoMap.get(s)||{};return void console.warn(`${this._name}._handleSuccess groupID:${s} key:${u} startSeq:${E} errorCode:${g}`)}this._hasJoinedAVChatRoom(s)&&this._handleResponseData(s,r)}_handleResponseData(s,r){const{Key:g,NextSeq:u,NextBroadcastSeq:E,RspMsgList:f=[],RspBroadcastMsgList:D=[]}=r;if(g&&u&&this._pollingRequestInfoMap.set(s,{longPollingKey:g,startSequence:u}),E&&E>this._startBroadcastSequence&&(this._startBroadcastSequence=E),f.length>0)this._getPollingNoMessageCount(s)!==0&&(this._updatePollingNoMessageCount(s,0),this._pollingIntervalMap.set(s,jQ())),fh.onMessageReceived(s,f);else{let v=this._getPollingNoMessageCount(s);if(v+=1,this._updatePollingNoMessageCount(s,v),v===(()=>{const N=BB("polling_no_msg_count");return yh(N)?parseInt(N,10):20})()){const N=jQ()+(()=>{const P=BB("polling_interval_plus");return yh(P)?parseInt(P,10):2e3})();this._pollingIntervalMap.set(s,N)}}D.length>0&&fh.onBroadcastMessageReceived(D)}_handleFailure(s,r){const{ssoLog:g,utils:{safeStringify:u}}=this._core;g.warn("polling",`${this._name}._handleFailure groupID:${s} error: ${u(r)}`)}_joinedAVChatRoomCount(){const{OuterConstant:s}=this._core;let r=[];return this._joinedGroupMap.size>0&&(r=this.getJoinedGroups().filter(g=>g.type===s.GRP_AVCHATROOM)),r.length}_hasJoinedAVChatRoom(s){return this._joinedGroupMap.has(s)}getJoinedGroups(){return[...this._joinedGroupMap.values()]}updateLocalLiveGroup(s,r){this._joinedGroupMap.set(s,r),this._parentPlugin.groupDataHandler.updateLocalGroup([r])}handleLiveHistoryMessages(s,r){fh.onMessageReceived(s,r,!0)}isOverFrequencyLimit(s){if(!this._membersReqInfoMap.has(s))return this._membersReqInfoMap.set(s,{startTime:Date.now(),requestCount:1}),!1;let{startTime:r,requestCount:g}=this._membersReqInfoMap.get(s);const{interval:u,count:E}=(()=>{const f=BB("av_members_freq_limit");if(yh(f)){const{interval:D,count:v}=JSON.parse(f);if(v>0&&D>0)return{interval:D,count:v}}return{interval:30,count:4}})();return Date.now()-r>1e3*u?(this._membersReqInfoMap.set(s,{startTime:Date.now(),requestCount:1}),!1):(g+=1,this._membersReqInfoMap.set(s,{startTime:r,requestCount:g}),g>E)}_stopPolling(s){if(this._core.ssoLog.debug("_stopPolling",`${this._name}._stopPolling groupID:${s}`),s){const{appStore:{conversationStore:r},OuterConstant:{CONV_GROUP:g}}=this._core;r.deleteConversation(`${g}${s}`);const u=this._pollingInstanceMap.get(s);return u?.stop(),this._parentPlugin.groupDataHandler.deleteLocalGroup(s),this._pollingInstanceMap.delete(s),this._pollingRequestInfoMap.delete(s),this._joinedGroupMap.delete(s),this._onlineMemberCountMap.delete(s),this._pollingIntervalMap.delete(s),this._pollingNoMessageCountMap.delete(s),void this._membersReqInfoMap.delete(s)}for(const r of this._pollingInstanceMap.values())r?.stop();this._pollingInstanceMap.clear(),this._pollingRequestInfoMap.clear(),this._joinedGroupMap.clear(),this._onlineMemberCountMap.clear(),this._pollingIntervalMap.clear(),this._pollingNoMessageCountMap.clear(),this._membersReqInfoMap.clear()}_updatePollingNoMessageCount(s,r){this._pollingNoMessageCountMap.set(s,r)}_getPollingNoMessageCount(s){return this._pollingNoMessageCountMap.get(s)||0}_reportLongPollingCount(){const s=this._joinedGroupMap.size;if(s>1){const{common:r,OuterConstant:g,ssoLog:u}=this._core,E=r.isUnlimitedAVChatRoom()?1:0,f=[],D=[];Array.from(this._joinedGroupMap.values()).forEach(({groupID:v,type:N})=>{N===g.GRP_LIVE?D.push(v):f.push(v)}),u.info("longPollingCount",String(s),{moreMessage:`av:${f.join(",")} live:${D.join(",")} code: ${E}`,eventType:29})}}reset(s){this._stopPolling(s),this._startBroadcastSequence=1,fh.reset()}},cR=new class{init(s,r){this._core=s,this._parentPlugin=r;const{helper:g}=s;g.registerApi({apiName:"joinGroup",context:this,matcher:()=>r.getInstalledSubPlugins().length>0})}joinGroup(s){return mA(this,void 0,void 0,function*(){const{OuterConstant:r}=this._core,g=yield this._parentPlugin.groupAction.joinGroup(s),{data:{status:u,group:{type:E}}}=g;return E===r.GRP_AVCHATROOM?u===r.JOIN_STATUS_ALREADY_IN_GROUP?g:Vg.handleJoinGroupResult(g.data):g})}},AN=new class{init(s,r){this._core=s,this._parentPlugin=r;const{helper:g}=s;g.registerApi({apiName:"quitGroup",context:this,matcher:()=>r.getInstalledSubPlugins().length>0})}quitGroup(s){return mA(this,void 0,void 0,function*(){const{OuterConstant:r}=this._core,g=yield this._parentPlugin.groupAction.quitGroup(s),{data:{type:u}}=g;return u===r.GRP_AVCHATROOM&&Vg.reset(s),g})}},lR=new class{init(s,r){this._core=s,this._parentPlugin=r;const{helper:g}=s;g.registerApi({apiName:"dismissGroup",context:this,matcher:()=>r.getInstalledSubPlugins().length>0})}dismissGroup(s){return mA(this,void 0,void 0,function*(){const{OuterConstant:r}=this._core,g=yield this._parentPlugin.groupAction.dismissGroup(s),{data:{type:u}}=g;return u===r.GRP_AVCHATROOM&&Vg.reset(s),g})}},qm=new class{constructor(){this._name="GetAVChatRoomMemberList"}init(s,r){this._core=s,this._parentPlugin=r;const{helper:g}=s;g.registerApi({apiName:"getGroupMemberList",context:this,matcher:()=>r.getInstalledSubPlugins().length>0})}getGroupMemberList(s){return mA(this,void 0,void 0,function*(){const{appStore:{groupStore:r},helper:g,OuterConstant:u}=this._core,{groupID:E}=s,f=r.getGroup(E);if(f?.type===u.GRP_AVCHATROOM&&g.checkBusinessCapabilityBits(rR)){if(Vg.isOverFrequencyLimit(E))throw{code:2996,message:`Over frequency limit: get_members-${E}`};return this._getGroupMemberList(s)}return this._parentPlugin.groupMember.getGroupMemberList(s)})}_getGroupMemberList(s){return mA(this,void 0,void 0,function*(){const r="_getGroupMemberList",{helper:g}=this._core;try{const u=yield function(v,N){return mA(this,void 0,void 0,function*(){const{groupID:P,offset:W=0}=v,nA={GroupId:P,Timestamp:W};return N.common.buildAndSendPacket({servcmd:"group_open_avchatroom_http_svc.get_members",data:nA})})}(s,this._core),{MemberList:E=[],NextTimestamp:f=0}=u||{},D=this._handleMemberList(E);return console.log(`${this._name}.${r} ok, groupID:${s.groupID} count:${D.length} nextOffset:${f}`),{code:0,data:{memberList:D,offset:f}}}catch(u){const E=new g.ChatError({functionName:r,code:u?.errorCode,message:u?.errorInfo});throw console.error(`${this._name}.${r} fail:`,E),E}})}_handleMemberList(s){return s.map(r=>{const{Member_Account:g,NickName:u="",Avatar:E="",Remark:f="",JoinTime:D=0,Marks:v=[]}=r;return{userID:g,nick:u,avatar:E,remark:f,joinTime:D,marks:v,isOnline:!0}})}},Km=new class{constructor(){this._name="DeleteAVChatRoomMember"}init(s,r){this._core=s,this._parentPlugin=r;const{helper:g}=s;g.registerApi({apiName:"deleteGroupMember",context:this,matcher:()=>r.getInstalledSubPlugins().length>0})}deleteGroupMember(s){return mA(this,void 0,void 0,function*(){const r="deleteGroupMember",{appStore:{groupStore:g},utils:{isUndefined:u},helper:E,OuterConstant:f}=this._core,{groupID:D}=s,v=g.getGroup(D);if(u(v))throw new E.ChatError({functionName:r,code:FD});if(v.type===f.GRP_AVCHATROOM){if(E.checkBusinessCapabilityBits(zT))return this._deleteGroupMember(s);throw new E.ChatError({functionName:r,code:qQ})}return this._parentPlugin.groupMember.deleteGroupMember(s)})}_deleteGroupMember(s){return mA(this,void 0,void 0,function*(){const r="_deleteGroupMember",{appStore:{groupStore:g},helper:u,ssoLog:E}=this._core,{groupID:f,duration:D=0,userIDList:v}=s;if(D===0)throw new u.ChatError({functionName:r,code:ZT});try{return yield function(N,P){return mA(this,void 0,void 0,function*(){const{groupID:W,userIDList:nA,duration:EA,reason:wA}=N,kA={GroupId:W,Members_Account:nA,Duration:EA,Description:wA};return P.common.buildAndSendPacket({servcmd:"group_open_http_svc.ban_group_member",data:kA})})}(s,this._core),E.debug(r,`${this._name}.${r} ok, groupID:${f}`),{code:0,data:{group:g.getGroup(f),userIDList:v}}}catch(N){throw new u.ChatError({functionName:r,code:N?.errorCode,message:N?.errorInfo})}})}},Nd=new class{constructor(){this._name="MarkAVChatRoomMember"}init(s){this._core=s;const{helper:r}=s;r.registerApi({apiName:"markGroupMemberList",context:this})}markGroupMemberList(s){return mA(this,void 0,void 0,function*(){const r="markGroupMemberList",{groupID:g,markType:u,enableMark:E,userIDList:f=[]}=s,D=this._generateRequestData(s);try{const v=yield function(nA,EA){return mA(this,void 0,void 0,function*(){const{groupID:wA,operationType:kA,memberList:VA}=nA,LA={GroupId:wA,CommandType:kA,MemberList:VA};return EA.common.buildAndSendPacket({servcmd:"group_open_avchatroom_http_svc.modify_user_info",data:LA})})}(D,this._core),{MemberList:N=[]}=v||{},{successUserIDList:P,failureUserIDList:W}=this._handleResult(N,f);return{code:0,data:{successUserIDList:P,failureUserIDList:W},successLog:{message:`${this._name}.${r} ok, groupID:${g} markType:${u} enableMark:${E} success:${P.length} fail:${W.length}`}}}catch(v){throw new this._core.helper.ChatError({functionName:r,code:v?.errorCode,message:v?.errorInfo})}})}_generateRequestData(s){const{groupID:r,markType:g,enableMark:u,userIDList:E=[]}=s,f=u===!0?1:2,D=[...E];return D.length>500&&console.warn(`${this._name}._generateRequestData, the length of userIDList cannot exceed 500`),{groupID:r,operationType:f,memberList:D.map(v=>({Member_Account:v,Marks:[g]}))}}_handleResult(s,r){const g=[],u=[];return s.length===r.length?(g.push(...r),{successUserIDList:g,failureUserIDList:u}):(r.forEach(E=>{s.find(f=>f.Member_Account===E)?g.push(E):u.push(E)}),{successUserIDList:g,failureUserIDList:u})}},IR=new class{init(s,r){s.ssoLog.debug("AVChatRoomAction.init"),cR.init(s,r),AN.init(s,r),lR.init(s,r),qm.init(s,r),gR.init(s,r),Km.init(s,r),Nd.init(s)}},uR=new class{constructor(){this._name="LiveHandler"}init(s){this._core=s;const{helper:r,ssoLog:g}=s;r.registerExperimentalAPI("startMessageLongPolling",this),r.registerExperimentalAPI("stopMessageLongPolling",this),g.debug("LiveHandler.init")}startMessageLongPolling(s){const{common:r,utils:{isEmpty:g},OuterConstant:u,ssoLog:E}=this._core,{groupID:f,longPollingKey:D,longPollingSequence:v=1}=s;if(g(D))return E.warn("startMessageLongPolling",`${this._name}.startMessageLongPolling longPollingKey is empty.`),Promise.resolve({});Vg.hasPollingInstance(f)&&this.stopMessageLongPolling({groupID:f});const N=Vg.getJoinedLiveList(),P=r.isUnlimitedAVChatRoom();!P&&N.length>0&&this.stopMessageLongPolling({groupID:N[0].groupID}),E.debug("startMessageLongPolling",`${this._name}.startMessageLongPolling isUnlimited:${P} groupID:${f} longPollingKey:${D} longPollingSequence:${v}`);const W={groupID:f,type:u.GRP_LIVE};return Vg.updateLocalLiveGroup(f,W),this._getLiveHistoryMessages({groupID:f,longPollingKey:D,startSequence:v}),Vg.startMessageLongPolling({group:W,longPollingKey:D,startSequence:v})}stopMessageLongPolling(s){const{groupID:r}=s;return Vg.reset(r),this._core.ssoLog.debug("stopMessageLongPolling",`${this._name}.stopMessageLongPolling ok, groupID:${r}`),Promise.resolve({groupID:r})}_getLiveHistoryMessages(s){return mA(this,void 0,void 0,function*(){const{ssoLog:r}=this._core,{groupID:g}=s;try{const u=yield function(f,D){return mA(this,void 0,void 0,function*(){const{groupID:v,longPollingKey:N,startSequence:P}=f,W={GroupId:v,LongPollingKey:N,PullPreSeq:P};return D.common.buildAndSendPacket({servcmd:"group_open_http_svc.get_huge_group_msg",data:W})})}(s,this._core),{RspMsgList:E=[]}=u||{};r.debug("_getLiveHistoryMessages",`${this._name}._getLiveHistoryMessages ok, groupID:${g} count:${E.length}`),E.length>0&&Vg.handleLiveHistoryMessages(g,E)}catch(u){r.debug("_getLiveHistoryMessages",`${this._name}._getLiveHistoryMessages failed, groupID:${g} info:${u.message}`)}})}},jm=new class{constructor(){this.name="AVChatRoom"}install(s,r){this._core=s,hB.init(s),Vg.init(s,r),IR.init(s,r),uR.init(s);const{notificationCenter:g,InnerEvent:u}=s,{InnerEventSubType:E}=g;g.subscribeInnerEvent(u.MESSAGE_PUSH,E.GROUP_SYSTEM_NOTIFICATION,this._onAVChatRoomSystemNotification,this),g.subscribeInnerEvent(u.LOGOUT,this._reset,this),g.subscribeInnerEvent(u.DESTROY,this._dispose,this)}_onAVChatRoomSystemNotification(s){Vg.onAVChatRoomSystemNotification(s)}_reset(){Vg.reset()}_dispose(){this._reset();const{notificationCenter:s,InnerEvent:r}=this._core,{InnerEventSubType:g}=s;s.unSubscribeInnerEvent(r.MESSAGE_PUSH,g.GROUP_SYSTEM_NOTIFICATION,this._onAVChatRoomSystemNotification,this),s.unSubscribeInnerEvent(r.LOGOUT,this._reset,this),s.unSubscribeInnerEvent(r.DESTROY,this._dispose,this)}};const og=new class{init(s){this.core=s}},Wm="message",pB="user",mB={OR:"or",AND:"and"},NI=20,eN=20,ER=20,Dh={required:!1,rules:["array"],allowEmpty:!0,customValidator:s=>!s||!!(Array.isArray(s)&&s.length<=5)||"keywordList should be an array and length <= 5"},zm={required:!1,rules:["string"],allowEmpty:!0,customValidator:s=>!s||!![mB.OR,mB.AND].includes(s)||"keywordListMatchType should be OR or AND"},RC={required:!1,rules:["number"],allowEmpty:!0,customValidator:s=>typeof s=="number"&&s>=1&&s<=100||"count must be a number between 1 and 100"},WQ={required:!1,rules:["string"],allowEmpty:!0},dR={required:!1,rules:["array"],allowEmpty:!0,customValidator:s=>{const{OuterConstant:r}=og.core;if(!Array.isArray(s))return"groupTypeList should be an array";const g=[r.GRP_PUBLIC,r.GRP_COMMUNITY,r.GRP_WORK,r.GRP_MEETING];let u=!1;for(let E=0;E{const{OuterConstant:r}=og.core,g=[r.MSG_TEXT,r.MSG_IMAGE,r.MSG_AUDIO,r.MSG_FILE,r.MSG_VIDEO,r.MSG_LOCATION,r.MSG_CUSTOM,r.MSG_MERGER];let u=!1;for(let E=0;E{const{OuterConstant:r}=og.core;return!(!s?.startsWith(r.CONV_C2C)&&!s?.startsWith(r.CONV_GROUP)&&s!==r.CONV_SYSTEM)||"conversationID is invalid"}},Zm=s=>({required:!1,rules:["number"],allowEmpty:!0,customValidator:r=>typeof r=="number"&&r>=0||`${s} should be a number >= 0';`}),PD={required:!1,rules:["string"],allowEmpty:!0,customValidator:s=>{const{OuterConstant:r}=og.core;return!![r.GENDER_FEMALE,r.GENDER_MALE].includes(s)||"gender is invalid"}},Xm={searchCloudMessages:{keywordList:Dh,keywordListMatchType:zm,cursor:WQ,senderUserIDList:{required:!1,rules:["array"],allowEmpty:!0,customValidator:s=>!!(Array.isArray(s)&&s.length<=5)||"senderUserIDList should be an array and length <= 5"},messageTypeList:CR,conversationID:hR,timePosition:Zm("timePosition"),timePeriod:Zm("timePeriod")},searchCloudUsers:{keywordList:Dh,keywordListMatchType:zm,cursor:WQ,count:RC,miniBirthday:Zm("miniBirthday"),maxBirthday:Zm("maxBirthday"),gender:PD},searchCloudGroupMembers:{keywordList:Dh,keywordListMatchType:zm,cursor:WQ,count:RC,groupTypeList:dR,groupIDList:{required:!1,rules:["array"],allowEmpty:!0}},searchCloudGroups:{keywordList:Dh,keywordListMatchType:zm,cursor:WQ,count:RC,groupTypeList:dR}},xD={searchCloudMessages:!0,searchCloudUsers:!0,searchCloudGroupMembers:!0,searchCloudGroups:!0};var YD=new class{constructor(){this.name="CloudSearch"}install(s){this._core=s,og.init(s),s.helper.registerApi({apiName:"searchCloudMessages",context:this}),s.helper.registerApi({apiName:"searchCloudUsers",context:this}),s.helper.registerApi({apiName:"searchCloudGroupMembers",context:this}),s.helper.registerApi({apiName:"searchCloudGroups",context:this}),s.helper.registerValidateConfig({auth:xD,params:Xm})}searchCloudMessages(s){return mA(this,void 0,void 0,function*(){try{const{OuterConstant:r,helper:g}=this._core,{conversationID:u,timePeriod:E,timePosition:f}=s,D=vo(s,["conversationID","timePeriod","timePosition"]),v=Object.assign({count:100},D);u&&(u.startsWith(r.CONV_C2C)?v.account=u.replace(r.CONV_C2C,""):u.startsWith(r.CONV_GROUP)&&(v.groupID=u.replace(r.CONV_GROUP,""))),this._setTimeRangeParams(v,{timePeriod:E,timePosition:f});const N=yield function(LA){return mA(this,void 0,void 0,function*(){const{count:SA,keywordList:PA,keywordListMatchType:zA,senderUserIDList:Ee,messageTypeList:Ie,endTime:Li,startTime:Ui,cursor:Yt,account:Oi,groupID:Bn}=LA,Re={Count:SA,KeywordList:PA,MatchType:zA,SendUserIDList:Ee,MsgTypeList:Ie,EndTime:Li,StartTime:Ui,Cursor:Yt,PeerAccount:Oi,GroupID:Bn};return og.core.common.buildAndSendPacket({servcmd:"message_search.query",data:Re})})}(v);if(!N)return{code:0,data:{}};const{ErrorCode:P,ErrorInfo:W,TotalCount:nA,Cursor:EA="",ConversationMsgs:wA=[]}=N;if(P!==0)throw{errorCode:P,errorInfo:W};const kA=`keywordList:${s.keywordList} keywordListMatchType:${s.keywordListMatchType} cursor:${s.cursor} res: totalCount:${nA}`;return{code:0,data:{searchResultList:wA.map(LA=>{const{MsgList:SA,Count:PA,GroupID:zA,UserID:Ee}=LA,Ie=zA?`${r.CONV_GROUP}${zA}`:`${r.CONV_C2C}${Ee}`;if(this._isSearchingAllConversations(s)&&PA>1)return{conversationID:Ie,messageCount:PA,messageList:[]};const Li=SA.map(Ui=>g.isEmpty(zA)?function(Yt,Oi){const Bn=Oi.OuterConstant.CONV_C2C,Re=Oi.message.messageHelper.parseServerPushMessage(Yt),Mt=Oi.message.messageFactory.createMessage(Object.assign(Object.assign({},Re),{conversationType:Bn,flow:"in"}));return Mt.setElement(Re.elements),Mt}(Ui,this._core):function(Yt,Oi){const Bn=Oi.OuterConstant.CONV_GROUP,Re=Oi.message.messageHelper.parseServerGroupMessage(Yt),Mt=Oi.message.messageFactory.createMessage(Object.assign(Object.assign({},Re),{conversationType:Bn,flow:"in"}));return Mt.setElement(Re.elements),Mt}(Ui,this._core));return{conversationID:Ie,messageCount:PA,messageList:Li}}),cursor:EA,totalCount:nA},successLog:{message:kA}}}catch(r){const{errorCode:g,errorInfo:u}=r||{};this._handleError({errorCode:g,errorInfo:u,searchType:Wm,functionName:"searchCloudMessages"})}})}searchCloudUsers(s){return mA(this,void 0,void 0,function*(){var r;try{const{keywordListMatchType:g,count:u=eN}=s,E=vo(s,["keywordListMatchType","count"]),f=Object.assign({count:u,keywordListMatchType:g===mB.AND?1:0},E);this._setBirthdayRangeParams(f,s);const D=yield function(kA){return mA(this,void 0,void 0,function*(){const{count:VA,keywordList:LA,keywordListMatchType:SA,miniBirthday:PA,maxBirthday:zA,cursor:Ee,gender:Ie}=kA,Li={Count:VA,Keywords:LA,KeywordMatchType:SA,Cursor:Ee,UserBirthStart:PA,UserBirthEnd:zA,Gender:Ie};return og.core.common.buildAndSendPacket({servcmd:"user_search.query",data:Li})})}(f);if(!D)return{error:0,data:{}};const{ErrorCode:v,ErrorInfo:N,TotalCount:P,Cursor:W="",Users:nA=[]}=D;if(v!==0)throw{errorCode:v,errorInfo:N};const EA=`keywordList:${s.keywordList} keywordListMatchType:${s.keywordListMatchType} cursor:${s.cursor} count:${s.count} res: totalCount:${P}`,wA=[];for(let kA=0,VA=nA.length;kA({tag:Ee.Tag,value:Ee.StrValue})),zA=(r=this._core.user.userProfile)===null||r===void 0?void 0:r.createProfile(LA,PA);wA.push(zA)}return{code:0,data:{searchResultList:wA,cursor:W,totalCount:P},successLog:{message:EA}}}catch(g){const{errorCode:u,errorInfo:E}=g||{};this._handleError({errorCode:u,errorInfo:E,searchType:pB,functionName:"searchCloudUsers"})}})}searchCloudGroupMembers(s){return mA(this,void 0,void 0,function*(){try{const{count:r=ER,keywordListMatchType:g}=s,u=vo(s,["count","keywordListMatchType"]),E=Object.assign({count:r,keywordListMatchType:g===mB.AND?1:0},u),f=yield function(wA){return mA(this,void 0,void 0,function*(){const{count:kA,keywordList:VA,keywordListMatchType:LA,groupTypeList:SA,cursor:PA,groupIDList:zA}=wA,Ee={Count:kA,Keywords:VA,KeywordMatchType:LA,Cursor:PA,GroupType:SA,GroupIdList:zA};return og.core.common.buildAndSendPacket({servcmd:"group_member_search.query",data:Ee})})}(E);if(!f)return{code:0,data:{}};const{ErrorCode:D,ErrorInfo:v,GroupMembers:N=[],Cursor:P,TotalCount:W}=f;if(D!==0)throw{errorCode:D,errorInfo:v};const nA=`keywordList:${s.keywordList} keywordListMatchType:${s.keywordListMatchType} cursor:${s.cursor} count:${s.count} res: totalCount:${W}`,EA=new Map;return N.forEach(wA=>{const{GroupID:kA,GroupName:VA,GroupType:LA,GroupFaceUrl:SA,GroupMemberUserName:PA,GroupMemberUserID:zA,GroupMemberNameCard:Ee,GroupMemberAvatar:Ie=""}=wA,Li={groupID:kA,name:VA,type:LA,avatar:SA},Ui={userID:zA,nick:PA,nameCard:Ee,avatar:Ie};if(EA.has(kA)){const Yt=EA.get(kA);Yt.memberList.push(Ui),EA.set(kA,Yt)}else EA.set(kA,{groupInfo:Li,memberList:[Ui]})}),{code:0,data:{searchResultList:[...EA.values()],cursor:P,totalCount:W},successLog:{message:nA}}}catch(r){const{errorCode:g,errorInfo:u}=r||{};this._handleError({errorCode:g,errorInfo:u,searchType:pB,functionName:"searchCloudGroupMembers"})}})}searchCloudGroups(s){return mA(this,void 0,void 0,function*(){try{const{count:r=NI,keywordListMatchType:g}=s,u=vo(s,["count","keywordListMatchType"]),E=Object.assign({count:r,keywordListMatchType:g===mB.AND?1:0},u),f=yield function(EA){return mA(this,void 0,void 0,function*(){const{count:wA,keywordList:kA,keywordListMatchType:VA,groupTypeList:LA,cursor:SA}=EA,PA={Count:wA,Keywords:kA,KeywordMatchType:VA,Cursor:SA,GroupType:LA};return og.core.common.buildAndSendPacket({servcmd:"group_search.query",data:PA})})}(E);if(!f)return{code:0,data:{}};const{ErrorCode:D,ErrorInfo:v,Groups:N,Cursor:P,TotalCount:W}=f;if(D!==0)throw{errorCode:D,errorInfo:v};const nA=`keywordList:${s.keywordList} keywordListMatchType:${s.keywordListMatchType} cursor:${s.cursor} count:${s.count} res: totalCount:${W}`;return{code:0,data:{searchResultList:N?.map(EA=>function(wA){const{GroupFaceUrl:kA,GroupID:VA,GroupIntroduction:LA,GroupMemberNum:SA,GroupName:PA,GroupOwnerTinyID:zA,GroupOwnerUserID:Ee,GroupOwnerUserName:Ie,GroupType:Li,GroupAddOption:Ui,GroupInviteOption:Yt}=wA;return{avatar:kA,groupID:VA,introduction:LA,memberCount:SA,name:PA,ownerTinyID:zA,ownerID:Ee,ownerNick:Ie,type:Li,joinOption:Ui,inviteOption:Yt}}(EA))||[],cursor:P,totalCount:W},successLog:{message:nA}}}catch(r){const{errorCode:g,errorInfo:u}=r||{};this._handleError({errorCode:g,errorInfo:u,searchType:pB,functionName:"searchCloudGroups"})}})}_setTimeRangeParams(s,{timePeriod:r,timePosition:g}){r&&r>0&&(s.startTime=g&&g>0?g-r:this._core.helper.timeManager.getServerTimeSeconds()-r),s.startTime&&s.startTime<0&&(s.startTime=void 0),g&&g>0&&(s.endTime=g)}_handleError({errorCode:s,errorMessage:r,searchType:g}){const{helper:u}=this._core;let E=s;throw s===60020?E="SearchUnable":g!==Wm&&s===27003?E="SearchParamsError":g!==Wm&&s===60018&&(E="SearchOverLimit"),new u.ChatError({code:E,message:r})}_isSearchingAllConversations(s){return this._core.helper.isEmpty(s.conversationID)}_setBirthdayRangeParams(s,r){const{miniBirthday:g,maxBirthday:u}=r;g!==void 0&&(s.miniBirthday=g,u===void 0&&(s.maxBirthday=4294967295)),u!==void 0&&(s.maxBirthday=u)}};function Sh(s,r){return Math.round(Number(s)*Math.pow(10,r))/Math.pow(10,r)}const BR="qualityStat",VD="im-ssolog-quality-stat";var HD;(function(s){s[s.ONLINE=8]="ONLINE"})(HD||(HD={}));const $m="networkRTT",vh="messageE2EDelay",fB="sendMessageC2C",Mh="sendMessageGroup",Rh="sendMessageGroupAV",yB="sendMessageRichMedia",DB="cosUpload",wC="messageReceivedGroup",zQ="messageReceivedGroupAVPush",ZQ="messageReceivedGroupAVPull",tN={[$m]:2,[vh]:3,[fB]:4,[Mh]:5,[Rh]:6,[yB]:7,[wC]:8,[zQ]:9,[ZQ]:10,[DB]:11},QR=[fB,Mh,Rh,yB,DB],wh=[wC,zQ,ZQ],SB=[$m,vh,fB,Mh,Rh,yB,DB,wC,zQ,ZQ],JD={ERR_SVR_COMM_SENSITIVE_TEXT:80001,ERR_SVR_COMM_BODY_SIZE_LIMIT:80002,OPEN_SERVICE_OVERLOAD_ERROR:60022,ERR_SVR_MSG_PKG_PARSE_FAILED:20001,ERR_SVR_MSG_INTERNAL_AUTH_FAILED:20002,ERR_SVR_MSG_INVALID_ID:20003,ERR_SVR_MSG_PUSH_DENY:20006,ERR_SVR_MSG_IN_PEER_BLACKLIST:20007,ERR_SVR_MSG_BOTH_NOT_FRIEND:20009,ERR_SVR_MSG_NOT_PEER_FRIEND:20010,ERR_SVR_MSG_NOT_SELF_FRIEND:20011,ERR_SVR_MSG_SHUTUP_DENY:20012,ERR_SVR_GROUP_INVALID_PARAMETERS:10004,ERR_SVR_GROUP_PERMISSION_DENY:10007,ERR_SVR_GROUP_NOT_FOUND:10010,ERR_SVR_GROUP_INVALID_GROUPID:10015,ERR_SVR_GROUP_REJECT_FROM_THIRDPARTY:10016,ERR_SVR_GROUP_SHUTUP_DENY:10017,MSG_SEND_FAIL:2100,OVER_FREQUENCY_LIMIT:2996},Af="quality_stat";var XQ=new class{constructor(){this._messageStatsMap=new Map,this._userSideErrorCodes=new Set(Object.values(JD))}init(s){this._core=s,Object.values(QR).forEach(r=>{this._messageStatsMap.set(r,{totalCount:0,successCount:0,failedCountOfUserSide:0,costSum:0,costCount:0,fileSizeSum:0})})}dispatchSendStats(s){const{name:r,message:g,error:u,startTs:E}=s,{SEND_MESSAGE_STAT:f}=this._core.constants;switch(r){case f.TOTAL_COUNT:this._handleTotalCount(g);break;case f.SUCCESS_COUNT:this._handleSuccessCount(g);break;case f.FAILED_COUNT:this._handleFailedCount(g,u);break;case f.SEND_COST:this._handleSendCost(g,E)}}getStatResult(s){const r=this._messageStatsMap.get(s);if(!r||r.totalCount===0)return null;const{totalCount:g,successCount:u,failedCountOfUserSide:E}=r,f=Sh(u/g*100,2),D=u+E,v=Sh(D/g*100,2),N=this._calcAverageValue(r,s);return this._resetStat(s),{total_count:g,success_count_business:u,percent_business:f,success_count_platform:D,percent_platform:v,average_value:N}}_handleTotalCount(s){const r=this._getSendMessageSpecifiedKey(s),g=r&&this._messageStatsMap.get(r);g&&g.totalCount++}_handleSuccessCount(s){const r=this._getSendMessageSpecifiedKey(s),g=r&&this._messageStatsMap.get(r);g&&g.successCount++}_handleFailedCount(s,r){var g;const u=(g=r?.code)!==null&&g!==void 0?g:r?.errorCode;if(this._isUserSideError(u)){const E=this._getSendMessageSpecifiedKey(s),f=E&&this._messageStatsMap.get(E);f&&f.failedCountOfUserSide++}}_handleSendCost(s,r){const g=this._getSendMessageSpecifiedKey(s),u=g&&this._messageStatsMap.get(g);u&&(u.costSum+=Date.now()-r,u.costCount++)}_isUserSideError(s){return this._userSideErrorCodes.has(s)||s>=120001&&s<=13e4||s>=10100&&s<=10200}_getSendMessageSpecifiedKey(s){const{MSG_IMAGE:r,MSG_AUDIO:g,MSG_VIDEO:u,MSG_FILE:E,CONV_C2C:f,CONV_GROUP:D,GRP_AVCHATROOM:v}=this._core.OuterConstant;if([r,g,u,E].includes(s.type))return yB;if(s.conversationType===f)return fB;if(s.conversationType===D){const{groupStore:N}=this._core.appStore,P=N.getGroup(s.to);if(!P)return;const{type:W}=P;return W===v?Rh:Mh}}_calcAverageValue(s,r){return s.costCount===0?0:Math.round(r===DB?1e3*s.fileSizeSum/s.costSum:s.costSum/s.costCount)}_resetStat(s){const r=this._messageStatsMap.get(s);r&&(r.totalCount=0,r.successCount=0,r.failedCountOfUserSide=0,r.costSum=0,r.costCount=0,r.fileSizeSum=0)}},$Q=new class{constructor(){this._lastCycleStats=new Map,this._currentCycleStats=new Map}init(s){this._core=s;const{OuterEvent:r,notificationCenter:g}=s;this._initStatsMap(),g.subscribeOuterEvent(r.MESSAGE_RECEIVED,this._onMessageReceived,this)}addMessageSequence(s){const r=this._getReceivedMessageSpecifiedKey(s),{utils:{isUndefined:g},OuterConstant:{CONV_GROUP:u},ssoLog:E}=this._core;if(g(r)||!this._currentCycleStats.has(r))return void E.debug("addMessageSequence",`${BR}.addMessageSequence invalid key:${r}`);const{conversationID:f,sequence:D}=s,v=f.replace(u,""),N=this._lastCycleStats.get(r);if(N.size===0||!N.has(v))return void this._addToCurrentCycle(r,v,D);const P=N.get(v);D>P.minSeq&&D{const{sortedSequences:f,minSeq:D,maxSeq:v}=E;f.length>0&&(u+=f.length,g+=v-D+1)}),g===0?null:(this._transferCycleDataOptimized(s),{total_count:g,success_count_business:u,percent_business:Sh(u/g*100,2)})}reset(){this._lastCycleStats.clear(),this._currentCycleStats.clear()}dispose(){const{notificationCenter:s,OuterEvent:{MESSAGE_RECEIVED:r}}=this._core;s.unSubscribeOuterEvent(r,this._onMessageReceived,this),this.reset()}_initStatsMap(){Object.values(wh).forEach(s=>{this._lastCycleStats.set(s,new Map),this._currentCycleStats.set(s,new Map)})}_onMessageReceived(s){const{data:r=[]}=s;r.forEach(g=>{this.addMessageSequence(g)})}_transferCycleDataOptimized(s){const r=this._currentCycleStats.get(s);if(!r)return;const g=new Map;r.forEach((u,E)=>{const f=u.dirty?[...u.sortedSequences].sort((D,v)=>D-v):u.sortedSequences;g.set(E,{sortedSequences:f,minSeq:u.minSeq,maxSeq:u.maxSeq,dirty:!1})}),this._lastCycleStats.set(s,g),this._currentCycleStats.set(s,new Map)}_getReceivedMessageSpecifiedKey(s){const{OuterConstant:{CONV_GROUP:r,GRP_AVCHATROOM:g}}=this._core;if(s.conversationType===r&&s?._onlineOnlyFlag!==!0){const{groupStore:u}=this._core.appStore,E=u.getGroup(s.to);if(!E)return null;const{type:f}=E;return f===g?ZQ:wC}}_insertToLastCycle(s,r){r.dirty&&(r.sortedSequences.sort((u,E)=>u-E),r.dirty=!1);const g=this._findInsertPos(r.sortedSequences,s);r.sortedSequences.splice(g,0,s),r.minSeq=Math.min(r.minSeq,s),r.maxSeq=Math.max(r.maxSeq,s)}_findInsertPos(s,r){let g=0,u=s.length-1;for(;g<=u;){const E=Math.floor((g+u)/2);if(s[E]===r)return E;s[E]0&&(this._totalDelay+=g,this._totalCount++,g<=1?this._countLessThan1s++:g<=3&&this._countLessThan3s++)}getStatResult(){if(this._totalCount===0)return null;const s={total_count:this._totalCount,success_count_business:this._countLessThan1s,success_count_platform:this._countLessThan3s,percent_business:this._calculatePercentage(this._countLessThan1s,this._totalCount),percent_platform:this._calculatePercentage(this._countLessThan3s,this._totalCount),average_value:this._calculateAverageDelay(this._totalCount)};return this.reset(),s}reset(){this._totalDelay=0,this._totalCount=0,this._countLessThan1s=0,this._countLessThan3s=0}dispose(){const{notificationCenter:s,OuterEvent:{MESSAGE_RECEIVED:r}}=this._core;s.unSubscribeOuterEvent(r,this._onMessageReceived,this),this.reset()}_onMessageReceived(s){const{data:r=[]}=s,{OuterConstant:{MSG_GRP_TIP:g,MSG_GRP_SYS_NOTICE:u}}=this._core,E=[g,u];r.forEach(f=>{!E.includes(f.type)&&f.clientTime>0&&this.addMessageDelay(f.clientTime)})}_calculateAverageDelay(s){return s===0?0:Sh(this._totalDelay/s,1)}_calculatePercentage(s,r){return Sh(s/r*100,2)}},pR=new class{init(s){this.core=s}},iN=new class{constructor(){this.name="MessageQualityStat",this._reportIndex=0,this._wholePeriod=!1,this._pendingReports=[],this._failedLogsCache=new Map}install(s){this._core=s;const{helper:r,notificationCenter:g,InnerEvent:{QUALITY_STAT:u,LOGOUT:E,DESTROY:f},constants:{WORKFLOW_NAME:D,WORKFLOW_STEP:v}}=s;pR.init(s),XQ.init(s),$Q.init(s),Ap.init(s),r.registerWorkflowStep(D.SYNC_SERVER_INFO_AFTER_LOGIN,v.QUALITY_REPORT,this.handleLoginSuccess,this),g.subscribeInnerEvent(u,this._handleQualityStat,this),g.subscribeInnerEvent(E,this._reset,this),g.subscribeInnerEvent(f,this._dispose,this)}handleLoginSuccess(){const{store:s,helper:r,utils:{isUndefined:g}}=this._core,u=s.get("cloudConfig")||{},{q_rpt_interval:E}=u,f=g(E)?12e4:Number(E);r.taskScheduler.addTask({id:Af,intervalMs:f,callback:this.report,context:this})}report(){this._wholePeriod=!0;const s=[...SB.map(r=>{const g=this._buildQualityReportItem(r);return g?Object.assign(Object.assign({},g),{report_index:this._reportIndex,whole_period:this._wholePeriod}):null}).filter(Boolean),...this._pendingReports];this._pendingReports=[],this._needSkipReport()||this._uploadQualityReports(s)}_handleQualityStat(s){const{constants:{QUALITY_METRICS:r}}=this._core,{label:g,data:u}=s;g===r.MESSAGE_SEND_SUCCESS_RATE&&XQ.dispatchSendStats(u)}_needSkipReport(){return this._isSDKAppIDInBlacklist()&&!this._isTinyIDInWhitelist()}_isSDKAppIDInBlacklist(){const{store:s,utils:r}=this._core,g=s.get("cloudConfig")||{},u=s.get("instance")||{},{sdkAppId:E}=u,{q_rpt_sdkappid_bl:f=[]}=g;if(!r.isEmpty(f))return f.split(",").map(D=>Number(D)).includes(E)}_isTinyIDInWhitelist(){const{store:s,utils:r}=this._core,g=s.get("cloudConfig")||{},u=s.get("login")||{},E=Number(u.tinyID),{q_rpt_tinyid_wl:f=[]}=g;if(!r.isEmpty(f))return f.split(",").includes(E)}_buildQualityReportItem(s){const r=this._getStatResultByKey(s);if(r===null)return null;const g={quality_type:tN[s],timestamp:Date.now(),network_type:HD.ONLINE,extension:""};return Object.assign(Object.assign({},g),r)}_getStatResultByKey(s){switch(s){case vh:return Ap.getStatResult();case fB:case Mh:case Rh:case yB:case DB:return XQ.getStatResult(s);case wC:case zQ:case ZQ:return $Q.getStatResult(s);default:return null}}_uploadQualityReports(s){return mA(this,void 0,void 0,function*(){try{const r={header:this._core.common.getCommonHead(),quality:s};yield function(g){const{common:u,channel:E}=pR.core,f="imopenstat.tim_web_report_v2",D=u.generateSSOLogProtocolData({servcmd:f,data:g}),v=`${D.head.seq}${f}`;return E.sendPacket(D,{requestId:v})}(r),this._reportIndex++,this._wholePeriod=!1}catch(r){console.warn("doReport failed. error:",r),this._pendingReports=this._pendingReports.concat(s),this._cacheFailedLogs()}})}_cacheFailedLogs(){const s=this._pendingReports,r=`${BR}._cacheFailedLogs`;let g=[...this._failedLogsCache.get(VD)||[],...s];g.length>10&&(g=g.slice(g.length-10),console.log(`${r} logs overflow, keeping last 10 items`)),this._failedLogsCache.set(VD,g),console.log(`${r} count: ${g.length}`),this._pendingReports=[]}_reset(){const{helper:s}=this._core;s.taskScheduler.removeTask(Af)}_dispose(){const{notificationCenter:s,InnerEvent:{QUALITY_STAT:r,LOGOUT:g,DESTROY:u}}=this._core;s.unSubscribeInnerEvent(r,this._handleQualityStat,this),s.unSubscribeInnerEvent(g,this._reset,this),s.unSubscribeInnerEvent(u,this._dispose,this),this._reset(),Ap.dispose(),$Q.dispose()}};const hl=new class{init(s){this.core=s}};function mR(s){return mA(this,void 0,void 0,function*(){var r;const{message:g,user:u,appStore:E,constants:{OuterConstant:f}}=hl.core,D=E.conversationStore.getConversationMap();if(D.has(s)){const N=(r=D.get(s))===null||r===void 0?void 0:r.userProfile;if(N&&s.startsWith(f.CONV_C2C)){const{avatar:P,nick:W}=N;hl.core.message.messageDataHandler.updateNickAndAvatarOfSentMessage({conversationID:s,latestAvatar:P,latestNick:W,isSentByMe:!1})}}const{data:v}=(yield u.userProfile.getMyProfile())||{};if(v){const{avatar:N,nick:P}=v;g.messageDataHandler.updateNickAndAvatarOfSentMessage({conversationID:s,latestAvatar:N,latestNick:P,isSentByMe:!0})}})}function fR(s){return mA(this,void 0,void 0,function*(){const r=s.map(g=>g.revoker);try{const g=yield function(u){return mA(this,void 0,void 0,function*(){var E,f;const D=yield(E=hl.core.user.userProfile)===null||E===void 0?void 0:E.getUserProfile({userIDList:u});return D?.data?(f=D.data)===null||f===void 0?void 0:f.reduce((v,{userID:N,nick:P,avatar:W})=>(v[N]={nick:P||"",avatar:W||""},v),{}):null})}(r);g&&s.forEach(u=>{const{revoker:E}=u;g[E]&&(u.revokerInfo.nick=g[E].nick||"",u.revokerInfo.avatar=g[E].avatar||"",u.revokerInfo.userID=E)})}catch(g){console.debug(g)}})}const qD=1,yR=2,_h=20,ep=2500,DR=1,Th=300;function tp(s){return mA(this,void 0,void 0,function*(){var r,g;const{appStore:u,utils:{isEmpty:E},common:{getCurrentUserID:f},notificationCenter:D,OuterEvent:v,OuterConstant:{CONV_C2C:N}}=hl.core,{messageList:P,conversationID:W}=s,nA=u.conversationStore.getConversationMap();let EA=(r=nA.get(W))===null||r===void 0?void 0:r.peerReadTime;if(!EA){const kA=W.replace(N,""),VA=yield function(LA){return mA(this,void 0,void 0,function*(){const SA={To_Account:LA};return hl.core.common.buildAndSendPacket({servcmd:"openim.get_peer_read_time",data:SA})})}([kA]);if(VA){const{ReadTime:LA}=VA;EA=LA?.[0],nA.has(W)&&(nA.get(W).peerReadTime=EA)}}if(nA.has(W)){const kA=(g=nA.get(W))===null||g===void 0?void 0:g.lastMessage;E(kA)||kA.fromAccount===f()&&kA.lastTime<=EA&&!kA.isPeerRead&&(kA.isPeerRead=!0,u.conversationStore.updateConversation(W,{lastMessage:kA}))}const wA=[];P.forEach(kA=>{kA.time<=EA&&!kA.isPeerRead&&kA.flow==="out"&&(kA.isPeerRead=!0,wA.push(kA))}),wA.length>0&&D.emitOuterEvent(v.MESSAGE_READ_BY_PEER,{name:v.MESSAGE_READ_BY_PEER,data:wA})})}var SR=new class{init(s){this._core=s,s.helper.registerApi({apiName:"getMessageList",context:this}),s.helper.registerApi({apiName:"getMessageListHopping",context:this}),s.helper.registerApi({apiName:"clearHistoryMessage",context:this})}getMessageList(s){return mA(this,void 0,void 0,function*(){try{const{message:r,OuterConstant:{Direction:g,CONV_C2C:u,CONV_GROUP:E},InnerEvent:{HISTORY_MESSAGE_FETCHED:f},notificationCenter:D}=this._core,{conversationID:v,nextReqMessageID:N}=s,P=_h;if(v==="@TIM#SYSTEM")return{code:0,data:{messageList:[],isCompleted:!1,nextMessageSeq:""}};const W=this._getAvailableLocalMessagesCount({conversationID:v,nextReqMessageID:N});if(this._needFetchHistoryMessageList({conversationID:v,availableLocalMessagesCount:W,targetCount:P})){let nA=null;if(v.startsWith(E)?nA=yield r.messageHistory.getGroupRoamingMessagesByAnchor({conversationID:v,sequence:Number(N),count:P,direction:g.FORWARD,shouldMarkCompleted:!0}):v.startsWith(u)&&(nA=yield r.messageHistory.getC2CRoamingMessagesByAnchor({conversationID:v,messageID:N,count:P,direction:g.FORWARD,shouldMarkCompleted:!0})),nA){const{nextReqMessageIDFromServer:EA,hasNoMoreHistoryMessage:wA,messageList:kA}=nA,VA=r.messageDataHandler.prependLocalMessageList({messageList:kA,conversationID:v});(function(Ee){const{appStore:Ie,message:Li,OuterConstant:Ui}=hl.core,Yt=Ie.conversationStore.getConversation(Ee),Oi=Li.messageDataHandler.getLocalMessageList(Ee);if(!Yt||Oi.length===0||Ee===Ui.CONV_SYSTEM)return;const Bn=[];for(let Mt=0;MtFA.isRevoked).length;Re=Bn.length-Yt.unreadCount-Mt}else Re=Bn.length-Yt.unreadCount;for(let Mt=0;MtEe.isRevoked);yield fR(SA),D.emitInnerEvent(f,VA);const PA={nextReqMessageID:wA?"":String(EA),messageList:LA,isCompleted:wA},zA=LA.map(Ee=>Ee.sequence);return{code:0,data:PA,successLog:{message:`conversationID: ${v} nextReqMessageID: ${N} availableLocalMessagesCount: ${W} sequenceList: ${JSON.stringify(zA)}`}}}return{code:0,data:{messageList:[],isCompleted:!1,nextReqMessageID:""}}}return{code:0,data:yield this._getMessageListFromMemory({conversationID:v,nextReqMessageID:N,count:P}),successLog:{message:`conversationID: ${v} nextReqMessageID: ${N} availableLocalMessagesCount: ${W}}`}}}catch(r){const{code:g,message:u}=r||{};throw new this._core.helper.ChatError({code:g,message:u,moreMessage:`options: ${this._core.utils.safeStringify(s)}`})}})}getMessageListHopping(s){return mA(this,void 0,void 0,function*(){var r,g;const{OuterConstant:{Direction:u,CONV_C2C:E,CONV_GROUP:f},utils:{safeStringify:D}}=this._core,{conversationID:v,sequence:N,time:P,direction:W=u.FORWARD}=s,{utils:{isEmpty:nA},message:EA,notificationCenter:wA,InnerEvent:{HISTORY_MESSAGE_FETCHED:kA}}=this._core;if(![u.BACKWARD,u.FORWARD].includes(W))throw new this._core.helper.ChatError({message:"direction must be 0 or 1",moreMessage:`options: ${D(s)}`});let{count:VA=_h}=s;VA=VA>_h?_h:VA;let LA=null;if(v.startsWith(f)){if(LA=yield EA.messageHistory.getGroupRoamingMessagesByAnchor({conversationID:v,sequence:N,count:VA,direction:W}),LA){const{nextReqMessageIDFromServer:SA,hasNoMoreHistoryMessage:PA,messageList:zA,invisibleSequenceList:Ee}=LA;if(this._core.message.messageDataHandler.storeSparseMessageList(zA),wA.emitInnerEvent(kA,zA),W===u.FORWARD){const Ie=PA&&SA<1;return{code:0,data:{messageList:zA,isCompleted:Ie,nextMessageSeq:Ie?"":SA}}}if(W===u.BACKWARD){if(nA(zA)&&nA(Ee))return{code:0,data:{messageList:[],isCompleted:!0,nextMessageSeq:""}};const Ie=((r=zA?.[zA.length-1])===null||r===void 0?void 0:r.sequence)||0,Li=((g=Ee?.[Ee.length-1])===null||g===void 0?void 0:g.sequence)||0;return{code:0,data:{messageList:zA.filter(Ui=>Ui.sequence>=N),isCompleted:!PA,nextMessageSeq:PA?Math.max(Ie,Li)+1:""}}}return{code:0,data:LA}}}else if(v.startsWith(E)&&(LA=yield EA.messageHistory.getC2CRoamingMessagesByAnchor({conversationID:v,count:VA+1,time:P,direction:W}),LA)){const{messageList:SA,lastMessageTime:PA,hasNoMoreHistoryMessage:zA}=LA;return wA.emitInnerEvent(kA,SA),zA||(W===u.FORWARD?SA.shift():SA.pop()),EA.messageDataHandler.storeSparseMessageList(SA),yield tp({messageList:SA,conversationID:v}),{code:0,data:{messageList:SA,isCompleted:zA,nextMessageTime:zA?"":PA}}}})}clearHistoryMessage(s){return mA(this,void 0,void 0,function*(){var r;const{appStore:g,common:{ChatError:u,getCurrentUserID:E},OuterConstant:{CONV_C2C:f,CONV_GROUP:D},apiMap:v,message:N}=this._core,P=g.conversationStore.getConversation(s);if(!P)throw new u({code:ep});const W={fromAccount:E()},{type:nA}=P;nA===f?(W.type=qD,W.toAccount=s.replace(f,"")):nA===D&&(W.type=yR,W.toGroupID=s.replace(D,""));try{return yield(r=v?.setMessageRead)===null||r===void 0?void 0:r.call(v,{conversationID:s}),(yield function(wA){return mA(this,void 0,void 0,function*(){const{fromAccount:kA,type:VA,toAccount:LA,toGroupID:SA}=wA,PA={From_Account:kA,Type:VA,To_Account:LA,ToGroupid:SA};return hl.core.common.buildAndSendPacket({servcmd:"recentcontact.clear_msg",data:PA})})}(W))&&(N.messageDataHandler.deleteConversationMessageList(s),N.messageHistory.completedHistoryConversations.delete(s),N.messageHistory.clearHistoryMessageListFetchAnchors(s),this._updateConversationLastMessage(s)),{code:0,data:{conversationID:s},successLog:{message:`convID:${s}`}}}catch(EA){const{errorCode:wA}=EA;throw new this._core.helper.ChatError({functionName:"clearHistoryMessage",code:wA,moreMessage:`convID:${s}`})}})}_updateConversationLastMessage(s){const{appStore:r}=this._core;r.conversationStore.updateConversation(s,{lastMessage:this._generateLastMessage()},{needSort:!0})}_getAvailableLocalMessagesCount({conversationID:s,nextReqMessageID:r}){const{OuterConstant:{CONV_C2C:g,CONV_GROUP:u}}=this._core,E=this._core.message.messageDataHandler.getLocalMessageList(s),{length:f}=E;if(!r)return f;let D=-1;return s?.startsWith(g)?D=E.findIndex(v=>v.ID===r):s?.startsWith(u)&&(D=E.findIndex(v=>r.includes("-")?v.ID===r:String(v.sequence)===r)),D===-1?0:D}_needFetchHistoryMessageList({conversationID:s,availableLocalMessagesCount:r,targetCount:g}){const{message:u}=this._core;return rr.startsWith(E)?EA.ID===g:String(EA.sequence)===g),W=nA>u?nA-u:0,N=nA):W=v>u?v-u:0,P.messageList=D.slice(W,nA),P.isCompleted=N<=u&&f.messageHistory.completedHistoryConversations.has(r),P.isCompleted?P.nextReqMessageID="":P.nextReqMessageID=this._generateNextReqMessageID({conversationID:r,targetIndex:W}),r.startsWith(E)&&(yield mR(r),yield tp({messageList:P.messageList,conversationID:r})),P})}_generateNextReqMessageID({conversationID:s,targetIndex:r}){const g=this._core.message.messageDataHandler.getLocalMessageList(s);return s.startsWith("C2C")?g[r].ID:String(g[r].sequence)}_generateLastMessage(){return{lastTime:0,lastSequence:0,fromAccount:"",messageForShow:"",payload:null,type:"",isRevoked:!1,cloudCustomData:"",onlineOnlyFlag:!1,nick:"",nameCard:"",version:0,isPeerRead:!1,revoker:null}}},vB=new class{constructor(){this._lastMessageSequenceMapOnDisconnect=new Map,this._lastMessageTimeMapOnDisconnect=new Map}init(s){this._core=s;const{common:{workflowManager:r},constants:{WORKFLOW_NAME:g,WORKFLOW_STEP:u,InnerEvent:E}}=s;r.registerWorkflowStep(g.SYNC_SERVER_INFO_AFTER_RE_ONLINE,u.HISTORY_MESSAGE_RECOVER,this._syncGroupOfflineMessage,this),r.registerWorkflowStep(g.SYNC_SERVER_INFO_AFTER_RE_ONLINE,u.C2C_HISTORY_MESSAGE_RECOVER,this._syncC2COfflineMessage,this),s.notificationCenter.subscribeInnerEvent(E.SOCKET_DISCONNECTED,this._updateLastMessageSequenceMapOnDisconnect,this)}_syncGroupOfflineMessage(s){const{conversationList:r}=s?.result||{},{OuterConstant:g,utils:{isArray:u}}=this._core;if(u(r)){const E=r.filter(f=>f.type===g.CONV_GROUP&&f.groupProfile.type!==g.GRP_AVCHATROOM);return this._recoverGroupHistoryMessage(E)}}_recoverGroupHistoryMessage(s){return mA(this,void 0,void 0,function*(){const{OuterConstant:r}=this._core,g=[],u=[];return yield Promise.all(s?.map(E=>mA(this,void 0,void 0,function*(){const{groupProfile:{groupID:f}={},lastMessage:{lastSequence:D}={}}=E,v=`${r.CONV_GROUP}${f}`;let N=this._getLocalLastMessageSequence(v);this._shouldRecoverHistory({localLastMessageSequence:N,serverLastMessageSequence:D})&&(yield this._recoverGroupHistoryForConversation({conversationID:v,localLastMessageSequence:N,serverLastMessageSequence:D,groupTipList:u})),g.push(v.replace(r.CONV_GROUP,""))}))),{recoverRevokeNoticeGroupIDList:g,groupTipList:u}})}_recoverGroupHistoryForConversation(s){return mA(this,arguments,void 0,function*({conversationID:r,localLastMessageSequence:g,serverLastMessageSequence:u,groupTipList:E}){try{const{utils:{isArray:f,isObject:D,isEmpty:v},OuterEvent:N,OuterConstant:P,notificationCenter:W,message:nA,appStore:EA,common:{getMessagePreviewText:wA,buildLastMessage:kA}}=this._core,VA=u-g,LA=Math.min(20,VA),SA={},PA=yield nA.messageHistory.getGroupRoamingMessagesByAnchor({conversationID:r,sequence:g+LA,direction:P.Direction.FORWARD,count:LA}),{nextReqMessageIDFromServer:zA,hasNoMoreHistoryMessage:Ee,messageList:Ie,serverGroupTipList:Li}=PA;f(Li)&&E.push(...Li);const Ui=Ee&&zA<0,Yt=[];if(f(Ie)&&(Ie.forEach(Oi=>{nA.messageReceiver.groupMessageReceiver.updateMessageProfile(Oi),Oi.from===P.CONV_SYSTEM&&(Oi.isSystemMessage=!1),nA.messageDataHandler.storeConversationMessage(Oi)&&!v(Oi.payload)&&(Yt.push(Oi),Oi._isExcludedFromLastMessage||(SA.lastMessage=kA(Oi)))}),Yt.length>0&&W.emitOuterEvent(N.MESSAGE_RECEIVED,{name:N.MESSAGE_RECEIVED,data:Yt})),!Ui&&Ie.length>0){const Oi=Ie[Ie.length-1].sequence;yield this._recoverGroupHistoryForConversation({conversationID:r,localLastMessageSequence:Oi,serverLastMessageSequence:u,groupTipList:E})}D(SA.lastMessage)&&(SA.lastMessage.messageForShow=wA(SA.lastMessage.type,SA.lastMessage.payload),EA.conversationStore.updateConversation(r,SA))}catch(f){this._core.ssoLog.error("_recoverGroupHistoryForConversation",`Recovery failed for conversation:${r}`,{error:f})}})}_updateLastMessageSequenceMapOnDisconnect(){const{message:s}=this._core,r=s.messageDataHandler.getContinuousMessagesByConversation();for(const[g,u]of r){const E=Array.from(u.values());if(E?.length>0){const f=E[E.length-1];g.startsWith("C2C")?this._lastMessageTimeMapOnDisconnect.set(g,f.time):g.startsWith("GROUP")&&this._lastMessageSequenceMapOnDisconnect.set(g,f.sequence)}}}_getLocalLastMessageSequence(s){const{message:r}=this._core;if(this._lastMessageSequenceMapOnDisconnect.has(s))return this._lastMessageSequenceMapOnDisconnect.get(s);const g=r.messageDataHandler.getLocalMessageList(s),u=g[g.length-1];return u?.sequence}_shouldRecoverHistory(s){const{localLastMessageSequence:r,serverLastMessageSequence:g}=s;if(typeof r!="number"||typeof g!="number")return!1;const u=g-r;return g!==0&&r>0&&u>=DR&&u| {f.type===g.CONV_C2C&&E.push(f)}),this._recoverC2CHistoryMessage(E)}}_recoverC2CHistoryMessage(s){return mA(this,void 0,void 0,function*(){yield Promise.all(s?.map(r=>mA(this,void 0,void 0,function*(){const{conversationID:g,lastMessage:{lastTime:u}={}}=r,E=this._getLocalLastMessageTime(g);this._shouldRecoverC2CHistory({localLastMessageTime:E,serverLastMessageTime:u})&&(yield this._recoverHistoryForC2CConversation({conversationID:g,localLastMessageTime:E,serverLastMessageTime:u}))})))})}_shouldRecoverC2CHistory(s){const{localLastMessageTime:r,serverLastMessageTime:g}=s,u=g-r;return r>0&&u>=1&&u<=600}_recoverHistoryForC2CConversation(s){return mA(this,void 0,void 0,function*(){var r;const{conversationID:g,localLastMessageTime:u,serverLastMessageTime:E}=s,{utils:{isArray:f,isObject:D,isEmpty:v,safeStringify:N},OuterEvent:P,OuterConstant:W,notificationCenter:nA,message:EA,appStore:wA,common:{getMessagePreviewText:kA,buildLastMessage:VA}}=this._core;try{const LA={},SA=yield EA.messageHistory.getC2CRoamingMessagesByAnchor({conversationID:g,direction:W.Direction.BACKWARD,time:u,count:20});if(v(SA))return;const{hasNoMoreHistoryMessage:PA,messageList:zA}=SA,Ee=[];f(zA)&&(zA.forEach(Li=>{EA.messageDataHandler.storeConversationMessage(Li)&&!v(Li.payload)&&(Ee.push(Li),Li._isExcludedFromLastMessage||(LA.lastMessage=VA(Li)))}),Ee.length>0&&nA.emitOuterEvent(P.MESSAGE_RECEIVED,{name:P.MESSAGE_RECEIVED,data:Ee}));const Ie=(r=zA[zA.length-1])===null||r===void 0?void 0:r.time;!PA&&Ie>E&&(yield this._recoverHistoryForC2CConversation({conversationID:g,localLastMessageTime:Ie,serverLastMessageTime:E})),D(LA.lastMessage)&&(LA.lastMessage.messageForShow=kA(LA.lastMessage.type,LA.lastMessage.payload),wA.conversationStore.updateConversation(g,LA))}catch(LA){this._core.ssoLog.error("_recoverHistoryForC2CConversation",`Recovery failed for conversation:${g} error: ${N(LA)}`)}})}_getLocalLastMessageTime(s){const{message:r}=this._core;if(this._lastMessageTimeMapOnDisconnect.has(s))return this._lastMessageTimeMapOnDisconnect.get(s);const g=r.messageDataHandler.getLocalMessageList(s),u=g[g.length-1];return u?.time}reset(){this._lastMessageSequenceMapOnDisconnect.clear(),this._lastMessageTimeMapOnDisconnect.clear()}dispose(){this.reset()}},MB=new class{constructor(){this.name="HistoryMessage"}install(s){this._core=s,hl.init(s),SR.init(s),vB.init(s),s.notificationCenter.subscribeInnerEvent(s.InnerEvent.LOGOUT,this._reset,this),s.notificationCenter.subscribeInnerEvent(s.InnerEvent.DESTROY,this.dispose,this)}dispose(){const{notificationCenter:s,InnerEvent:r}=this._core;s.unSubscribeInnerEvent(r.LOGOUT,this._reset,this),s.unSubscribeInnerEvent(r.DESTROY,this.dispose,this),vB.dispose()}_reset(){vB.reset()}},KD=new class{init(s){this.core=s}},_C=new class{constructor(){this._reportedAtomicStoreIDs=new Set}init(s){const{helper:{registerExperimentalAPI:r}}=s;this._core=s,r("reportModalView",this),r("reportTUIFeatureUsage",this),r("reportRoomEngineEvent",this)}reportModalView(s){const{ssoLog:r,utils:{safeStringify:g,isString:u}}=this._core;try{if(!u(s))throw new Error("reportModalView data is not a string");r.createSSOLogData({method:"reportModalView",message:s,eventType:30}).end(!0)}catch(E){r.debug(`reportModalView Report failed: ${g(E)}`)}}reportTUIFeatureUsage(s){const{ssoLog:r,utils:{safeStringify:g,isEmpty:u}}=this._core,{atomicStoreID:E}=s;try{u(E)||this._reportedAtomicStoreIDs.has(E)||(this._core.ssoLog.info("reportTUIFeatureUsage",`atomicStoreID: ${s.atomicStoreID}`,{method:"reportTUIFeatureUsage",eventType:31,code:E}),this._reportedAtomicStoreIDs.add(E))}catch(f){r.debug(`reportTUIFeatureUsage Report failed: ${g(f)}`)}}reportRoomEngineEvent(s){const{utils:{safeStringify:r},ssoLog:g}=this._core;try{g.debug(`reportRoomEngineEvent Report: ${r(s)}`);const{eventId:u,eventCode:E,eventResult:f,eventMessage:D,moreMessage:v,extensionMessage:N}=s;g.createSSOLogData({method:N,code:u,message:D,eventType:30,costTime:E,uiPlatform:f,moreMessage:v}).end(!0)}catch(u){g.debug(`reportRoomEngineEvent Report failed: ${r(u)}`)}}reset(){this._reportedAtomicStoreIDs.clear()}dispose(){this.reset()}},ip=new class{constructor(){this.name="DataReport"}install(s){this._core=s;const{notificationCenter:r,InnerEvent:{LOGOUT:g,DESTROY:u}}=s;KD.init(s),_C.init(s),r.subscribeInnerEvent(g,this._reset,this),r.subscribeInnerEvent(u,this._dispose,this)}_reset(){_C.reset()}_dispose(){const{notificationCenter:s,InnerEvent:{LOGOUT:r,DESTROY:g}}=this._core;s.unSubscribeInnerEvent(r,this._reset,this),s.unSubscribeInnerEvent(g,this._dispose,this),_C.dispose()}};let ef=dr.STANDARD,RB=[];ef=dr.STANDARD,RB=[Ih,dC,CC,hC,kc,iN,MB,ip,YE,Ni,er,WT,jm,YD,tu];function wB(s,r){const{operationType:g,memberInfoList:u,operatorInfo:E}=s||{};let f={};if(tn(u)?tn(E)||(f=E):g!==bg.JOINED&&g!==bg.KICKED&&g!==bg.ADMIN_SET&&g!==bg.ADMIN_CANCELED||(f=Object.assign({},u[0])),!tn(f)){const{nick:D="",avatar:v=""}=f;r.nick=D,r.avatar=v}}const op=s=>({lastTime:s?.time||s?.lastTime||0,lastSequence:s?.sequence||s?.lastSequence||0,fromAccount:s?.from||s?.fromAccount||"",messageForShow:il(s?.type,s?.payload),payload:s?.payload||null,type:s?.type||"",isRevoked:s?.isRevoked||!1,cloudCustomData:s?.cloudCustomData||"",onlineOnlyFlag:s?._onlineOnlyFlag||!1,nick:s?.nick||"",nameCard:s?.nameCard||"",version:s?.version||0,isPeerRead:s?.isPeerRead||!1,revoker:s?.revoker||null});var np=Object.freeze({__proto__:null,ChatError:hn,WorkflowManager:Pn,buildAndSendPacket:Ig,buildLastMessage:op,get builtInPlugins(){return RB},checkBusinessCapabilityBits:us,deepMerge:Bd,getCurrentUserID:ar,getErrorMessage:dn,getMessagePreviewText:il,isC2CConv:s=>c(s)&&s.slice(0,3)===Pa.CONV_C2C,isCommunity:ea,isGroupConv:s=>c(s)&&s.slice(0,5)===Pa.CONV_GROUP,isInternational:bl,isTopic:tl,isUnlimitedAVChatRoom:function(){var s;return!!(!((s=Se.store.get("instance"))===null||s===void 0)&&s.unlimitedAVChatRoom)},liteChatInstanceMap:fa,registerInterceptor:Gc,registerValidateConfig:el,requireAuth:dd,get sdkEdition(){return ef},setGroupTipsUserInfo:wB,t:Uu,updateGroupAtInfo:(s,r)=>{const{CONV_AT_ME:g,CONV_AT_ALL:u,CONV_AT_ALL_AT_ME:E}=Po;if(function(v,N){const{CONV_AT_ME:P,CONV_AT_ALL:W,CONV_AT_ALL_AT_ME:nA}=Po,{groupID:EA,sequence:wA}=v;let kA=!1;return ea({groupID:EA})&&N.forEach(VA=>{VA.messageSequence===wA&&(VA.atTypeArray.includes(P)&&v.groupAtType.includes(W)&&(VA.atTypeArray=[nA]),VA.atTypeArray.includes(W)&&v.groupAtType.includes(P)&&(VA.atTypeArray=[nA],VA.__random=v.__random,VA.__sequence=v.__sequence),kA=!0)}),kA}(s,r))return;let f=[...s.groupAtType];f.includes(g)&&f.includes(u)&&(f=[E]);const D={from:s.from,groupID:s.groupID,topicID:s.topicID,messageSequence:s.sequence,atTypeArray:f,__random:s.__random,__sequence:s.__sequence};r.push(D)},validateAndExecute:wr,validateParameters:hI});class Iu{constructor(){this._builtInPlugins=new Set,this._externalPlugins=new Set}static getInstance(){return Iu._instance||(Iu._instance=new Iu),Iu._instance}static setInstance(r){Iu._instance=r}installBuiltInPlugin(r){r&&this._installPlugin(r,this._builtInPlugins)}installExternalPlugin(r){r&&this._installPlugin(r,this._externalPlugins)}clear(){this._builtInPlugins=new Set,this._externalPlugins=new Set}_installPlugin(r,g){let u=[];u=C(r)?r:[r];const E=u.findIndex(D=>D?.name==="AVChatRoom"),f=E>-1?u.splice(E,1):[];u.forEach(D=>{this._isPluginInstalled(D.name)||(D&&_g(D.install)?(g.add(D.name),_g(D.getInstalledSubPlugins)?(f?.forEach(v=>g.add(v?.name)),D.install(Sr.getInstance().exposeApiForPlugin(),f)):D.install(Sr.getInstance().exposeApiForPlugin()),_g(D.handleLoginSuccess)&&this._isLoggedIn()&&D.handleLoginSuccess()):_g(D)?(g.add(D.name),D(Sr.getInstance().exposeApiForPlugin()),_g(D.handleLoginSuccess)&&this._isLoggedIn()&&D.handleLoginSuccess()):console.warn('A plugin must either be a function or an object with an "install" function.'))})}_isPluginInstalled(r){return this._builtInPlugins.has(r)||this._externalPlugins.has(r)}_isLoggedIn(){var r;return((r=Se.store.get("login"))===null||r===void 0?void 0:r.isLoggedIn)===!0}}var _B=new class{constructor(){this._conversationMap=new Map}getConversationMap(){return this._conversationMap}getConversation(s){return this._conversationMap.get(s)}updateConversation(s,r,g){const{emit:u=!0,needSort:E=!1}=g||{},f=this._conversationMap.get(s);f&&!tn(r)&&(Object.keys(r).forEach(D=>{f[D]=r[D]}),u&&Se.notificationCenter.emitInnerEvent(lo.CONVERSATION_UPDATED,{needSort:E}))}deleteConversation(s){this._conversationMap.has(s)&&(this._conversationMap.delete(s),Se.notificationCenter.emitInnerEvent(lo.CONVERSATION_UPDATED))}},sp=new class{constructor(){this._groupMap=new Map}getGroupMap(){return this._groupMap}getGroup(s){return this._groupMap.get(s)}updateGroup(s,r){const g=this._groupMap.get(s);g&&!tn(r)&&Object.keys(r).forEach(u=>{g[u]=r[u]})}},rp=new class{constructor(){this._messagesByConversation=new Map}updateMessage(s,r,g){var u;const{operation:E,updateUnreadCount:f=!0}=g,D=vo(g,["operation","updateUnreadCount"]),v=[];for(const N of r){const P=(u=this._messagesByConversation.get(s))===null||u===void 0?void 0:u.get(N);if(!P)return!1;Object.keys(D).forEach(W=>{P[W]=D[W]}),v.push(P)}return this._emitMessageStoreOperationEvent(E,{conversationID:s,messageList:v,updateUnreadCount:f}),v}getMessagesByConversation(s){var r;return[...((r=this._messagesByConversation.get(s))===null||r===void 0?void 0:r.values())||[]]}getMessages(){return this._messagesByConversation}_emitMessageStoreOperationEvent(s,r){const{conversationID:g}=r;tl(g)?Se.notificationCenter.emitInnerEvent(Nu[s],r):Se.notificationCenter.emitInnerEvent(s,r)}},uc=new class{constructor(){this.userProfileMap=new Map,this.friendMap=new Map}getUserProfileMap(){return this.userProfileMap}getFriendMap(){return this.friendMap}getUserProfile(s){return this.userProfileMap.get(s)}getFriend(s){return this.friendMap.get(s)}},jD=Object.freeze({__proto__:null,conversationStore:_B,groupStore:sp,messageStore:rp,userStore:uc});class Sr{static getInstance(){return Sr._instance||(Sr._instance=new Sr),Sr._instance}static setInstance(r){Sr._instance=r}constructor(){this._experimentalApiMap={statTUIKeyFeatures:this.statKeyFeatureUsage.bind(this),setApplicationID:this.setApplicationID.bind(this)},this._apiHandlersMap={},this._apiMap={on:Se.notificationCenter.subscribeOuterEvent.bind(Se.notificationCenter),off:Se.notificationCenter.unSubscribeOuterEvent.bind(Se.notificationCenter),destroy:this.destroy.bind(this),callExperimentalAPI:this.callExperimentalAPI.bind(this),use:Iu.getInstance().installExternalPlugin.bind(Iu.getInstance()),registerPlugin:this.registerPlugin.bind(this),setLogLevel:this.setLogLevel.bind(this)}}registerPlugin(r){Se.ssoLog.debug("registerPlugin",r)}statKeyFeatureUsage(r){Se.ssoLog.debug("statTUIKeyFeatures",r)}setLogLevel(r){Se.ssoLog.debug("setLogLevel",r),Se.ssoLog.setLogLevel(r)}setApplicationID(r){Se.store.set("instance",{applicationID:r})}getApiMap(){return this._apiMap}setApiMap(r){this._apiMap=r}registerApi(r){const{common:{timeManager:g},utils:{safeStringify:u}}=Se,{apiName:E,context:f,methodName:D=E,matcher:v}=r;this._apiHandlersMap[E]||(this._apiHandlersMap[E]=[]),this._apiHandlersMap[E].push({context:f,methodName:D,matcher:v}),this._apiMap[E]&&this._apiHandlersMap[E].length!==1||(this._apiMap[E]=(...N)=>{const P=g.getServerTimeMs();let W=0;E==="login"&&(W=4),zI.includes(E)&&Se.ssoLog.debug(E,`${E} start params: ${u(N)}`),wr(D,N);const nA=this._apiHandlersMap[E];for(const EA of nA)if(!EA.matcher||EA.matcher(N))try{const wA=EA.context[EA.methodName].bind(EA.context)(...N);return this._isPromiseLike(wA)?this._handleAsyncResult(wA,E,W,P):(this._reportApiSuccessLog({result:wA,apiName:E,eventType:W,startTime:P}),wA)}catch(wA){throw Se.ssoLog.error(E,`${E} fail ${wA?.message||wA?.errorMessage})`,{error:wA,costTime:g.getServerTimeMs()-P,eventType:W,method:E}),wA}})}registerExperimentalAPI(r,g,u){const E=u||r;this._experimentalApiMap[r]=g[E].bind(g)}destroy(){return mA(this,void 0,void 0,function*(){var r,g;try{!((r=Se.store.get("login"))===null||r===void 0)&&r.isLogin&&(yield this._apiMap.logout()),Se.notificationCenter.emitInnerEvent(lo.DESTROY)}catch(u){console.debug("destroy error: ",u)}finally{Se.notificationCenter.emitOuterEvent(Rr.SDK_DESTROY,{SDKAppID:(g=Se.store.get("instance"))===null||g===void 0?void 0:g.sdkAppId}),fa.clear(),Iu.getInstance().clear(),Pn.getInstance().destroy(),Se.destroy()}})}exposeApiForClient(){return this._apiMap}exposeApiForPlugin(){return Object.assign(Object.assign({InnerEvent:lo,InnerEventSubType:Se.notificationCenter.InnerEventSubType,OuterEvent:Rr,OuterConstant:Po,SignalingEvent:Xc,helper:Object.assign(Object.assign(Object.assign({},Se.utils),Se.common),{registerApi:this.registerApi.bind(this),registerExperimentalAPI:this.registerExperimentalAPI.bind(this),registerInterceptor:Gc,registerValidateConfig:el,checkBusinessCapabilityBits:us,registerWorkflowStep:Pn.getInstance().registerWorkflowStep.bind(Pn.getInstance()),ChatError:hn}),apiMap:this._apiMap},Se),{constants:Object.assign(Object.assign({},Ag),Se.constants),common:Object.assign(Object.assign(Object.assign({},np),Se.common),{workflowManager:Pn.getInstance()}),utils:Se.utils,appStore:jD})}callExperimentalAPI(r,g){return Se.ssoLog.debug(`callExperimentalAPI.${r} start params: ${Se.utils.safeStringify(g)}`),this._experimentalApiMap[r]?this._experimentalApiMap[r](g):(Se.ssoLog.error("callExperimentalAPI",`callExperimentalAPI.${r} not found, params: ${Se.utils.safeStringify(g)}`),Promise.reject(new hn({code:ma.INVALID_OPERATION})))}_isPromiseLike(r){return r!==null&&typeof r=="object"&&typeof r.then=="function"}_handleAsyncResult(r,g,u,E){return r.then(f=>(this._reportApiSuccessLog({result:f,apiName:g,eventType:u,startTime:E}),f)).catch(f=>{throw Se.ssoLog.error(g,`${g} fail ${f?.message||f?.errorMessage})`,{error:f,costTime:Se.common.timeManager.getServerTimeMs()-E,eventType:u,method:g,startTime:E}),f})}_reportApiSuccessLog(r){let{result:g,apiName:u,startTime:E,eventType:f}=r;const{timeManager:D}=Se.common,{successLog:{message:v,moreMessage:N}={message:"",moreMessage:""}}=g||{},P=D.getServerTimeMs();u==="login"&&(E+=D.getTimeOffsetWithServer()),zI.includes(u)&&Se.ssoLog.info(u,`${u} success ${v} ${N}`,{costTime:P-E,eventType:f,message:v,moreMessage:N,startTime:E}),g?.successLog&&delete g.successLog}}class vR{constructor(){this._latestLoginAt=0,this._latestSendOnlinePresenceRequestTime=0,this._helloInterval=120,this._customLoginInfo=""}init(){const{notificationCenter:r,store:g}=Se;g.set("login",{isReady:!1}),Sr.getInstance().registerApi({apiName:"login",context:this}),Sr.getInstance().registerApi({apiName:"logout",context:this}),Sr.getInstance().registerApi({apiName:"getLoginUser",context:this}),Sr.getInstance().registerApi({apiName:"isReady",context:this}),Sr.getInstance().registerApi({apiName:"getServerTime",context:this}),Sr.getInstance().registerExperimentalAPI("setCustomLoginInfo",this),r.subscribeInnerEvent(lo.RECONNECTED,this._reLogin,this),Se.notificationCenter.subscribeInnerEvent(lo.DESTROY,this._dispose,this)}login(r){return mA(this,void 0,void 0,function*(){var g;const{sdkEdition:u}=Se.store.get("instance")||{};try{if(this._isLoginIn())return this._createRepeatLoginResponse();if(this._isLoginFrequencyExceeded())throw new hn({functionName:"login",code:ma.REPEAT_LOGIN});const E=yield this._performLogin(r);this._validateAfterLogin(E),this._handleLoginSuccess(E),yield this._ensureAsyncComplete(),this._updateAndEmitSDKReady(),this._latestLoginAt=0;const f=(g=Se.channel.getSocketAdapter())===null||g===void 0?void 0:g.getId(),{appId:D,href:v}=Se.store.get("instance")||{},{instanceID:N,customStatus:P}=E||{};return{code:0,data:E,successLog:{message:u,moreMessage:`socketID:${f} instanceID:${N} customStatus:${P} href: ${v} appId: ${D}`}}}catch(E){const{errorCode:f}=E;f!==ma.REPEAT_LOGIN&&(this._latestLoginAt=0);const D=new hn({functionName:"login",code:f});throw console.error(D),D}})}_reLogin(){return mA(this,void 0,void 0,function*(){var r;try{if(!this._isLoginIn())return;const g=yield Lu(this._customLoginInfo);if(g){const{instanceID:u,customStatus:E}=g;Se.store.set("login",{statusInstanceId:u}),Pn.getInstance().executeWorkflow(jt.SYNC_SERVER_INFO_AFTER_RE_ONLINE,{customStatus:E,statusType:ME.USER_STATUS_ONLINE});const f=(r=Se.channel.getSocketAdapter())===null||r===void 0?void 0:r.getId();Se.ssoLog.info("reLogin",`socketId:${f} instanceId:${u}`)}}catch(g){console.warn(g)}})}logout(){return mA(this,arguments,void 0,function*(r=ca.USER_INITIATED){const{ssoLog:g}=Se;g.debug("logout",`logout start logoutReason: ${r}`);try{yield this._performLogout(r),g.info("logout","logout success"),Se.ssoLog.uploadSSOLogData()}catch(u){const{errorCode:E}=u;throw new hn({functionName:"logout",code:E})}finally{this.handleLogoutCompleted()}return{code:0,data:{}}})}getLoginUser(){return this._isLoginIn()?ar():""}isReady(){var r;return(r=Se.store.get("login"))===null||r===void 0?void 0:r.isReady}setCustomLoginInfo(r=""){this._customLoginInfo=r}handleLogoutCompleted(){this._updateAndEmitSDKNotReady(),this._reset(),Pn.getInstance().reset(),Se.notificationCenter.emitInnerEvent("logout")}getServerTime(){const{timeManager:r}=Se.common;return r.getServerTimeMs()}_updateAndEmitSDKReady(){Se.store.set("login",{isReady:!0}),setTimeout(()=>{Se.notificationCenter.emitOuterEvent(Rr.SDK_READY,{name:Rr.SDK_READY})},1)}_updateAndEmitSDKNotReady(){Se.store.set("login",{isReady:!1}),Se.notificationCenter.emitOuterEvent(Rr.SDK_NOT_READY,{name:Rr.SDK_NOT_READY})}_validateAfterLogin(r){const g="login";if(!r)throw new hn({functionName:g,message:"login response is empty"});const{tinyID:u,a2Key:E}=r||{};if(!u)throw new hn({functionName:g,code:ma.NO_TINYID});if(!E)throw new hn({functionName:g,code:ma.NO_A2KEY})}_createRepeatLoginResponse(){var r;return{code:0,data:{actionStatus:"OK",errorCode:0,errorInfo:dn({code:"RepeatLogin",replacement1:(r=Se.store.get("login"))===null||r===void 0?void 0:r.userId}),repeatLogin:!0}}}_performLogin(r){return mA(this,void 0,void 0,function*(){const{userID:g,userSig:u}=r;return Se.store.set("login",{userId:g,userSig:u}),this._latestLoginAt=Date.now(),Lu(this._customLoginInfo)})}_ensureAsyncComplete(){return mA(this,void 0,void 0,function*(){yield new Promise(r=>{setTimeout(()=>r(null),1)})})}_handleLoginSuccess(r){const{timeManager:g}=Se.common,{helloInterval:u,timeStamp:E,customStatus:f,purchaseBits:D}=r,v=1e3*E;g.calculateTimeOffsetWithServer(this._latestLoginAt,v),this._helloInterval=u||120,this._updateLoginStore(r),Se.user.userStatus.setCustomStatus(f),Pn.getInstance().executeWorkflow(jt.SYNC_SERVER_INFO_AFTER_LOGIN,{purchaseBits:D}),Se.common.taskScheduler.addTask({id:Lg,intervalMs:1e3*this._helloInterval,callback:this._sendOnlinePresenceRequest,context:this})}_performLogout(r){return function(g){return mA(this,void 0,void 0,function*(){const{logoutReason:u}=g,E="im_open_status.wslogout",f=Se.common.generateProtocolData({servcmd:E,data:{wslogout_type:u,isWebUniapp:0}}),D=`${f.head.seq}${E}`;return yield Se.channel.sendPacket(f,{requestId:D})})}({logoutReason:r})}_updateLoginStore(r){const{a2Key:g,tinyID:u,instanceID:E,authKey:f}=r;Se.store.set("login",{a2Key:g,tinyID:u,statusInstanceId:E,authKey:f,isLoggedIn:!0})}_sendOnlinePresenceRequest(){return mA(this,void 0,void 0,function*(){this._latestSendOnlinePresenceRequestTime=Date.now();try{yield function(){const r="im_open_status.wshello",g=Se.common.generateProtocolData({servcmd:r,data:{isWebUniapp:0}}),u=`${g.head.seq}${r}`;return Se.channel.sendPacket(g,{requestId:u})}()}catch(r){Se.ssoLog.warn("_sendOnlinePresenceRequest",` error:${r.message}`)}})}_isLoginIn(){var r;return((r=Se.store.get("login"))===null||r===void 0?void 0:r.isLoggedIn)===!0}_isLoginFrequencyExceeded(){return Date.now()-this._latestLoginAt<=15e3}_reset(){Se.common.taskScheduler.removeTask(Lg),this._helloInterval=120,this._latestSendOnlinePresenceRequestTime=0,this._latestLoginAt=0,this._customLoginInfo="",Se.store.clear("login"),Se.store.set("login",{isReady:!1}),Se.store.set("instance",{applicationID:0})}_dispose(){this._reset();const{notificationCenter:r}=Se;r.unSubscribeInnerEvent(lo.RECONNECTED,this._reLogin,this),r.unSubscribeInnerEvent(lo.DESTROY,this._dispose,this)}}const MR={login:{userID:{required:!0,rules:["string"],allowEmpty:!1},userSig:{required:!0,rules:["string"],allowEmpty:!1}}},oN={logout:!0};class Nh{constructor(){this.loginAction=new vR,this.kickedOutHandler=new ku,this.loginAction.init(),this.kickedOutHandler.init(),el({auth:oN,params:MR})}}var Zr,eE,WE;(function(s){s.CONV_C2C="C2C",s.CONV_GROUP="GROUP",s.CONV_TOPIC="TOPIC",s.CONV_SYSTEM="@TIM#SYSTEM"})(Zr||(Zr={})),function(s){s.MSG_PRIORITY_HIGH="High",s.MSG_PRIORITY_NORMAL="Normal",s.MSG_PRIORITY_LOW="Low",s.MSG_PRIORITY_LOWEST="Lowest"}(eE||(eE={})),function(s){s.MSG_TEXT="TIMTextElem",s.MSG_CUSTOM="TIMCustomElem",s.MSG_LOCATION="TIMLocationElem",s.MSG_FACE="TIMFaceElem",s.MSG_IMAGE="TIMImageElem",s.MSG_AUDIO="TIMSoundElem",s.MSG_FILE="TIMFileElem",s.MSG_VIDEO="TIMVideoFileElem",s.MSG_GRP_TIP="TIMGroupTipElem",s.MSG_GRP_SYS_NOTICE="TIMGroupSystemNoticeElem",s.MSG_MERGER="TIMRelayElem"}(WE||(WE={}));const WD={1:eE.MSG_PRIORITY_HIGH,2:eE.MSG_PRIORITY_NORMAL,3:eE.MSG_PRIORITY_LOW,4:eE.MSG_PRIORITY_LOWEST},zD=0,RR=1;var tE;(function(s){s.IN="in",s.OUT="out"})(tE||(tE={}));const wR=2,ap={};function uu(s){if(!s)return 0;if(ap[s]===void 0){const r=new Date,g=`3${r.getHours()}`.slice(-2),u=`0${r.getMinutes()}`.slice(-2),E=`0${r.getSeconds()}`.slice(-2);ap[s]=parseInt([g,u,E,"0001"].join(""),10),console.log(`autoIncrementIndex start index:${ap[s]}`)}else ap[s]+=1;return ap[s]}class zE{constructor(r){this.ID="",this.random=0,this.sequence=0,this.nameCard="",this.isRead=!1,this.isPeerRead=!1,this.isDeleted=!1,this.isResend=!1,this.hasRiskContent=!1,this._onlineOnlyFlag=!1,this.atUserList=[],this._groupAtInfoList=[],this.isBroadcastMessage=!1,this.priority=eE.MSG_PRIORITY_NORMAL,this._relayFlag=!1;const{clientTime:g=Se.common.timeManager.getServerTimeSeconds()||0,senderTinyID:u,currentUser:E,needReadReceipt:f,isSupportExtension:D,customModerationConfigurationId:v,to:N,from:P,nick:W="",avatar:nA="",time:EA,messageControlInfo:wA,tinyID:kA,cloudCustomData:VA="",messageLifeTime:LA,messageVersion:SA=0,conversationType:PA,sequence:zA,checkResult:Ee=0,isPlaceMessage:Ie=0,messageFlagBits:Li,receiverList:Ui,isSystemMessage:Yt=!1,status:Oi=qr.SUCCESS,revokeReason:Bn="",conversationSubType:Re,clientSequence:Mt,protocol:FA="JSON",revokerInfo:ci={userID:"",nick:"",avatar:""},readReceiptInfo:xn={readCount:void 0,unreadCount:void 0,isPeerRead:void 0,timestamp:0},random:Pi,groupProfile:Vr,atUserList:ji,flow:Br,isRead:Ut=!1,priority:Ft=eE.MSG_PRIORITY_NORMAL,onlineOnlyFlag:oE=!1,nameCard:hs="",quoteInfo:Do}=r;var Bl;this.clientTime=g,this.senderTinyID=u||kA,this.needReadReceipt=f===!0||f===1,this.isSupportExtension=D===!0||D===1,this._cmConfigID=v,this.to=N,this.nick=W,this.avatar=nA,this.protocol=FA,this.random=Pi===void 0?(Bl=Bl||99999999,Math.round(Math.random()*Bl)):Pi,this.time=EA||Math.ceil(Date.now()/1e3),this._isExcludedFromLastMessage=!!wA?.excludedFromLastMessage,this._isExcludedFromUnreadCount=!!wA?.excludedFromUnreadCount,this.isModified=!!SA,this.cloudCustomData=VA,this.messageLifeTime=LA,this.from=P||null,this.sequence=zA||0,this.conversationType=PA||Zr.CONV_C2C,this.hasRiskContent=Ee>1,this.version=SA,this.isPlaceMessage=Ie,this.isRevoked=Ie===2||Li===8,this.isSystemMessage=Yt,this.readReceiptInfo=xn,this.revokeReason=Bn,this.revokerInfo=ci,this._receiverList=Ui,this.conversationSubType=Re,this.revoker=ci?.revoker||"",this.clientSequence=Mt||zA||0,this.status=Oi,this.atUserList=ji||[],this.flow=Br,this.isRead=Ut,this.priority=Ft,this._onlineOnlyFlag=oE,this.nameCard=hs,this.quoteInfo=Do,this.reInitialize(E),this._initC2CReadReceiptInfo(r),this._extractGroupInfo(Vr)}getElements(){return this._elements}isOnlineMessage(){return this.messageLifeTime===0}setElement(r){Array.isArray(r)?this._elements=r:this._elements=[r],this._updatePayloadAndType()}transformElementsToServerFormat(){return this._elements?Array.isArray(this._elements)?this._elements.map(r=>r.transformToServerFormat()):this._elements.transformToServerFormat():null}setRelayFlag(r){this._relayFlag=r}validateBeforeSend(){var r,g,u;return this._relayFlag?{isValid:!0}:((r=this._elements)===null||r===void 0?void 0:r.length)>0?(u=(g=this._elements[0])===null||g===void 0?void 0:g.validateBeforeSend)===null||u===void 0?void 0:u.call(g):{isValid:!1}}_updatePayloadAndType(){this._elements[0]&&(this.payload=this._elements[0].content,this.type=this._elements[0].type)}_initC2CReadReceiptInfo(r){const{readReceiptSentByPeer:g,timestamp:u=0}=r;this.conversationType===Zr.CONV_C2C&&this.needReadReceipt===!0&&(this.readReceiptInfo.isPeerRead=g===1,this.readReceiptInfo.timestamp=u)}_extractGroupInfo(r){if(!r)return;const{From_AccountNick:g,From_AccountHeadurl:u,MsgFrom_AccountExtraInfo:E,GroupType:f}=r,{NameCard:D}=E||{};typeof g=="string"&&(this.nick=g),typeof u=="string"&&(this.avatar=u),typeof D=="string"&&(this.nameCard=D),this.conversationSubType=f}reInitialize(r){r===this.from&&(this.isRead=!0),this._initSequence(r),this._concatConversationID(r),this.generateMessageID()}_concatConversationID(r){let g="";const u=this.conversationType;u!==Zr.CONV_SYSTEM?(g=u===Zr.CONV_C2C?r===this.from?this.to:this.from:this.to,this.conversationID=g?`${u}${g}`:null):this.conversationID=Zr.CONV_SYSTEM}_initSequence(r){this.clientSequence===0&&r&&(this.clientSequence=uu(r)),this.sequence===0&&this.conversationType===Zr.CONV_C2C&&(this.sequence=this.clientSequence)}generateMessageID(){this.from===Zr.CONV_SYSTEM&&(this.senderTinyID="144115198244471703"),this.ID=`${this.senderTinyID}-${this.clientTime}-${this.random}`}setIsRead(r){this.isRead=r}}class Gd{static parseServerPushElement(r){const{MsgContent:g={}}=r,{Data:u,Ext:E,Desc:f}=g;return new Gd({data:u,description:f,extension:E})}constructor(r){this.type=WE.MSG_CUSTOM;const{data:g="",description:u="",extension:E=""}=r;this.content={data:g,description:u,extension:E}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{data:E,description:f,extension:D}=u;return{MsgType:this.type,MsgContent:{Data:E,Ext:D,Desc:f}}}validateBeforeSend(){const{isEmpty:r}=Se.utils,g=[this.content.data,this.content.description,this.content.extension].some(u=>!r(u));return{isValid:g,error:g?null:{message:"content can not be empty"}}}}class bd{static parseServerPushElement(r){const{MsgContent:g={Text:""}}=r,{Text:u}=g;return new bd({text:u})}constructor(r){this.type=Ng.MSG_TEXT,this.content={text:r.text||""}}validateBeforeSend(){var r,g;return((g=(r=this.content)===null||r===void 0?void 0:r.text)===null||g===void 0?void 0:g.length)>0?{isValid:!0}:{isValid:!1,error:{message:"content can not be empty"}}}transformToServerFormat(r){const{isMergerMessage:g=!1}=r||{},u=g?this.payload:this.content,{text:E}=u;return{MsgType:this.type,MsgContent:{Text:E}}}}var tf=new class{constructor(){this._elementClassMap={[WE.MSG_CUSTOM]:Gd,[WE.MSG_TEXT]:bd}}init(){Sr.getInstance().registerApi({apiName:"createCustomMessage",context:this}),Sr.getInstance().registerApi({apiName:"createTextMessage",context:this})}registerElementClass(s,r){var g;(g=r).prototype!==void 0&&"constructor"in g.prototype&&(this._elementClassMap[s]=r)}getElementClass(s){return this._elementClassMap[s]}createMessage(s){const{from:r,flow:g=tE.OUT}=s,{userId:u}=Se.store.get("login")||{};this._isSendByCurrentInstance({from:r,flow:g,currentUser:u})?this._updateWithSenderInfo(s):this._isMultiEndpointSyncMessage({from:r,flow:g,currentUser:u})&&(s.flow=tE.OUT);const E=Object.assign(Object.assign({},s),{currentUser:u});return new zE(E)}createCustomMessage(s){const r=ar(),g=this.createMessage(Object.assign(Object.assign({},s),{from:r})),u=this._elementClassMap[WE.MSG_CUSTOM];if(!g)return null;if(u){const E=new u(s.payload);g.setElement(E)}return g}createTextMessage(s){var r;if(!s)return null;const g=typeof s.payload=="string"?s.payload:((r=s?.payload)===null||r===void 0?void 0:r.text)||"",u=new bd({text:g}),E=ar(),f=Se.message.messageFactory.createMessage(Object.assign(Object.assign({},s),{from:E}));return f.setElement(u),f}_updateWithSenderInfo(s){var r,g;const{nick:u,avatar:E,conversationType:f,to:D}=s,{userId:v,tinyID:N}=Se.store.get("login")||{},P=uc.getUserProfile(v);return s.nick=u||P?.nick||"",s.avatar=E||P?.avatar||"",s.tinyID=s.tinyID||N||"",s.from=v,s.status=qr.UNSENT,s.flow=tE.OUT,f===Pa.CONV_GROUP&&(s.nameCard=(g=(r=sp.getGroup(D))===null||r===void 0?void 0:r.selfInfo)===null||g===void 0?void 0:g.nameCard),s}_isMultiEndpointSyncMessage(s){const{from:r,flow:g,currentUser:u}=s;return r===u&&g===tE.IN}_isSendByCurrentInstance(s){const{from:r,flow:g,currentUser:u}=s;return r===u&&g===tE.OUT}};const _R={PushFlag:0,Title:"",Desc:"",Ext:"",ApnsInfo:{Sound:"",BadgeMode:0,IsVoipPush:void 0,Image:"",InterruptionLevel:"active",ContentAvailable:0},AndroidInfo:{Sound:"",XiaoMiChannelID:"",OPPOChannelID:"",GoogleChannelID:"",VIVOClassification:1,VIVOCategory:"",HuaWeiCategory:"",OPPOCategory:"",HuaWeiImage:"",HonorImage:"",GoogleImage:"",HonorImportance:"",MeizuNotifyType:void 0}},kd={HonorImportance:{range:["LOW","NORMAL"],defaultValue:void 0},MeizuNotifyType:{range:[0,1],defaultValue:void 0}},ZD={enableIOSBackgroundNotification:{range:[!0,!1],defaultValue:!1},interruptionLevel:{range:["passive","active","time-sensitive","critical"],defaultValue:"active"}};function TR(s,r){return Object.keys(r).forEach(g=>{const{range:u,defaultValue:E}=r[g];s[g]=u.includes(s[g])?s[g]:E}),s}function gp(s){const r=s.lastIndexOf(".");return r===-1?s:s.slice(0,r)}function NR(s){const{androidInfo:r={},androidOPPOChannelID:g=""}=s,u=r.OPPOChannelID||g,E=TR(r,kd),{sound:f="",FCMChannelID:D=""}=E,v=vo(E,["sound","FCMChannelID"]);return Object.assign(Object.assign({},v),{Sound:gp(f),OPPOChannelID:u,GoogleChannelID:D})}function GR(s){const{apnsInfo:r={},ignoreIOSBadge:g=!1,disableVoipPush:u}=s,E=TR(r,ZD),{ignoreIOSBadge:f,disableVoipPush:D,enableIOSBackgroundNotification:v}=E,N=vo(E,["ignoreIOSBadge","disableVoipPush","enableIOSBackgroundNotification"]),P=f===!0||g===!0?1:0;let W;return n(u)||(W=u===!1?1:0),n(D)||(W=D===!1?1:0),Object.assign(Object.assign({},N),{BadgeMode:P,IsVoipPush:W,ContentAvailable:v?1:0})}function XD(s){return Se.utils.isPlainObject(s)?{PushFlag:s.disablePush===!0?1:0,Title:s.title||"",Desc:s.description||"",Ext:s.extension||"",ApnsInfo:GR(s),AndroidInfo:NR(s)}:_R}function of(s){const{From_AccountHeadurl:r,From_AccountNick:g,IsNeedReadReceipt:u,IsPeerRead:E,IsSyncMsg:f,MsgBody:D,MsgClientTime:v,MsgLifeTime:N,MsgRandom:P,MsgSeq:W,MsgTimeStamp:nA,SendMsgControl:EA,SupportMessageExtension:wA,TinyId:kA,MsgCheckResult:VA,CloudCustomData:LA,MsgVersion:SA,MsgFlagBits:PA,RevokerInfo:zA,InnerSdkCustomData:Ee}=s;let Ie,{From_Account:Li,To_Account:Ui}=s;if(f===1){const Yt=Ui;Ui=Li,Li=Yt}if(zA){const{Reason:Yt,Revoker_Account:Oi,Revoker_FromUin:Bn}=zA;Ie={reason:Yt,revoker:Oi,revokerFromUin:Bn,userID:Oi}}return{from:Li,avatar:r,nick:g,needReadReceipt:u===1,isSyncMessage:f,clientTime:v,messageLifeTime:N,random:P,sequence:W,time:nA,messageControlInfo:{excludedFromLastMessage:EA?.NoLastMsg===1,excludedFromUnreadCount:EA?.NoUnread===1},isSupportExtension:wA,to:Ui,tinyID:kA,checkResult:VA,cloudCustomData:LA,revokerInfo:Ie,messageVersion:SA,messageFlagBits:PA,readReceiptSentByPeer:E,elements:TC(D),onlineOnlyFlag:N===0,quoteInfo:cp(Ee)}}function nf(s){const{From_Account:r,MsgBody:g,MsgClientTime:u,MsgRandom:E,MsgSeq:f,MsgTimeStamp:D,To_Account:v,MsgVersion:N,CloudCustomData:P,MsgCheckResult:W}=s;return{from:r,clientTime:u,random:E,sequence:f,time:D,to:v,elements:TC(g),messageVersion:N,cloudCustomData:P,checkResult:W}}function $D(s){const{ClientSeq:r,From_Account:g,GroupInfo:u,MsgBody:E,MsgClientTime:f,MsgRandom:D,MsgSeq:v,MsgTimeStamp:N,SendMsgControl:P,SupportMessageExtension:W,TinyId:nA,CloudCustomData:EA,MsgVersion:wA,MsgCheckResult:kA,NeedReadReceipt:VA,IsPlaceMsg:LA,RevokerInfo:SA,GroupAtInfo:PA,OnlineOnlyFlag:zA,InnerSdkCustomData:Ee}=s;let Ie,Li=eE.MSG_PRIORITY_NORMAL;if(Object.keys(WD).includes(String(s.MsgPriority))&&(Li=WD[s.MsgPriority]),SA){const{Reason:Yt,Revoker_Account:Oi,Revoker_FromUin:Bn}=SA;Ie={reason:Yt,revoker:Oi,revokerFromUin:Bn,userID:Oi}}const Ui=function(Yt){const Oi=[];return Array.isArray(Yt)&&Yt.forEach(Bn=>{Bn.GroupAtAllFlag===zD?Oi.push(Bn.GroupAt_Account):Bn.GroupAtAllFlag===RR&&Oi.push(Po.MSG_AT_ALL)}),Oi}(PA);return{clientSequence:r,from:g,groupProfile:u,clientTime:f,priority:Li,random:D,sequence:v,time:N,messageControlInfo:{excludedFromLastMessage:P?.NoLastMsg===1,excludedFromUnreadCount:P?.NoUnread===1},isSupportExtension:W,tinyID:nA,cloudCustomData:EA,messageVersion:wA,checkResult:kA,needReadReceipt:VA,isPlaceMessage:LA,revokerInfo:Ie,atUserList:Ui,elements:TC(E),to:nN(s),onlineOnlyFlag:zA===1,quoteInfo:cp(Ee)}}function nN(s){const{utils:{isEmpty:r},constants:{IS_TOPIC_MESSAGE:g}}=Se,{ToGroupId:u,GroupInfo:{MillionGroupFlag:E=0,TopicId:f}={}}=s;return E!==g||r(f)?u:f}function TC(s){if(!s)return null;if(Array.isArray(s))return s.map(g=>{const u=Se.message.messageFactory.getElementClass(g.MsgType);return u?.parseServerPushElement(g)});const r=Se.message.messageFactory.getElementClass(s.MsgType);return r?.parseServerPushElement(s)}function AS(s){const{From_Account:r,MsgBody:g,MsgClientTime:u,MsgRandom:E,MsgSeq:f,MsgTimeStamp:D,GroupId:v,TopicId:N,MsgVersion:P,CloudCustomData:W,MsgCheckResult:nA}=s;return{from:r,clientTime:u,random:E,sequence:f,time:D,groupID:v,topicID:N,elements:TC(g),messageVersion:P,cloudCustomData:W,checkResult:nA}}function cp(s){const{utils:{isString:r,safeStringify:g},ssoLog:u}=Se;if(!r(s))return null;try{const{messageID:E,messageTime:f,messageSequence:D}=JSON.parse(s).businessQuote;return{msgID:E,messageTime:f,messageSequence:D}}catch(E){return u.debug("_parseServerQuoteInfo",g(E)),null}}function lp({conversationUpdateFields:s,message:r}){const{conversationID:g,conversationType:u,conversationSubType:E,flow:f,_isExcludedFromUnreadCount:D,_isExcludedFromLastMessage:v}=r,N=v?"":op(r),P=!D&&f===tE.IN;s.has(g)?(s.get(g).lastMessage=N,P&&s.get(g).unreadCount++):s.set(g,{conversationID:g,type:u,subType:E,unreadCount:P?1:0,lastMessage:N})}function TB(s){return s.filter(r=>{const g=!tn(r?._elements),u=r?.isPlaceMessage===1;return g||Se.ssoLog.error("emptyMessageBody",`from:${r.from} to:${r.to} sequence:${r.sequence}`),g&&!u})}function NB(s){const{messageDataHandler:r}=Se.message;return!r.isInMessageList(s)&&!r.isMessageSentByCurrentInstance(s)}var bR=Object.freeze({__proto__:null,autoIncrementIndex:uu,createAndroidPushInfo:NR,createApnsPushInfo:GR,createOfflinePushInfo:XD,filterValidMessages:TB,getAndroidSoundName:gp,parseServerGroupMessage:$D,parseServerPushC2CModifyMessage:nf,parseServerPushGroupModifyMessage:AS,parseServerPushMessage:of,parseServerPushMessageElement:TC,shouldStoreMessage:NB,updateConversationFields:lp});const{isPlainObject:kR}=Se.utils;function Ip(s,r={}){const{onlineUserOnly:g,messageControlInfo:u}=r;let{offlinePushInfo:E}=r;s.conversationType===Zr.CONV_C2C&&g===!0&&(E?E.disablePush=!0:E={disablePush:!0});let f="";typeof s.cloudCustomData=="string"&&s.cloudCustomData.length>0&&(f=s.cloudCustomData);const D=[];if(u&&kR(u)){const{excludedFromUnreadCount:v,excludedFromLastMessage:N,excludedFromContentModeration:P}=u;v===!0&&D.push("NoUnread"),N===!0&&D.push("NoLastMsg"),P===!0&&D.push("NoMsgCheck")}return{onlineUserOnly:g,cloudCustomData:f,messageControlInfo:D,offlinePushInfo:E}}function eS(s){const{webhookInfo:{disableCloudMessagePreHook:r=!1,disableCloudMessagePostHook:g=!1}={}}=s||{};if(!r&&!g)return;const u=[];return r&&u.push("ForbidBeforeSendMsgCallback"),g&&u.push("ForbidAfterSendMsgCallback"),u}function Gh(s,r){return mA(this,void 0,void 0,function*(){const g=s.conversationType===Zr.CONV_GROUP?function(E,f){var D;const v=Ip(E,f),{onlineUserOnly:N,cloudCustomData:P,messageControlInfo:W,offlinePushInfo:nA}=v,EA=JSON.parse(JSON.stringify(E.transformElementsToServerFormat()));let wA;return C(E._receiverList)&&E._receiverList.length>0&&(wA=E._receiverList,E._receiverList.length>50&&(wA=E._receiverList.slice(0,50),console.warn("ReceiverListLimit"))),{servcmd:"group_open_http_svc.send_group_msg",data:{From_Account:(D=Se.store.get("login"))===null||D===void 0?void 0:D.userId,GroupId:E.to,MsgBody:EA,CloudCustomData:P,Random:E.random,MsgPriority:E.priority,ClientSeq:E.clientSequence,GroupAtInfo:E._groupAtInfoList,OnlineOnlyFlag:N?1:0,MsgClientTime:E.clientTime,OfflinePushInfo:XD(nA),SendMsgControl:N?void 0:W,NeedReadReceipt:E.needReadReceipt===!0?1:0,To_Account:wA,SupportMessageExtension:E.isSupportExtension===!0?1:0,IsRelayMsg:E._relayFlag===!0?1:0,CustomModerationConfigID:E._cmConfigID,ForbidCallbackControl:eS(f),InnerSdkCustomData:bB(E)}}}(s,r):function(E,f){var D;const v=Ip(E,f),{onlineUserOnly:N,cloudCustomData:P,messageControlInfo:W,offlinePushInfo:nA}=v,EA=N===!0?0:void 0,wA=JSON.parse(JSON.stringify(E.transformElementsToServerFormat()));return{servcmd:"openim.sendmsg",data:{From_Account:(D=Se.store.get("login"))===null||D===void 0?void 0:D.userId,To_Account:E.to,MsgBody:wA,CloudCustomData:P,MsgSeq:E.sequence,MsgRandom:E.random,MsgLifeTime:EA,From_AccountNick:E.nick,From_AccountHeadurl:E.avatar,SendMsgControl:EA!==0?W:void 0,MsgClientTime:E.clientTime,IsNeedReadReceipt:E.needReadReceipt===!0?1:0,SupportMessageExtension:E.isSupportExtension===!0?1:0,IsRelayMsg:E._relayFlag===!0?1:0,CustomModerationConfigID:E._cmConfigID,OfflinePushInfo:XD(nA),ForbidCallbackControl:eS(f),InnerSdkCustomData:bB(E)}}}(s,r),u=yield Ig(g);return u?{time:u.MsgTime,messageDropReason:u.MsgDropReason,sequence:u.MsgSeq}:null})}function bh(s){return mA(this,void 0,void 0,function*(){const{from:r,to:g,version:u=0,sequence:E,random:f,time:D,type:v,cloudCustomData:N}=s,P={From_Account:r,To_Account:g,MsgVersion:u,MsgSeq:E,MsgRandom:f,MsgTime:D,MsgType:v,MsgBody:s.transformElementsToServerFormat(),CloudCustomData:N},W=yield Ig({servcmd:"openim.modify_c2c_msg",data:P});if(W){const{MsgBody:nA,MsgVersion:EA,CloudCustomData:wA}=W;return{elements:TC(nA),messageVersion:EA,cloudCustomData:wA}}})}function GB(s){return mA(this,void 0,void 0,function*(){const{to:r,version:g=0,sequence:u,cloudCustomData:E}=s,f={GroupId:r,MsgVersion:g,MsgSeq:u,MsgBody:s.transformElementsToServerFormat(),CloudCustomData:E},D=yield Ig({servcmd:"openim.modify_group_msg",data:f});if(D){const{MsgBody:v,MsgVersion:N,CloudCustomData:P}=D;return{elements:TC(v),messageVersion:N,cloudCustomData:P}}})}function kh(s){return mA(this,void 0,void 0,function*(){const{groupID:r,count:g,messageSequence:u,messageSequenceList:E,getType:f}=s,D={GroupId:r,ReqMsgNumber:g,WithRecalledMsg:1,Version:1,GetType:f};return u&&(D.ReqMsgSeq=u),C(E)&&E.length>0&&(D.ReqMsgSeqList=E),yield Ig({servcmd:"group_open_http_svc.group_msg_get",data:D})})}function sf(s){return mA(this,void 0,void 0,function*(){const{peerAccount:r,count:g,lastMessageTime:u,messageKey:E,direction:f}=s;return Ig({servcmd:"openim.getroammsg",data:{Peer_Account:r,MaxCnt:g,WithRecalledMsg:1,LastMsgTime:u,MsgKey:E,GetDirection:f}})})}function bB(s){if(Se.utils.isObject(s.quoteInfo)){const{msgID:r,messageSequence:g,messageTime:u}=s.quoteInfo;return JSON.stringify({businessQuote:{messageID:r,messageSequence:g,messageTime:u}})}}var tS=Object.freeze({__proto__:null,createMessagePackOptions:Ip,generateForbidCallbackControl:eS,getC2CRoamingMessagesByAnchor:sf,getGroupRoamingMessagesByAnchor:kh,getRoamingMessages:function(s){return mA(this,void 0,void 0,function*(){const{peerAccount:r,count:g,lastMessageTime:u,messageKey:E}=s;return(yield Ig({servcmd:"openim.getroammsg",data:{Peer_Account:r,MaxCnt:g||15,LastMsgTime:u||0,MsgKey:E,GetDirection:0,WithRecalledMsg:1}}))||[]})},modifyC2CMessage:bh,modifyGroupMessage:GB,sendMessage:Gh});const{isPlainObject:sN}=Se.utils,{MSG_AUDIO:iS,MSG_FILE:oS,MSG_IMAGE:LR,MSG_VIDEO:UR,MSG_MERGER:FR}=Po;class rf{constructor(){this._sendProtocolMap=new Map}init(){Sr.getInstance().registerApi({apiName:"sendMessage",context:this,matcher:r=>![iS,oS,LR,UR,FR].includes(r[0].type)})}registerSendProtocol(r,g,u){this._sendProtocolMap.set(r,g.bind(u))}sendMessage(r,g){return mA(this,void 0,void 0,function*(){const{TOTAL_COUNT:u,SEND_COST:E,SUCCESS_COUNT:f,FAILED_COUNT:D}=Cr;if(!(r instanceof zE))throw new hn({code:ma.MSG_INSTANCE_REQUIRED});const v=r.validateBeforeSend();if(!v.isValid){const{code:W,message:nA=""}=v.error||{};throw new hn({code:W,message:nA})}this._reportMessageSendQuality({name:u,message:r});let N=!1;const{messageDataHandler:P}=Se.message||{};try{const{messageControlInfo:W}=g||{};let nA=null;P.addRandomOfSentMessage(r.random);const EA=Date.now(),wA=this._getSendProtocol(r);if(r.conversationType===Zr.CONV_C2C?(N=g?.onlineUserOnly===!0,nA=yield wA(r,g)):r.conversationType===Zr.CONV_GROUP&&(yield this._validateBeforeSendGroupMessage(r),nA=yield wA(r,g)),nA){const{messageDropReason:kA,sequence:VA,time:LA}=nA;if(this._updateNickAndAvatarOfSentMessageByMe(r),kA&&this._logRateLimitInfo(r,VA,kA),this._reportMessageSendQuality({name:f,message:r}),this._reportMessageSendQuality({name:E,message:r,startTs:EA}),r.isResend===!0){const SA=P.findMessage(r.ID);SA&&(Se.ssoLog.debug("sendMessage",`sendMessage resend ok. ID:${SA.ID}`),P.deleteConversationMessage(SA))}return r.status=qr.SUCCESS,r.time=LA,r.conversationType===Zr.CONV_GROUP&&(r.sequence=VA),N?r._onlineOnlyFlag=!0:(P.storeConversationMessage(r),this._applySentMessageControlInfo(r,W),this._emitOnlineMessageSent(r)),r.type===Ng.MSG_STREAM?{code:0,data:{message:r,streamMessageID:nA.streamMessageID}}:{code:0,data:{message:r}}}}catch(W){r.status=qr.FAIL,P.removeRandomOfSentMessage(r.random);let{errorCode:nA}=W||{},EA=W?.errorInfo||W?.message||"";throw this._hasRiskContent(nA)&&(r.hasRiskContent=!0),N||this._isRejectedByRestApi(nA)||P.storeConversationMessage(r),this._reportMessageSendQuality({name:D,message:r,error:W}),new hn({code:nA,message:EA,data:{message:r},moreMessage:`type:${r.type} from:${r.from} to:${r.to}`})}})}_hasRiskContent(r){return r===80001||r===80004}_isRejectedByRestApi(r){return r>=10100&&r<=10200||r>=120001&&r<=13e4}_emitOnlineMessageSent(r){const g=r._isExcludedFromLastMessage?"":r,{conversationID:u,conversationType:E}=r,f=tl(u)?lo.TOPIC_NEW_MESSAGE:lo.NEW_MESSAGE;Se.notificationCenter.emitInnerEvent(f,{result:{conversationUpdateFieldList:[{conversationID:u,type:E,message:r,lastMessage:g,unreadCount:0}]}})}_applySentMessageControlInfo(r,g){g&&sN(g)&&(g.excludedFromLastMessage===!0&&(r._isExcludedFromLastMessage=!0),g.excludedFromUnreadCount===!0&&(r._isExcludedFromUnreadCount=!0))}_logRateLimitInfo(r,g,u){const E=`from:${r.from} to:${r.to} sequence:${g} messageDropReason:${u}`;Se.ssoLog.warn("messageDropReason",E)}_updateNickAndAvatarOfSentMessageByMe(r){const{messageDataHandler:g}=Se.message||{};let u=!1;const{conversationID:E}=r,f=g.getLatestMsgSentByMe(E);if(f){const{nick:D,avatar:v}=f;D===r.nick&&v===r.avatar||(u=!0),u&&g.updateNickAndAvatarOfSentMessage({conversationID:E,latestNick:r.nick,latestAvatar:r.avatar,isSentByMe:!0})}}_validateBeforeSendGroupMessage(r){return mA(this,void 0,void 0,function*(){var g,u,E;const{to:f,from:D}=r;let v=f,N=sp.getGroup(v);if(ea({groupID:v})&&N?.isSupportTopic)throw new hn({code:ma.MSG_SEND_GRP_WITH_TOPIC_FAIL});if(tl(f)&&([v]=f.split(ga.TOPIC),N=sp.getGroup(v)),!N&&typeof((g=Sr.getInstance().getApiMap())===null||g===void 0?void 0:g.getGroupProfile)=="function"){const P=yield Sr.getInstance().getApiMap().getGroupProfile({groupID:v});if(((E=(u=P?.data)===null||u===void 0?void 0:u.group)===null||E===void 0?void 0:E.type)===Po.GRP_AVCHATROOM){const W=dn({code:ma.MSG_SEND_FAIL_NOT_IN_AV,replacement1:D,replacement2:v});throw new hn({code:ma.MSG_SEND_FAIL_NOT_IN_AV,message:W})}}return!0})}_reportMessageSendQuality(r){Se.notificationCenter.emitInnerEvent(lo.QUALITY_STAT,{label:dI.MESSAGE_SEND_SUCCESS_RATE,data:r})}_getSendProtocol(r){return this._sendProtocolMap.get(r.type)||Gh}}var rN=new class{constructor(){this._sparseMessagesByConversation=new Map,this._latestMessageSentByPeerMap=new Map,this._latestMessageSentByMeMap=new Map,this._randomOfSentMessageList=new Set}init(){Se.notificationCenter.subscribeInnerEvent(lo.LOGOUT,this._reset,this),Se.notificationCenter.subscribeInnerEvent(lo.DESTROY,this._dispose,this)}get _messagesByConversation(){return rp.getMessages()}storeConversationMessage(s,r=!1){if(jn)return!0;const{conversationID:g}=s;if(!g||(this._messagesByConversation.has(g)||this._messagesByConversation.set(g,new Map),this._shouldSkipStoreMessage(s,r)))return!1;const u=this._getUniqueIdOfMessage(s);return this._messagesByConversation.get(g).set(u,s),this._updateLatestMessageMap(s),!0}_updateLatestMessageMap(s){const{conversationID:r}=s;s.flow==="out"?this._setLatestMsgSentByMe(r,s):r.startsWith("C2C")&&this._setLatestMsgSentByPeer(r,s)}_shouldSkipStoreMessage(s,r){const g=this._getUniqueIdOfMessage(s),u=this._messagesByConversation.get(s.conversationID);if(u?.has(g)){const E=u?.get(g);if(!r||E?.isModified===!0)return!0}return!1}deleteConversationMessage(s){var r;const{conversationID:g=""}=s,u=this._getUniqueIdOfMessage(s);this._messagesByConversation.has(g)&&((r=this._messagesByConversation.get(g))===null||r===void 0||r.delete(u))}modifyConversationMessage(s,r){var g;if(!this._messagesByConversation.has(s)&&!this._sparseMessagesByConversation.has(s))return{isUpdated:!1,message:null};const u=this._getUniqueIdOfMessage(r),E=this._getMessageFromLocalMessage(s,u);if(E){const{messageVersion:f,elements:D,cloudCustomData:v,checkResult:N=0}=r,P=N>1;if(Se.ssoLog.debug("modifyConversationMessage",`conversationToMessageMap modifyConversationMessage localVersion:${E.version} remoteVersion:${f}`),E.versionE.ID===s)||null,r)break;if(!r){const u=Array.from(this._sparseMessagesByConversation.values());for(const E of u)if(r=E.get(s)||null,r)break}return r}deleteConversationMessageList(s){this._messagesByConversation.has(s)&&(this._messagesByConversation.delete(s),this._latestMessageSentByMeMap.delete(s),this._latestMessageSentByPeerMap.delete(s)),this._sparseMessagesByConversation.has(s)&&this._sparseMessagesByConversation.delete(s)}revokeMessage({conversationID:s,sequence:r,random:g,revoker:u}){const E=this._messagesByConversation.get(s);let f=null;if(E){const D=Array.from(E.values());if(f=this._findMessageBySequenceAndRandom({messageList:D,random:g,sequence:r}),f){const v=this._getUniqueIdOfMessage(f);return rp.updateMessage(s,[v],{isRevoked:!0,revoker:u,operation:_c.revoke}),f}}if(this._sparseMessagesByConversation.has(s)){const D=Array.from(this._sparseMessagesByConversation.get(s).values());if(f=this._findMessageBySequenceAndRandom({messageList:D,random:g,sequence:r}),f)return f.isRevoked=!0,f.revoker=u,f}}_findMessageBySequenceAndRandom({messageList:s,sequence:r,random:g}){for(let u=0;u0){const D=new Map([...E,...f.entries()]);this._messagesByConversation.set(g,D),this._updateLatestMessageSentByMe(g),this._updateLatestMessageSentByPeer(g)}return u}storeSparseMessageList(s){if(s.length===0)return;const{conversationID:r}=s[0],g=s.length;this._sparseMessagesByConversation.has(r)||this._sparseMessagesByConversation.set(r,new Map);const u=this._sparseMessagesByConversation.get(r);for(let E=0;E=0;u--)if(g[u].flow==="out"){this._setLatestMsgSentByMe(s,g[u]);break}}}_updateLatestMessageSentByPeer(s){var r;const g=Array.from(((r=this._messagesByConversation.get(s))===null||r===void 0?void 0:r.values())||[]);if(g.length!==0&&s.startsWith("C2C")){for(let u=g.length-1;u>=0;u--)if(g[u].flow==="in"){this._setLatestMsgSentByPeer(s,g[u]);break}}}_getUniqueIdOfMessage(s){const{from:r,to:g,random:u,sequence:E,time:f}=s;return`${r}-${g}-${u}-${E}-${f}`}_setLatestMsgSentByPeer(s,r){this._latestMessageSentByPeerMap.set(s,r)}_setLatestMsgSentByMe(s,r){this._latestMessageSentByMeMap.set(s,r)}getLatestMsgSentByPeer(s){return this._latestMessageSentByPeerMap.get(s)}getLatestMsgSentByMe(s){return this._latestMessageSentByMeMap.get(s)}addRandomOfSentMessage(s){this._randomOfSentMessageList.add(s)}removeRandomOfSentMessage(s){this._randomOfSentMessageList.delete(s)}updateNickAndAvatarOfSentMessage(s){const{conversationID:r="",latestAvatar:g,latestNick:u,isSentByMe:E=!0}=s,f=this._messagesByConversation.get(r);if(!f)return;const D=Array.from(f.values()),v=E?"out":"in";D.forEach(N=>{const{nick:P,avatar:W,flow:nA}=N;nA===v&&(P!==u&&(N.nick=u),W!==g&&(N.avatar=g))})}isInMessageList(s){var r;const{conversationID:g}=s;if(!g||!this._messagesByConversation.has(g))return!1;const u=this._getUniqueIdOfMessage(s);return(r=this._messagesByConversation.get(g))===null||r===void 0?void 0:r.has(u)}isMessageSentByCurrentInstance(s){const{random:r}=s;return this._randomOfSentMessageList.has(r)}getContinuousMessagesByConversation(){return this._messagesByConversation}getLocalMessageList(s){const r=this._messagesByConversation.get(s);return r?[...r.values()]:[]}getSparseMessageList(s){const r=this._sparseMessagesByConversation.get(s);return r?[...r.values()]:[]}_reset(){this._messagesByConversation.clear(),this._latestMessageSentByPeerMap.clear(),this._latestMessageSentByMeMap.clear(),this._randomOfSentMessageList.clear()}_dispose(){this._reset(),Se.notificationCenter.unSubscribeInnerEvent(lo.LOGOUT,this._reset,this),Se.notificationCenter.unSubscribeInnerEvent(lo.DESTROY,this._dispose,this)}};function af(s,r){const g=_B.getConversation(s);if(g?.lastMessage){const{lastMessage:u}=g,{lastTime:E,lastSequence:f,version:D}=u,{time:v,sequence:N,messageVersion:P,elements:W,cloudCustomData:nA}=r;E===v&&f===N&&D!==P&&(u.type=W[0].type,u.payload=W[0].content,u.messageForShow=il(u.type,u.payload),u.cloudCustomData=nA,u.version=P,_B.updateConversation(s,{lastMessage:u}))}}class OR{init(){Sr.getInstance().registerApi({apiName:"modifyMessage",context:this})}modifyMessage(r){return mA(this,void 0,void 0,function*(){const{to:g,payload:u,sequence:E,conversationType:f,random:D,time:v,from:N,type:P}=r;if(this._canModifyMessageElement(P)){const W=r?._elements||[];W.length>=1&&(W[0].type=P,W[0].content=u)}try{let W=null,nA=null;if(f===Zr.CONV_C2C?W=yield bh(r):f===Zr.CONV_GROUP&&(W=yield GB(r)),W){let EA=`${f}${g}`;return g===ar()&&f===Zr.CONV_C2C&&(EA=`${f}${N}`),nA={conversationType:f,from:N,to:g,time:v,random:D,sequence:E,elements:W?.elements,cloudCustomData:W?.cloudCustomData,messageVersion:W?.messageVersion,conversationID:EA},this._handleModifyMessageSuccess(nA),{code:0,data:{message:r},successLog:{message:`to:${g}`}}}}catch(W){const{errorCode:nA}=W||{};throw new hn({functionName:"modifyMessage",code:nA,moreMessage:`to:${g}`})}})}_handleModifyMessageSuccess(r){const{conversationID:g}=r,{isUpdated:u,message:E}=Se.message.messageDataHandler.modifyConversationMessage(g,r);u===!0&&Se.notificationCenter.emitOuterEvent(Rr.MESSAGE_MODIFIED,{name:Rr.MESSAGE_MODIFIED,data:[E]}),Se.notificationCenter.emitInnerEvent(lo.MESSAGE_MODIFIED,{conversationID:g,message:E}),af(g,r)}_canModifyMessageElement(r){return[WE.MSG_TEXT,WE.MSG_CUSTOM,WE.MSG_LOCATION,WE.MSG_FACE].includes(r)}}class Lh{init(){const{notificationCenter:r}=Se,{InnerEventSubType:g}=r;Pn.getInstance().registerWorkflowStep(jt.RECEIVE_C2C_NEW_MESSAGE,Xt.HANDLE_C2C_NEW_MESSAGE,this._handleC2CMessagePush,this),Pn.getInstance().registerWorkflowStep(jt.RECEIVE_C2C_NEW_MESSAGE,Xt.EMIT_C2C_MESSAGE_EVENT,this._emitMessageEventsAfterReceiveNewMessage,this),Pn.getInstance().registerWorkflowStep(jt.SYNC_SERVER_INFO_AFTER_RE_ONLINE,Xt.EMIT_C2C_MESSAGE_EVENT,this._emitMessageEventsAfterSyncUnreadMessage,this),r.subscribeInnerEvent(lo.MESSAGE_PUSH,g.C2C_REALTIME_MESSAGE,this._executeReceiverNewMessageWorkFlow,this),r.subscribeInnerEvent(lo.MESSAGE_PUSH,g.C2C_MESSAGE_MODIFIED,this._handleC2CMessageModify,this),r.subscribeInnerEvent(lo.DESTROY,this._dispose,this)}_executeReceiverNewMessageWorkFlow(r){Pn.getInstance().executeWorkflow(jt.RECEIVE_C2C_NEW_MESSAGE,r)}_handleC2CMessagePush(r){const g=r.data||{},{messageDataHandler:u}=Se.message||{},E=[],f=new Map;return g.C2cMsgArray.forEach(D=>{const v=this._generateC2CMessage(D);this._updateMessageProfile(v);let N=v.isModified===1;u.isMessageSentByCurrentInstance(v)?v.isModified=N:N=!1,v._onlineOnlyFlag?u.isMessageSentByCurrentInstance(v)||E.push(v):NB(v)&&(u.storeConversationMessage(v)&&lp({conversationUpdateFields:f,message:v}),u.isMessageSentByCurrentInstance(v)&&!N||E.push(v))}),{conversationUpdateFieldList:[...f.values()],messages:E}}_emitMessageEventsAfterReceiveNewMessage(r){var g;const{messages:u=[]}=((g=r.result)===null||g===void 0?void 0:g[Xt.HANDLE_C2C_NEW_MESSAGE])||{};this._emitMessageEvents(u)}_emitMessageEventsAfterSyncUnreadMessage(r){var g;const{messages:u=[]}=((g=r.result)===null||g===void 0?void 0:g[Xt.UNREAD_MESSAGE_SYNC])||{};this._emitMessageEvents(u)}_emitMessageEvents(r){const g=r?.filter(E=>E?.isModified===!0)||[];g.length>0&&Se.notificationCenter.emitOuterEvent("onMessageModified",{name:"onMessageModified",data:g});const u=r?.filter(E=>!E?.isModified);u.length>0&&Se.notificationCenter.emitOuterEvent("onMessageReceived",{name:"onMessageReceived",data:u})}_generateC2CMessage(r){const g=Zr.CONV_C2C,u=of(r),E=Se.message.messageFactory.createMessage(Object.assign(Object.assign({},u),{conversationType:g,flow:tE.IN})),{elements:f}=u;return E.setElement(f),E}_updateMessageProfile(r){var g;const{messageDataHandler:u}=Se.message||{},E=(g=Se.store.get("login"))===null||g===void 0?void 0:g.userId,{from:f,nick:D,avatar:v,conversationID:N=""}=r;if(f!==E){const P=u.getLatestMsgSentByPeer(N);if(P){const{nick:W,avatar:nA}=P;n(D)||n(v)?(r.nick=c(W)?W:r.nick,r.avatar=c(nA)?nA:r.avatar):D===W&&v===nA||(u.updateNickAndAvatarOfSentMessage({conversationID:N,latestNick:D,latestAvatar:v,isSentByMe:!1}),this._updateConversationUserProfile({conversationID:N,nick:D,avatar:v}))}}else{const P=u.getLatestMsgSentByMe(N);!P||D===P.nick&&v===P.avatar||u.updateNickAndAvatarOfSentMessage({conversationID:N,latestNick:D,latestAvatar:v,isSentByMe:!0})}}_updateConversationUserProfile(r){const{conversationID:g,nick:u,avatar:E}=r,f=_B.getConversation(g),{userProfile:D={}}=f||{};D.avatar===E&&D.nick===u||_B.updateConversation(g,{userProfile:Object.assign(Object.assign({},D),{nick:u,avatar:E})})}_updateMessageListDueToModify(r){const{conversationID:g}=r,{isUpdated:u,message:E}=Se.message.messageDataHandler.modifyConversationMessage(g,r);u===!0&&Se.notificationCenter.emitOuterEvent("onMessageModified",{name:"onMessageModified",data:[E]}),Se.notificationCenter.emitInnerEvent("ModifyMessageSuccess",r),af(g,r)}_handleC2CMessageModify(r){r.C2cMsgModNotifys.forEach(g=>{var u;const E=Zr.CONV_C2C;let f=nf(g);const{to:D,from:v}=f;let N=`${E}${D}`;D===((u=Se.store.get("login"))===null||u===void 0?void 0:u.userId)&&(N=`${E}${v}`),f=Object.assign({conversationType:E,conversationID:N},f),this._updateMessageListDueToModify(f)})}_dispose(){const{notificationCenter:r}=Se,{InnerEventSubType:g}=r;Se.notificationCenter.unSubscribeInnerEvent(lo.MESSAGE_PUSH,g.C2C_REALTIME_MESSAGE,this._handleC2CMessagePush,this),Se.notificationCenter.unSubscribeInnerEvent(lo.MESSAGE_PUSH,g.C2C_MESSAGE_MODIFIED,this._handleC2CMessageModify,this),Se.notificationCenter.unSubscribeInnerEvent(lo.DESTROY,this._dispose,this)}}class Uh{init(){const{notificationCenter:r}=Se,{InnerEventSubType:g}=r;Pn.getInstance().registerWorkflowStep(jt.RECEIVE_GROUP_NEW_MESSAGE,Xt.HANDLE_GROUP_NEW_MESSAGE,this._handleGroupMessagePush,this),Pn.getInstance().registerWorkflowStep(jt.RECEIVE_GROUP_NEW_MESSAGE,Xt.EMIT_GROUP_MESSAGE_EVENT,this._emitMessageEvents,this),r.subscribeInnerEvent(lo.MESSAGE_PUSH,g.GROUP_REALTIME_MESSAGE,this._executeReceiverNewMessageWorkFlow,this),r.subscribeInnerEvent(lo.MESSAGE_PUSH,g.GROUP_MESSAGE_MODIFIED,this._handleGroupMessageModify,this),r.subscribeInnerEvent(lo.DESTROY,this._dispose,this)}_executeReceiverNewMessageWorkFlow(r){this._canExecuteReceiverNewMessageWorkFlow(r)&&Pn.getInstance().executeWorkflow(jt.RECEIVE_GROUP_NEW_MESSAGE,r)}_handleGroupMessagePush(r){const g=r.data||{},{messageDataHandler:u}=Se.message,E=[],f=new Map,D=g?.GroupMsgArray;return D?.forEach(v=>{if(v.GroupInfo.NotVisible===1)return;const N=this._generateGroupMessage(v);this.updateMessageProfile(N);let P=N.isModified===1;u.isMessageSentByCurrentInstance(N)?N.isModified=P:P=!1,N._onlineOnlyFlag?u.isMessageSentByCurrentInstance(N)||E.push(N):NB(N)&&u.storeConversationMessage(N)&&(E.push(N),lp({conversationUpdateFields:f,message:N}))}),{conversationUpdateFieldList:[...f.values()],messages:E}}_emitMessageEvents(r){var g;const{messages:u}=((g=r.result)===null||g===void 0?void 0:g[Xt.HANDLE_GROUP_NEW_MESSAGE])||{},E=u?.filter(D=>D?.isModified===!0)||[];E.length>0&&Se.notificationCenter.emitOuterEvent("onMessageModified",{name:"onMessageModified",data:E});const f=u?.filter(D=>!D?.isModified)||[];f.length>0&&Se.notificationCenter.emitOuterEvent("onMessageReceived",{name:"onMessageReceived",data:f})}_generateGroupMessage(r){const g=Zr.CONV_GROUP,u=$D(r),E=Se.message.messageFactory.createMessage(Object.assign(Object.assign({},u),{conversationType:g,flow:tE.IN})),{elements:f}=u;return E.setElement(f),E}updateMessageProfile(r){var g;const{messageDataHandler:u}=Se.message||{},E=(g=Se.store.get("login"))===null||g===void 0?void 0:g.userId,{from:f,nick:D,avatar:v,conversationID:N="",_elements:P}=r;if(f===E){const W=u.getLatestMsgSentByMe(N);!W||D===W.nick&&v===W.avatar||u.updateNickAndAvatarOfSentMessage({conversationID:N,latestNick:D,latestAvatar:v,isSentByMe:!0})}else if(f===Po.CONV_SYSTEM){const{operationType:W,memberInfoList:nA,operatorInfo:EA}=P;let wA={};if(tn(nA)?tn(EA)||(wA=EA):[bg.JOINED,bg.KICKED,bg.ADMIN_SET,bg.ADMIN_CANCELED].includes(W)&&(wA=Object.assign({},nA[0])),!tn(wA)){const{nick:kA="",avatar:VA=""}=wA;r.nick=kA,r.avatar=VA}}}_updateMessageListDueToModify(r){const{conversationID:g}=r,{isUpdated:u,message:E}=Se.message.messageDataHandler.modifyConversationMessage(g,r);u===!0&&Se.notificationCenter.emitOuterEvent("onMessageModified",{name:"onMessageModified",data:[E]}),af(g,r)}_handleGroupMessageModify(r){r.GroupMsgModNotifys.forEach(g=>{const u=Zr.CONV_GROUP;let E=AS(g);const{topicID:f,groupID:D}=E,v=f||D,N=`${u}${v}`;E=Object.assign({conversationType:u,conversationID:N,to:v},E),this._updateMessageListDueToModify(E)})}_dispose(){const{notificationCenter:r}=Se,{InnerEventSubType:{GROUP_REALTIME_MESSAGE:g,GROUP_MESSAGE_MODIFIED:u}}=r;r.unSubscribeInnerEvent(lo.MESSAGE_PUSH,g,this._handleGroupMessagePush,this),r.unSubscribeInnerEvent(lo.MESSAGE_PUSH,u,this._handleGroupMessageModify,this),r.unSubscribeInnerEvent(lo.DESTROY,this._dispose,this)}_canExecuteReceiverNewMessageWorkFlow(r){var g,u;const{GroupId:E,GroupType:f}=((u=(g=r?.GroupMsgArray)===null||g===void 0?void 0:g[0])===null||u===void 0?void 0:u.GroupInfo)||{},D=f===xa.GRP_AVCHATROOM;return!(!sp.getGroup(E)&&D)}}var nS=new class{constructor(){this.c2cMessageReceiver=new Lh,this.groupMessageReceiver=new Uh}init(){this.c2cMessageReceiver.init(),this.groupMessageReceiver.init()}};const PR={createCustomMessage:{to:{required:!0,rules:["string"],allowEmpty:!1},conversationType:{required:!0,rules:["string"],allowEmpty:!1},payload:{required:!0,rules:["object"],allowEmpty:!1},cloudCustomData:{required:!1,rules:["string"],allowEmpty:!1},priority:{required:!1,rules:["string"],allowEmpty:!1},customModerationConfigurationID:{required:!1,rules:["string"],allowEmpty:!1}},sendMessage:[{key:"message",required:!0,rules:["object"],allowEmpty:!1},{key:"options",required:!1,rules:["object"],allowEmpty:!1}],createTextMessage:{to:{required:!0,rules:["string"],allowEmpty:!1},conversationType:{required:!0,rules:["string"],allowEmpty:!1,customValidator:s=>!(!s.startsWith("C2C")&&!s.startsWith("GROUP"))||"conversationType is invalid."},payload:{required:!0,rules:["object"],allowEmpty:!1,customValidator:s=>function(r){var g;return typeof r?.text!="string"||typeof r.text=="string"&&((g=r?.text)===null||g===void 0?void 0:g.length)===0?"payload.text must be a string":!0}(s)}}},aN={createCustomMessage:!0,sendMessage:!0,modifyMessage:!0};var gN=new class{constructor(){this._historyMessageListFetchAnchors=new Map,this.completedHistoryConversations=new Set}getGroupRoamingMessagesByAnchor(s){return mA(this,void 0,void 0,function*(){try{const{conversationID:r,count:g,direction:u,sequence:E,messageSequenceList:f,shouldMarkCompleted:D=!1,getType:v}=s,N=r.replace(Pa.CONV_GROUP,""),P=[];let W=E;if(u===$c.BACKWARD){if(typeof E!="number")return{messageList:[],hasNoMoreHistoryMessage:!1,nextReqMessageIDFromServer:""};W=E+g-1}const nA=yield kh({groupID:N,count:g,messageSequence:W,messageSequenceList:f,getType:v});if(nA){const{RspMsgList:EA=[],NextReqMsgSeq:wA=0,IsFinished:kA,InvisibleMsgSeq:VA}=nA,LA=`groupID:${N} sequence:${E} reqSeq:${W} direction:${u} complete:${kA} nextSequence:${wA} remoteMsgCount:${EA.length} invisibleSequenceList:${VA}`,SA=[];for(let Ee=0;Ee=E),PA&&D&&this.completedHistoryConversations.add(r);const zA=TB(SA);return Se.ssoLog.info("getGroupRoamingMessagesByAnchor",LA),{messageList:zA,invisibleSequenceList:VA,nextReqMessageIDFromServer:wA,hasNoMoreHistoryMessage:PA,serverGroupTipList:P}}}catch(r){const{errorCode:g,errorInfo:u}=r||{};throw new hn({code:g,message:u})}})}clearHistoryMessageListFetchAnchors(s){this._historyMessageListFetchAnchors.delete(s)}isHistoryMessageFetchCompleted(s){return this.completedHistoryConversations.has(s)}_parseMessage(s){var r;const g=Pa.CONV_GROUP;s.Event===4&&(s.MsgBody.MsgType=Po.MSG_GRP_TIP);const u=$D(s),E=tf.createMessage(Object.assign(Object.assign({},u),{conversationType:g,flow:"in"}));return wB(((r=u.elements)===null||r===void 0?void 0:r.content)||{},E),E.setElement(u.elements),E}getC2CRoamingMessagesByAnchor(s){return mA(this,void 0,void 0,function*(){var r;try{const{conversationID:g,count:u,messageID:E,time:f,direction:D,shouldMarkCompleted:v=!1}=s;let N=f,P="";if(!f){const EA=E?Se.message.messageDataHandler.findMessage(E):null;if(N=EA?.time||0,E&&this._historyMessageListFetchAnchors.has(g)){const wA=this._historyMessageListFetchAnchors.get(g);N=wA.lastMessageTime,P=wA.messageKey}}const W=g.replace(Pa.CONV_C2C,""),nA=yield sf({count:u,lastMessageTime:N,messageKey:P,peerAccount:W,direction:D});if(nA){const{MsgList:EA=[],Complete:wA,MsgKey:kA,LastMsgTime:VA}=nA;this._historyMessageListFetchAnchors.set(g,{messageKey:kA,lastMessageTime:VA});const LA=[];for(let Ee=0;Ee{const{tag:E,value:f}=u;E&&E.indexOf(rS)>-1?g.profileCustomField.push({key:E,value:f}):Ld.has(E)&&(g[Ld.get(E)]=f)}),Object.assign(Object.assign({},gf),g)}parseProfileItem(s=[]){const r=[];return s.forEach(g=>{r.push({tag:g.Tag,value:g.Value})}),r}parseProfileList(s=[]){const r=[];return s.forEach(g=>{r.push({tag:g.Tag,value:g.ValueBytes})}),r}convertParamsToProfile(s){const r=[];return Object.keys(s).forEach(g=>{g!==aS&&r.push({tag:ql[g.toUpperCase()],value:s[g]})}),s.profileCustomField&&C(s.profileCustomField)&&s.profileCustomField.forEach(g=>{r.push({tag:g.key,value:g.value})}),r}normalizeProfileFields(s){const r={},g=[];return s.forEach(u=>{const{tag:E,value:f}=u;if(E&&E.indexOf(rS)>-1&&g.push({key:E,value:f}),Ld.has(E)&&f!==void 0){const D=Ld.get(E);r[D]=f}}),g.length>0&&(r.profileCustomField=g),r}};const{generateProtocolData:YR}=Se.common;function VR(s){return mA(this,void 0,void 0,function*(){const r="profile.portrait_get_all",g={From_Account:ar(),UserItem:[]};s.forEach(D=>{g.UserItem.push({CustomSequence:0,StandardSequence:0,To_Account:D})});const u=YR({servcmd:r,data:g}),E=`${u.head.seq}${r}`,f=yield Se.channel.sendPacket(u,{requestId:E});if(f)return function(D){const{ActionStatus:v,ErrorCode:N,ErrorDisplay:P,ErrorInfo:W,UserProfileItem:nA}=D,EA=[];return nA.map(wA=>{const{To_Account:kA,CustomSequence:VA,ResultCode:LA,ResultInfo:SA,StandardSequence:PA,ProfileItem:zA}=wA,Ee=iE.parseProfileItem(zA);EA.push({userId:kA,customSequence:VA,resultCode:LA,resultInfo:SA,standardSequence:PA,profileItem:Ee})}),{actionStatus:v,errorCode:N,errorDisplay:P,errorInfo:W,userProfile:EA}}(f)})}function ZE(s){return uc.getFriendMap().has(s)}const{isEmpty:gS}=Se.utils;class cf{constructor(){this._strangerProfileMap=new Map}init(){Sr.getInstance().registerApi({apiName:"getMyProfile",context:this}),Sr.getInstance().registerApi({apiName:"getUserProfile",context:this}),Sr.getInstance().registerApi({apiName:"updateMyProfile",context:this}),this.createProfile=iE.createProfile.bind(iE);const{notificationCenter:r}=Se;Pn.getInstance().registerWorkflowStep(jt.SYNC_SERVER_INFO_AFTER_LOGIN,Xt.USER_PROFILE_SYNC,this.getMyProfileCacheThenServer,this),r.subscribeInnerEvent(lo.MESSAGE_PUSH,r.InnerEventSubType.PROFILE_MODIFIED,this._onProfileDataModify,this),r.subscribeInnerEvent(lo.LOGOUT,this._reset,this),r.subscribeInnerEvent(lo.DESTROY,this._dispose,this)}getMyProfile(){return mA(this,void 0,void 0,function*(){try{const r=ar(),g=yield VR([r]);if(g){const u=this._handleProfileFormResponse(g)[0];return uc.getUserProfileMap().set(r,u),{code:0,data:u}}}catch(r){const{errorCode:g,errorInfo:u}=r;throw new hn({functionName:"getMyProfile",code:g,message:u})}})}getUserProfile(r){return mA(this,void 0,void 0,function*(){try{let{userIDList:g}=r;const{userIdListToRequest:u,profileFromCache:E}=this._filterRequestAndCacheUsers(g);if(u.length===0)return{code:0,data:E,successLog:{message:`userIDList.length:${g.length}`}};u.length>xR&&(Se.ssoLog.warn("getUserProfile","userIdListToRequest.length > 1000"),u.length=xR);const{data:f,error:D}=yield this._batchFetchUserProfiles(u),v=u.length,N=f.length,P=v-N;if(E.length===0&&v===P&&!gS(D))throw D;if(C(f))return f.forEach(nA=>{ZE(nA.userID)?uc.getUserProfileMap().set(nA.userID,nA):this._strangerProfileMap.set(nA.userID,nA)}),{code:0,data:f.concat(E),successLog:{message:`getUserProfile query:${v} success:${N} fail:${P} from cache:${E.length}`}}}catch(g){throw new hn(g)}})}getMyProfileCacheThenServer(){return mA(this,void 0,void 0,function*(){const r=ar(),g=uc.getUserProfileMap().has(r);return g?{code:0,data:g}:this.getMyProfile()})}updateMyProfile(r){return mA(this,void 0,void 0,function*(){const g=ar(),u={};for(const f in r)r[f]!==void 0&&(u[f]=r[f]);const E=iE.convertParamsToProfile(u);try{yield function(P){return mA(this,void 0,void 0,function*(){const W="profile.portrait_set",nA=YR({servcmd:W,data:P}),EA=`${nA.head.seq}${W}`,wA=yield Se.channel.sendPacket(nA,{requestId:EA});if(wA){const{ActionStatus:kA,ErrorCode:VA,ErrorDisplay:LA,ErrorInfo:SA}=wA;return{actionStatus:kA,errorCode:VA,errorDisplay:LA,errorInfo:SA}}})}({From_Account:g,ProfileItem:E});const D=uc.getUserProfile(g);let v;v=D?Object.assign(Object.assign({},D),u):iE.createProfile(g,E);const N=!cg(D,v,["lastUpdatedTime"]);return v.lastUpdatedTime=Date.now(),uc.getUserProfileMap().set(g,v),N&&this._emitProfileUpdated(v),{code:0,data:v,successLog:{message:`profileArray: ${Se.utils.safeStringify(E)}`}}}catch(f){const{errorCode:D,errorInfo:v}=f;throw new hn({functionName:"updateMyProfile",code:D,message:v,moreMessage:`params: ${Se.utils.safeStringify(r)}`})}})}updateMyNickAndAvatar(r){return mA(this,void 0,void 0,function*(){const g=ar(),u=Date.now(),E=uc.getUserProfile(g);let f={};f=E?Object.assign(E,r):iE.createProfile(g,r),f.lastUpdatedTime=u,uc.getUserProfileMap().set(g,f)})}_onProfileDataModify(r){const g=function(f){const{Profile_Account:D,PushType:v,ProfileList:N}=f;return{userId:D,pushType:v,profileList:iE.parseProfileList(N)}}(r.ProfileDataMod[0]);if(gS(g))return;const{isProfileUpdated:u,profile:E}=this._handleProfileModified(g);u&&this._emitProfileUpdated(E)}_emitProfileUpdated(r){Se.notificationCenter.emitInnerEvent(lo.PROFILE_UPDATE,{name:lo.PROFILE_UPDATE,data:[r]}),Se.notificationCenter.emitOuterEvent(Rr.PROFILE_UPDATED,{name:Rr.PROFILE_UPDATED,data:[r]}),_B.updateConversation(`C2C${r?.userID}`,{userProfile:r})}_dispose(){const{notificationCenter:r}=Se;r.unSubscribeInnerEvent(lo.LOGOUT,this._reset,this),r.unSubscribeInnerEvent(lo.MESSAGE_PUSH,r.InnerEventSubType.PROFILE_MODIFIED,this._onProfileDataModify,this),r.unSubscribeInnerEvent(lo.DESTROY,this._dispose,this),this._reset()}_handleProfileModified(r){const{userId:g,profileList:u}=r,E=uc.getUserProfile(g);if(!(ar()===g||ZE(g)&&E))return{isProfileUpdated:!1,profile:null};const f=iE.normalizeProfileFields(u),D=Object.keys(f).some(W=>W===aS?this._isCustomFieldChanged(E.profileCustomField,f.profileCustomField):E[W]!==f[W]);if(!D)return{isProfileUpdated:!1,profile:E};const v=Date.now(),N=Object.prototype.hasOwnProperty.call(f,aS)?this._mergeProfileCustomField(E.profileCustomField,f.profileCustomField):E.profileCustomField,P=Object.assign(Object.assign(Object.assign({},E),f),{profileCustomField:N,lastUpdatedTime:v});return uc.getUserProfileMap().set(g,P),{isProfileUpdated:D,profile:P}}_filterRequestAndCacheUsers(r){const g=[],u=[];return r.forEach(E=>{const f=uc.getUserProfileMap().has(E);ZE(E)&&f?u.push(uc.getUserProfile(E)):this._isStrangerAndProfileValid(E)?u.push(this._strangerProfileMap.get(E)):g.push(E)}),{userIdListToRequest:g,profileFromCache:u}}_handleProfileFormResponse(r){const{userProfile:g}=r;if(!Array.isArray(g))return[];const u=g.filter(f=>f.userId!=="@TLS#NOT_FOUND"&&f.userId!==""&&!gS(f.profileItem)),E=Date.now();return u.map(f=>{const D=iE.createProfile(f.userId,f.profileItem);return D.lastUpdatedTime=E,D})}_isStrangerAndProfileValid(r){var g;if(!ZE(r)){const{lastUpdatedTime:u=0}=this._strangerProfileMap.get(r)||{},E=((g=Se.store.get("cloudConfig"))===null||g===void 0?void 0:g.stranger_profile_expiration_time)||6e5;return Date.now()-u<=E}return!1}_chunkUserIDList(r,g){return Array.from({length:Math.ceil(r.length/g)},(u,E)=>r.slice(E*g,(E+1)*g))}_batchFetchUserProfiles(r){return mA(this,void 0,void 0,function*(){const g=[],u=[];let E={};return this._chunkUserIDList(r,100).forEach(f=>{g.push(VR(f))}),(yield Promise.allSettled(g)).forEach(f=>{if(f.status==="fulfilled"){const D=f.value,v=this._handleProfileFormResponse(D);C(v)&&u.push(...v)}else if(f.status==="rejected"){const{code:D,message:v}=f.reason||{};E={errorCode:D,message:v}}}),{data:u,error:E}})}_isCustomFieldChanged(r=[],g=[]){if(!C(g)||g.length===0)return!1;if(!C(r)||r.length===0)return!0;const u=new Map(r.map(E=>[E.key,E.value]));return g.some(E=>u.get(E.key)!==E.value)}_mergeProfileCustomField(r=[],g=[]){const u=C(r)?r.map(E=>Object.assign({},E)):[];return C(g)&&g.length!==0&&g.forEach(({key:E,value:f})=>{const D=u.find(v=>v.key===E);D?D.value=f:u.push({key:E,value:f})}),u}_reset(){uc.getUserProfileMap().clear(),this._strangerProfileMap.clear()}}const lf=new Map,cS=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];for(let s=0,r=cS.length;s |