k2-im 0.2.9 → 0.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/modules/im-browser/src/http/requests/pull-offline-channel.js +1 -1
- package/dist/modules/im-core/src/mapping/merge.js +1 -1
- package/dist/modules/im-core/src/state/conversation-deletion-boundary.js +1 -0
- package/dist/modules/im-core/src/state/domain-state.js +1 -1
- package/dist/modules/im-sdk/src/runtime/recent-history-fetcher.js +1 -1
- package/dist/modules/im-sdk/src/runtime/session-runtime.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{encodeChannelSessionsRequest as e,decodeChannelSessionsResponse as n,encodeChannelMessagesRequest as o,decodeChannelMessagesResponse as t,decodeChannelMessagesResponseAsync as a,encodeChannelHistoryRequest as s,decodeChannelHistoryResponse as i}from"../../../../im-core/src/mapping/channel-offline-mapper.js";import{throwIfAborted as r}from"../../../../im-core/src/abort.js";import{
|
|
1
|
+
import{encodeChannelSessionsRequest as e,decodeChannelSessionsResponse as n,encodeChannelMessagesRequest as o,decodeChannelMessagesResponse as t,decodeChannelMessagesResponseAsync as a,encodeChannelHistoryRequest as s,decodeChannelHistoryResponse as i}from"../../../../im-core/src/mapping/channel-offline-mapper.js";import{throwIfAborted as r}from"../../../../im-core/src/abort.js";import{pullChannelMessagesRespCodec as c}from"../../../../im-protocol/src/protobuf/registry.js";import{compareBySortKey as d}from"../../../../im-core/src/mapping/sort.js";async function l(o){const t=[];for(const a of u(o.channels,20)){const s=e({userId:o.userId,clientType:o.clientType,channels:a}),i=await o.http.postProtobuf({path:"/channel/v1/sessions",body:s}),r={selfId:o.userId,keepRaw:o.keepRaw??!0,expectedChannelIds:a.map(e=>e.channelId),diagnostic:{endpoint:"sessions",surface:"session-last",...void 0===o.operationId?{}:{operationId:o.operationId},clientTypeHeader:o.clientType,clientTypeBody:o.clientType}},c=n(i,r);await f(o,c.sessions.filter(e=>"active"===e.channelState||0===e.raw?.status).map(e=>e.channelId)),t.push(...n(i,{...r,onContentDecodeError:o.onContentDecodeError,onReaction:o.onReaction},o.decryptDeps).sessions)}return t}async function p(e){const n=function(e){if(void 0===e)return 10;if(!Number.isInteger(e)||e<=0)throw new Error("channel offline: channelBatchSize 必须为正整数");return Math.min(e,10)}(e.channelBatchSize),s=e.messageCount??30,i=function(e){if(void 0===e)return 100;if(!Number.isInteger(e)||e<=0)throw new Error("channel offline: maxPagesPerBatch 必须为正整数");return e}(e.maxPagesPerBatch),c=/* @__PURE__ */new Map;for(const d of u(e.pulls,n)){let n=d.map(e=>({...e}));const l=new Map(n.map(e=>[e.channelId,/* @__PURE__ */new Set([e.baseIndex])]));let p=0;for(;n.length>0;){r(e.signal),await(e.beforePage?.()),r(e.signal);const d=e.isChannelCurrent;if(void 0!==d&&(n=n.filter(e=>d(e.channelId))),0===n.length)break;if(p>=i){const e=n.map(({channelId:e,baseIndex:n})=>`${e}@${n}`).join(",");throw new Error(`channel offline 分页超过 maxPagesPerBatch=${i}(active=${e})`)}p+=1;const h=o({userId:e.userId,clientType:e.clientType,pulls:n.map(e=>({channelId:e.channelId,baseIndex:e.baseIndex,direction:0,count:s,contain:0}))});r(e.signal);const I=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:h,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal),await f(e,n.map(e=>e.channelId)),r(e.signal);const u={selfId:e.userId,keepRaw:e.keepRaw??!0,expectedChannelIds:n.map(e=>e.channelId),diagnostic:{endpoint:"offlineMessages",surface:"offline-batch",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},g=void 0===e.yieldToEventLoop?t(I,u,e.decryptDeps):await a(I,u,e.decryptDeps,{yieldToEventLoop:e.yieldToEventLoop,signal:e.signal});r(e.signal);const y=[];for(const e of n){const n=g.nextBaseIndexes[e.channelId],o=g.messageCounts[e.channelId]??0;if(void 0===n)continue;const t=l.get(e.channelId);if(t.has(n))throw new Error(`channel offline cursor 循环(channelId=${e.channelId}, baseIndex=${n})`);o<s||(t.add(n),y.push({channelId:e.channelId,baseIndex:n}))}await(e.onPage?.(g.messages,{pulls:n.map(e=>({...e})),nextBaseIndexes:{...g.nextBaseIndexes},messageCounts:{...g.messageCounts}})),r(e.signal);for(const e of g.messages)c.has(e.id)||c.set(e.id,e);n=y}}return[...c.values()].sort(d)}async function h(e){r(e.signal);const n=e.count??30;if(!Number.isInteger(n)||n<=0)throw new Error("channel latest: count 必须为正整数");void 0!==e.decryptDeps&&void 0!==e.prepareKey&&await e.prepareKey(e.channelId);const s=o({userId:e.userId,clientType:e.clientType,pulls:[{channelId:e.channelId,baseIndex:"",direction:1,count:n,contain:0}]});r(e.signal);const i=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:s,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal);const d={selfId:e.userId,keepRaw:e.keepRaw??!0,expectedChannelIds:[e.channelId],diagnostic:{endpoint:"offlineMessages",surface:"history-page",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},l=void 0===e.yieldToEventLoop?{...t(i,d,e.decryptDeps),firstBaseIndex:c.decode(i).lsMessage[0]?.sIndex}:await a(i,d,e.decryptDeps,{yieldToEventLoop:e.yieldToEventLoop,signal:e.signal}),p=l.batchSize===n,h=l.firstBaseIndex;if(p&&("string"!=typeof h||""===h.trim()))throw new Error(`channel latest: 满页缺少向旧 cursor(channelId=${e.channelId})`);return{messages:l.messages,hasOlder:p,...p?{nextCursor:h}:{}}}async function I(e){r(e.signal);const n=e.count??30;void 0!==e.decryptDeps&&void 0!==e.prepareKey&&await e.prepareKey(e.channelId);const o=s({userId:e.userId,clientType:e.clientType,channelId:e.channelId,baseIndex:e.baseIndex,count:n,contain:e.contain??0});r(e.signal);const t=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:o,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal);return i(t,{selfId:e.userId,channelId:e.channelId,requestedBaseIndex:e.baseIndex,requestedCount:n,keepRaw:e.keepRaw??!0,diagnostic:{endpoint:"history",surface:"history-page",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},e.decryptDeps)}async function f(e,n){if(void 0===e.decryptDeps||void 0===e.prepareKeys)return;const o=[...new Set(n.filter(Boolean))];o.length>0&&await e.prepareKeys(o)}function u(e,n){const o=[];for(let t=0;t<e.length;t+=n)o.push(e.slice(t,t+n));return o}export{I as pullChannelHistory,h as pullChannelLatestPage,p as pullChannelOfflineMessages,l as pullChannelSessions};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{encodeConversationKey as e}from"../conversation-identity.js";import{mergeMessageReactions as t}from"../state/message-reactions.js";import{resolveMessageServerTime as i,computeMessageSortKey as o}from"./sort.js";const n={unread:0,delivered:1,read:2};function r(e,t){return n[t]>n[e]?t:e}function d(e,t){return"sent"===e||"sent"===t?"sent":t}function a(e,n,a=""){const s=i(e)??0,c=i(n)??0,y=c>=s,u=y?{...e,...n}:{...n,...e},l=!0===e.readBySelf||!0===n.readBySelf,v=Math.max(s,c),f=Math.min(e.createdAt,n.createdAt),p=void 0===e.extensions&&void 0===n.extensions?void 0:y?{...e.extensions,...n.extensions}:{...n.extensions,...e.extensions},b=o({...u,createdAt:f,serverTime:v,extensions:p}),g="failed"===e.status&&!1===e.failure?.retryable&&"sent"===n.status?"failed":d(e.status,n.status),h="failed"===g?n.failure??e.failure:void 0,T=t(e.reactions,n.reactions,a),N=!0===e.encryption.decryptFailed,U=!0===n.encryption.decryptFailed;let w=u.contentType,I=u.body,A=u.encryption,x=u.mention;N&&!U?(w=n.contentType,I=n.body,A=n.encryption,x=n.mention):!N&&U&&(w=e.contentType,I=e.body,A=e.encryption,x=e.mention),!0!==n.edited||U||(w=n.contentType,I=n.body,A=n.encryption,x=n.mention);const z=e.body.voice?.waveform??n.body.voice?.waveform;if(void 0!==I.voice&&void 0===I.voice.waveform&&void 0!==z&&(I={...I,voice:{...I.voice,waveform:z}}),void 0!==I.video&&void 0===I.video.size){const t=I.video,i=[e.body.video,n.body.video].find(e=>"bytes"===e?.sizeUnit&&void 0!==e.size&&e.url===t.url&&e.fileEncryptType===t.fileEncryptType&&e.md5===t.md5&&m(e.teaKey,t.teaKey)&&(void 0===t.unverifiedFileLength||t.unverifiedFileLength===String(e.size)));void 0!==i&&(I={...I,video:{...t,size:i.size,sizeUnit:"bytes"}})}const E=!0===e.edited||!0===n.edited,S=e.deletedForEveryone??n.deletedForEveryone;if(void 0!==S){const t={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:f,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,n.receipt),sortKey:b,extensions:p,recalled:void 0,deletedForEveryone:S,body:{},encryption:u.encryption};return delete t.reactions,t}const k=e.recalled??n.recalled;if(void 0!==k){const t={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:f,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,n.receipt),sortKey:b,extensions:p,recalled:k,body:{},encryption:u.encryption};return delete t.reactions,t}const K={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:f,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,n.receipt),sortKey:b,extensions:p,contentType:w,body:I,encryption:A,...void 0===T?{}:{reactions:T},...E?{edited:!0}:{}};return void 0!==x?K.mention=x:delete K.mention,K}function s(t,i=""){const o=/* @__PURE__ */new Map;for(const n of t){const t=JSON.stringify([e(n),n.id]),r=o.get(t);o.set(t,void 0===r?n:a(r,n,i))}return[...o.values()]}function c(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.fileName===t.fileName&&e.size===t.size&&e.extension===t.extension&&e.fileType===t.fileType&&e.mimeType===t.mimeType&&e.md5===t.md5&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}function y(e,t){return e===t||void 0!==e&&void 0!==t&&JSON.stringify(e)===JSON.stringify(t)}function u(e,t){return void 0===e||void 0===t?e===t:e.atAll===t.atAll&&e.atUserIds.length===t.atUserIds.length&&(!e.atUserIds.some((e,i)=>e!==t.atUserIds[i])&&function(e,t){if(void 0===e||void 0===t)return e===t;const i=Object.keys(e);return i.length===Object.keys(t).length&&i.every(i=>e[i]===t[i])}(e.atUsersName,t.atUsersName))}function m(e,t){return void 0===e||void 0===t?e===t:e.length===t.length&&e.every((e,i)=>e===t[i])}function l(e,t){return void 0===e||void 0===t?e===t:e.caption===t.caption&&e.items.length===t.items.length&&e.items.every((e,i)=>function(e,t){return e.kind===t.kind&&e.url===t.url&&e.width===t.width&&e.height===t.height&&e.durationMs===t.durationMs&&e.thumbUrl===t.thumbUrl&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.size===t.size&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)&&e.hd===t.hd}(e,t.items[i]))}function v(e,t){return e.id===t.id&&e.conversationId===t.conversationId&&e.conversationType===t.conversationType&&e.senderId===t.senderId&&e.contentType===t.contentType&&JSON.stringify(e.body.customerService)===JSON.stringify(t.body.customerService)&&e.body.text===t.body.text&&function(e,t){return void 0===e||void 0===t?e===t:e.eventType===t.eventType&&e.timelineVisibility===t.timelineVisibility&&e.operatorId===t.operatorId&&e.rawNotifyType===t.rawNotifyType&&e.errcode===t.errcode&&e.fallbackText===t.fallbackText&&function(e,t){return void 0===e||void 0===t?e===t:e.length===t.length&&e.every((e,i)=>e===t[i])}(e.targetUserIds,t.targetUserIds)&&y(e.payload,t.payload)&&y(e.action,t.action)&&y(e.pinnedMessageAction,t.pinnedMessageAction)}(e.body.system,t.body.system)&&e.createdAt===t.createdAt&&e.sortKey===t.sortKey&&e.status===t.status&&e.serverTime===t.serverTime&&e.receipt===t.receipt&&e.readBySelf===t.readBySelf&&e.refMessageId===t.refMessageId&&e.edited===t.edited&&(e.recalled?.by??"")===(t.recalled?.by??"")&&(e.recalled?.at??0)===(t.recalled?.at??0)&&(e.deletedForEveryone?.by??"")===(t.deletedForEveryone?.by??"")&&(e.deletedForEveryone?.at??0)===(t.deletedForEveryone?.at??0)&&(e.deletedForEveryone?.reason??"")===(t.deletedForEveryone?.reason??"")&&function(e,t){return void 0===e||void 0===t?e===t:e.version===t.version&&e.total===t.total&&e.currentUserEmoji===t.currentUserEmoji&&e.events.length===t.events.length&&e.events.every((e,i)=>{const o=t.events[i];return void 0!==o&&e.id===o.id&&e.senderId===o.senderId&&e.emoji===o.emoji&&e.action===o.action&&e.createdAt===o.createdAt})}(e.reactions,t.reactions)&&e.encryption.encrypted===t.encryption.encrypted&&e.encryption.scheme===t.encryption.scheme&&e.encryption.decryptFailed===t.encryption.decryptFailed&&u(e.mention,t.mention)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.imageType===t.imageType&&e.size===t.size&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}(e.body.image,t.body.image)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&e.duration===t.duration&&e.durationUnit===t.durationUnit&&e.sizeUnit===t.sizeUnit&&e.unverifiedFileLength===t.unverifiedFileLength&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.size===t.size&&e.describe===t.describe&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}(e.body.video,t.body.video)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.durationMs===t.durationMs&&e.size===t.size&&e.md5===t.md5&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)&&(e.waveform?.length??0)===(t.waveform?.length??0)}(e.body.voice,t.body.voice)&&c(e.body.file,t.body.file)&&(void 0===e.body.filesAlbum||void 0===t.body.filesAlbum?e.body.filesAlbum===t.body.filesAlbum:e.body.filesAlbum.caption===t.body.filesAlbum.caption&&e.body.filesAlbum.items.length===t.body.filesAlbum.items.length&&e.body.filesAlbum.items.every((e,i)=>c(e,t.body.filesAlbum.items[i])))&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&e.exprType===t.exprType&&e.imageType===t.imageType&&e.size===t.size&&e.describe===t.describe&&e.contentId===t.contentId&&e.packageName===t.packageName&&m(e.thumbData,t.thumbData)}(e.body.sticker,t.body.sticker)&&function(e,t){return void 0===e||void 0===t?e===t:e.targetId===t.targetId&&e.avatar===t.avatar&&e.displayName===t.displayName&&e.username===t.username&&e.gender===t.gender&&e.kind===t.kind&&e.rawKind===t.rawKind}(e.body.contact,t.body.contact)&&function(e,t){return void 0===e||void 0===t?e===t:e.appId===t.appId&&e.host===t.host&&e.developerId===t.developerId&&e.name===t.name&&e.icon===t.icon&&e.productId===t.productId&&e.isDynamicHost===t.isDynamicHost&&e.suffixAddress===t.suffixAddress&&e.showType===t.showType&&e.rawShowType===t.rawShowType&&e.description===t.description&&e.currencySource===t.currencySource&&e.currencyType===t.currencyType&&e.gamePath===t.gamePath&&e.subGameName===t.subGameName&&e.gamePreviewUrl===t.gamePreviewUrl&&e.gamePreviewWidth===t.gamePreviewWidth&&e.gamePreviewHeight===t.gamePreviewHeight}(e.body.miniProgram,t.body.miniProgram)&&function(e,t){return void 0===e||void 0===t?e===t:JSON.stringify(e.modules)===JSON.stringify(t.modules)&&JSON.stringify(e.commands)===JSON.stringify(t.commands)}(e.body.robot,t.body.robot)&&function(e,t){return void 0===e||void 0===t?e===t:e.gameType===t.gameType&&e.value===t.value}(e.body.game,t.body.game)&&function(e,t){return void 0===e||void 0===t?e===t:e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.fromUserName===t.fromUserName&&e.toUserName===t.toUserName&&e.amount===t.amount&&e.currencyType===t.currencyType&&e.status===t.status&&e.serialNumber===t.serialNumber&&e.remark===t.remark&&e.sessionType===t.sessionType&&e.transferTime===t.transferTime&&e.receiveTime===t.receiveTime&&e.returnTime===t.returnTime&&e.isRead===t.isRead&&e.transferMsgId===t.transferMsgId&&e.coinName===t.coinName&&e.coinIcon===t.coinIcon}(e.body.transfer,t.body.transfer)&&function(e,t){return void 0===e||void 0===t?e===t:e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.fromUserName===t.fromUserName&&e.toUserName===t.toUserName&&e.giftType===t.giftType&&e.giftName===t.giftName&&e.giftIcon===t.giftIcon&&e.explain===t.explain&&e.state===t.state&&e.serialNumber===t.serialNumber&&e.sessionType===t.sessionType&&e.initiateTime===t.initiateTime&&e.amount===t.amount&&e.receiveTime===t.receiveTime&&e.returnTime===t.returnTime&&e.isRead===t.isRead&&e.zhangCount===t.zhangCount&&e.benCount===t.benCount&&e.fissionNumber===t.fissionNumber}(e.body.gift,t.body.gift)&&function(e,t){return void 0===e||void 0===t?e===t:e.callKind===t.callKind&&e.outcome===t.outcome&&e.durationMs===t.durationMs&&e.outgoing===t.outgoing}(e.body.call,t.body.call)&&function(e,t){return void 0===e||void 0===t?e===t:e.packetId===t.packetId&&e.packetType===t.packetType&&e.amount===t.amount&&e.count===t.count&&e.showAmount===t.showAmount&&e.thunderRate===t.thunderRate&&e.isThunder===t.isThunder&&e.thunderNumber===t.thunderNumber&&e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.currencyType===t.currencyType&&e.coinName===t.coinName}(e.body.redPacket,t.body.redPacket)&&l(e.body.mediaAlbum,t.body.mediaAlbum)&&function(e,t){return void 0===e||void 0===t?e===t:e.reason===t.reason}(e.body.unknown,t.body.unknown)&&function(e,t){return void 0===e||void 0===t?e===t:e.code===t.code&&e.reason===t.reason}(e.failure,t.failure)}export{s as dedupeById,v as isMessageEqual,a as mergeMessage,r as mergeReceipt,d as mergeSendStatus};
|
|
1
|
+
import{encodeConversationKey as e}from"../conversation-identity.js";import{mergeMessageReactions as t}from"../state/message-reactions.js";import{resolveMessageServerTime as i,computeMessageSortKey as n}from"./sort.js";const o={unread:0,delivered:1,read:2};function r(e,t){return o[t]>o[e]?t:e}function d(e,t){return"sent"===e||"sent"===t?"sent":t}function a(e,o,a=""){const s=i(e)??0,c=i(o)??0,y=c>=s,u=y?{...e,...o}:{...o,...e},l=!0===e.readBySelf||!0===o.readBySelf,v=Math.max(s,c),p=Math.min(e.createdAt,o.createdAt),f=void 0===e.extensions&&void 0===o.extensions?void 0:y?{...e.extensions,...o.extensions}:{...o.extensions,...e.extensions},b=n({...u,createdAt:p,serverTime:v,extensions:f}),g="failed"===e.status&&!1===e.failure?.retryable&&"sent"===o.status?"failed":d(e.status,o.status),h="failed"===g?o.failure??e.failure:void 0,T=t(e.reactions,o.reactions,a),N=!0===e.encryption.decryptFailed,U=!0===o.encryption.decryptFailed;let w=u.contentType,I=u.body,A=u.encryption,x=u.mention;N&&!U?(w=o.contentType,I=o.body,A=o.encryption,x=o.mention):!N&&U&&(w=e.contentType,I=e.body,A=e.encryption,x=e.mention),!0!==o.edited||U||(w=o.contentType,I=o.body,A=o.encryption,x=o.mention);const z=e.body.voice?.waveform??o.body.voice?.waveform;if(void 0!==I.voice&&void 0===I.voice.waveform&&void 0!==z&&(I={...I,voice:{...I.voice,waveform:z}}),void 0!==I.video&&void 0===I.video.size){const t=I.video,i=[e.body.video,o.body.video].find(e=>"bytes"===e?.sizeUnit&&void 0!==e.size&&e.url===t.url&&e.fileEncryptType===t.fileEncryptType&&e.md5===t.md5&&m(e.teaKey,t.teaKey)&&(void 0===t.unverifiedFileLength||t.unverifiedFileLength===String(e.size)));void 0!==i&&(I={...I,video:{...t,size:i.size,sizeUnit:"bytes"}})}const E=!0===e.edited||!0===o.edited,S=e.deletedForEveryone??o.deletedForEveryone;if(void 0!==S){const t={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:p,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,o.receipt),sortKey:b,extensions:f,recalled:void 0,deletedForEveryone:S,body:{},encryption:u.encryption};return delete t.reactions,t}const k=e.recalled??o.recalled;if(void 0!==k){const t={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:p,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,o.receipt),sortKey:b,extensions:f,recalled:k,body:{},encryption:u.encryption};return delete t.reactions,t}const K={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:p,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,o.receipt),sortKey:b,extensions:f,contentType:w,body:I,encryption:A,...void 0===T?{}:{reactions:T},...E?{edited:!0}:{}};return void 0!==x?K.mention=x:delete K.mention,K}function s(t,i=""){const n=/* @__PURE__ */new Map;for(const o of t){const t=JSON.stringify([e(o),o.id]),r=n.get(t);n.set(t,void 0===r?o:a(r,o,i))}return[...n.values()]}function c(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.fileName===t.fileName&&e.size===t.size&&e.extension===t.extension&&e.fileType===t.fileType&&e.mimeType===t.mimeType&&e.md5===t.md5&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}function y(e,t){return e===t||void 0!==e&&void 0!==t&&JSON.stringify(e)===JSON.stringify(t)}function u(e,t){return void 0===e||void 0===t?e===t:e.atAll===t.atAll&&e.atUserIds.length===t.atUserIds.length&&(!e.atUserIds.some((e,i)=>e!==t.atUserIds[i])&&function(e,t){if(void 0===e||void 0===t)return e===t;const i=Object.keys(e);return i.length===Object.keys(t).length&&i.every(i=>e[i]===t[i])}(e.atUsersName,t.atUsersName))}function m(e,t){return void 0===e||void 0===t?e===t:e.length===t.length&&e.every((e,i)=>e===t[i])}function l(e,t){return void 0===e||void 0===t?e===t:e.caption===t.caption&&e.items.length===t.items.length&&e.items.every((e,i)=>function(e,t){return e.kind===t.kind&&e.url===t.url&&e.width===t.width&&e.height===t.height&&e.durationMs===t.durationMs&&e.thumbUrl===t.thumbUrl&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.size===t.size&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)&&e.hd===t.hd}(e,t.items[i]))}function v(e,t){return e.id===t.id&&e.conversationId===t.conversationId&&e.conversationType===t.conversationType&&e.senderId===t.senderId&&e.contentType===t.contentType&&JSON.stringify(e.body.customerService)===JSON.stringify(t.body.customerService)&&e.body.text===t.body.text&&function(e,t){return void 0===e||void 0===t?e===t:e.eventType===t.eventType&&e.timelineVisibility===t.timelineVisibility&&e.operatorId===t.operatorId&&e.rawNotifyType===t.rawNotifyType&&e.errcode===t.errcode&&e.fallbackText===t.fallbackText&&function(e,t){return void 0===e||void 0===t?e===t:e.length===t.length&&e.every((e,i)=>e===t[i])}(e.targetUserIds,t.targetUserIds)&&y(e.payload,t.payload)&&y(e.action,t.action)&&y(e.pinnedMessageAction,t.pinnedMessageAction)}(e.body.system,t.body.system)&&e.createdAt===t.createdAt&&e.sortKey===t.sortKey&&e.status===t.status&&e.serverTime===t.serverTime&&e.receipt===t.receipt&&e.readBySelf===t.readBySelf&&e.refMessageId===t.refMessageId&&e.edited===t.edited&&(e.recalled?.by??"")===(t.recalled?.by??"")&&(e.recalled?.at??0)===(t.recalled?.at??0)&&(e.deletedForEveryone?.by??"")===(t.deletedForEveryone?.by??"")&&(e.deletedForEveryone?.at??0)===(t.deletedForEveryone?.at??0)&&(e.deletedForEveryone?.reason??"")===(t.deletedForEveryone?.reason??"")&&function(e,t){return void 0===e||void 0===t?e===t:e.version===t.version&&e.total===t.total&&e.currentUserEmoji===t.currentUserEmoji&&e.events.length===t.events.length&&e.events.every((e,i)=>{const n=t.events[i];return void 0!==n&&e.id===n.id&&e.senderId===n.senderId&&e.emoji===n.emoji&&e.action===n.action&&e.createdAt===n.createdAt})}(e.reactions,t.reactions)&&e.encryption.encrypted===t.encryption.encrypted&&e.encryption.scheme===t.encryption.scheme&&e.encryption.decryptFailed===t.encryption.decryptFailed&&u(e.mention,t.mention)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.imageType===t.imageType&&e.size===t.size&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}(e.body.image,t.body.image)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&e.duration===t.duration&&e.durationUnit===t.durationUnit&&e.sizeUnit===t.sizeUnit&&e.unverifiedFileLength===t.unverifiedFileLength&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.size===t.size&&e.describe===t.describe&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}(e.body.video,t.body.video)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.durationMs===t.durationMs&&e.size===t.size&&e.md5===t.md5&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)&&(e.waveform?.length??0)===(t.waveform?.length??0)}(e.body.voice,t.body.voice)&&c(e.body.file,t.body.file)&&(void 0===e.body.filesAlbum||void 0===t.body.filesAlbum?e.body.filesAlbum===t.body.filesAlbum:e.body.filesAlbum.caption===t.body.filesAlbum.caption&&e.body.filesAlbum.items.length===t.body.filesAlbum.items.length&&e.body.filesAlbum.items.every((e,i)=>c(e,t.body.filesAlbum.items[i])))&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&e.exprType===t.exprType&&e.imageType===t.imageType&&e.size===t.size&&e.describe===t.describe&&e.contentId===t.contentId&&e.packageName===t.packageName&&m(e.thumbData,t.thumbData)}(e.body.sticker,t.body.sticker)&&function(e,t){return void 0===e||void 0===t?e===t:e.targetId===t.targetId&&e.avatar===t.avatar&&e.displayName===t.displayName&&e.username===t.username&&e.gender===t.gender&&e.kind===t.kind&&e.rawKind===t.rawKind}(e.body.contact,t.body.contact)&&function(e,t){return void 0===e||void 0===t?e===t:e.appId===t.appId&&e.host===t.host&&e.developerId===t.developerId&&e.name===t.name&&e.icon===t.icon&&e.productId===t.productId&&e.isDynamicHost===t.isDynamicHost&&e.suffixAddress===t.suffixAddress&&e.showType===t.showType&&e.rawShowType===t.rawShowType&&e.description===t.description&&e.currencySource===t.currencySource&&e.currencyType===t.currencyType&&e.gamePath===t.gamePath&&e.subGameName===t.subGameName&&e.gamePreviewUrl===t.gamePreviewUrl&&e.gamePreviewWidth===t.gamePreviewWidth&&e.gamePreviewHeight===t.gamePreviewHeight}(e.body.miniProgram,t.body.miniProgram)&&function(e,t){return void 0===e||void 0===t?e===t:JSON.stringify(e.modules)===JSON.stringify(t.modules)&&JSON.stringify(e.commands)===JSON.stringify(t.commands)}(e.body.robot,t.body.robot)&&function(e,t){return void 0===e||void 0===t?e===t:e.gameType===t.gameType&&e.value===t.value}(e.body.game,t.body.game)&&function(e,t){return void 0===e||void 0===t?e===t:e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.fromUserName===t.fromUserName&&e.toUserName===t.toUserName&&e.amount===t.amount&&e.currencyType===t.currencyType&&e.status===t.status&&e.serialNumber===t.serialNumber&&e.remark===t.remark&&e.sessionType===t.sessionType&&e.transferTime===t.transferTime&&e.receiveTime===t.receiveTime&&e.returnTime===t.returnTime&&e.isRead===t.isRead&&e.transferMsgId===t.transferMsgId&&e.coinName===t.coinName&&e.coinIcon===t.coinIcon}(e.body.transfer,t.body.transfer)&&function(e,t){return void 0===e||void 0===t?e===t:e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.fromUserName===t.fromUserName&&e.toUserName===t.toUserName&&e.giftType===t.giftType&&e.giftName===t.giftName&&e.giftIcon===t.giftIcon&&e.explain===t.explain&&e.state===t.state&&e.serialNumber===t.serialNumber&&e.sessionType===t.sessionType&&e.initiateTime===t.initiateTime&&e.amount===t.amount&&e.receiveTime===t.receiveTime&&e.returnTime===t.returnTime&&e.isRead===t.isRead&&e.zhangCount===t.zhangCount&&e.benCount===t.benCount&&e.fissionNumber===t.fissionNumber}(e.body.gift,t.body.gift)&&function(e,t){return void 0===e||void 0===t?e===t:e.callKind===t.callKind&&e.outcome===t.outcome&&e.durationMs===t.durationMs&&e.outgoing===t.outgoing}(e.body.call,t.body.call)&&function(e,t){return void 0===e||void 0===t?e===t:e.packetId===t.packetId&&e.packetType===t.packetType&&e.amount===t.amount&&e.count===t.count&&e.showAmount===t.showAmount&&e.thunderRate===t.thunderRate&&e.isThunder===t.isThunder&&e.thunderNumber===t.thunderNumber&&e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.currencyType===t.currencyType&&e.coinName===t.coinName}(e.body.redPacket,t.body.redPacket)&&l(e.body.mediaAlbum,t.body.mediaAlbum)&&function(e,t){return void 0===e||void 0===t?e===t:e.reason===t.reason}(e.body.unknown,t.body.unknown)&&function(e,t){return void 0===e||void 0===t?e===t:e.code===t.code&&e.reason===t.reason}(e.failure,t.failure)}function p(e,t){return v(e,{...e,body:t.body,contentType:t.contentType,encryption:t.encryption,edited:t.edited,recalled:t.recalled})}export{s as dedupeById,v as isMessageEqual,p as isMessageRecoveryBodyEqual,a as mergeMessage,r as mergeReceipt,d as mergeSendStatus};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{resolveMessageServerTime as e}from"../mapping/sort.js";function n(n,o,r){const s=n.conversationType;if("direct"!==s&&"group"!==s&&"channel"!==s)return;let i=r?.serverTime??0;const t=new Set(r?.messageIds);for(const n of o){const o=e(n);void 0===o||o<i||(o>i&&(i=o,t.clear()),t.add(n.id))}return 0===i?void 0:{kind:"conversation-deletion-boundary",conversation:{conversationType:s,conversationId:n.conversationId},serverTime:i,messageIds:[...t]}}function o(n,o){const r=e(n);return void 0!==r&&(r>o.serverTime||r===o.serverTime&&!o.messageIds.includes(n.id))}function r(n){if("object"!=typeof n||null===n)throw new Error("会话删除位置格式无效");const o=n,r=n,s="group-deletion-boundary"===r.kind?{conversationType:"group",conversationId:r.conversationId}:"conversation-deletion-boundary"===o.kind?o.conversation:void 0;if("object"!=typeof s||null===s||!["direct","group","channel"].includes(s.conversationType)||"string"!=typeof s.conversationId||""===s.conversationId||void 0===e(o)||!Array.isArray(o.messageIds)||0===o.messageIds.length||o.messageIds.some(e=>"string"!=typeof e||""===e))throw new Error("会话删除位置格式无效");return{kind:"conversation-deletion-boundary",conversation:{conversationType:s.conversationType,conversationId:s.conversationId},serverTime:o.serverTime,messageIds:[...o.messageIds]}}export{n as captureConversationDeletionBoundary,o as isAfterConversationDeletion,r as parseConversationDeletionBoundary};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{encodeConversationKey as e,conversationRefFromMessage as t,conversationRefFromPinnedMessage as n,conversationRefFromSession as o}from"../conversation-identity.js";import{compareChannelReadPosition as r,getChannelReadOrder as s}from"../mapping/channel-read-position.js";import{collectTransferStatusBySerialNumber as i,synchronizeTransferStatusMessages as a,applyTransferStatusToBody as c}from"../mapping/transfer-status.js";import{parseChannelSyncCheckpoint as d,channelSyncCheckpointKey as u}from"../sync/channel-sync-checkpoint.js";import{createDraftStore as l}from"./draft-store.js";import{rollbackMessageReaction as v,applyMessageReaction as f}from"./message-reactions.js";import{createMessageStore as p}from"./message-store.js";import{createMessageWindowStore as y}from"./message-window-store.js";import{createPinnedMessageStore as m}from"./pinned-message-store.js";import{createReadStore as g}from"./read-store.js";import{sortSessions as h}from"./session-sort.js";import{createSessionStore as C}from"./session-store.js";import{createImTextSearchMatcher as w,extractSearchText as I}from"../mapping/search-text.js";import{normalizeStoredMessageContent as T,LOCAL_MEDIA_ERROR_CODE as M,failInterruptedUpload as S}from"../mapping/stored-message.js";import{isMessageVisibleInTimeline as b,lastMessageSummaryEqual as U,sessionFromMessage as K}from"../mapping/session-mapper.js";import{isMessageEqual as E,dedupeById as A,mergeMessage as R}from"../mapping/merge.js";import{newClientMessageId as P}from"../mapping/message-id.js";import{computeSortKey as N,resolveMessageTimestamp as x,computeMessageSortKey as $}from"../mapping/sort.js";import{backfillGroupMention as D}from"../mapping/group-message-mapper.js";import{isConversationUnreadMessage as B}from"../mapping/unread-divider.js";function j(e){return"direct"===e||"robot"===e||"customerService"===e?"local":"server"}function F(e,t){const n=t?.includeMuted??!1;let o=0;for(const t of e)!n&&t.muted||(o+=t.unreadCount>0?t.unreadCount:!0===t.manuallyUnread?1:0);return o}const L="im:deleted-conversations",_="im:terminated-conversations",k="im:membership-reset-sort-keys",O="im:pending-message-reactions",H="im:transfer-status-records",z=["sendMessages","mentionAll","editProfile","manageMembers","manageAdmins","moderateMessages","manageMute","dismissChannel","transferOwnership"];function q(e,t){return e===t||void 0!==e&&void 0!==t&&z.every(n=>e[n]===t[n])}function G(e,t){return e===t||void 0!==e&&void 0!==t&&e.role===t.role&&e.baseState===t.baseState&&e.resolvedState===t.resolvedState&&e.allMembersMuted===t.allMembersMuted&&e.currentUserMuted===t.currentUserMuted&&e.mutePeriod===t.mutePeriod}function W(e,t){return e.id===t.id&&e.type===t.type&&e.title===t.title&&e.avatar===t.avatar&&U(e.lastMessageSummary,t.lastMessageSummary)&&e.timestamp===t.timestamp&&e.unreadCount===t.unreadCount&&(e.manuallyUnread??!1)===(t.manuallyUnread??!1)&&(e.mentionUnreadCount??0)===(t.mentionUnreadCount??0)&&e.pinned===t.pinned&&e.muted===t.muted&&e.topTime===t.topTime&&e.lastMessageSendState===t.lastMessageSendState&&e.lastMessageReceipt===t.lastMessageReceipt&&e.readCursor===t.readCursor&&e.groupState===t.groupState&&e.channelState===t.channelState&&q(e.channelPermissions,t.channelPermissions)&&G(e.channelAccessSnapshot,t.channelAccessSnapshot)&&e.sendDisabledReason===t.sendDisabledReason}function J(U){const z=p({getSelfId:U.getSelfId}),J=/* @__PURE__ */new Map,Q=/* @__PURE__ */new Map,V=C(),X=C(),Y=g(),Z=l(),ee=m(),te=/* @__PURE__ */new Map,ne=/* @__PURE__ */new Map;let oe=0;function re(e){ne.set(e,++oe)}let se=1;const ie=/* @__PURE__ */new Set,ae=/* @__PURE__ */new Set,ce=/* @__PURE__ */new Map,{storage:de}=U;let ue=Promise.resolve();const le=/* @__PURE__ */new Map,ve=/* @__PURE__ */new Map,fe=/* @__PURE__ */new Map;let pe=0;const ye=U.unreadMode??j,me=/* @__PURE__ */new Set;function ge(e={}){const t=y({storage:de,loadOlderFromRemote:U.loadOlderFromRemote,loadNewerFromRemote:U.loadNewerFromRemote,shouldIncludeMessage:qe,normalizeStoredUpload:qt,...e});return me.add(t),t}const he=ge();function Ce(e,t){let n;for(const o of me){const r=o.list().find(n=>n.id===e&&n.conversationId===t);if(void 0!==r){if(void 0!==n&&n.conversationType!==r.conversationType)throw new Error(`裸 conversationId 存在多类型消息歧义:${t}`);n=r}}return n}function we(e,t){const n=z.get(t,e);if(n?.conversationId===e.conversationId&&n.conversationType===e.conversationType)return n;for(const n of me){const o=n.list().find(n=>n.id===t&&n.conversationId===e.conversationId&&n.conversationType===e.conversationType);if(void 0!==o)return o}}function Ie(e,n){const o=we(t(e),e.id);void 0===o||z.has(e.id,e)||z.upsert(o);const r=z.upsert(e,n);return{...r,previous:o,changed:void 0===o?r.changed:!E(o,r.message)}}function Te(e){const t=new Map(z.getByConversation(e).map(e=>[e.id,e]));for(const n of me)if(Me(n,e))for(const o of n.list())o.conversationType!==e.conversationType||o.conversationId!==e.conversationId||t.has(o.id)||t.set(o.id,o);return[...t.values()].sort((e,t)=>e.sortKey.localeCompare(t.sortKey))}function Me(t,n){const o=t.info();return void 0===o.conversation?o.conversationId===n.conversationId:e(o.conversation)===e(n)}let Se=!1;function be(t){return`${e(t.conversation)}\0${t.parentMessageId}`}function Ue(){if(void 0===de||Se)return;const e=[...J.values()].flat();ft(()=>de.setMeta(O,e)).catch(e=>Je("保存待处理 Reaction 失败",e))}function Ke(e){const t=e.body.transfer;if("transfer"!==e.contentType||void 0===t)return e;const n=Q.get(t.serialNumber);if(void 0===n||0!==t.status&&0===n.status)return e;const o={...t,status:n.status,...1===n.status&&void 0!==n.occurredTime?{receiveTime:n.occurredTime}:{},...2===n.status||3===n.status?{returnTime:n.occurredTime??t.returnTime}:{}};return t.status===o.status&&t.receiveTime===o.receiveTime&&t.returnTime===o.returnTime&&t.isRead===o.isRead?e:{...e,body:{transfer:c(t,o)}}}function Ee(t,n){const o=`${e(t)}\0${n}`;return!!J.delete(o)&&(Ue(),!0)}function Ae(t){const n=`${e(t)}\0`;let o=!1;for(const e of J.keys())e.startsWith(n)&&(J.delete(e),o=!0);return o&&Ue(),o}function Re(e,t){const n=we(e.conversation,e.parentMessageId);if(void 0===n){const t=be(e),n=J.get(t)??[];return n.some(t=>t.id===e.id)?"duplicate":(J.set(t,[...n,e]),Ue(),"pending")}if(at(n),void 0!==n.recalled||void 0!==n.deletedForEveryone)return"duplicate";const o=f(n.reactions,e,U.getSelfId?.()??"");return o===n.reactions?"duplicate":(Jt([{...n,reactions:o}],t),"applied")}function Pe(n,o){const r=t(n),s=`${e(r)}\0${n.id}`,i=J.get(s);if(void 0!==i){J.delete(s),Ue();for(const e of i)Re(e,o)}}function Ne(e){for(const t of[...J.values()]){const n=t[0];if(void 0===n)continue;const o=we(n.conversation,n.parentMessageId);void 0!==o&&(void 0!==o.recalled||void 0!==o.deletedForEveryone?Ee(n.conversation,n.parentMessageId):Pe(o,e))}}let xe=0;const $e=/* @__PURE__ */new Map,De=/* @__PURE__ */new Map,Be=/* @__PURE__ */new Map,je=/* @__PURE__ */new Map,Fe=/* @__PURE__ */new Map;function Le(t){return e(t)}function _e(e){return ke(e)||ie.has(Le(e))||ie.has(e.conversationId)}function ke(e){return ae.has(Le(e))||ae.has(e.conversationId)}function Oe(e){const t=ie.delete(Le(e)),n=ie.delete(e.conversationId);return t||n}function He(e){const t=Oe(e),n=ae.delete(Le(e)),o=ae.delete(e.conversationId);return{deleted:t,terminal:n||o}}function ze(e,t){if(""===t||"system"!==e.contentType)return!1;const n=e.body.system;return!0===n?.targetUserIds?.includes(t)&&("group"===e.conversationType?"group_member_joined"===n.eventType||"group_member_invited"===n.eventType:"channel"===e.conversationType&&("channel_member_joined"===n.eventType||"channel_member_invited"===n.eventType||"channel_created"===n.eventType))}function qe(n){const o=t(n);if(ke(o)||_e(o)&&void 0===X.get(o))return!1;if("group"!==o.conversationType)return!0;const r=ce.get(e(o));return void 0===r||n.sortKey>=r}function Ge(t){const n=e(t),o=(De.get(n)??0)+1;return De.set(n,o),o}function We(t){const n=e(t),o=($e.get(n)??0)+1;return $e.set(n,o),o}function Je(e,t){U.emitter.emit({type:"error",error:{scope:"storage",message:e,cause:t}})}function Qe(e){U.emitter.emit({type:"session:updated",session:e,conversation:o(e)})}const Ve=/* @__PURE__ */new Set,Xe=/* @__PURE__ */new Set,Ye=/* @__PURE__ */new Map,Ze=/* @__PURE__ */new Map;let et=0,tt=Promise.resolve(),nt=0,ot=Promise.resolve(),rt=0;const st=/* @__PURE__ */new Map;let it;function at(n){const o=e(t(n));it?.keys.has(o)&&it.messages.set(`${o}\0${n.id}`,n)}function ct(t){const n=e(t);st.set(n,(st.get(n)??0)+1)}function dt(e){return it?.writes.push(e),void 0!==it&&e.catch(()=>{}),e}async function ut(e){const t=(await Promise.allSettled(e)).find(e=>"rejected"===e.status);if(void 0!==t)throw t.reason}function lt(e){const t=ot.then(e);return ot=t.then(()=>{},()=>{}),t}function vt(t,n){const o=rt,r=t.map(t=>[e(t),st.get(e(t))??0]);return()=>o===rt&&n()&&r.every(([e,t])=>(st.get(e)??0)===t)}function ft(e){const t=0===nt?(()=>{try{return e()}catch(e){return Promise.reject(e)}})():tt.then(e),n=t.then(()=>{},()=>{});Ve.add(n),n.finally(()=>Ve.delete(n));for(const e of Xe)e.writes.push(t);return dt(t)}function pt(e){nt+=1;const t=Promise.all([...Ve]),n=tt.then(()=>t).then(e);return tt=n.then(()=>{},()=>{}),tt.finally(()=>{nt-=1}),dt(n)}function yt(e){const t=e.body.system;if(void 0===t?.pinnedMessageAction)return e;const{pinnedMessageAction:n,...o}=t;return{...e,body:{...e.body,system:o}}}function mt(n){if(void 0!==de&&!Se&&0!==n.length){for(const o of Xe)for(const r of n)o.messages.add(`${e(t(r))}\0${r.id}`);ft(()=>de.saveMessages(n.map(yt))).catch(e=>Je("消息落盘失败",e))}}function gt(e){const{lastMessageSendState:t,manuallyUnread:n,...o}=e;return o}function ht(t){if(void 0!==de&&!Se){for(const n of Xe)n.sessions.add(e(o(t)));ft(()=>de.saveSessions([gt(t)])).catch(e=>Je("会话落盘失败",e))}}function Ct(e,t,n){if(void 0===de||Se)return;const o=++et;Ye.set(e,{version:o,persist:()=>Ct(e,t,n)});for(const t of Xe)t.metadata.add(e);const r=Ze.get(e),s=ft(()=>void 0===r?de.setMeta(e,t()):r.then(()=>de.setMeta(e,t()))),i=s.then(()=>{},()=>{});Ze.set(e,i),i.then(()=>{Ze.get(e)===i&&Ze.delete(e)}),s.then(()=>{Ye.get(e)?.version===o&&Ye.delete(e)},e=>Je(n,e))}function wt(){Ct(L,()=>[...ie],"删除会话标记保存失败")}function It(){Ct(_,()=>[...ae],"成员资格终止标记保存失败")}function Tt(){Ct(k,()=>[...ce.entries()],"重新入群的历史起点保存失败")}function Mt(t){if(void 0!==de&&!Se){for(const n of Xe)void 0!==t.conversationType&&n.reads.add(e({conversationType:t.conversationType,conversationId:t.conversationId}));ft(()=>de.saveReadState(t)).catch(e=>Je("已读态落盘失败",e))}}function St(t){if(e(t),"supergroup"===t.conversationType)throw new Error("supergroup 草稿未实现,不得 fallback 到其他会话类型")}function bt(e){return St(e),Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function Ut(e,t,n){if(St(e),"string"!=typeof t.text)throw new TypeError("草稿 text 必须是字符串");if(void 0!==t.attachments&&t.attachments.length>0)throw new Error("草稿附件尚未支持:attachments 只接受空集合");if(void 0!==t.mentions&&!Array.isArray(t.mentions))throw new TypeError("草稿 mentions 必须是数组");const o=(t.mentions??[]).map(e=>{if("string"!=typeof e.userId||""===e.userId.trim()||"string"!=typeof e.displayName)throw new TypeError("草稿 mention 必须包含非空 userId 与字符串 displayName");return Object.freeze({userId:e.userId,displayName:e.displayName})}),r=Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId});return Object.freeze({ref:r,text:t.text,mentions:Object.freeze(o),...void 0===t.replyToMessageId?{}:{replyToMessageId:t.replyToMessageId},attachments:Object.freeze([]),updatedAt:n})}function Kt(e,t){return e.text===t.text&&e.replyToMessageId===t.replyToMessageId&&e.mentions.length===t.mentions.length&&e.mentions.every((e,n)=>{const o=t.mentions[n];return void 0!==o&&e.userId===o.userId&&e.displayName===o.displayName})}function Et(t,n){St(t);const o=e(t),r=(le.get(o)??Promise.resolve()).catch(()=>{}).then(n),s=r.then(()=>{},()=>{});return le.set(o,s),s.finally(()=>{le.get(o)===s&&le.delete(o)}),r}async function At(t,n){const o=bt(t),r=e(o);if(void 0!==n&&(!Number.isFinite(n)||n<0))throw new Error(`草稿 expectedUpdatedAt 非法:${n}`);const s=pe,i=fe.get(r)??0;return await Et(o,async()=>{const e=Z.get(o);if(null===e||void 0!==n&&e.updatedAt!==n)return!1;if(void 0!==de&&await de.deleteDraft(o),s!==pe||i!==(fe.get(r)??0))throw new Error("草稿状态已失效,拒绝过期清理回灌内存");return Z.delete(o),U.emitter.emit({type:"draft:cleared",conversation:o}),!0})}function Rt(t,n,o,r,s){const i=cn(t);if(void 0===i)return;const a={...i,...void 0===s||s===De.get(e(t))?{title:n,avatar:o??i.avatar}:{},...void 0!==r?{muted:r}:{}};W(i,a)||dn(a)}function Pt(t,n){const o=U.profile;if(void 0===o)return Promise.resolve(null);const r={conversationType:"direct",conversationId:t},s=e(r),i=Fe.get(t);if(!0!==n?.forceRefresh&&void 0!==i&&i.revision===$e.get(s))return i.promise;const a=xe,c=We(r),d=Ge(r),u=(async()=>{const e=await o.getUserProfile(t,n);if(null!==e&&e.id===t&&a===xe&&c===$e.get(s)){const n=e.remark?.trim()?e.remark:e.nickname||t;Rt(r,n,e.avatar??"",e.muted,d)}return e})().finally(()=>{Fe.get(t)?.promise===u&&Fe.delete(t)});return Fe.set(t,{revision:c,promise:u}),u}async function Nt(t,n){const{conversationId:o,conversationType:r}=t;if("direct"===r){try{await Pt(o,!0===n?.force?{forceRefresh:!0}:void 0)}catch(e){U.emitter.emit({type:"error",error:{scope:"http",message:"会话资料补齐失败",cause:e}})}return!1}const s=e(t),i=!0===n?.force;if(!i&&(je.has(s)||Be.has(s)))return!1;const a=xe,c=We(t),d=Ge(t);i&&je.set(s,c);const{profile:u,channelProfile:l}=U,v=i?{forceRefresh:!0}:void 0;try{if("group"===r){if(void 0===u)return!1;const e=await u.getGroupProfile(o,v);if(a!==xe||c!==$e.get(s))return!1;null!==e&&(Rt(t,e.name,e.avatar??"",e.muted,d),3===e.status&&an({conversationType:"group",conversationId:o},"group_dismissed"),i&&U.emitter.emit({type:"profile:updated",profileType:"group",id:o}))}else if("channel"===r){if(void 0===l)return!1;const e=await l.getProfile(o,v);if(a!==xe||c!==$e.get(s))return!1;if(null!==e){Rt(t,e.name,e.avatar??"",e.muted,d);const r=cn(t)?.channelState,s="left"===r||"removed"===r||"dismissed"===r,a="left"===e.channelState||"removed"===e.channelState||"dismissed"===e.channelState;if(!0===n?.allowChannelRecovery&&s&&"dismissed"!==r&&"active"===e.channelState)return on(o,"active",void 0,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}}),i&&U.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}}),!0;const c=s&&(!a||"dismissed"===r||"dismissed"!==e.channelState);if(a&&!c)return an({conversationType:"channel",conversationId:o},`channel_${e.channelState}`),i&&U.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}}),!1;if(!c){const t=e.permissions.sendMessages?void 0:`channel_${e.channelState}`;on(o,e.channelState,t,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}})}i&&U.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}})}}return!1}catch(e){return U.emitter.emit({type:"error",error:{scope:"http",message:"会话资料补齐失败",cause:e}}),!1}finally{i&&a===xe&&je.get(s)===c&&je.delete(s)}}function xt(e){return B(e,U.getSelfId?.()??"")}function $t(e){const t=Y.get(e);if(void 0===t||""===t.readCursor)return;const n="string"==typeof e?t.conversationType:e.conversationType;if("channel"===n){const o={conversationType:n,conversationId:"string"==typeof e?e:e.conversationId};return Te(o).find(e=>e.extensions?.historyCursor===t.readCursor)?.sortKey??t.readCursorSortKey}const o="string"==typeof e?z.getByConversation(e).find(e=>e.id===t.readCursor):we(e,t.readCursor);return o?.sortKey??t.readCursorSortKey}function Dt(e,t){let n=0;for(const o of z.getByConversation(e))b(o)&&xt(o)&&(void 0===t||o.sortKey>t)&&(n+=1);return n}function Bt(e){const t=U.getSelfId?.();if(void 0===t||""===t||e.senderId===t)return!1;const{mention:n}=e;return void 0!==n&&(n.atAll||n.atUserIds.includes(t))}function jt(e,t){let n=0;for(const o of z.getByConversation(e))!0!==o.readBySelf&&Bt(o)&&(void 0===t||o.sortKey>t)&&(n+=1);return n}function Ft(e,t=!0){const n=void 0===e.conversationType?V.get(e.conversationId):void 0,o=void 0===e.conversationType&&void 0!==n?{...e,conversationType:n.type}:e,r=void 0===o.conversationType?o.conversationId:{conversationType:o.conversationType,conversationId:o.conversationId},s=Y.get(r);if("channel"===o.conversationType&&re(o.conversationId),Y.set(o),t&&Mt(o),void 0===s||s.readCursor!==o.readCursor||s.readCursorSortKey!==o.readCursorSortKey||s.unreadCount!==o.unreadCount||(s.manuallyUnread??!1)!==(o.manuallyUnread??!1)){if(void 0===o.conversationType)return void U.emitter.emit({type:"error",error:{scope:"storage",message:`已读状态缺少复合身份,拒绝发布 read:updated(conversationId=${o.conversationId})`}});U.emitter.emit({type:"read:updated",conversationId:o.conversationId,conversation:{conversationType:o.conversationType,conversationId:o.conversationId},readCursor:o.readCursor,unreadCount:o.unreadCount,...!0===o.manuallyUnread?{manuallyUnread:!0}:{}})}}function Lt(n,o){if(void 0===n||n.sortKey===o.sortKey)return;const r=t(o),s=Y.get(r),i="channel"===o.conversationType?o.extensions?.historyCursor:void 0,a="direct"===o.conversationType||"group"===o.conversationType||"robot"===o.conversationType||"customerService"===o.conversationType;void 0!==s&&(a&&s.readCursor===o.id||"string"==typeof i&&""!==i&&s.readCursor===i||s.readCursorSortKey===n.sortKey)&&Ft({...s,readCursorSortKey:o.sortKey});const c=e(r);"group"===o.conversationType&&ce.get(c)===n.sortKey&&(ce.set(c,o.sortKey),Tt())}function _t(e){const t=e?.channelAccessSnapshot?.role;return"owner"===t||"admin"===t}function kt(e,t,n,o,r=cn(e)){const s=o??Y.get(e);if(void 0===t){if(void 0===r){if("string"==typeof e||void 0===s||s.unreadCount<=0)return;return{id:e.conversationId,type:e.conversationType,title:"",lastMessagePreview:"",timestamp:0,unreadCount:s.unreadCount,mentionUnreadCount:s.mentionUnreadCount,readCursor:s.readCursor,pinned:!1,muted:!1}}const t={...r,..."clear"===n?{lastMessagePreview:"",timestamp:0}:{},...void 0===s?{}:{unreadCount:s.unreadCount,manuallyUnread:s.manuallyUnread,mentionUnreadCount:s.mentionUnreadCount,readCursor:s.readCursor||r.readCursor}};return"clear"===n&&(delete t.lastMessageSummary,delete t.lastMessageSenderId,delete t.lastMessageSystemEvent,delete t.lastMessageSystemTargetsSelf,delete t.lastMessageMention,delete t.lastMessageRecalled,delete t.lastMessageDeletedForEveryone,delete t.lastMessageSendState,delete t.lastMessageReceipt),t}const i=s?.unreadCount??r?.unreadCount??0,a=void 0===s?r?.manuallyUnread:s.manuallyUnread,c=K(t,{unreadCount:i,mentionUnreadCount:s?.mentionUnreadCount??r?.mentionUnreadCount??0,selfId:U.getSelfId?.(),showChannelModerationDeleted:_t(r)});return void 0===r?{...c,...void 0===a?{}:{manuallyUnread:a},readCursor:(s?.readCursor??"")||c.readCursor}:{...c,title:r.title||c.title,avatar:r.avatar??c.avatar,pinned:r.pinned,muted:r.muted,topTime:r.topTime,...void 0===a?{}:{manuallyUnread:a},readCursor:(s?.readCursor??"")||r.readCursor,groupState:r.groupState,channelState:r.channelState,channelPermissions:r.channelPermissions,channelAccessSnapshot:r.channelAccessSnapshot,sendDisabledReason:r.sendDisabledReason}}function Ot(e,t){if(void 0===e)return;const n=V.get({conversationType:e.type,conversationId:e.id});void 0!==n&&W(n,e)||(V.set(e),X.delete({conversationType:e.type,conversationId:e.id}),Qe(e),t&&ht(e),""===e.title&&Nt({conversationType:e.type,conversationId:e.id}))}function Ht(e,t,n="preserve",o=cn(e)){const r=t.findLast(e=>function(e,t){return!!b(e)&&("channel"!==e.conversationType||void 0===e.deletedForEveryone||_t(t))}(e,o)),s="string"==typeof e?o?.type:e.conversationType;return kt(e,r,void 0===r&&"channel"===s&&!_t(o)&&(t.some(e=>void 0!==e.deletedForEveryone)||"channel-moderation-deleted"===o?.lastMessageSummary?.kind||void 0!==o?.lastMessageDeletedForEveryone)?"clear":n,void 0,o)}function zt(e,t=!1){(t||void 0!==V.get(e))&&Ot(Ht(e,z.getByConversation(e)),!0)}function qt(e){if("uploading"!==e.status&&("failed"!==e.status||e.failure?.code!==M))return e;const t=z.get(e.id,e);return void 0!==t&&t.conversationType===e.conversationType&&t.conversationId===e.conversationId?t:S(T(e))}function Gt(n,o=()=>!0){const r=[],s=A(n,U.getSelfId?.()??"").map(e=>{const t=qt(e);let n={...t,sortKey:$(t)};if(n=T(n),"group"===n.conversationType&&"text"===n.contentType){const e=D(n.body.text??"",n.mention);void 0!==e&&(n.mention=e)}return Ke(n)}),i=/* @__PURE__ */new Map;for(const n of s){if("transfer"!==n.contentType||void 0===n.body.transfer)continue;const o=t(n);i.set(e(o),o)}const c=[...i.values()].flatMap(e=>Te(e)),d=a(c,s),u=new Set(s.map(e=>e.id));for(const e of d){if(!o())break;const{previous:n,message:s,isNew:i,changed:a}=Ie(e);if(Lt(n,s),void 0!==n&&a)for(const e of me){if(!o())return r;e.list().some(e=>e.id===s.id&&e.conversationType===s.conversationType&&e.conversationId===s.conversationId)&&e.applyIncoming([s])}if(!o())return r;i?U.emitter.emit({type:"message:received",message:s,conversation:t(s),source:"offline",channelLifecycleEffects:!1}):a&&U.emitter.emit({type:"message:updated",message:s,conversation:t(s),source:"offline",channelLifecycleEffects:!1}),u.has(s.id)&&r.push(s)}return r}function Wt(e){const t=qt(e);let n={...t,sortKey:$(t)};if(n=T(n),"group"===n.conversationType&&"text"===n.contentType){const e=D(n.body.text??"",n.mention);void 0!==e&&(n.mention=e)}return Ke(n)}function Jt(n,o,r={}){const s=U.getSelfId?.()??"";if("live"===o){let i=!1,a=!1;for(const c of n){const n=t(c);if(ze(c,s)){const t=He(n);t.deleted&&(i=!0),t.terminal&&("group"===n.conversationType?(ce.set(e(n),c.sortKey),Tt()):"channel"===n.conversationType&&ce.delete(e(n)),U.diagnostics?.record("info","core","conversation","membership-termination-cleared",()=>({conversation:n,data:{source:o,eventType:c.body.system?.eventType,groupHistoryLowerBoundApplied:"group"===n.conversationType}})),a=!0)}else""!==s&&c.senderId===s&&!0!==r.newOutgoing||ke(n)||!Oe(n)||(i=!0)}i&&wt(),a&&It()}const i=!0===U.diagnostics?.isEnabled("debug","conversation")?/* @__PURE__ */new Map:void 0,c=(n,o)=>{if(void 0===i)return;const r=t(n),s=e(r),a=i.get(s)??{ref:r,tombstone:0,groupLowerBound:0};"tombstone"===o?a.tombstone+=1:a.groupLowerBound+=1,i.set(s,a)},d=ie.size>0||ae.size>0?n.filter(e=>{const n=t(e),o=!_e(n)||!0===r.backfillOnly&&void 0!==X.get(n)&&!ke(n);return o||c(e,"tombstone"),o}):n,u=function(n){const o=/* @__PURE__ */new Map;if(0===ce.size)return o;for(const r of A(n,U.getSelfId?.()??"")){if("group"!==r.conversationType)continue;const n=t(r),s=e(n),i=ce.get(s);if(void 0===i)continue;const a=we(n,r.id);if(void 0===a||a.sortKey!==i)continue;const c=R(a,r,U.getSelfId?.()??"");c.sortKey!==i&&(ce.set(s,c.sortKey),o.set(s,c.id))}return o.size>0&&Tt(),o}(d),l=n=>u.get(e(t(n)))===n.id,v=ce.size>0?d.filter(e=>{const t=l(e)||qe(e);return t||c(e,"groupLowerBound"),t}):d,f=0===u.size?v:[...v.filter(l),...v.filter(e=>!l(e))];for(const e of i?.values()??[])U.diagnostics?.record("debug","core","conversation","membership-filter-dropped",()=>({conversation:e.ref,data:{source:o,tombstoneDroppedCount:e.tombstone,groupHistoryLowerBoundDroppedCount:e.groupLowerBound}}));const p=/* @__PURE__ */new Map,y=/* @__PURE__ */new Map,m=/* @__PURE__ */new Map,g=/* @__PURE__ */new Map,h=/* @__PURE__ */new Map,C=/* @__PURE__ */new Set,w=A(f,s).map(Ke),I=/* @__PURE__ */new Map;for(const n of w){if("transfer"!==n.contentType||void 0===n.body.transfer)continue;const o=t(n);I.set(e(o),o)}const T=[...I.values()].flatMap(e=>Te(e)),M=a(T,w),S=[],K=[];for(const n of M){if("channel"===n.conversationType&&it?.keys.has(e(t(n)))&&!it.current())continue;const{previous:s,message:i,isNew:a,changed:c}=Ie(n,{authoritativeFailure:!0===r.authoritativeOutboxFailure});if(at(i),!0===r.backfillOnly&&!0===r.refreshSessionSummary){const n=t(i);p.set(e(n),n)}if(!a&&!c)continue;Lt(s,i);for(const e of me)e.applyIncoming([i]);a?U.emitter.emit({type:"message:received",message:i,conversation:t(i),source:o,channelLifecycleEffects:!0===r.applyChannelLifecycleEffects}):U.emitter.emit({type:"message:updated",message:i,conversation:t(i),source:o,channelLifecycleEffects:!0===r.applyChannelLifecycleEffects});const d=t(i);if(!a&&void 0!==s&&!0!==s.readBySelf&&!0===i.readBySelf){const t=$t(d),n=void 0===t||s.sortKey>t,o=e(d);n&&b(s)&&xt(s)&&void 0===s.recalled&&void 0===s.deletedForEveryone&&m.set(o,(m.get(o)??0)-1),n&&Bt(s)&&void 0===s.recalled&&void 0===s.deletedForEveryone&&h.set(o,(h.get(o)??0)-1)}ke(d)||(S.push(i),p.set(e(d),d),a&&!0!==r.backfillOnly&&K.push(i))}const E=/* @__PURE__ */new Map;for(const n of K){const r=t(n),s=e(r);xt(n)&&C.add(s),E.has(s)||E.set(s,$t(r));const i=E.get(s),a=void 0===i||n.sortKey>i;if(b(n)&&a&&xt(n)&&!0!==n.readBySelf&&void 0===n.recalled&&void 0===n.deletedForEveryone){const e=ye(n.conversationType);("local"===e||"server"===e&&"live"===o)&&y.set(s,(y.get(s)??0)+1)}a&&!0!==n.readBySelf&&Bt(n)&&void 0===n.recalled&&void 0===n.deletedForEveryone&&g.set(s,(g.get(s)??0)+1)}for(const t of p.values()){if(!0===r.backfillOnly){!0===r.refreshSessionSummary&&zt(t);continue}const n=e(t),o=y.get(n)??0,s=g.get(n)??0,i=m.get(n)??0,a=h.get(n)??0,c=C.has(n),d=Y.get(t);if(o>0||s>0||c||void 0!==d&&(0!==i||0!==a)){const e=d??{...t,readCursor:"",unreadCount:0},n={...e,unreadCount:Math.max(0,e.unreadCount+o+i),mentionUnreadCount:Math.max(0,(e.mentionUnreadCount??0)+s+a)};c&&delete n.manuallyUnread,Ft(n)}zt(t,K.some(e=>e.conversationType===t.conversationType&&e.conversationId===t.conversationId&&b(e)))}mt(S.filter(e=>void 0!==we(t(e),e.id)));for(const e of S)void 0===e.recalled&&void 0===e.deletedForEveryone?Pe(e,o):Ee(t(e),e.id)}function Qt(e,t,n=Date.now()){const o={conversationType:"direct",conversationId:e},r=we(o,t),s=z.getByConversation(o).findLast(e=>"direct_contact_established"===e.body.system?.eventType);if(void 0!==r&&void 0!==s&&x(s)>=x(r))return;const i=`${t}:contact-required`;if(void 0!==z.get(i,o))return;Jt([{id:i,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_contact_required",targetUserIds:[e],action:{type:"request-contact",userId:e}}},createdAt:n,sortKey:N(n,i),status:"sent",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1}}],"live")}const Vt=/* @__PURE__ */new Map;let Xt=0;function Yt(e){const t=Y.get(e);if(!0!==t?.manuallyUnread)return!1;const n={...t};return delete n.manuallyUnread,Ft(n),zt(e),!0}function Zt(e,t,n,r,s){const i="string"==typeof e?e:e.conversationId,a=cn(e),c="string"==typeof e?void 0===a?void 0:o(a):e;if(void 0!==a&&"server"!==ye(a.type))return void U.emitter.emit({type:"error",error:{scope:"unknown",message:`applyServerUnread 不应用于本地未读会话(conversationId=${i}, type=${a.type}),已忽略`}});if(!Number.isFinite(t))return void U.emitter.emit({type:"error",error:{scope:"unknown",message:`applyServerUnread 收到非法未读数(conversationId=${i}, count=${t}),已忽略`}});"channel"===c?.conversationType&&te.delete(i);const d=Y.get(e);let u=d?.readCursor??"",l=d?.readCursorSortKey;const v=void 0===n||""===n?void 0:void 0===c?z.getByConversation(i).find(e=>e.id===n)??Ce(n,i):we(c,n);void 0!==v&&v.conversationId===i&&(void 0===l||v.sortKey>l)&&(u=v.id,l=v.sortKey),void 0!==r&&(u=r),Ft({...void 0===c?{conversationId:i}:c,readCursor:u,readCursorSortKey:l,unreadCount:Math.max(0,Math.floor(t)),...t>0?{}:{manuallyUnread:d?.manuallyUnread},mentionUnreadCount:0===t||!1===s?0:!0===s?Math.max(1,d?.mentionUnreadCount??0):d?.mentionUnreadCount}),zt(e,t>0&&void 0!==c&&!_e(c))}function en(e){const t=te.get(e.conversation.conversationId);return t?.handle.transactionId===e.transactionId?t:void 0}function tn(e,t,n,o=!1){const r=cn(e),s=we(e,t);if("channel"!==r?.type||"channel"!==s?.conversationType||s.conversationId!==e.conversationId||s.extensions?.historyCursor!==n)throw new Error(`CHANNEL 已读位置不可信(channelId=${e.conversationId}, messageId=${t})`);o||te.delete(e.conversationId);const i=Y.get(e),a=void 0===i?r.mentionUnreadCount:i.mentionUnreadCount;Ft({...e,readCursor:n,readCursorSortKey:s.sortKey,unreadCount:i?.unreadCount??r.unreadCount,...void 0===a?{}:{mentionUnreadCount:a}}),zt(e)}function nn(e,t,n){const o=e.conversation,r=o.conversationId,i=en(e);if(void 0===i)throw new Error(`CHANNEL 乐观已读事务已失效(channelId=${r})`);const a=we(o,t);if(void 0===a||a.conversationId!==r||"channel"!==a.conversationType)throw new Error(`CHANNEL 乐观已读消息不可信(channelId=${r}, messageId=${t})`);if(a.extensions?.historyCursor!==n)throw new Error(`CHANNEL 乐观已读 cursor 与消息不一致(channelId=${r}, messageId=${t})`);i.steps.at(-1)?.readCursor!==n&&(i.steps.push({readCursor:n,messageId:t,...s(a)}),tn(o,t,n,!0))}function on(t,n,o,r){const s={conversationType:"channel",conversationId:t},i=e(s);if(_e(s)&&void 0===X.get(s))return;const a=cn(s);if(void 0===a){We(s),je.delete(i);return void dn({id:t,type:"channel",title:"",lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:!1,channelState:n,channelPermissions:r?.permissions,channelAccessSnapshot:r?.snapshot,sendDisabledReason:o})}if("channel"!==a.type)throw new Error(`setChannelRestriction: 会话 ${t} 类型为 ${a.type},拒绝写入 CHANNEL 状态`);We(s),je.delete(i);const c=r?.permissions,d=r?.snapshot;if(a.channelState===n&&a.sendDisabledReason===o&&q(a.channelPermissions,c)&&G(a.channelAccessSnapshot,d))return void(void 0!==V.get(s)&&zt(s));const u={...a,channelState:n,channelPermissions:c,channelAccessSnapshot:d,sendDisabledReason:o};void 0!==V.get(s)?dn(Ht(s,z.getByConversation(s),"preserve",u)):dn(u)}async function rn(e,t){if(""===t.trim())throw new Error("本机删除消息需要非空 messageId");const n=()=>{if(ee.isPinnedMessage(e,t))throw Object.assign(new Error("置顶消息必须先取消置顶才能删除"),{code:"IM_MESSAGE_PINNED"})};n();const o=we(e,t),r=z.get(t,e),s=void 0!==r&&r.conversationType===e.conversationType&&r.conversationId===e.conversationId,i=z.getByConversation(e).filter(e=>e.id!==t),a=void 0===V.get(e)?void 0:Ht(e,i,"clear"),c=void 0===a?void 0:gt(a);function d(e){return void 0!==e&&(void 0===r||!E(r,e))}const u=void 0===de?{deleted:!1,superseded:!1}:await pt(async()=>{n();const r=we(e,t)??o??await de.getMessage(e,t)??void 0;if(n(),d(z.get(t,e)))return{deleted:!1,superseded:!0};const s=await de.deleteMessage(e,t,c);if(ee.isPinnedMessage(e,t)){const o=we(e,t)??r;void 0!==o&&await de.saveMessages([yt(o)]);const s=V.get(e);return void 0!==s&&await de.saveSessions([gt(s)]),n(),{deleted:!1,superseded:!0}}return{deleted:s,superseded:!1}});if(u.superseded||d(z.get(t,e)))return!1;const l=s&&z.delete(e,t);let v=!1;for(const n of me)v=n.removeMessage(e,t)||v;if(!u.deleted&&!l&&!v)return!1;const f=void 0===V.get(e)?void 0:Ht(e,z.getByConversation(e),"clear");return Ot(f,!1),void 0===f||void 0!==a&&W(a,f)||ht(f),Ee(e,t),U.emitter.emit({type:"message:removed",conversation:{...e},messageId:t,scope:"local-only"}),!0}function sn(t,o={}){const r="string"==typeof t?t:t.conversationId,s=V.get(t),i=ee.get(t),a="string"==typeof t?void 0!==s?{conversationType:s.type,conversationId:r}:void 0===i?void 0:n(i):t;if(void 0===a)throw new Error(`裸 conversationId 无法确定删除类型:${r}`);Ge(a),Be.delete(e(a)),"direct"===a.conversationType&&(We(a),Fe.delete(a.conversationId)),ct(a);const c=z.getByConversation(a).length;!function(t){const n=bt(t),o=e(n);fe.set(o,(fe.get(o)??0)+1),null!==Z.get(n)&&(Z.delete(n),U.emitter.emit({type:"draft:cleared",conversation:n})),Et(n,async()=>{void 0!==de&&await de.deleteDraft(n)}).catch(e=>Je("删会话草稿失败",e))}(a),Ae(a),V.delete(t),X.delete(t),"channel"===a.conversationType&&(re(a.conversationId),te.delete(a.conversationId)),Y.delete(t),z.deleteByConversation(t),ee.clear(t);const d=Le(a);if(!0===o.terminal){ae.add(d);const e=ce.delete(d);ie.delete(d),ie.delete(r),e&&Tt(),U.diagnostics?.record("info","core","conversation","membership-terminated",()=>({conversation:a,data:{reason:o.terminalReason??"membership-terminated",removedMessageCount:c}}))}else ie.add(d);for(const e of me)Me(e,a)&&e.reset();U.emitter.emit({type:"session:removed",conversationId:r,conversation:a}),wt(),!0===o.terminal&&It(),void 0!==de&&pt(async()=>{await ut([de.deleteConversationMessages(a),de.deleteSession(a),de.deleteReadState(a),de.removePinnedMessage(a)])}).catch(e=>Je("删除会话持久数据失败",e))}function an(e,t){sn(e,{terminal:!0,terminalReason:t})}function cn(e){if("string"==typeof e){const t=[...V.getAll(),...X.getAll()].filter(t=>t.id===e);if(t.length>1)throw new Error(`裸 conversationId 存在多类型歧义:${e}`);return t[0]}return V.get(e)??X.get(e)}function dn(e){const t=o(e);void 0!==V.get(t)?(V.set(e),Qe(e),ht(e)):(X.set(e),U.emitter.emit({type:"conversation-context:updated",conversation:t}))}return{upsertMessages:Jt,commitReceivedMessages:function(n,o,r,s){if(void 0===de){for(const e of s?.events??[])s.apply(e);return void Jt(n,o,r)}const i={writes:[],messages:/* @__PURE__ */new Set,sessions:/* @__PURE__ */new Set,reads:/* @__PURE__ */new Set,metadata:/* @__PURE__ */new Set};Xe.add(i);try{const a=(s?.events??[]).filter(e=>"ignored"!==s.apply(e));Jt(n,o,r);const c=a.flatMap(e=>{const t=we(e.conversation,e.parentMessageId);return void 0===t?[]:[t]});a.length>0&&Ue();const d=/* @__PURE__ */new Map,u=[];for(const o of[...n,...c]){const n=t(o),r=e(n),s=we(n,o.id);void 0!==s&&(d.set(r,n),i.messages.has(`${r}\0${s.id}`)||u.push(s))}mt(u);for(const[e,t]of d){const n=V.get(t),o=Y.get(t);void 0===n||i.sessions.has(e)||ht(n),void 0===o||i.reads.has(e)||Mt(o)}for(const[e,t]of Ye)i.metadata.has(e)||t.persist()}finally{Xe.delete(i)}return ut(i.writes)},applyReaction:Re,rollbackReaction:function(t,n,o){const r=we(t,n);if(void 0===r){const r=`${e(t)}\0${n}`,s=J.get(r);if(void 0===s)return!1;const i=s.filter(e=>e.id!==o);return i.length!==s.length&&(0===i.length?J.delete(r):J.set(r,i),Ue(),!0)}const s=v(r.reactions,o,U.getSelfId?.()??"");if(s===r.reactions)return!1;const i={...r};return void 0===s?delete i.reactions:i.reactions=s,Jt([i],"live"),!0},appendDirectContactRequiredNotice:Qt,appendDirectMessageRefusedNotice:function(e,t,n=Date.now()){const o={conversationType:"direct",conversationId:e},r=`${t}:message-refused`;if(void 0!==z.get(r,o))return;const s=z.get(t,o),i="direct"===s?.conversationType&&s.conversationId===e?x(s):n;Jt([{id:r,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_message_refused",targetUserIds:[e]}},createdAt:i,sortKey:N(i,r),status:"sent",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1}}],"live")},appendDirectContactRequiredTextFailure:function(e,t=Date.now()){const n=P(),o={id:n,conversationId:e.conversationId,conversationType:"direct",senderId:e.senderId,contentType:"text",body:{text:e.text},createdAt:t,sortKey:N(t,n),status:"failed",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1},failure:{code:33281,reason:"rejected",displayCode:"contactRequired",retryable:!1},...void 0===e.refMessageId?{}:{refMessageId:e.refMessageId}};return Jt([o],"live"),Qt(e.conversationId,n,t+1),o},reconcileDirectContactEstablishedNotice:function(e,t,n=Date.now()){const o=Vt.get(e);if(void 0!==o)return o;const r={conversationType:"direct",conversationId:e},s=Xt,i=(async()=>{const o=z.getByConversation(r).filter(e=>{const t=e.body.system?.eventType;return"direct_contact_required"===t||"direct_contact_established"===t}),i=o.filter(e=>"direct_contact_required"===e.body.system?.eventType),a=i.at(-1)?.createdAt??0,c=o.findLast(e=>"direct_contact_established"===e.body.system?.eventType)?.createdAt??0,d=c>=a&&c>0;if(0===i.length&&d)return;const u=$t(r);for(const e of i)try{const t=await rn(r,e.id),n=we(r,e.id);t||"direct_contact_required"!==n?.body.system?.eventType||U.emitter.emit({type:"error",error:{scope:"storage",message:"联系人关系已建立,但旧的申请添加提示未能删除",cause:{conversation:r,messageId:e.id}}})}catch(t){U.emitter.emit({type:"error",error:{scope:"storage",message:"联系人关系已建立,但删除旧的申请添加提示失败",cause:{conversation:r,messageId:e.id,error:t}}})}if(s!==Xt)return;const l=Y.get(r);if(void 0!==l&&(Ft({...l,...void 0===l.readCursorSortKey&&void 0!==u?{readCursorSortKey:u}:{},unreadCount:Dt(r,u)}),zt(r)),d)return;const v=Number.isFinite(n)&&n>0?n:Date.now(),f=Math.max(v,a+1);!function(e,t,n=Date.now(),o=n){const r=function(e,t){return`${""===e.trim()?`contact-established:${t}`:e}:contact-established`}(t,o);if(void 0!==z.get(r,{conversationType:"direct",conversationId:e}))return;Jt([{id:r,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_contact_established",targetUserIds:[e]}},createdAt:n,sortKey:N(n,r),status:"sent",receipt:"unread",encryption:{encrypted:!1}}],"live")}(e,t,f,v)})().finally(()=>{Vt.get(e)===i&&Vt.delete(e)});return Vt.set(e,i),i},recallMessage:function(e,t,n){const o=we(e,t);void 0!==o&&Jt([{...o,recalled:n,body:{}}],"live")},deleteChannelMessageForEveryone:function(e,t,n){const o=we(e,t);void 0!==o&&"channel"===o.conversationType&&Jt([{...o,recalled:void 0,deletedForEveryone:n,body:{}}],"live")},editMessage:function(e,t,n,o){const r=we(e,t);if(void 0===r)return;const s={...r,body:n,edited:!0};void 0!==o?s.mention=o:delete s.mention,Jt([s],"live")},applyTransferStatusBySerialNumber:async function(e,t,n){const o=function(e,t){if(void 0===e)return t;if(0===e.status&&0!==t.status)return t;if(0===t.status&&0!==e.status)return e;const n=e.occurredTime??0,o=t.occurredTime??0;return n!==o?o>n?t:e:t.status>e.status?t:e}(Q.get(e),{serialNumber:e,status:t,...void 0===n?{}:{occurredTime:n}});Q.set(o.serialNumber,o),await async function(){if(void 0===de)return;const e=[...Q.values()],t=ue.then(()=>de.setMeta(H,e));dt(t),ue=t.catch(()=>{});try{await t}catch(e){throw Je("保存转账状态记录失败",e),e}}();const r=/* @__PURE__ */new Map;for(const t of i(z.getAll(),e,o.status,o.occurredTime))r.set(t.id,t);for(const t of V.getAll()){const n=Te({conversationType:t.type,conversationId:t.id});for(const t of i(n,e,o.status,o.occurredTime))r.set(t.id,t)}0!==r.size&&Jt([...r.values()],"live")},getMessage:e=>z.get(e),getMessagesById:e=>z.getById(e),getConversationMessage:we,getLoadedMessagesByConversation:Te,resolveConversationMessage:async function(n,o,r={}){const s=we(n,o);if(void 0!==s||void 0===de)return s;try{const r=await de.getMessage(n,o);if(null===r||e(t(r))!==e(n))return;return Wt(r)}catch(e){if(Je("按消息 ID 读取本地历史失败",e),!0===r.throwOnStorageError)throw e;return}},getMessages:()=>z.getAll(),getMessagesByConversation:e=>z.getByConversation(e),deleteLocalMessage:rn,clearLocalConversationHistory:async function(e){ct(e);const t={...e},n=new Map(z.getByConversation(t).map(e=>[e.id,e])),o=V.get(t),r=Y.get(t),s=void 0===r&&void 0===o?void 0:{...t,readCursor:r?.readCursor??o?.readCursor??"",...void 0===r?.readCursorSortKey?{}:{readCursorSortKey:r.readCursorSortKey},unreadCount:0,mentionUnreadCount:0},i=void 0===o?void 0:kt(t,void 0,"clear",s);if(void 0!==de){if(void 0===de.clearConversationHistory)throw new Error("当前 storage 未实现 clearConversationHistory,拒绝非原子清空本机会话历史");await pt(()=>de.clearConversationHistory(t,void 0===i?void 0:gt(i),s))}const a=Y.get(t);void 0!==s&&(a?.conversationType===r?.conversationType&&a?.conversationId===r?.conversationId&&a?.readCursor===r?.readCursor&&a?.readCursorSortKey===r?.readCursorSortKey&&a?.unreadCount===r?.unreadCount&&a?.mentionUnreadCount===r?.mentionUnreadCount)&&Ft(s,!1);for(const[e,o]of n){const n=z.get(e,t);void 0!==n&&E(o,n)&&z.delete(t,e)}const c=z.getByConversation(t);for(const e of me)e.clearConversation(t)&&e.applyIncoming(c);Ae(t),void 0!==V.get(t)&&Ot(Ht(t,c,"clear"),!1),U.emitter.emit({type:"conversation-history:cleared",conversation:t,scope:"local-only"})},commitChannelSyncPage:function(n,o,r,s){const i=vt(n,r);return lt(async()=>{if(!i())return!1;if(void 0===de)throw new Error("CHANNEL 严格同步提交需要 storage");const r={writes:[],messages:/* @__PURE__ */new Map,keys:new Set(n.map(e)),current:i};let a;it=r;try{const e=o();if(e instanceof Promise)throw e.catch(()=>{}),new Error("CHANNEL 页 mutation 必须同步执行")}catch(e){a={cause:e}}finally{it=void 0}if(await ut(r.writes),void 0!==a)throw a.cause;if(!i())return!1;const c=[...r.messages.values()].flatMap(e=>{const n=we(t(e),e.id);return void 0===n?[]:[yt(n)]}),d=[];c.length>0&&d.push(ft(()=>de.saveMessages(c)));for(const e of n){const t=V.get(e),n=Y.get(e),o=ee.get(e);void 0!==t&&d.push(ft(()=>de.saveSessions([gt(t)]))),void 0!==n&&d.push(ft(()=>de.saveReadState(n))),d.push(ft(()=>void 0===o?de.removePinnedMessage(e):de.savePinnedMessage(o)))}const u=[[O,[...J.values()].flat()],[H,[...Q.values()]],[L,[...ie]],[_,[...ae]],[k,[...ce.entries()]]];for(const[e,t]of u)d.push(ft(()=>de.setMeta(e,t)));return void 0!==s&&d.push(ft(async()=>{i()&&await s()})),await ut(d),i()})},saveChannelSyncCheckpoint:function(e,t){const n=d(e,e.conversation);if(void 0===n)return Promise.reject(new Error("CHANNEL 同步位置无效"));const o=vt([n.conversation],t);return lt(async()=>{if(!o())return!1;if(void 0===de)throw new Error("CHANNEL 同步位置保存需要 storage");let e=!1;return await ft(async()=>{o()&&(await de.setMeta(u(n.conversation),n),e=!0)}),e&&o()})},waitForChannelSyncPersistence:async function(){for(;;){const e=ot,t=tt;if(await Promise.all([e,t,...Ve]),e===ot&&t===tt&&0===Ve.size)return}},getSession:e=>V.get(e),getConversationContext:cn,isMembershipTerminated:ke,prepareConversation:function(e,t={}){const n=o(e);if("supergroup"===n.conversationType)throw new Error("prepareConversation:supergroup 未实现");const r=cn(n);if(void 0!==r){const t=r.title||e.title,n=r.avatar??e.avatar;return void(t===r.title&&n===r.avatar||dn({...r,title:t,avatar:n}))}if(ke(n)){if(!0!==t.membershipConfirmed)throw new Error("准备聊天失败:需要重新确认成员资格");ae.delete(Le(n)),ae.delete(n.conversationId),It()}dn({...e,...void 0===e.channelPermissions?{}:{channelPermissions:{...e.channelPermissions}},...void 0===e.channelAccessSnapshot?{}:{channelAccessSnapshot:{...e.channelAccessSnapshot}}}),(Y.get(n)?.unreadCount??0)>0&&!_e(n)&&zt(n,!0)},ensureConversation:function(t){const n=o(t);if(e(n),"supergroup"===n.conversationType)throw new Error("ensureConversation:supergroup 未实现");const r=V.get(n);if(void 0!==r)return r;const s={...t,id:n.conversationId,type:n.conversationType,...void 0===t.channelPermissions?{}:{channelPermissions:{...t.channelPermissions}},...void 0===t.channelAccessSnapshot?{}:{channelAccessSnapshot:{...t.channelAccessSnapshot}},...void 0===t.extensions?{}:{extensions:{...t.extensions}}},i=He(n);return i.deleted&&wt(),i.terminal&&It(),V.set(s),X.delete(n),Qe(s),ht(s),s},getSessions:()=>V.getAll(),getConversationList:function(){const e=[];for(const t of V.getAll()){const n=o(t);e.push({...t,draft:Z.get(n)})}return h(e)},getReadState:e=>Y.get(e),getPinnedMessage:e=>ee.get(e),setPinnedMessage:function(e,t){const o=function(e){const t=we(n(e),e.messageId);return void 0===t?e:{...e,preview:{state:"ready",message:t}}}(e);ee.set(o)&&(U.emitter.emit({type:"pinned-message:updated",conversationId:o.conversationId,conversation:{conversationType:o.conversationType,conversationId:o.conversationId},pinnedMessage:o,reason:t}),function(e){void 0===de||Se||ft(()=>de.savePinnedMessage(e)).catch(e=>Je("置顶消息落盘失败",e))}(o))},clearPinnedMessage:function(e,t){const o="string"==typeof e?e:e.conversationId,r=ee.get(e);if(!ee.clear(e))return;const s="string"==typeof e?void 0===r?void 0:n(r):e;if(void 0===s)throw new Error(`置顶消息清理缺少复合身份:${o}`);U.emitter.emit({type:"pinned-message:updated",conversationId:o,conversation:s,pinnedMessage:null,reason:t}),function(e){void 0===de||Se||ft(()=>de.removePinnedMessage(e)).catch(e=>Je("置顶消息删除失败",e))}(e)},isPinnedMessage:(e,t)=>ee.isPinnedMessage(e,t),setReadState:e=>{const t=void 0===e.conversationType?V.get(e.conversationId):void 0,n=void 0===e.conversationType&&void 0!==t?{...e,conversationType:t.type}:e;"channel"===n.conversationType&&re(n.conversationId),Y.set(n),Mt(n)},markConversationUnread:function(e){const t=V.get(e);if(void 0===t)return!1;const n=Y.get(e)??{...e,readCursor:t.readCursor??"",unreadCount:t.unreadCount,mentionUnreadCount:t.mentionUnreadCount};return!(n.unreadCount>0||!0===n.manuallyUnread)&&(Ft({...n,manuallyUnread:!0}),zt(e),!0)},clearConversationManualUnread:Yt,advanceRead:function(e,n){const o="string"==typeof e?z.getByConversation(e).find(e=>e.id===n)??Ce(n,e):we(e,n);if(void 0===o)return;const r="string"==typeof e?t(o):e,s="string"==typeof e?e:e.conversationId;if(o.conversationId!==s||o.conversationType!==r.conversationType)return;const i=$t(r);if(void 0!==i&&i>=o.sortKey)return void("string"!=typeof e&&Yt(e));const a={...r,readCursor:n,readCursorSortKey:o.sortKey,unreadCount:Dt(r,o.sortKey),mentionUnreadCount:jt(r,o.sortKey)};return Ft(a),zt(r),a},applyServerUnread:Zt,applyChannelReadPosition:tn,getChannelReadRevision:e=>ne.get(e.conversationId)??oe,hasPendingChannelRead:e=>te.has(e.conversationId),applyChannelReadSummary:(e,t)=>Zt(e,t.unreadCount,void 0,t.readCursor,t.hasUnreadMention),beginChannelReadTransaction:function(e){const t=e.conversationId,n=cn(e);if(void 0===n||"channel"!==n.type)throw new Error(`CHANNEL 乐观已读事务要求 channel 会话(conversationId=${t}, type=${n?.type??"missing"})`);if(te.has(t))throw new Error(`CHANNEL 乐观已读事务已存在(channelId=${t})`);const o={conversation:e,transactionId:se++},r=Y.get(e)??{conversationId:t,readCursor:n.readCursor??"",unreadCount:n.unreadCount,...void 0===n.mentionUnreadCount?{}:{mentionUnreadCount:n.mentionUnreadCount}};return te.set(t,{handle:o,baseReadState:{...r},steps:[],committedThrough:-1}),re(t),o},applyChannelReadOptimistically:nn,applyChannelConversationReadOptimistically:function(e,t,n){nn(e,t,n);const o=en(e).steps.at(-1);if(void 0!==o.clearedCounts)return;const i=Y.get(e.conversation),a=Te(e.conversation).filter(e=>r(s(e),o)>0&&xt(e)&&b(e)&&!0!==e.readBySelf&&void 0===e.recalled&&void 0===e.deletedForEveryone),c=Math.min(i.unreadCount,a.length),d=Math.min(i.mentionUnreadCount??0,a.filter(Bt).length);o.clearedCounts={unread:i.unreadCount-c,mention:(i.mentionUnreadCount??0)-d},Ft({...i,unreadCount:c,mentionUnreadCount:d}),zt(e.conversation)},commitChannelReadTransaction:function(e,t){const n=en(e);if(void 0===n)return!1;const o=n.steps.findLastIndex(e=>e.readCursor===t);if(o<0)throw new Error(`CHANNEL 已确认 cursor 不属于乐观事务(channelId=${e.conversation.conversationId}, cursor=${t})`);return n.committedThrough=Math.max(n.committedThrough,o),re(e.conversation.conversationId),n.committedThrough===n.steps.length-1&&te.delete(e.conversation.conversationId),!0},rollbackChannelReadTransaction:function(e){const t=en(e);if(void 0===t)return!1;const n=e.conversation,o=n.conversationId,r=Y.get(n),s=t.committedThrough>=0?t.steps[t.committedThrough]:void 0,i=void 0===s?t.baseReadState:void 0;let a=r?.unreadCount??i?.unreadCount??0,c=r?.mentionUnreadCount??i?.mentionUnreadCount??0;for(const e of t.steps.slice(t.committedThrough+1))a+=e.clearedCounts?.unread??0,c+=e.clearedCounts?.mention??0;const d=void 0!==i?.mentionUnreadCount||void 0!==r?.mentionUnreadCount,u={conversationId:o,conversationType:"channel",readCursor:s?.readCursor??i?.readCursor??"",readCursorSortKey:s?.sortKey??i?.readCursorSortKey,unreadCount:a,...d?{mentionUnreadCount:c}:{}};return te.delete(o),Ft(u),zt(n),!0},setGroupRestriction:function(e,t,n){const o=cn({conversationType:"group",conversationId:e});if(void 0===o){return void dn({id:e,type:"group",title:"",lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:!1,groupState:t,sendDisabledReason:n})}if(o.groupState===t&&o.sendDisabledReason===n)return;dn({...o,groupState:t,sendDisabledReason:n})},setChannelRestriction:on,setPinned:function(e,t){const n=V.get(e);if(void 0===n||n.pinned===t)return;const o={...n,pinned:t,topTime:t?Date.now():void 0};V.set(o),Qe(o),ht(o)},setMuted:function(e,t){const n=cn(e);if(void 0===n||n.muted===t)return;dn({...n,muted:t})},removeConversation:function(e){sn(e)},removeConversationForMembershipTermination:an,refreshConversationProfile:function(e,t){Nt({conversationType:t,conversationId:e},{force:!0})},readDirectProfile:Pt,beginConversationProfileRead:function(t,n){const o={...t},r=e(o),s=xe,i=!0!==n?.forceRefresh&&(je.has(r)||Be.has(r))?void 0:Ge(o);void 0!==i&&!0===n?.forceRefresh&&Be.set(r,i);const a=()=>{s===xe&&void 0!==i&&Be.get(r)===i&&Be.delete(r)};return Object.assign(e=>{try{if(void 0===i||e.id!==o.conversationId||s!==xe)return;Rt(o,e.title,e.avatar??"",void 0,i)}finally{a()}},{finish:a})},recoverChannelFromProfile:function(e){return Nt({conversationType:"channel",conversationId:e},{force:!0,allowChannelRecovery:!0})},updateConversationProfile:function(e,t){const n=cn(e);if(void 0===n)return;Ge(o(n));const r={...n,...void 0!==t.title?{title:t.title}:{},...void 0!==t.avatar?{avatar:t.avatar}:{}};W(n,r)||dn(r)},getTotalUnread:function(e){return F(V.getAll(),e)},getDraft:function(e){return Z.get(bt(e))},saveDraft:async function(t,n){const o=bt(t),r=e(o),s=Ut(o,n,0),i=pe,a=fe.get(r)??0;return await Et(o,async()=>{const e=Z.get(o),t=Math.max(Date.now(),(ve.get(r)??e?.updatedAt??0)+1),n=Ut(o,s,t);if(null!==e&&Kt(e,n))return e;if(void 0!==de&&await de.saveDraft(n),i!==pe||a!==(fe.get(r)??0))throw new Error("草稿状态已失效,拒绝过期写入回灌内存");return Z.set(n),ve.set(r,t),U.emitter.emit({type:"draft:updated",conversation:n.ref,draft:n}),n})},clearDraft:async function(e){await At(e)},clearDraftIfUnchanged:async function(e,t){return await At(e,t)},invalidateAndDrainDraftOperations:async function(){for(pe+=1;le.size>0;)await Promise.all([...le.values()])},clearSession(){rt+=1,xe+=1,pe+=1,Xt+=1,Vt.clear(),$e.clear(),De.clear(),Be.clear(),je.clear(),Fe.clear(),z.clear(),V.clear(),X.clear(),Y.clear(),Z.clear(),le.clear(),ve.clear(),fe.clear(),te.clear(),ne.clear(),oe+=1,ee.clearAll(),ie.clear(),ae.clear(),ce.clear(),Ye.clear(),J.clear();for(const e of me)e.reset()},hydrate:async function(r=()=>!0){if(void 0!==de&&r()){Se=!0;try{const s=await de.getMeta(L);if(!r())return;if(null!==s)for(const e of s)ie.add(e);const i=await de.getMeta(_);if(!r())return;if(null!==i)for(const e of i)ae.add(e);const a=await de.getMeta(k);if(!r())return;if(null!==a)for(const[e,t]of a)"string"==typeof e&&"string"==typeof t&&ce.set(e,t);const c=await de.getMeta(O);if(!r())return;if(null!==c)for(const e of c){const t=be(e);J.set(t,[...J.get(t)??[],e])}const d=await de.getMeta(H);if(!r())return;if(Array.isArray(d))for(const e of d){if("object"!=typeof e||null===e)continue;const t=Reflect.get(e,"serialNumber"),n=Reflect.get(e,"status"),o=Reflect.get(e,"occurredTime");"string"!=typeof t||""===t.trim()||0!==n&&1!==n&&2!==n&&3!==n||void 0!==o&&("number"!=typeof o||!Number.isFinite(o)||o<=0)||Q.set(t,{serialNumber:t,status:n,...void 0===o?{}:{occurredTime:o}})}const u=await de.getPinnedMessages();if(!r())return;for(const e of u){if(!r())return;_e({conversationType:e.conversationType,conversationId:e.conversationId})||ee.set(e)&&U.emitter.emit({type:"pinned-message:updated",conversationId:e.conversationId,conversation:n(e),pinnedMessage:e,reason:"hydrate"})}const l=(await de.getSessions()).filter(e=>!_e({conversationType:e.type,conversationId:e.id}));if(!r())return;for(const e of l){if(!r())return;const t=Ht(o(e),[],"preserve",e),n=o(t),s=V.get(n);V.set(t),X.delete(n),void 0!==s&&W(s,t)||Qe(t)}const v=await de.getReadStates();if(!r())return;for(const e of v)"channel"===e.conversationType&&re(e.conversationId),Y.set(e);const f=pe,p=await de.getDrafts();if(!r())return;if(f!==pe)return;for(const t of p){if(!r())return;if(!Number.isFinite(t.updatedAt)||t.updatedAt<0)throw new Error(`草稿 updatedAt 非法:${t.updatedAt}`);const n=Ut(t.ref,t,t.updatedAt);if(_e(n.ref)){try{if(await de.deleteDraft(n.ref),!r())return}catch(e){if(!r())return;Je("清理已删会话残留草稿失败",e)}continue}const o=e(n.ref);ve.set(o,Math.max(ve.get(o)??0,n.updatedAt));const s=Z.get(n.ref);null!==s&&s.updatedAt===n.updatedAt&&Kt(s,n)||(Z.set(n),U.emitter.emit({type:"draft:updated",conversation:n.ref,draft:n}))}for(const n of l){if(!r())return;const s=o(n),i=(await de.getMessages(s,{limit:50})).filter(n=>e(t(n))===e(s)).filter(qe);if(!r())return;const a=[];if(Gt(i.map(e=>{const t=qt(T(e));return t!==e&&a.push(t),t}),r),!r())return;if(a.length>0)try{if(await de.saveMessages(a),!r())return}catch(e){if(!r())return;Je("本地消息修复态落盘失败",e)}if(!r())return;zt(s)}}catch(e){r()&&Je("本地历史回读失败",e)}finally{Se=!1,r()&&Ne("offline")}}},loadOlderMessages:async function(n,o){if(void 0===de)return[];try{const r=await de.getMessages(n,o),s="string"==typeof n?r.filter(qe):r.filter(o=>e(t(o))===e(n)).filter(qe),i=Se;let a;Se=!0;try{a=Gt(s)}finally{Se=i}return Se||Ne("offline"),a.map(e=>we(t(e),e.id)??e)}catch(e){return Je("加载更早消息失败",e),[]}},searchMessages:async function(n,o){const r=o.keyword?.trim()??"",s=o.contentTypes;if(""===r&&(void 0===s||0===s.length))return{results:[],exhausted:!0};const i=""===r?void 0:await w(r),a=e=>{const t=void 0===s||s.includes(e.contentType),n=void 0===i||null!==i.match(I(e));return t&&n},c=(e,t)=>e.sortKey<t.sortKey?1:e.sortKey>t.sortKey?-1:0,d=e=>function(e,t){const n=t?.match(I(e));return{message:e,ranges:n?.ranges.map(({start:e,end:t})=>[e,t])??[]}}(e,i);if(void 0===de)return(()=>{const e=z.getByConversation(n).filter(a).sort(c),t=(void 0===o.beforeSortKey?e:e.filter(e=>e.sortKey<o.beforeSortKey)).slice(0,o.limit),r=t.length<o.limit;return{results:t.map(d),exhausted:r,...r?{}:{nextBeforeSortKey:t.at(-1)?.sortKey}}})();let u;try{u=await de.searchMessages(n,{...void 0!==o.keyword?{keyword:o.keyword}:{},...void 0!==s?{contentTypes:s}:{},limit:o.limit,...void 0!==o.beforeSortKey?{beforeSortKey:o.beforeSortKey}:{}})}catch(e){throw Je("会话内搜索失败",e),e}const l=u.exhausted?void 0:u.nextBeforeSortKey,v=new Map(z.getByConversation(n).map(e=>[e.id,e])),f=/* @__PURE__ */new Map;for(const o of u.items){const r=Wt(o);e(t(r))===e(n)&&f.set(r.id,v.get(r.id)??r)}for(const e of v.values()){const t=void 0===o.beforeSortKey||e.sortKey<o.beforeSortKey,n=void 0===l||e.sortKey>=l;t&&n&&a(e)&&f.set(e.id,e)}return{results:[...f.values()].filter(a).sort(c).map(d),exhausted:u.exhausted,...u.exhausted?{}:{nextBeforeSortKey:u.nextBeforeSortKey}}},messageWindow:he,createMessageWindow:function(e={}){const t=ge(e);let n=!1;return{window:t,dispose(){n||(n=!0,t.reset(),me.delete(t))}}}}}export{J as createDomainState,j as defaultConversationUnreadMode,F as sumSessionsUnread};
|
|
1
|
+
import{encodeConversationKey as e,conversationRefFromMessage as t,conversationRefFromPinnedMessage as n,conversationRefFromSession as o}from"../conversation-identity.js";import{compareChannelReadPosition as r,getChannelReadOrder as s}from"../mapping/channel-read-position.js";import{computeSortKey as i,resolveMessageTimestamp as a,computeMessageSortKey as c,resolveMessageServerTime as d}from"../mapping/sort.js";import{collectTransferStatusBySerialNumber as u,synchronizeTransferStatusMessages as l,applyTransferStatusToBody as v}from"../mapping/transfer-status.js";import{parseChannelSyncCheckpoint as f,channelSyncCheckpointKey as p}from"../sync/channel-sync-checkpoint.js";import{parseConversationDeletionBoundary as y,isAfterConversationDeletion as m,captureConversationDeletionBoundary as g}from"./conversation-deletion-boundary.js";import{createDraftStore as h}from"./draft-store.js";import{rollbackMessageReaction as C,applyMessageReaction as w}from"./message-reactions.js";import{createMessageStore as I}from"./message-store.js";import{createMessageWindowStore as T}from"./message-window-store.js";import{createPinnedMessageStore as M}from"./pinned-message-store.js";import{createReadStore as S}from"./read-store.js";import{sortSessions as b}from"./session-sort.js";import{createSessionStore as E}from"./session-store.js";import{createImTextSearchMatcher as K,extractSearchText as U}from"../mapping/search-text.js";import{normalizeStoredMessageContent as A,LOCAL_MEDIA_ERROR_CODE as R,failInterruptedUpload as P}from"../mapping/stored-message.js";import{isMessageVisibleInTimeline as N,lastMessageSummaryEqual as x,sessionFromMessage as $}from"../mapping/session-mapper.js";import{isMessageEqual as D,isMessageRecoveryBodyEqual as B,dedupeById as j,mergeMessage as F}from"../mapping/merge.js";import{newClientMessageId as L}from"../mapping/message-id.js";import{backfillGroupMention as _}from"../mapping/group-message-mapper.js";import{isConversationUnreadMessage as k}from"../mapping/unread-divider.js";function O(e){return"direct"===e||"robot"===e||"customerService"===e?"local":"server"}function H(e,t){const n=t?.includeMuted??!1;let o=0;for(const t of e)!n&&t.muted||(o+=t.unreadCount>0?t.unreadCount:!0===t.manuallyUnread?1:0);return o}const z="im:deleted-conversations",q="im:terminated-conversations",G="im:membership-reset-sort-keys",W="im:pending-message-reactions",J="im:transfer-status-records",Q=["sendMessages","mentionAll","editProfile","manageMembers","manageAdmins","moderateMessages","manageMute","dismissChannel","transferOwnership"];function V(e,t){return e===t||void 0!==e&&void 0!==t&&Q.every(n=>e[n]===t[n])}function X(e,t){return e===t||void 0!==e&&void 0!==t&&e.role===t.role&&e.baseState===t.baseState&&e.resolvedState===t.resolvedState&&e.allMembersMuted===t.allMembersMuted&&e.currentUserMuted===t.currentUserMuted&&e.mutePeriod===t.mutePeriod}function Y(e,t){return e.id===t.id&&e.type===t.type&&e.title===t.title&&e.avatar===t.avatar&&x(e.lastMessageSummary,t.lastMessageSummary)&&e.timestamp===t.timestamp&&e.unreadCount===t.unreadCount&&(e.manuallyUnread??!1)===(t.manuallyUnread??!1)&&(e.mentionUnreadCount??0)===(t.mentionUnreadCount??0)&&e.pinned===t.pinned&&e.muted===t.muted&&e.topTime===t.topTime&&e.lastMessageSendState===t.lastMessageSendState&&e.lastMessageReceipt===t.lastMessageReceipt&&e.readCursor===t.readCursor&&e.groupState===t.groupState&&e.channelState===t.channelState&&V(e.channelPermissions,t.channelPermissions)&&X(e.channelAccessSnapshot,t.channelAccessSnapshot)&&e.sendDisabledReason===t.sendDisabledReason}function Z(x){const Q=I({getSelfId:x.getSelfId}),Z=/* @__PURE__ */new Map,ee=/* @__PURE__ */new Map,te=E(),ne=E(),oe=S(),re=h(),se=M(),ie=/* @__PURE__ */new Map,ae=/* @__PURE__ */new Map;let ce=0;function de(e){ae.set(e,++ce)}let ue=1;const le=/* @__PURE__ */new Set,ve=/* @__PURE__ */new Map,fe=/* @__PURE__ */new Set,pe=/* @__PURE__ */new Map,{storage:ye}=x;let me=Promise.resolve();const ge=/* @__PURE__ */new Map,he=/* @__PURE__ */new Map,Ce=/* @__PURE__ */new Map;let we=0;const Ie=x.unreadMode??O,Te=/* @__PURE__ */new Set;function Me(e={}){const t=T({storage:ye,loadOlderFromRemote:x.loadOlderFromRemote,loadNewerFromRemote:x.loadNewerFromRemote,shouldIncludeMessage:Ze,normalizeStoredUpload:Zt,...e});return Te.add(t),t}const Se=Me();function be(e,t){let n;for(const o of Te){const r=o.list().find(n=>n.id===e&&n.conversationId===t);if(void 0!==r){if(void 0!==n&&n.conversationType!==r.conversationType)throw new Error(`裸 conversationId 存在多类型消息歧义:${t}`);n=r}}return n}function Ee(e,t){const n=Q.get(t,e);if(n?.conversationId===e.conversationId&&n.conversationType===e.conversationType)return n;for(const n of Te){const o=n.list().find(n=>n.id===t&&n.conversationId===e.conversationId&&n.conversationType===e.conversationType);if(void 0!==o)return o}}function Ke(e,n){const o=Ee(t(e),e.id);void 0===o||Q.has(e.id,e)||Q.upsert(o);const r=Q.upsert(e,n);return{...r,previous:o,changed:void 0===o?r.changed:!D(o,r.message)}}function Ue(e){const t=new Map(Q.getByConversation(e).map(e=>[e.id,e]));for(const n of Te)if(Ae(n,e))for(const o of n.list())o.conversationType!==e.conversationType||o.conversationId!==e.conversationId||t.has(o.id)||t.set(o.id,o);return[...t.values()].sort((e,t)=>e.sortKey.localeCompare(t.sortKey))}function Ae(t,n){const o=t.info();return void 0===o.conversation?o.conversationId===n.conversationId:e(o.conversation)===e(n)}let Re=!1;function Pe(t){return`${e(t.conversation)}\0${t.parentMessageId}`}function Ne(){if(void 0===ye||Re)return;const e=[...Z.values()].flat();It(()=>ye.setMeta(W,e)).catch(e=>nt("保存待处理 Reaction 失败",e))}function xe(e){const t=e.body.transfer;if("transfer"!==e.contentType||void 0===t)return e;const n=ee.get(t.serialNumber);if(void 0===n||0!==t.status&&0===n.status)return e;const o={...t,status:n.status,...1===n.status&&void 0!==n.occurredTime?{receiveTime:n.occurredTime}:{},...2===n.status||3===n.status?{returnTime:n.occurredTime??t.returnTime}:{}};return t.status===o.status&&t.receiveTime===o.receiveTime&&t.returnTime===o.returnTime&&t.isRead===o.isRead?e:{...e,body:{transfer:v(t,o)}}}function $e(t,n){const o=`${e(t)}\0${n}`;return!!Z.delete(o)&&(Ne(),!0)}function De(t){const n=`${e(t)}\0`;let o=!1;for(const e of Z.keys())e.startsWith(n)&&(Z.delete(e),o=!0);return o&&Ne(),o}function Be(e,t){const n=Ee(e.conversation,e.parentMessageId);if(void 0===n){const t=Pe(e),n=Z.get(t)??[];return n.some(t=>t.id===e.id)?"duplicate":(Z.set(t,[...n,e]),Ne(),"pending")}if(yt(n),void 0!==n.recalled||void 0!==n.deletedForEveryone)return"duplicate";const o=w(n.reactions,e,x.getSelfId?.()??"");return o===n.reactions?"duplicate":(nn([{...n,reactions:o}],t),"applied")}function je(n,o){const r=t(n),s=`${e(r)}\0${n.id}`,i=Z.get(s);if(void 0!==i){Z.delete(s),Ne();for(const e of i)Be(e,o)}}function Fe(e){for(const t of[...Z.values()]){const n=t[0];if(void 0===n)continue;const o=Ee(n.conversation,n.parentMessageId);void 0!==o&&(void 0!==o.recalled||void 0!==o.deletedForEveryone?$e(n.conversation,n.parentMessageId):je(o,e))}}let Le=0;const _e=/* @__PURE__ */new Map,ke=/* @__PURE__ */new Map,Oe=/* @__PURE__ */new Map,He=/* @__PURE__ */new Map,ze=/* @__PURE__ */new Map;function qe(t){return e(t)}function Ge(e){return We(e)||le.has(qe(e))||le.has(e.conversationId)}function We(e){return fe.has(qe(e))||fe.has(e.conversationId)}function Je(t,n={}){return(!0===n.includeRestored||Ge(t))&&!We(t)&&ve.has(e(t))}function Qe(){return[...le,...ve.values()]}function Ve(e){const t=le.delete(qe(e)),n=le.delete(e.conversationId);return t||n}function Xe(e){const t=Ve(e),n=fe.delete(qe(e)),o=fe.delete(e.conversationId);return{deleted:t,terminal:n||o}}function Ye(e,t){if(""===t||"system"!==e.contentType)return!1;const n=e.body.system;return!0===n?.targetUserIds?.includes(t)&&("group"===e.conversationType?"group_member_joined"===n.eventType||"group_member_invited"===n.eventType:"channel"===e.conversationType&&("channel_member_joined"===n.eventType||"channel_member_invited"===n.eventType||"channel_created"===n.eventType))}function Ze(n){const o=t(n);if(We(o)||Ge(o)&&void 0===ne.get(o))return!1;if("group"!==o.conversationType)return!0;const r=pe.get(e(o));return void 0===r||n.sortKey>=r}function et(t){const n=e(t),o=(ke.get(n)??0)+1;return ke.set(n,o),o}function tt(t){const n=e(t),o=(_e.get(n)??0)+1;return _e.set(n,o),o}function nt(e,t){x.emitter.emit({type:"error",error:{scope:"storage",message:e,cause:t}})}function ot(e){x.emitter.emit({type:"session:updated",session:e,conversation:o(e)})}const rt=/* @__PURE__ */new Set,st=/* @__PURE__ */new Set,it=/* @__PURE__ */new Map,at=/* @__PURE__ */new Map;let ct=0,dt=Promise.resolve(),ut=0,lt=Promise.resolve(),vt=0;const ft=/* @__PURE__ */new Map;let pt;function yt(n){const o=e(t(n));pt?.keys.has(o)&&pt.messages.set(`${o}\0${n.id}`,n)}function mt(t){const n=e(t);ft.set(n,(ft.get(n)??0)+1)}function gt(e){return pt?.writes.push(e),void 0!==pt&&e.catch(()=>{}),e}async function ht(e){const t=(await Promise.allSettled(e)).find(e=>"rejected"===e.status);if(void 0!==t)throw t.reason}function Ct(e){const t=lt.then(e);return lt=t.then(()=>{},()=>{}),t}function wt(t,n){const o=vt,r=t.map(t=>[e(t),ft.get(e(t))??0]);return()=>o===vt&&n()&&r.every(([e,t])=>(ft.get(e)??0)===t)}function It(e){const t=0===ut?(()=>{try{return e()}catch(e){return Promise.reject(e)}})():dt.then(e),n=t.then(()=>{},()=>{});rt.add(n),n.finally(()=>rt.delete(n));for(const e of st)e.writes.push(t);return gt(t)}function Tt(e){ut+=1;const t=Promise.all([...rt]),n=dt.then(()=>t).then(e);return dt=n.then(()=>{},()=>{}),dt.finally(()=>{ut-=1}),gt(n)}function Mt(e){const t=e.body.system;if(void 0===t?.pinnedMessageAction)return e;const{pinnedMessageAction:n,...o}=t;return{...e,body:{...e.body,system:o}}}function St(n){if(void 0!==ye&&!Re&&0!==n.length){for(const o of st)for(const r of n)o.messages.add(`${e(t(r))}\0${r.id}`);It(()=>ye.saveMessages(n.map(Mt))).catch(e=>nt("消息落盘失败",e))}}function bt(e){const{lastMessageSendState:t,manuallyUnread:n,...o}=e;return o}function Et(t){if(void 0!==ye&&!Re){for(const n of st)n.sessions.add(e(o(t)));It(()=>ye.saveSessions([bt(t)])).catch(e=>nt("会话落盘失败",e))}}function Kt(e,t,n){if(void 0===ye||Re)return;const o=++ct;it.set(e,{version:o,persist:()=>Kt(e,t,n)});for(const t of st)t.metadata.add(e);const r=at.get(e),s=It(()=>void 0===r?ye.setMeta(e,t()):r.then(()=>ye.setMeta(e,t()))),i=s.then(()=>{},()=>{});at.set(e,i),i.then(()=>{at.get(e)===i&&at.delete(e)}),s.then(()=>{it.get(e)?.version===o&&it.delete(e)},e=>nt(n,e))}function Ut(){Kt(z,Qe,"删除会话标记保存失败")}function At(){Kt(q,()=>[...fe],"成员资格终止标记保存失败")}function Rt(){Kt(G,()=>[...pe.entries()],"重新入群的历史起点保存失败")}function Pt(t){if(void 0!==ye&&!Re){for(const n of st)void 0!==t.conversationType&&n.reads.add(e({conversationType:t.conversationType,conversationId:t.conversationId}));It(()=>ye.saveReadState(t)).catch(e=>nt("已读态落盘失败",e))}}function Nt(t){if(e(t),"supergroup"===t.conversationType)throw new Error("supergroup 草稿未实现,不得 fallback 到其他会话类型")}function xt(e){return Nt(e),Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function $t(e,t,n){if(Nt(e),"string"!=typeof t.text)throw new TypeError("草稿 text 必须是字符串");if(void 0!==t.attachments&&t.attachments.length>0)throw new Error("草稿附件尚未支持:attachments 只接受空集合");if(void 0!==t.mentions&&!Array.isArray(t.mentions))throw new TypeError("草稿 mentions 必须是数组");const o=(t.mentions??[]).map(e=>{if("string"!=typeof e.userId||""===e.userId.trim()||"string"!=typeof e.displayName)throw new TypeError("草稿 mention 必须包含非空 userId 与字符串 displayName");return Object.freeze({userId:e.userId,displayName:e.displayName})}),r=Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId});return Object.freeze({ref:r,text:t.text,mentions:Object.freeze(o),...void 0===t.replyToMessageId?{}:{replyToMessageId:t.replyToMessageId},attachments:Object.freeze([]),updatedAt:n})}function Dt(e,t){return e.text===t.text&&e.replyToMessageId===t.replyToMessageId&&e.mentions.length===t.mentions.length&&e.mentions.every((e,n)=>{const o=t.mentions[n];return void 0!==o&&e.userId===o.userId&&e.displayName===o.displayName})}function Bt(t,n){Nt(t);const o=e(t),r=(ge.get(o)??Promise.resolve()).catch(()=>{}).then(n),s=r.then(()=>{},()=>{});return ge.set(o,s),s.finally(()=>{ge.get(o)===s&&ge.delete(o)}),r}async function jt(t,n){const o=xt(t),r=e(o);if(void 0!==n&&(!Number.isFinite(n)||n<0))throw new Error(`草稿 expectedUpdatedAt 非法:${n}`);const s=we,i=Ce.get(r)??0;return await Bt(o,async()=>{const e=re.get(o);if(null===e||void 0!==n&&e.updatedAt!==n)return!1;if(void 0!==ye&&await ye.deleteDraft(o),s!==we||i!==(Ce.get(r)??0))throw new Error("草稿状态已失效,拒绝过期清理回灌内存");return re.delete(o),x.emitter.emit({type:"draft:cleared",conversation:o}),!0})}function Ft(t,n,o,r,s){const i=mn(t);if(void 0===i)return;const a={...i,...void 0===s||s===ke.get(e(t))?{title:n,avatar:o??i.avatar}:{},...void 0!==r?{muted:r}:{}};Y(i,a)||gn(a)}function Lt(t,n){const o=x.profile;if(void 0===o)return Promise.resolve(null);const r={conversationType:"direct",conversationId:t},s=e(r),i=ze.get(t);if(!0!==n?.forceRefresh&&void 0!==i&&i.revision===_e.get(s))return i.promise;const a=Le,c=tt(r),d=et(r),u=(async()=>{const e=await o.getUserProfile(t,n);if(null!==e&&e.id===t&&a===Le&&c===_e.get(s)){const n=e.remark?.trim()?e.remark:e.nickname||t;Ft(r,n,e.avatar??"",e.muted,d)}return e})().finally(()=>{ze.get(t)?.promise===u&&ze.delete(t)});return ze.set(t,{revision:c,promise:u}),u}async function _t(t,n){const{conversationId:o,conversationType:r}=t;if("direct"===r){try{await Lt(o,!0===n?.force?{forceRefresh:!0}:void 0)}catch(e){x.emitter.emit({type:"error",error:{scope:"http",message:"会话资料补齐失败",cause:e}})}return!1}const s=e(t),i=!0===n?.force;if(!i&&(He.has(s)||Oe.has(s)))return!1;const a=Le,c=tt(t),d=et(t);i&&He.set(s,c);const{profile:u,channelProfile:l}=x,v=i?{forceRefresh:!0}:void 0;try{if("group"===r){if(void 0===u)return!1;const e=await u.getGroupProfile(o,v);if(a!==Le||c!==_e.get(s))return!1;null!==e&&(Ft(t,e.name,e.avatar??"",e.muted,d),3===e.status&&yn({conversationType:"group",conversationId:o},"group_dismissed"),i&&x.emitter.emit({type:"profile:updated",profileType:"group",id:o}))}else if("channel"===r){if(void 0===l)return!1;const e=await l.getProfile(o,v);if(a!==Le||c!==_e.get(s))return!1;if(null!==e){Ft(t,e.name,e.avatar??"",e.muted,d);const r=mn(t)?.channelState,s="left"===r||"removed"===r||"dismissed"===r,a="left"===e.channelState||"removed"===e.channelState||"dismissed"===e.channelState;if(!0===n?.allowChannelRecovery&&s&&"dismissed"!==r&&"active"===e.channelState)return vn(o,"active",void 0,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}}),i&&x.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}}),!0;const c=s&&(!a||"dismissed"===r||"dismissed"!==e.channelState);if(a&&!c)return yn({conversationType:"channel",conversationId:o},`channel_${e.channelState}`),i&&x.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}}),!1;if(!c){const t=e.permissions.sendMessages?void 0:`channel_${e.channelState}`;vn(o,e.channelState,t,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}})}i&&x.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}})}}return!1}catch(e){return x.emitter.emit({type:"error",error:{scope:"http",message:"会话资料补齐失败",cause:e}}),!1}finally{i&&a===Le&&He.get(s)===c&&He.delete(s)}}function kt(e){return k(e,x.getSelfId?.()??"")}function Ot(e){const t=oe.get(e);if(void 0===t||""===t.readCursor)return;const n="string"==typeof e?t.conversationType:e.conversationType;if("channel"===n){const o={conversationType:n,conversationId:"string"==typeof e?e:e.conversationId};return Ue(o).find(e=>e.extensions?.historyCursor===t.readCursor)?.sortKey??t.readCursorSortKey}const o="string"==typeof e?Q.getByConversation(e).find(e=>e.id===t.readCursor):Ee(e,t.readCursor);return o?.sortKey??t.readCursorSortKey}function Ht(e,t){let n=0;for(const o of Q.getByConversation(e))N(o)&&kt(o)&&(void 0===t||o.sortKey>t)&&(n+=1);return n}function zt(e){const t=x.getSelfId?.();if(void 0===t||""===t||e.senderId===t)return!1;const{mention:n}=e;return void 0!==n&&(n.atAll||n.atUserIds.includes(t))}function qt(e,t){let n=0;for(const o of Q.getByConversation(e))!0!==o.readBySelf&&zt(o)&&(void 0===t||o.sortKey>t)&&(n+=1);return n}function Gt(e,t=!0){const n=void 0===e.conversationType?te.get(e.conversationId):void 0,o=void 0===e.conversationType&&void 0!==n?{...e,conversationType:n.type}:e,r=void 0===o.conversationType?o.conversationId:{conversationType:o.conversationType,conversationId:o.conversationId},s=oe.get(r);if("channel"===o.conversationType&&de(o.conversationId),oe.set(o),t&&Pt(o),void 0===s||s.readCursor!==o.readCursor||s.readCursorSortKey!==o.readCursorSortKey||s.unreadCount!==o.unreadCount||(s.manuallyUnread??!1)!==(o.manuallyUnread??!1)){if(void 0===o.conversationType)return void x.emitter.emit({type:"error",error:{scope:"storage",message:`已读状态缺少复合身份,拒绝发布 read:updated(conversationId=${o.conversationId})`}});x.emitter.emit({type:"read:updated",conversationId:o.conversationId,conversation:{conversationType:o.conversationType,conversationId:o.conversationId},readCursor:o.readCursor,unreadCount:o.unreadCount,...!0===o.manuallyUnread?{manuallyUnread:!0}:{}})}}function Wt(n,o){if(void 0===n||n.sortKey===o.sortKey)return;const r=t(o),s=oe.get(r),i="channel"===o.conversationType?o.extensions?.historyCursor:void 0,a="direct"===o.conversationType||"group"===o.conversationType||"robot"===o.conversationType||"customerService"===o.conversationType;void 0!==s&&(a&&s.readCursor===o.id||"string"==typeof i&&""!==i&&s.readCursor===i||s.readCursorSortKey===n.sortKey)&&Gt({...s,readCursorSortKey:o.sortKey});const c=e(r);"group"===o.conversationType&&pe.get(c)===n.sortKey&&(pe.set(c,o.sortKey),Rt())}function Jt(e){const t=e?.channelAccessSnapshot?.role;return"owner"===t||"admin"===t}function Qt(e,t,n,o,r=mn(e)){const s=o??oe.get(e);if(void 0===t){if(void 0===r){if("string"==typeof e||void 0===s||s.unreadCount<=0)return;return{id:e.conversationId,type:e.conversationType,title:"",lastMessagePreview:"",timestamp:0,unreadCount:s.unreadCount,mentionUnreadCount:s.mentionUnreadCount,readCursor:s.readCursor,pinned:!1,muted:!1}}const t={...r,..."clear"===n?{lastMessagePreview:"",timestamp:0}:{},...void 0===s?{}:{unreadCount:s.unreadCount,manuallyUnread:s.manuallyUnread,mentionUnreadCount:s.mentionUnreadCount,readCursor:s.readCursor||r.readCursor}};return"clear"===n&&(delete t.lastMessageSummary,delete t.lastMessageSenderId,delete t.lastMessageSystemEvent,delete t.lastMessageSystemTargetsSelf,delete t.lastMessageMention,delete t.lastMessageRecalled,delete t.lastMessageDeletedForEveryone,delete t.lastMessageSendState,delete t.lastMessageReceipt),t}const i=s?.unreadCount??r?.unreadCount??0,a=void 0===s?r?.manuallyUnread:s.manuallyUnread,c=$(t,{unreadCount:i,mentionUnreadCount:s?.mentionUnreadCount??r?.mentionUnreadCount??0,selfId:x.getSelfId?.(),showChannelModerationDeleted:Jt(r)});return void 0===r?{...c,...void 0===a?{}:{manuallyUnread:a},readCursor:(s?.readCursor??"")||c.readCursor}:{...c,title:r.title||c.title,avatar:r.avatar??c.avatar,pinned:r.pinned,muted:r.muted,topTime:r.topTime,...void 0===a?{}:{manuallyUnread:a},readCursor:(s?.readCursor??"")||r.readCursor,groupState:r.groupState,channelState:r.channelState,channelPermissions:r.channelPermissions,channelAccessSnapshot:r.channelAccessSnapshot,sendDisabledReason:r.sendDisabledReason}}function Vt(e,t){if(void 0===e)return;const n=te.get({conversationType:e.type,conversationId:e.id});void 0!==n&&Y(n,e)||(te.set(e),ne.delete({conversationType:e.type,conversationId:e.id}),ot(e),t&&Et(e),""===e.title&&_t({conversationType:e.type,conversationId:e.id}))}function Xt(e,t,n="preserve",o=mn(e)){const r=t.findLast(e=>function(e,t){return!!N(e)&&("channel"!==e.conversationType||void 0===e.deletedForEveryone||Jt(t))}(e,o)),s="string"==typeof e?o?.type:e.conversationType;return Qt(e,r,void 0===r&&"channel"===s&&!Jt(o)&&(t.some(e=>void 0!==e.deletedForEveryone)||"channel-moderation-deleted"===o?.lastMessageSummary?.kind||void 0!==o?.lastMessageDeletedForEveryone)?"clear":n,void 0,o)}function Yt(e,t=!1){(t||void 0!==te.get(e))&&Vt(Xt(e,Q.getByConversation(e)),!0)}function Zt(e){if("uploading"!==e.status&&("failed"!==e.status||e.failure?.code!==R))return e;const t=Q.get(e.id,e);return void 0!==t&&t.conversationType===e.conversationType&&t.conversationId===e.conversationId?t:P(A(e))}function en(n,o=()=>!0){const r=[],s=j(n,x.getSelfId?.()??"").map(e=>{const t=Zt(e);let n={...t,sortKey:c(t)};if(n=A(n),"group"===n.conversationType&&"text"===n.contentType){const e=_(n.body.text??"",n.mention);void 0!==e&&(n.mention=e)}return xe(n)}),i=/* @__PURE__ */new Map;for(const n of s){if("transfer"!==n.contentType||void 0===n.body.transfer)continue;const o=t(n);i.set(e(o),o)}const a=[...i.values()].flatMap(e=>Ue(e)),d=l(a,s),u=new Set(s.map(e=>e.id));for(const e of d){if(!o())break;const{previous:n,message:s,isNew:i,changed:a}=Ke(e);if(Wt(n,s),void 0!==n&&a)for(const e of Te){if(!o())return r;e.list().some(e=>e.id===s.id&&e.conversationType===s.conversationType&&e.conversationId===s.conversationId)&&e.applyIncoming([s])}if(!o())return r;i?x.emitter.emit({type:"message:received",message:s,conversation:t(s),source:"offline",channelLifecycleEffects:!1}):a&&x.emitter.emit({type:"message:updated",message:s,conversation:t(s),source:"offline",channelLifecycleEffects:!1}),u.has(s.id)&&r.push(s)}return r}function tn(e){const t=Zt(e);let n={...t,sortKey:c(t)};if(n=A(n),"group"===n.conversationType&&"text"===n.contentType){const e=_(n.body.text??"",n.mention);void 0!==e&&(n.mention=e)}return xe(n)}function nn(n,o,r={}){const s=x.getSelfId?.()??"";if("offline"===o&&!0!==r.backfillOnly){let o=!1;for(const r of n){if(r.senderId===s||!N(r)||void 0!==r.recalled||void 0!==r.deletedForEveryone)continue;const n=t(r),i=ve.get(e(n));void 0!==i&&!We(n)&&m(r,i)&&Ve(n)&&(o=!0)}o&&Ut(),n=n.filter(n=>{const o=ve.get(e(t(n)));return void 0===o||m(n,o)||void 0!==Ee(t(n),n.id)})}if("live"===o){let i=!1,a=!1;for(const c of n){const n=t(c);if(Ye(c,s)){const t=Xe(n);t.deleted&&(i=!0),t.terminal&&("group"===n.conversationType?(pe.set(e(n),c.sortKey),Rt()):"channel"===n.conversationType&&pe.delete(e(n)),x.diagnostics?.record("info","core","conversation","membership-termination-cleared",()=>({conversation:n,data:{source:o,eventType:c.body.system?.eventType,groupHistoryLowerBoundApplied:"group"===n.conversationType}})),a=!0)}else""!==s&&c.senderId===s&&!0!==r.newOutgoing||We(n)||!Ve(n)||(i=!0)}i&&Ut(),a&&At()}const i=!0===x.diagnostics?.isEnabled("debug","conversation")?/* @__PURE__ */new Map:void 0,a=(n,o)=>{if(void 0===i)return;const r=t(n),s=e(r),a=i.get(s)??{ref:r,tombstone:0,groupLowerBound:0};"tombstone"===o?a.tombstone+=1:a.groupLowerBound+=1,i.set(s,a)},c=le.size>0||fe.size>0?n.filter(e=>{const n=t(e),o=!Ge(n)||!0===r.backfillOnly&&void 0!==ne.get(n)&&!We(n);return o||a(e,"tombstone"),o}):n,d=function(n){const o=/* @__PURE__ */new Map;if(0===pe.size)return o;for(const r of j(n,x.getSelfId?.()??"")){if("group"!==r.conversationType)continue;const n=t(r),s=e(n),i=pe.get(s);if(void 0===i)continue;const a=Ee(n,r.id);if(void 0===a||a.sortKey!==i)continue;const c=F(a,r,x.getSelfId?.()??"");c.sortKey!==i&&(pe.set(s,c.sortKey),o.set(s,c.id))}return o.size>0&&Rt(),o}(c),u=n=>d.get(e(t(n)))===n.id,v=pe.size>0?c.filter(e=>{const t=u(e)||Ze(e);return t||a(e,"groupLowerBound"),t}):c,f=0===d.size?v:[...v.filter(u),...v.filter(e=>!u(e))];for(const e of i?.values()??[])x.diagnostics?.record("debug","core","conversation","membership-filter-dropped",()=>({conversation:e.ref,data:{source:o,tombstoneDroppedCount:e.tombstone,groupHistoryLowerBoundDroppedCount:e.groupLowerBound}}));const p=/* @__PURE__ */new Map,y=/* @__PURE__ */new Map,g=/* @__PURE__ */new Map,h=/* @__PURE__ */new Map,C=/* @__PURE__ */new Map,w=/* @__PURE__ */new Set,I=j(f,s).map(xe),T=/* @__PURE__ */new Map;for(const n of I){if("transfer"!==n.contentType||void 0===n.body.transfer)continue;const o=t(n);T.set(e(o),o)}const M=[...T.values()].flatMap(e=>Ue(e)),S=l(M,I),b=[],E=[];for(const n of S){if("channel"===n.conversationType&&pt?.keys.has(e(t(n)))&&!pt.current())continue;const{previous:s,message:i,isNew:a,changed:c}=Ke(n,{authoritativeFailure:!0===r.authoritativeOutboxFailure});if(yt(i),!0===r.backfillOnly&&!0===r.refreshSessionSummary){const n=t(i);p.set(e(n),n)}if(!a&&!c)continue;Wt(s,i);for(const e of Te)e.applyIncoming([i]);a?x.emitter.emit({type:"message:received",message:i,conversation:t(i),source:o,channelLifecycleEffects:!0===r.applyChannelLifecycleEffects}):x.emitter.emit({type:"message:updated",message:i,conversation:t(i),source:o,channelLifecycleEffects:!0===r.applyChannelLifecycleEffects});const d=t(i);if(!a&&void 0!==s&&!0!==s.readBySelf&&!0===i.readBySelf){const t=Ot(d),n=void 0===t||s.sortKey>t,o=e(d);n&&N(s)&&kt(s)&&void 0===s.recalled&&void 0===s.deletedForEveryone&&g.set(o,(g.get(o)??0)-1),n&&zt(s)&&void 0===s.recalled&&void 0===s.deletedForEveryone&&C.set(o,(C.get(o)??0)-1)}We(d)||(b.push(i),p.set(e(d),d),a&&!0!==r.backfillOnly&&E.push(i))}const K=/* @__PURE__ */new Map;for(const n of E){const r=t(n),s=e(r);kt(n)&&w.add(s),K.has(s)||K.set(s,Ot(r));const i=K.get(s),a=void 0===i||n.sortKey>i;if(N(n)&&a&&kt(n)&&!0!==n.readBySelf&&void 0===n.recalled&&void 0===n.deletedForEveryone){const e=Ie(n.conversationType);("local"===e||"server"===e&&"live"===o)&&y.set(s,(y.get(s)??0)+1)}a&&!0!==n.readBySelf&&zt(n)&&void 0===n.recalled&&void 0===n.deletedForEveryone&&h.set(s,(h.get(s)??0)+1)}for(const t of p.values()){if(!0===r.backfillOnly){!0===r.refreshSessionSummary&&Yt(t);continue}const n=e(t),o=y.get(n)??0,s=h.get(n)??0,i=g.get(n)??0,a=C.get(n)??0,c=w.has(n),d=oe.get(t);if(o>0||s>0||c||void 0!==d&&(0!==i||0!==a)){const e=d??{...t,readCursor:"",unreadCount:0},n={...e,unreadCount:Math.max(0,e.unreadCount+o+i),mentionUnreadCount:Math.max(0,(e.mentionUnreadCount??0)+s+a)};c&&delete n.manuallyUnread,Gt(n)}Yt(t,E.some(e=>e.conversationType===t.conversationType&&e.conversationId===t.conversationId&&N(e)))}St(b.filter(e=>void 0!==Ee(t(e),e.id)));for(const e of b)void 0===e.recalled&&void 0===e.deletedForEveryone?je(e,o):$e(t(e),e.id)}function on(e,t,n=Date.now()){const o={conversationType:"direct",conversationId:e},r=Ee(o,t),s=Q.getByConversation(o).findLast(e=>"direct_contact_established"===e.body.system?.eventType);if(void 0!==r&&void 0!==s&&a(s)>=a(r))return;const c=`${t}:contact-required`;if(void 0!==Q.get(c,o))return;nn([{id:c,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_contact_required",targetUserIds:[e],action:{type:"request-contact",userId:e}}},createdAt:n,sortKey:i(n,c),status:"sent",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1}}],"live")}const rn=/* @__PURE__ */new Map;let sn=0;function an(e){const t=oe.get(e);if(!0!==t?.manuallyUnread)return!1;const n={...t};return delete n.manuallyUnread,Gt(n),Yt(e),!0}function cn(e,t,n,r,s){const i="string"==typeof e?e:e.conversationId,a=mn(e),c="string"==typeof e?void 0===a?void 0:o(a):e;if(void 0!==a&&"server"!==Ie(a.type))return void x.emitter.emit({type:"error",error:{scope:"unknown",message:`applyServerUnread 不应用于本地未读会话(conversationId=${i}, type=${a.type}),已忽略`}});if(!Number.isFinite(t))return void x.emitter.emit({type:"error",error:{scope:"unknown",message:`applyServerUnread 收到非法未读数(conversationId=${i}, count=${t}),已忽略`}});"channel"===c?.conversationType&&ie.delete(i);const d=oe.get(e);let u=d?.readCursor??"",l=d?.readCursorSortKey;const v=void 0===n||""===n?void 0:void 0===c?Q.getByConversation(i).find(e=>e.id===n)??be(n,i):Ee(c,n);void 0!==v&&v.conversationId===i&&(void 0===l||v.sortKey>l)&&(u=v.id,l=v.sortKey),void 0!==r&&(u=r),Gt({...void 0===c?{conversationId:i}:c,readCursor:u,readCursorSortKey:l,unreadCount:Math.max(0,Math.floor(t)),...t>0?{}:{manuallyUnread:d?.manuallyUnread},mentionUnreadCount:0===t||!1===s?0:!0===s?Math.max(1,d?.mentionUnreadCount??0):d?.mentionUnreadCount}),Yt(e,t>0&&void 0!==c&&!Ge(c))}function dn(e){const t=ie.get(e.conversation.conversationId);return t?.handle.transactionId===e.transactionId?t:void 0}function un(e,t,n,o=!1){const r=mn(e),s=Ee(e,t);if("channel"!==r?.type||"channel"!==s?.conversationType||s.conversationId!==e.conversationId||s.extensions?.historyCursor!==n)throw new Error(`CHANNEL 已读位置不可信(channelId=${e.conversationId}, messageId=${t})`);o||ie.delete(e.conversationId);const i=oe.get(e),a=void 0===i?r.mentionUnreadCount:i.mentionUnreadCount;Gt({...e,readCursor:n,readCursorSortKey:s.sortKey,unreadCount:i?.unreadCount??r.unreadCount,...void 0===a?{}:{mentionUnreadCount:a}}),Yt(e)}function ln(e,t,n){const o=e.conversation,r=o.conversationId,i=dn(e);if(void 0===i)throw new Error(`CHANNEL 乐观已读事务已失效(channelId=${r})`);const a=Ee(o,t);if(void 0===a||a.conversationId!==r||"channel"!==a.conversationType)throw new Error(`CHANNEL 乐观已读消息不可信(channelId=${r}, messageId=${t})`);if(a.extensions?.historyCursor!==n)throw new Error(`CHANNEL 乐观已读 cursor 与消息不一致(channelId=${r}, messageId=${t})`);i.steps.at(-1)?.readCursor!==n&&(i.steps.push({readCursor:n,messageId:t,...s(a)}),un(o,t,n,!0))}function vn(t,n,o,r){const s={conversationType:"channel",conversationId:t},i=e(s);if(Ge(s)&&void 0===ne.get(s)&&!Je(s))return;const a=mn(s);if(void 0===a){tt(s),He.delete(i);return void gn({id:t,type:"channel",title:"",lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:!1,channelState:n,channelPermissions:r?.permissions,channelAccessSnapshot:r?.snapshot,sendDisabledReason:o})}if("channel"!==a.type)throw new Error(`setChannelRestriction: 会话 ${t} 类型为 ${a.type},拒绝写入 CHANNEL 状态`);tt(s),He.delete(i);const c=r?.permissions,d=r?.snapshot;if(a.channelState===n&&a.sendDisabledReason===o&&V(a.channelPermissions,c)&&X(a.channelAccessSnapshot,d))return void(void 0!==te.get(s)&&Yt(s));const u={...a,channelState:n,channelPermissions:c,channelAccessSnapshot:d,sendDisabledReason:o};void 0!==te.get(s)?gn(Xt(s,Q.getByConversation(s),"preserve",u)):gn(u)}async function fn(e,t){if(""===t.trim())throw new Error("本机删除消息需要非空 messageId");const n=()=>{if(se.isPinnedMessage(e,t))throw Object.assign(new Error("置顶消息必须先取消置顶才能删除"),{code:"IM_MESSAGE_PINNED"})};n();const o=Ee(e,t),r=Q.get(t,e),s=void 0!==r&&r.conversationType===e.conversationType&&r.conversationId===e.conversationId,i=Q.getByConversation(e).filter(e=>e.id!==t),a=void 0===te.get(e)?void 0:Xt(e,i,"clear"),c=void 0===a?void 0:bt(a);function d(e){return void 0!==e&&(void 0===r||!D(r,e))}const u=void 0===ye?{deleted:!1,superseded:!1}:await Tt(async()=>{n();const r=Ee(e,t)??o??await ye.getMessage(e,t)??void 0;if(n(),d(Q.get(t,e)))return{deleted:!1,superseded:!0};const s=await ye.deleteMessage(e,t,c);if(se.isPinnedMessage(e,t)){const o=Ee(e,t)??r;void 0!==o&&await ye.saveMessages([Mt(o)]);const s=te.get(e);return void 0!==s&&await ye.saveSessions([bt(s)]),n(),{deleted:!1,superseded:!0}}return{deleted:s,superseded:!1}});if(u.superseded||d(Q.get(t,e)))return!1;const l=s&&Q.delete(e,t);let v=!1;for(const n of Te)v=n.removeMessage(e,t)||v;if(!u.deleted&&!l&&!v)return!1;const f=void 0===te.get(e)?void 0:Xt(e,Q.getByConversation(e),"clear");return Vt(f,!1),void 0===f||void 0!==a&&Y(a,f)||Et(f),$e(e,t),x.emitter.emit({type:"message:removed",conversation:{...e},messageId:t,scope:"local-only"}),!0}function pn(t,o={}){const r="string"==typeof t?t:t.conversationId,s=te.get(t),i=se.get(t),a="string"==typeof t?void 0!==s?{conversationType:s.type,conversationId:r}:void 0===i?void 0:n(i):t;if(void 0===a)throw new Error(`裸 conversationId 无法确定删除类型:${r}`);if(et(a),Oe.delete(e(a)),"direct"===a.conversationType&&(tt(a),ze.delete(a.conversationId)),mt(a),"direct"===a.conversationType||"group"===a.conversationType||"channel"===a.conversationType)if(!0===o.terminal)ve.delete(e(a));else{const t=g(a,Ue(a),ve.get(e(a)));void 0!==t&&ve.set(e(a),t)}const c=Q.getByConversation(a).length;!function(t){const n=xt(t),o=e(n);Ce.set(o,(Ce.get(o)??0)+1),null!==re.get(n)&&(re.delete(n),x.emitter.emit({type:"draft:cleared",conversation:n})),Bt(n,async()=>{void 0!==ye&&await ye.deleteDraft(n)}).catch(e=>nt("删会话草稿失败",e))}(a),De(a),te.delete(t),ne.delete(t),"channel"===a.conversationType&&(de(a.conversationId),ie.delete(a.conversationId)),oe.delete(t),Q.deleteByConversation(t),se.clear(t);const d=qe(a);if(!0===o.terminal){fe.add(d);const e=pe.delete(d);le.delete(d),le.delete(r),e&&Rt(),x.diagnostics?.record("info","core","conversation","membership-terminated",()=>({conversation:a,data:{reason:o.terminalReason??"membership-terminated",removedMessageCount:c}}))}else le.add(d);for(const e of Te)Ae(e,a)&&e.reset();x.emitter.emit({type:"session:removed",conversationId:r,conversation:a}),Ut(),!0===o.terminal&&At(),void 0!==ye&&Tt(async()=>{await ht([ye.deleteConversationMessages(a),ye.deleteSession(a),ye.deleteReadState(a),ye.removePinnedMessage(a)])}).catch(e=>nt("删除会话持久数据失败",e))}function yn(e,t){pn(e,{terminal:!0,terminalReason:t})}function mn(e){if("string"==typeof e){const t=[...te.getAll(),...ne.getAll()].filter(t=>t.id===e);if(t.length>1)throw new Error(`裸 conversationId 存在多类型歧义:${e}`);return t[0]}return te.get(e)??ne.get(e)}function gn(e){const t=o(e);void 0!==te.get(t)?(te.set(e),ot(e),Et(e)):(ne.set(e),x.emitter.emit({type:"conversation-context:updated",conversation:t}))}async function hn(n,o){let r=await ye.getMessages(n,{limit:50});const s=o=>o.filter(o=>e(t(o))===e(n)&&Ze(o)),a=s(r);if(!["direct","group","channel"].includes(n.conversationType)||!o())return a;let c=g(n,a);for(;o()&&50===r.length;){const e=r[0].sortKey;if(void 0!==c&&e<i(c.serverTime,""))break;if(r=await ye.getMessages(n,{beforeSortKey:e,limit:50}),!o())return[];if(r.some(t=>t.sortKey>=e))throw new Error("会话本地历史游标没有向前推进");const t=s(r);c=g(n,t,c),a.push(...t.filter(e=>void 0!==c&&d(e)===c.serverTime))}return a}return{upsertMessages:nn,commitReceivedMessages:function(n,o,r,s){if(void 0===ye){for(const e of s?.events??[])s.apply(e);return void nn(n,o,r)}const i={writes:[],messages:/* @__PURE__ */new Set,sessions:/* @__PURE__ */new Set,reads:/* @__PURE__ */new Set,metadata:/* @__PURE__ */new Set};st.add(i);try{const a=(s?.events??[]).filter(e=>"ignored"!==s.apply(e));nn(n,o,r);const c=a.flatMap(e=>{const t=Ee(e.conversation,e.parentMessageId);return void 0===t?[]:[t]});a.length>0&&Ne();const d=/* @__PURE__ */new Map,u=[];for(const o of[...n,...c]){const n=t(o),r=e(n),s=Ee(n,o.id);void 0!==s&&(d.set(r,n),i.messages.has(`${r}\0${s.id}`)||u.push(s))}St(u);for(const[e,t]of d){const n=te.get(t),o=oe.get(t);void 0===n||i.sessions.has(e)||Et(n),void 0===o||i.reads.has(e)||Pt(o)}for(const[e,t]of it)i.metadata.has(e)||t.persist()}finally{st.delete(i)}return ht(i.writes)},prepareOfflineMessageUpdate:function(n,o){if(void 0===ye)return!0;const r=t(n),s=ve.get(e(r));if(void 0===s||Ge(r)||m(n,s)||void 0!==Ee(r,n.id))return!0;const i=vt,a=e(r),c=ft.get(a)??0;o();let d=!1,u=Ee(r,n.id);const l=x.emitter.subscribe(o=>{"message:received"!==o.type&&"message:updated"!==o.type||o.message.id!==n.id||e(t(o.message))!==a||("live"!==o.source||void 0!==u&&B(u,o.message)||(d=!0),u=o.message)});return ye.getMessage(r,n.id).then(s=>{if(o(),i!==vt||(ft.get(a)??0)!==c)throw new DOMException("消息提交前的本地历史读取已失效","AbortError");return!d&&(void 0===Ee(r,n.id)&&null!==s&&s.id===n.id&&e(t(s))===a&&Ze(s)&&Q.upsert(s),!0)}).finally(l)},applyReaction:Be,rollbackReaction:function(t,n,o){const r=Ee(t,n);if(void 0===r){const r=`${e(t)}\0${n}`,s=Z.get(r);if(void 0===s)return!1;const i=s.filter(e=>e.id!==o);return i.length!==s.length&&(0===i.length?Z.delete(r):Z.set(r,i),Ne(),!0)}const s=C(r.reactions,o,x.getSelfId?.()??"");if(s===r.reactions)return!1;const i={...r};return void 0===s?delete i.reactions:i.reactions=s,nn([i],"live"),!0},appendDirectContactRequiredNotice:on,appendDirectMessageRefusedNotice:function(e,t,n=Date.now()){const o={conversationType:"direct",conversationId:e},r=`${t}:message-refused`;if(void 0!==Q.get(r,o))return;const s=Q.get(t,o),c="direct"===s?.conversationType&&s.conversationId===e?a(s):n;nn([{id:r,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_message_refused",targetUserIds:[e]}},createdAt:c,sortKey:i(c,r),status:"sent",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1}}],"live")},appendDirectContactRequiredTextFailure:function(e,t=Date.now()){const n=L(),o={id:n,conversationId:e.conversationId,conversationType:"direct",senderId:e.senderId,contentType:"text",body:{text:e.text},createdAt:t,sortKey:i(t,n),status:"failed",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1},failure:{code:33281,reason:"rejected",displayCode:"contactRequired",retryable:!1},...void 0===e.refMessageId?{}:{refMessageId:e.refMessageId}};return nn([o],"live"),on(e.conversationId,n,t+1),o},reconcileDirectContactEstablishedNotice:function(e,t,n=Date.now()){const o=rn.get(e);if(void 0!==o)return o;const r={conversationType:"direct",conversationId:e},s=sn,a=(async()=>{const o=Q.getByConversation(r).filter(e=>{const t=e.body.system?.eventType;return"direct_contact_required"===t||"direct_contact_established"===t}),a=o.filter(e=>"direct_contact_required"===e.body.system?.eventType),c=a.at(-1)?.createdAt??0,d=o.findLast(e=>"direct_contact_established"===e.body.system?.eventType)?.createdAt??0,u=d>=c&&d>0;if(0===a.length&&u)return;const l=Ot(r);for(const e of a)try{const t=await fn(r,e.id),n=Ee(r,e.id);t||"direct_contact_required"!==n?.body.system?.eventType||x.emitter.emit({type:"error",error:{scope:"storage",message:"联系人关系已建立,但旧的申请添加提示未能删除",cause:{conversation:r,messageId:e.id}}})}catch(t){x.emitter.emit({type:"error",error:{scope:"storage",message:"联系人关系已建立,但删除旧的申请添加提示失败",cause:{conversation:r,messageId:e.id,error:t}}})}if(s!==sn)return;const v=oe.get(r);if(void 0!==v&&(Gt({...v,...void 0===v.readCursorSortKey&&void 0!==l?{readCursorSortKey:l}:{},unreadCount:Ht(r,l)}),Yt(r)),u)return;const f=Number.isFinite(n)&&n>0?n:Date.now(),p=Math.max(f,c+1);!function(e,t,n=Date.now(),o=n){const r=function(e,t){return`${""===e.trim()?`contact-established:${t}`:e}:contact-established`}(t,o);if(void 0!==Q.get(r,{conversationType:"direct",conversationId:e}))return;nn([{id:r,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_contact_established",targetUserIds:[e]}},createdAt:n,sortKey:i(n,r),status:"sent",receipt:"unread",encryption:{encrypted:!1}}],"live")}(e,t,p,f)})().finally(()=>{rn.get(e)===a&&rn.delete(e)});return rn.set(e,a),a},recallMessage:function(e,t,n){const o=Ee(e,t);void 0!==o&&nn([{...o,recalled:n,body:{}}],"live")},deleteChannelMessageForEveryone:function(e,t,n){const o=Ee(e,t);void 0!==o&&"channel"===o.conversationType&&nn([{...o,recalled:void 0,deletedForEveryone:n,body:{}}],"live")},editMessage:function(e,t,n,o){const r=Ee(e,t);if(void 0===r)return;const s={...r,body:n,edited:!0};void 0!==o?s.mention=o:delete s.mention,nn([s],"live")},applyTransferStatusBySerialNumber:async function(e,t,n){const o=function(e,t){if(void 0===e)return t;if(0===e.status&&0!==t.status)return t;if(0===t.status&&0!==e.status)return e;const n=e.occurredTime??0,o=t.occurredTime??0;return n!==o?o>n?t:e:t.status>e.status?t:e}(ee.get(e),{serialNumber:e,status:t,...void 0===n?{}:{occurredTime:n}});ee.set(o.serialNumber,o),await async function(){if(void 0===ye)return;const e=[...ee.values()],t=me.then(()=>ye.setMeta(J,e));gt(t),me=t.catch(()=>{});try{await t}catch(e){throw nt("保存转账状态记录失败",e),e}}();const r=/* @__PURE__ */new Map;for(const t of u(Q.getAll(),e,o.status,o.occurredTime))r.set(t.id,t);for(const t of te.getAll()){const n=Ue({conversationType:t.type,conversationId:t.id});for(const t of u(n,e,o.status,o.occurredTime))r.set(t.id,t)}0!==r.size&&nn([...r.values()],"live")},getMessage:e=>Q.get(e),getMessagesById:e=>Q.getById(e),getConversationMessage:Ee,getLoadedMessagesByConversation:Ue,hasRecoverableConversationDeletion:Je,resolveConversationMessage:async function(n,o,r={}){const s=Ee(n,o);if(void 0!==s||void 0===ye)return s;try{const r=await ye.getMessage(n,o);if(null===r||e(t(r))!==e(n))return;return tn(r)}catch(e){if(nt("按消息 ID 读取本地历史失败",e),!0===r.throwOnStorageError)throw e;return}},getMessages:()=>Q.getAll(),getMessagesByConversation:e=>Q.getByConversation(e),deleteLocalMessage:fn,clearLocalConversationHistory:async function(e){mt(e);const t={...e},n=new Map(Q.getByConversation(t).map(e=>[e.id,e])),o=te.get(t),r=oe.get(t),s=void 0===r&&void 0===o?void 0:{...t,readCursor:r?.readCursor??o?.readCursor??"",...void 0===r?.readCursorSortKey?{}:{readCursorSortKey:r.readCursorSortKey},unreadCount:0,mentionUnreadCount:0},i=void 0===o?void 0:Qt(t,void 0,"clear",s);if(void 0!==ye){if(void 0===ye.clearConversationHistory)throw new Error("当前 storage 未实现 clearConversationHistory,拒绝非原子清空本机会话历史");await Tt(()=>ye.clearConversationHistory(t,void 0===i?void 0:bt(i),s))}const a=oe.get(t);void 0!==s&&(a?.conversationType===r?.conversationType&&a?.conversationId===r?.conversationId&&a?.readCursor===r?.readCursor&&a?.readCursorSortKey===r?.readCursorSortKey&&a?.unreadCount===r?.unreadCount&&a?.mentionUnreadCount===r?.mentionUnreadCount)&&Gt(s,!1);for(const[e,o]of n){const n=Q.get(e,t);void 0!==n&&D(o,n)&&Q.delete(t,e)}const c=Q.getByConversation(t);for(const e of Te)e.clearConversation(t)&&e.applyIncoming(c);De(t),void 0!==te.get(t)&&Vt(Xt(t,c,"clear"),!1),x.emitter.emit({type:"conversation-history:cleared",conversation:t,scope:"local-only"})},commitChannelSyncPage:function(n,o,r,s){const i=wt(n,r);return Ct(async()=>{if(!i())return!1;if(void 0===ye)throw new Error("CHANNEL 严格同步提交需要 storage");const r={writes:[],messages:/* @__PURE__ */new Map,keys:new Set(n.map(e)),current:i};let a;pt=r;try{const e=o();if(e instanceof Promise)throw e.catch(()=>{}),new Error("CHANNEL 页 mutation 必须同步执行")}catch(e){a={cause:e}}finally{pt=void 0}if(await ht(r.writes),void 0!==a)throw a.cause;if(!i())return!1;const c=[...r.messages.values()].flatMap(e=>{const n=Ee(t(e),e.id);return void 0===n?[]:[Mt(n)]}),d=[];c.length>0&&d.push(It(()=>ye.saveMessages(c)));for(const e of n){const t=te.get(e),n=oe.get(e),o=se.get(e);void 0!==t&&d.push(It(()=>ye.saveSessions([bt(t)]))),void 0!==n&&d.push(It(()=>ye.saveReadState(n))),d.push(It(()=>void 0===o?ye.removePinnedMessage(e):ye.savePinnedMessage(o)))}const u=[[W,[...Z.values()].flat()],[J,[...ee.values()]],[z,Qe()],[q,[...fe]],[G,[...pe.entries()]]];for(const[e,t]of u)d.push(It(()=>ye.setMeta(e,t)));return void 0!==s&&d.push(It(async()=>{i()&&await s()})),await ht(d),i()})},saveChannelSyncCheckpoint:function(e,t){const n=f(e,e.conversation);if(void 0===n)return Promise.reject(new Error("CHANNEL 同步位置无效"));const o=wt([n.conversation],t);return Ct(async()=>{if(!o())return!1;if(void 0===ye)throw new Error("CHANNEL 同步位置保存需要 storage");let e=!1;return await It(async()=>{o()&&(await ye.setMeta(p(n.conversation),n),e=!0)}),e&&o()})},waitForChannelSyncPersistence:async function(){for(;;){const e=lt,t=dt;if(await Promise.all([e,t,...rt]),e===lt&&t===dt&&0===rt.size)return}},getSession:e=>te.get(e),getConversationContext:mn,isMembershipTerminated:We,prepareConversation:function(e,t={}){const n=o(e);if("supergroup"===n.conversationType)throw new Error("prepareConversation:supergroup 未实现");const r=mn(n);if(void 0!==r){const t=r.title||e.title,n=r.avatar??e.avatar;return void(t===r.title&&n===r.avatar||gn({...r,title:t,avatar:n}))}if(We(n)){if(!0!==t.membershipConfirmed)throw new Error("准备聊天失败:需要重新确认成员资格");fe.delete(qe(n)),fe.delete(n.conversationId),At()}gn({...e,...void 0===e.channelPermissions?{}:{channelPermissions:{...e.channelPermissions}},...void 0===e.channelAccessSnapshot?{}:{channelAccessSnapshot:{...e.channelAccessSnapshot}}}),(oe.get(n)?.unreadCount??0)>0&&!Ge(n)&&Yt(n,!0)},ensureConversation:function(t){const n=o(t);if(e(n),"supergroup"===n.conversationType)throw new Error("ensureConversation:supergroup 未实现");const r=te.get(n);if(void 0!==r)return r;const s={...t,id:n.conversationId,type:n.conversationType,...void 0===t.channelPermissions?{}:{channelPermissions:{...t.channelPermissions}},...void 0===t.channelAccessSnapshot?{}:{channelAccessSnapshot:{...t.channelAccessSnapshot}},...void 0===t.extensions?{}:{extensions:{...t.extensions}}},i=Xe(n);return i.deleted&&Ut(),i.terminal&&At(),te.set(s),ne.delete(n),ot(s),Et(s),s},getSessions:()=>te.getAll(),getConversationList:function(){const e=[];for(const t of te.getAll()){const n=o(t);e.push({...t,draft:re.get(n)})}return b(e)},getReadState:e=>oe.get(e),getPinnedMessage:e=>se.get(e),setPinnedMessage:function(e,t){const o=function(e){const t=Ee(n(e),e.messageId);return void 0===t?e:{...e,preview:{state:"ready",message:t}}}(e);se.set(o)&&(x.emitter.emit({type:"pinned-message:updated",conversationId:o.conversationId,conversation:{conversationType:o.conversationType,conversationId:o.conversationId},pinnedMessage:o,reason:t}),function(e){void 0===ye||Re||It(()=>ye.savePinnedMessage(e)).catch(e=>nt("置顶消息落盘失败",e))}(o))},clearPinnedMessage:function(e,t){const o="string"==typeof e?e:e.conversationId,r=se.get(e);if(!se.clear(e))return;const s="string"==typeof e?void 0===r?void 0:n(r):e;if(void 0===s)throw new Error(`置顶消息清理缺少复合身份:${o}`);x.emitter.emit({type:"pinned-message:updated",conversationId:o,conversation:s,pinnedMessage:null,reason:t}),function(e){void 0===ye||Re||It(()=>ye.removePinnedMessage(e)).catch(e=>nt("置顶消息删除失败",e))}(e)},isPinnedMessage:(e,t)=>se.isPinnedMessage(e,t),setReadState:e=>{const t=void 0===e.conversationType?te.get(e.conversationId):void 0,n=void 0===e.conversationType&&void 0!==t?{...e,conversationType:t.type}:e;"channel"===n.conversationType&&de(n.conversationId),oe.set(n),Pt(n)},markConversationUnread:function(e){const t=te.get(e);if(void 0===t)return!1;const n=oe.get(e)??{...e,readCursor:t.readCursor??"",unreadCount:t.unreadCount,mentionUnreadCount:t.mentionUnreadCount};return!(n.unreadCount>0||!0===n.manuallyUnread)&&(Gt({...n,manuallyUnread:!0}),Yt(e),!0)},clearConversationManualUnread:an,advanceRead:function(e,n){const o="string"==typeof e?Q.getByConversation(e).find(e=>e.id===n)??be(n,e):Ee(e,n);if(void 0===o)return;const r="string"==typeof e?t(o):e,s="string"==typeof e?e:e.conversationId;if(o.conversationId!==s||o.conversationType!==r.conversationType)return;const i=Ot(r);if(void 0!==i&&i>=o.sortKey)return void("string"!=typeof e&&an(e));const a={...r,readCursor:n,readCursorSortKey:o.sortKey,unreadCount:Ht(r,o.sortKey),mentionUnreadCount:qt(r,o.sortKey)};return Gt(a),Yt(r),a},applyServerUnread:cn,applyChannelReadPosition:un,getChannelReadRevision:e=>ae.get(e.conversationId)??ce,hasPendingChannelRead:e=>ie.has(e.conversationId),applyChannelReadSummary:(e,t)=>cn(e,t.unreadCount,void 0,t.readCursor,t.hasUnreadMention),beginChannelReadTransaction:function(e){const t=e.conversationId,n=mn(e);if(void 0===n||"channel"!==n.type)throw new Error(`CHANNEL 乐观已读事务要求 channel 会话(conversationId=${t}, type=${n?.type??"missing"})`);if(ie.has(t))throw new Error(`CHANNEL 乐观已读事务已存在(channelId=${t})`);const o={conversation:e,transactionId:ue++},r=oe.get(e)??{conversationId:t,readCursor:n.readCursor??"",unreadCount:n.unreadCount,...void 0===n.mentionUnreadCount?{}:{mentionUnreadCount:n.mentionUnreadCount}};return ie.set(t,{handle:o,baseReadState:{...r},steps:[],committedThrough:-1}),de(t),o},applyChannelReadOptimistically:ln,applyChannelConversationReadOptimistically:function(e,t,n){ln(e,t,n);const o=dn(e).steps.at(-1);if(void 0!==o.clearedCounts)return;const i=oe.get(e.conversation),a=Ue(e.conversation).filter(e=>r(s(e),o)>0&&kt(e)&&N(e)&&!0!==e.readBySelf&&void 0===e.recalled&&void 0===e.deletedForEveryone),c=Math.min(i.unreadCount,a.length),d=Math.min(i.mentionUnreadCount??0,a.filter(zt).length);o.clearedCounts={unread:i.unreadCount-c,mention:(i.mentionUnreadCount??0)-d},Gt({...i,unreadCount:c,mentionUnreadCount:d}),Yt(e.conversation)},commitChannelReadTransaction:function(e,t){const n=dn(e);if(void 0===n)return!1;const o=n.steps.findLastIndex(e=>e.readCursor===t);if(o<0)throw new Error(`CHANNEL 已确认 cursor 不属于乐观事务(channelId=${e.conversation.conversationId}, cursor=${t})`);return n.committedThrough=Math.max(n.committedThrough,o),de(e.conversation.conversationId),n.committedThrough===n.steps.length-1&&ie.delete(e.conversation.conversationId),!0},rollbackChannelReadTransaction:function(e){const t=dn(e);if(void 0===t)return!1;const n=e.conversation,o=n.conversationId,r=oe.get(n),s=t.committedThrough>=0?t.steps[t.committedThrough]:void 0,i=void 0===s?t.baseReadState:void 0;let a=r?.unreadCount??i?.unreadCount??0,c=r?.mentionUnreadCount??i?.mentionUnreadCount??0;for(const e of t.steps.slice(t.committedThrough+1))a+=e.clearedCounts?.unread??0,c+=e.clearedCounts?.mention??0;const d=void 0!==i?.mentionUnreadCount||void 0!==r?.mentionUnreadCount,u={conversationId:o,conversationType:"channel",readCursor:s?.readCursor??i?.readCursor??"",readCursorSortKey:s?.sortKey??i?.readCursorSortKey,unreadCount:a,...d?{mentionUnreadCount:c}:{}};return ie.delete(o),Gt(u),Yt(n),!0},setGroupRestriction:function(e,t,n){const o=mn({conversationType:"group",conversationId:e});if(void 0===o){return void gn({id:e,type:"group",title:"",lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:!1,groupState:t,sendDisabledReason:n})}if(o.groupState===t&&o.sendDisabledReason===n)return;gn({...o,groupState:t,sendDisabledReason:n})},setChannelRestriction:vn,setPinned:function(e,t){const n=te.get(e);if(void 0===n||n.pinned===t)return;const o={...n,pinned:t,topTime:t?Date.now():void 0};te.set(o),ot(o),Et(o)},setMuted:function(e,t){const n=mn(e);if(void 0===n||n.muted===t)return;gn({...n,muted:t})},removeConversation:function(e){pn(e)},removeConversationForMembershipTermination:yn,refreshConversationProfile:function(e,t){_t({conversationType:t,conversationId:e},{force:!0})},readDirectProfile:Lt,beginConversationProfileRead:function(t,n){const o={...t},r=e(o),s=Le,i=!0!==n?.forceRefresh&&(He.has(r)||Oe.has(r))?void 0:et(o);void 0!==i&&!0===n?.forceRefresh&&Oe.set(r,i);const a=()=>{s===Le&&void 0!==i&&Oe.get(r)===i&&Oe.delete(r)};return Object.assign(e=>{try{if(void 0===i||e.id!==o.conversationId||s!==Le)return;Ft(o,e.title,e.avatar??"",void 0,i)}finally{a()}},{finish:a})},recoverChannelFromProfile:function(e){return _t({conversationType:"channel",conversationId:e},{force:!0,allowChannelRecovery:!0})},updateConversationProfile:function(e,t){const n=mn(e);if(void 0===n)return;et(o(n));const r={...n,...void 0!==t.title?{title:t.title}:{},...void 0!==t.avatar?{avatar:t.avatar}:{}};Y(n,r)||gn(r)},getTotalUnread:function(e){return H(te.getAll(),e)},getDraft:function(e){return re.get(xt(e))},saveDraft:async function(t,n){const o=xt(t),r=e(o),s=$t(o,n,0),i=we,a=Ce.get(r)??0;return await Bt(o,async()=>{const e=re.get(o),t=Math.max(Date.now(),(he.get(r)??e?.updatedAt??0)+1),n=$t(o,s,t);if(null!==e&&Dt(e,n))return e;if(void 0!==ye&&await ye.saveDraft(n),i!==we||a!==(Ce.get(r)??0))throw new Error("草稿状态已失效,拒绝过期写入回灌内存");return re.set(n),he.set(r,t),x.emitter.emit({type:"draft:updated",conversation:n.ref,draft:n}),n})},clearDraft:async function(e){await jt(e)},clearDraftIfUnchanged:async function(e,t){return await jt(e,t)},invalidateAndDrainDraftOperations:async function(){for(we+=1;ge.size>0;)await Promise.all([...ge.values()])},clearSession(){vt+=1,Le+=1,we+=1,sn+=1,rn.clear(),_e.clear(),ke.clear(),Oe.clear(),He.clear(),ze.clear(),Q.clear(),te.clear(),ne.clear(),oe.clear(),re.clear(),ge.clear(),he.clear(),Ce.clear(),ie.clear(),ae.clear(),ce+=1,se.clearAll(),le.clear(),ve.clear(),fe.clear(),pe.clear(),it.clear(),Z.clear();for(const e of Te)e.reset()},hydrate:async function(t=()=>!0){if(void 0!==ye&&t()){Re=!0;try{const r=await ye.getMeta(z);if(!t())return;if(null!==r)for(const t of r)if("string"==typeof t)le.add(t);else{const n=y(t);ve.set(e(n.conversation),n)}const s=await ye.getMeta(q);if(!t())return;if(null!==s)for(const e of s)fe.add(e);const i=await ye.getMeta(G);if(!t())return;if(null!==i)for(const[e,t]of i)"string"==typeof e&&"string"==typeof t&&pe.set(e,t);const a=await ye.getMeta(W);if(!t())return;if(null!==a)for(const e of a){const t=Pe(e);Z.set(t,[...Z.get(t)??[],e])}const c=await ye.getMeta(J);if(!t())return;if(Array.isArray(c))for(const e of c){if("object"!=typeof e||null===e)continue;const t=Reflect.get(e,"serialNumber"),n=Reflect.get(e,"status"),o=Reflect.get(e,"occurredTime");"string"!=typeof t||""===t.trim()||0!==n&&1!==n&&2!==n&&3!==n||void 0!==o&&("number"!=typeof o||!Number.isFinite(o)||o<=0)||ee.set(t,{serialNumber:t,status:n,...void 0===o?{}:{occurredTime:o}})}const d=await ye.getPinnedMessages();if(!t())return;for(const e of d){if(!t())return;Ge({conversationType:e.conversationType,conversationId:e.conversationId})||se.set(e)&&x.emitter.emit({type:"pinned-message:updated",conversationId:e.conversationId,conversation:n(e),pinnedMessage:e,reason:"hydrate"})}const u=(await ye.getSessions()).filter(e=>!Ge({conversationType:e.type,conversationId:e.id}));if(!t())return;for(const e of u){if(!t())return;const n=Xt(o(e),[],"preserve",e),r=o(n),s=te.get(r);te.set(n),ne.delete(r),void 0!==s&&Y(s,n)||ot(n)}const l=await ye.getReadStates();if(!t())return;for(const e of l)"channel"===e.conversationType&&de(e.conversationId),oe.set(e);const v=we,f=await ye.getDrafts();if(!t())return;if(v!==we)return;for(const n of f){if(!t())return;if(!Number.isFinite(n.updatedAt)||n.updatedAt<0)throw new Error(`草稿 updatedAt 非法:${n.updatedAt}`);const o=$t(n.ref,n,n.updatedAt);if(Ge(o.ref)){try{if(await ye.deleteDraft(o.ref),!t())return}catch(e){if(!t())return;nt("清理已删会话残留草稿失败",e)}continue}const r=e(o.ref);he.set(r,Math.max(he.get(r)??0,o.updatedAt));const s=re.get(o.ref);null!==s&&s.updatedAt===o.updatedAt&&Dt(s,o)||(re.set(o),x.emitter.emit({type:"draft:updated",conversation:o.ref,draft:o}))}for(const e of u){if(!t())return;const n=o(e),r=await hn(n,t);if(!t())return;const s=[];if(en(r.map(e=>{const t=Zt(A(e));return t!==e&&s.push(t),t}),t),!t())return;if(s.length>0)try{if(await ye.saveMessages(s),!t())return}catch(e){if(!t())return;nt("本地消息修复态落盘失败",e)}if(!t())return;Yt(n)}}catch(e){t()&&nt("本地历史回读失败",e)}finally{Re=!1,t()&&Fe("offline")}}},loadOlderMessages:async function(n,o){if(void 0===ye)return[];try{const r=await ye.getMessages(n,o),s="string"==typeof n?r.filter(Ze):r.filter(o=>e(t(o))===e(n)).filter(Ze),i=Re;let a;Re=!0;try{a=en(s)}finally{Re=i}return Re||Fe("offline"),a.map(e=>Ee(t(e),e.id)??e)}catch(e){return nt("加载更早消息失败",e),[]}},searchMessages:async function(n,o){const r=o.keyword?.trim()??"",s=o.contentTypes;if(""===r&&(void 0===s||0===s.length))return{results:[],exhausted:!0};const i=""===r?void 0:await K(r),a=e=>{const t=void 0===s||s.includes(e.contentType),n=void 0===i||null!==i.match(U(e));return t&&n},c=(e,t)=>e.sortKey<t.sortKey?1:e.sortKey>t.sortKey?-1:0,d=e=>function(e,t){const n=t?.match(U(e));return{message:e,ranges:n?.ranges.map(({start:e,end:t})=>[e,t])??[]}}(e,i);if(void 0===ye)return(()=>{const e=Q.getByConversation(n).filter(a).sort(c),t=(void 0===o.beforeSortKey?e:e.filter(e=>e.sortKey<o.beforeSortKey)).slice(0,o.limit),r=t.length<o.limit;return{results:t.map(d),exhausted:r,...r?{}:{nextBeforeSortKey:t.at(-1)?.sortKey}}})();let u;try{u=await ye.searchMessages(n,{...void 0!==o.keyword?{keyword:o.keyword}:{},...void 0!==s?{contentTypes:s}:{},limit:o.limit,...void 0!==o.beforeSortKey?{beforeSortKey:o.beforeSortKey}:{}})}catch(e){throw nt("会话内搜索失败",e),e}const l=u.exhausted?void 0:u.nextBeforeSortKey,v=new Map(Q.getByConversation(n).map(e=>[e.id,e])),f=/* @__PURE__ */new Map;for(const o of u.items){const r=tn(o);e(t(r))===e(n)&&f.set(r.id,v.get(r.id)??r)}for(const e of v.values()){const t=void 0===o.beforeSortKey||e.sortKey<o.beforeSortKey,n=void 0===l||e.sortKey>=l;t&&n&&a(e)&&f.set(e.id,e)}return{results:[...f.values()].filter(a).sort(c).map(d),exhausted:u.exhausted,...u.exhausted?{}:{nextBeforeSortKey:u.nextBeforeSortKey}}},messageWindow:Se,createMessageWindow:function(e={}){const t=Me(e);let n=!1;return{window:t,dispose(){n||(n=!0,t.reset(),Te.delete(t))}}}}}export{Z as createDomainState,O as defaultConversationUnreadMode,H as sumSessionsUnread};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveGroupHistoryPageBoundary as e}from"./group-history-page-boundary.js";import{throwIfAborted as r}from"../../../im-core/src/abort.js";import{pullGroupHistory as o}from"../../../im-browser/src/http/requests/pull-offline-group.js";import{
|
|
1
|
+
import{resolveGroupHistoryPageBoundary as e}from"./group-history-page-boundary.js";import{throwIfAborted as r}from"../../../im-core/src/abort.js";import{pullGroupHistory as o}from"../../../im-browser/src/http/requests/pull-offline-group.js";import{yieldToBrowser as t}from"../../../im-browser/src/scheduling/yield-to-browser.js";import{pullChannelLatestPage as s}from"../../../im-browser/src/http/requests/pull-offline-channel.js";function n(n){return async(i,p)=>{r(p);const a="group"===i.conversationType?n.groupAsyncDecrypt?.({conversationType:"group",conversationId:i.conversationId},p):void 0;a?.assertCurrent?.();const c=await n.authProvider.getLoginContext();if(r(p),null===c)throw new Error("最近历史请求缺少当前账号");n.assertLoginContext?.(c.userId),a?.assertCurrent?.();const u=[],y=[],d=e=>{y.push({...e,source:"history"})},l=e=>{u.push(e)};if("group"===i.conversationType){const s={...n.groupDecrypt(),onDecryptRecovery:d},m=Date.now(),g=await o({asyncDecrypt:a,http:n.http,userId:c.userId,clientType:n.clientType,groupId:i.conversationId,baseTime:m,direct:1,limit:30,decryptDeps:s,prepareKeys:e=>n.prepareGroupKeys(e,{signal:p,priority:n.keyPriority?.(i)??"foreground"}),onReaction:l,signal:p,keepRaw:!1,yieldToEventLoop:t});r(p),a?.assertCurrent?.();const h=e({conversationId:i.conversationId,direction:"older",baseTime:m,batchSize:g.batchSize,boundaryTime:g.oldestEntryTime,limit:30});return{messages:g.messages,reactions:u,recoveries:y,...h}}const m={...n.channelDecrypt(),onDecryptRecovery:d},g=await s({http:n.http,userId:c.userId,clientType:n.clientType,channelId:i.conversationId,count:30,decryptDeps:m,prepareKey:e=>n.prepareChannelKeys([e],{signal:p,priority:n.keyPriority?.(i)??"foreground"}),onReaction:l,signal:p,keepRaw:!1,yieldToEventLoop:t});return r(p),{messages:g.messages,reactions:u,recoveries:y,exhausted:!g.hasOlder,...void 0===g.nextCursor?{}:{nextCursor:g.nextCursor}}}}export{n as createRecentHistoryFetcher};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createChannelPinnedRuntime as e,createChannelApi as t,createChannelLegacyMessageRepair as r,isChannelHistoryBlocked as o,createChannelOperationsRuntime as n}from"../domains/channel.js";import{createContactApi as s}from"../domains/contact.js";import{createConversationsApi as a,createConversationInputResolver as i}from"../domains/conversation.js";import{createGroupPinnedRuntime as c,createGroupApi as d}from"../domains/group.js";import{createMediaUploadComputation as p}from"../domains/media-byte-computation.js";import{createMessageOperationsRuntime as l}from"../domains/message.js";import{createConnectionApi as u}from"../domains/session.js";import{createApplicationsRuntime as m}from"../product/applications.js";import{createDirectCallsApi as v}from"../product/calls.js";import{createChannelMentionCandidatesRuntime as y}from"../product/channel-mention-candidates.js";import{createConversationBackgroundRuntime as g}from"../product/conversation-background.js";import{createRobotConversationHandle as f,createCustomerServiceConversationHandle as h,createChannelConversationHandle as I,createGroupConversationHandle as w,createDirectConversationHandle as C,linkConversationHandleDomainAccess as b}from"../product/conversation-handle.js";import{createCustomerServiceApi as S,createCustomerServiceError as T}from"../product/customer-service.js";import{createSdkDiagnosticWriter as E,toImDiagnosticMessage as M}from"../product/diagnostics.js";import{createDirectoryRuntime as R}from"../product/directory.js";import{createDraftsRuntime as k}from"../product/draft.js";import{isImReactionEmojiToken as x}from"../product/emoji-catalog.js";import{createExpressionsRuntime as D}from"../product/expressions.js";import{createGroupCallsApi as P}from"../product/group-calls.js";import{createLocalDataRuntime as A}from"../product/local-data.js";import{createDefaultMediaAssetCacheStrategyRegistry as j,createMediaTasksRuntime as O}from"../product/media.js";import{createImSdkError as _}from"../product/message.js";import{fetchMessagesByIdWithCaseVariants as N}from"../product/messages-by-id.js";import{createOutboxRuntime as L}from"../product/outbox.js";import{createRobotDirectoryRuntime as K}from"../product/robots.js";import{createSearchRuntime as F}from"../product/search.js";import{createSessionFavoritesRuntime as U}from"../product/session-favorites.js";import{createImSettingsRuntime as B}from"../product/settings.js";import{createChannelReadSummaryRefresh as G}from"./channel-read-summary-refresh.js";import{createCustomerServiceLegacyRecovery as H}from"./customer-service-legacy-recovery.js";import{recordDecryptFailedDiagnostic as V}from"./decrypt-diagnostics.js";import{createForegroundWorkCoordinator as $}from"./foreground-work-coordinator.js";import{resolveGroupHistoryPageBoundary as q}from"./group-history-page-boundary.js";import{createKeyPrefetchQueue as W}from"./key-prefetch.js";import{createLocalMediaPreviewPreparation as z}from"./local-media-preview.js";import{createMediaCacheMaintenance as J}from"./media-cache-maintenance.js";import{createAccountMediaUploadRecovery as Q,createMediaOnlineWaiter as Y}from"./media-upload-recovery.js";import{inspectProtobufWireShape as X}from"./protobuf-wire-shape.js";import{createReceivingActivity as Z}from"./receiving-activity.js";import{createRecentHistoryFetcher as ee}from"./recent-history-fetcher.js";import{createRecentHistoryPrefetch as te}from"./recent-history-prefetch.js";import{createSessionHttpClients as re}from"./session-http-clients.js";import{createSignalOfflinePoller as oe}from"./signal-offline-poller.js";import{createWsTransport as ne}from"../../../im-browser/src/transport/ws-transport.js";import{createIndexedDbStorageAdapter as se,deleteIndexedDbNamespace as ae}from"../../../im-browser/src/storage/indexed-db-storage-adapter.js";import{createProfileHttpAdapter as ie}from"../../../im-browser/src/http/profile-http-adapter.js";import{createChannelHttpAdapter as ce,ChannelHttpError as de,ChannelProfileMappingError as pe}from"../../../im-browser/src/http/channel-http-adapter.js";import{createChannelMemberHttpAdapter as le}from"../../../im-browser/src/http/channel-member-http-adapter.js";import{createChannelMentionMemberHttpAdapter as ue}from"../../../im-browser/src/http/channel-mention-member-http-adapter.js";import{createDirectoryHttpAdapter as me}from"../../../im-browser/src/http/directory-http-adapter.js";import{createExpressionHttpAdapter as ve}from"../../../im-browser/src/http/expression-http-adapter.js";import{createSessionFavoriteHttpAdapter as ye}from"../../../im-browser/src/http/session-favorite-http-adapter.js";import{createChannelJoinApplicationHttpAdapter as ge}from"../../../im-browser/src/http/channel-join-application-http-adapter.js";import{createContactApplicationHttpAdapter as fe,createGroupApplicationHttpAdapter as he}from"../../../im-browser/src/http/application-http-adapters.js";import{createDomainState as Ie}from"../../../im-core/src/state/domain-state.js";import{encodeConversationKey as we}from"../../../im-core/src/conversation-identity.js";import{createNetworkMonitor as Ce}from"../../../im-browser/src/network/network-monitor.js";import{createCryptoTaskExecutor as be}from"../../../im-browser/src/crypto/crypto-task-executor.js";import{createMediaTransferAdapter as Se}from"../../../im-browser/src/media/media-transfer-adapter.js";import{createMediaPreviewPreparationExecutor as Te}from"../../../im-browser/src/media/media-preview-preparation-executor.js";import{createChannelKeyService as Ee}from"../../../im-browser/src/crypto/channel-key-service.js";import{createSendStrategyRegistry as Me}from"../../../im-core/src/message-flow/send/send-strategy-registry.js";import{createDirectSendStrategy as Re}from"../../../im-core/src/message-flow/send/direct-send-strategy.js";import{createGroupSendStrategy as ke}from"../../../im-core/src/message-flow/send/group-send-strategy.js";import{createChannelSendStrategy as xe}from"../../../im-core/src/message-flow/send/channel-send-strategy.js";import{createRobotSendStrategy as De}from"../../../im-core/src/message-flow/send/robot-send-strategy.js";import{createRecallStrategyRegistry as Pe,createDirectRecallStrategy as Ae,createGroupRecallStrategy as je,createChannelRecallStrategy as Oe}from"../../../im-core/src/message-flow/recall/recall-strategy.js";import{createEditStrategyRegistry as _e,createDirectEditStrategy as Ne,createGroupEditStrategy as Le,createChannelEditStrategy as Ke}from"../../../im-core/src/message-flow/edit/edit-strategy.js";import{createReactionReceiveHandlers as Fe}from"../../../im-core/src/message-flow/reaction/reaction-receive-handlers.js";import{createGroupReceiveHandlers as Ue}from"../../../im-core/src/message-flow/receive/group-receive-handlers.js";import{createChannelReceiveHandlers as Be}from"../../../im-core/src/message-flow/receive/channel-receive-handlers.js";import{createRobotReceiveHandlers as Ge}from"../../../im-core/src/message-flow/receive/robot-receive-handlers.js";import{createChannelNotifyReceiveHandlers as He}from"../../../im-core/src/message-flow/receive/channel-notify-receive-handlers.js";import{createChannelApplicationReceiveHandlers as Ve}from"../../../im-core/src/message-flow/receive/channel-application-receive-handlers.js";import{createSessionFavoriteReceiveHandlers as $e}from"../../../im-core/src/message-flow/receive/session-favorite-receive-handlers.js";import{createFriendActionReceiveHandlers as qe}from"../../../im-core/src/message-flow/receive/friend-action-receive-handlers.js";import{createWalletNotifyReceiveHandlers as We}from"../../../im-core/src/message-flow/receive/wallet-notify-receive-handlers.js";import{createContactApplicationReceiveHandlers as ze}from"../../../im-core/src/message-flow/receive/contact-application-receive-handlers.js";import{createContactApplicationAnswerReceiveHandlers as Je}from"../../../im-core/src/message-flow/receive/contact-application-answer-receive-handlers.js";import{createDirectCallManager as Qe}from"../../../im-core/src/message-flow/call/direct-call-manager.js";import{createGroupCallManager as Ye}from"../../../im-core/src/message-flow/call/group-call-manager.js";import{createGroupEventReceiveHandlers as Xe}from"../../../im-core/src/message-flow/receive/group-event-receive-handlers.js";import{createChannelReadReceiveHandlers as Ze}from"../../../im-core/src/message-flow/read/channel-read-receive-handlers.js";import{createReadStrategyRegistry as et}from"../../../im-core/src/message-flow/read/read-strategy.js";import{createPushRegistration as tt}from"../../../im-core/src/push/push-registration.js";import{createClientActivity as rt}from"../../../im-core/src/connection/client-activity.js";import{createImConnection as ot}from"../../../im-core/src/connection/connection-manager.js";import{createBrowserConnectionOwnership as nt}from"../../../im-browser/src/network/browser-connection-ownership.js";import{CmdId as st}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{createGroupRestrictionCoordinator as at}from"../../../im-core/src/state/group-restriction-coordinator.js";import{createChannelRestrictionCoordinator as it}from"../../../im-core/src/state/channel-restriction-coordinator.js";import{resolveMediaUploadPlan as ct}from"../../../im-browser/src/media/media-transfer-policy.js";import{resolveChannelAccess as dt}from"../../../im-core/src/state/channel-permissions.js";import{createGroupReadStrategy as pt}from"../../../im-core/src/message-flow/read/group-read-strategy.js";import{createRobotReadStrategy as lt}from"../../../im-core/src/message-flow/read/robot-read-strategy.js";import{createCustomerServiceReadStrategy as ut}from"../../../im-core/src/message-flow/read/customer-service-read-strategy.js";import{createMediaPreviewAdapter as mt}from"../../../im-browser/src/media/media-preview-adapter.js";import{isCryptoExecutionError as vt,CryptoExecutionError as yt}from"../../../im-core/src/ports/crypto-task-executor.js";import{createRsaTeaCryptoAdapter as gt}from"../../../im-browser/src/crypto/rsa-tea-crypto-adapter.js";import{createImDiagnosticLogger as ft}from"../../../im-core/src/diagnostics.js";import{createPeerPublicKeyService as ht}from"../../../im-browser/src/crypto/peer-public-key-service.js";import{getChannelSecretKey as It}from"../../../im-browser/src/http/requests/get-channel-secret-key.js";import{createEncryptKeyService as wt}from"../../../im-browser/src/crypto/encrypt-key-service.js";import{pullOfflineInboundChat as Ct,pullOfflineOwnerChat as bt,pullOfflineInboundChatBatch as St,pullOfflineOwnerChatBatch as Tt}from"../../../im-browser/src/http/requests/pull-offline-chat.js";import{createReactionManager as Et}from"../../../im-core/src/message-flow/reaction/reaction-manager.js";import{throwIfAborted as Mt}from"../../../im-core/src/abort.js";import{pullChannelMessageContext as Rt}from"../../../im-browser/src/http/requests/channel-message-context.js";import{pullGroupMessagesById as kt,pullDirectMessagesById as xt,pullChannelMessagesById as Dt}from"../../../im-browser/src/http/requests/pull-messages-by-id.js";import{createChannelReadStrategy as Pt}from"../../../im-core/src/message-flow/read/channel-read-strategy.js";import{createGroupKeyService as At}from"../../../im-browser/src/crypto/group-key-service.js";import{pullOfflineGroupSession as jt,pullGroupHistory as Ot,pullOfflineGroupBatch as _t}from"../../../im-browser/src/http/requests/pull-offline-group.js";import{assertOfflineChatBatchComplete as Nt}from"../../../im-core/src/mapping/offline-mapper.js";import{createSyncManager as Lt}from"../../../im-core/src/sync/sync-manager.js";import{yieldToBrowser as Kt}from"../../../im-browser/src/scheduling/yield-to-browser.js";import{resolveGroupRestriction as Ft}from"../../../im-core/src/mapping/group-notify-mapper.js";import{bContentCodec as Ut,bMessageCodec as Bt}from"../../../im-protocol/src/protobuf/registry.js";import{mapIncomingChannelNotify as Gt}from"../../../im-core/src/mapping/channel-notify-mapper.js";import{recoverDecryptedMessage as Ht}from"../../../im-core/src/mapping/decrypt-recovery.js";import{isMessageEqual as Vt}from"../../../im-core/src/mapping/merge.js";import{pullChannelSessions as $t,pullChannelOfflineMessages as qt,pullChannelLatestPage as Wt,pullChannelHistory as zt}from"../../../im-browser/src/http/requests/pull-offline-channel.js";import{parseChannelSyncCheckpoint as Jt,channelSyncCheckpointKey as Qt}from"../../../im-core/src/sync/channel-sync-checkpoint.js";import{requestRobotMenuReply as Yt}from"../../../im-browser/src/http/requests/robot-menu-reply.js";import{mapIncomingRobotFixedChat as Xt}from"../../../im-core/src/mapping/robot-message-mapper.js";import{getRobotChatMenus as Zt,confirmRobotChat as er,getRobotProfile as tr}from"../../../im-browser/src/http/requests/robot-profile.js";import{unbindRobotFromConversation as rr,bindRobotToConversation as or}from"../../../im-browser/src/http/requests/bind-robot-conversation.js";import{searchRobots as nr}from"../../../im-browser/src/http/requests/search-robots.js";import{getCustomerServiceProfile as sr,downloadCustomerServiceFile as ar}from"../../../im-browser/src/http/requests/customer-service-profile.js";import{pullOfflineSignal as ir}from"../../../im-browser/src/http/requests/pull-offline-signal.js";import{updateChannelReadIndexes as cr}from"../../../im-browser/src/http/requests/channel-read-index.js";import{markGroupReadAll as dr}from"../../../im-browser/src/http/requests/mark-group-read-all.js";const pr=30;function lr(e,t){const r=Number(e);if(!Number.isSafeInteger(r)||r<0)throw new Error(`GROUP history cursor 非法(groupId=${t})`);return r}function ur(ur,mr,vr,yr=0){const gr=ur.clientType??2,fr={...ur.authProvider,getLoginContext:async()=>{const e=await ur.authProvider.getLoginContext();return null===e?null:{...e,clientType:gr}}};let hr="";const Ir=E(ur.debug,()=>({generation:yr,...""===hr?{}:{accountId:hr}}));let wr=!0;const Cr=ur.uploadRecovery?.enabled?Q(vr):void 0,br=Y(!1!==globalThis.navigator?.onLine),{coreClient:Sr,http:Tr}=re({coreClient:ur.coreClient,http:ur.http,authProvider:fr,endpointProvider:ur.endpointProvider,clientType:gr,isActive:()=>wr,onRequestError:ur.onRequestError,onHandlerError:e=>Ir.record("error","sdk","session","request-error-handler-failed",()=>({error:{message:"宿主请求错误处理器失败",data:e}}))}),Er=ur.transport??ne(),Mr=ur.adapters?.storage,Rr=void 0!==Mr?Mr.create({namespaceFactory:vr}):"undefined"==typeof indexedDB?void 0:se({namespaceFactory:vr,mediaAssetCache:{strategies:j()}}),kr=/* @__PURE__ */new Map,xr=/* @__PURE__ */new Map,Dr=/* @__PURE__ */new Map,Pr=/* @__PURE__ */new Map,Ar=/* @__PURE__ */new Map,jr=/* @__PURE__ */new Map,Or=e=>`${we(e.conversation)}\0${e.messageId}`;function _r(e,t){const r=we(e),o=(jr.get(r)??Promise.resolve()).then(t),n=o.then(()=>{},()=>{});return jr.set(r,n),n.then(()=>{jr.get(r)===n&&jr.delete(r)}),o}function Nr(e,t){return _r(e.conversation,async()=>{t()&&(await(Rr?.deleteDecryptRecovery?.(e.conversation,e.messageId)),t()&&(Ar.delete(Or(e)),Pr.delete(Or(e)),kr.delete(Or(e))))})}const Lr=e=>{const t=Rr?.saveDecryptRecovery;if(void 0===t)return;const r=Or(e),o=(Dr.get(r)??0)+1;Dr.set(r,o),Ar.delete(r),Pr.set(r,e);const n=we(e.conversation),s=xr.get(n)??0,a=()=>wr&&s===(xr.get(n)??0)&&o===Dr.get(r),i=_r(e.conversation,async()=>{a()&&await t(e)});kr.set(r,i),i.then(()=>{if(kr.get(r)===i&&kr.delete(r),a())return ns(e)}).catch(t=>mr.emit({type:"error",error:{scope:"storage",message:`保存解密恢复记录失败(conversationType=${e.conversation.conversationType}, messageId=${e.messageId})`,cause:t}}))};let Kr=!1;const Fr="object"==typeof(Ur=Rr)&&null!==Ur&&"get"in Ur&&"function"==typeof Ur.get&&"put"in Ur&&"function"==typeof Ur.put&&"clear"in Ur&&"function"==typeof Ur.clear?Rr:void 0;var Ur;const Br=g({...void 0===Rr?{}:{storage:Rr},...void 0===Sr?{}:{coreClient:Sr}});let Gr,Hr;const Vr=B({...void 0===Rr?{}:{storage:Rr},conversationBackgrounds:Br.api,onDirectReadReceiptDisabled:e=>Gr?.(e)});let $r=0;function qr(e){return $r+=1,`channel-${e}-${yr}-${$r}`}const Wr=ft(Ir),zr=(e,t,r=hr)=>{const o=t.fromId===r?t.toId:t.fromId;V(Ir,{conversation:{conversationType:"direct",conversationId:o},source:e,messageId:t.msgId,senderId:t.fromId,receiverId:t.toId,messageType:t.msgType,encrypt:t.encrypt,encryptVersion:t.encryptVersion,reason:t.reason,resolverSource:"direct-private-key",...void 0===t.cmdId?{}:{commandId:t.cmdId},...void 0===t.cause?{}:{cause:t.cause}})},Jr=(e,t)=>{V(Ir,{conversation:{conversationType:"group",conversationId:t.groupId},source:e,messageId:t.msgId,senderId:t.fromId,messageType:t.msgType,encrypt:t.encrypt,encryptVersion:t.encryptVersion,reason:t.reason,resolverSource:"group-private-key",...void 0===t.cmdId?{}:{commandId:t.cmdId},...void 0===t.cause?{}:{cause:t.cause}})},Qr=(e,t)=>{V(Ir,{conversation:{conversationType:"channel",conversationId:t.channelId},source:e,messageId:t.messageId,encrypt:t.encrypt,reason:t.reason,resolverSource:"channel-symmetric-key",endpoint:t.endpoint,surface:t.surface,decryptStage:t.decryptStage,keySource:t.keySource,keyByteLength:t.keyByteLength,payloadByteLength:t.payloadByteLength,...void 0===t.cipherDataByteLength?{}:{cipherDataByteLength:t.cipherDataByteLength},...void 0===t.decryptedByteLength?{}:{decryptedByteLength:t.decryptedByteLength},...void 0===t.forceRefreshAttempted?{}:{forceRefreshAttempted:t.forceRefreshAttempted},...void 0===t.clientTypeHeader?{}:{clientTypeHeader:t.clientTypeHeader},...void 0===t.clientTypeBody?{}:{clientTypeBody:t.clientTypeBody},...void 0===t.operationId?{}:{operationId:t.operationId},...void 0===t.cause?{}:{cause:t.cause}})},Yr=e=>{Ir.record("warn","sdk","protocol","channel-content-decode",()=>({conversation:{conversationType:"channel",conversationId:e.channelId},...void 0===e.operationId?{}:{operationId:e.operationId},data:{messageId:e.messageId,encrypt:e.encrypt,contentLength:e.contentLength,...void 0===e.endpoint?{}:{endpoint:e.endpoint},...void 0===e.surface?{}:{surface:e.surface},...void 0===e.clientTypeHeader?{}:{clientTypeHeader:e.clientTypeHeader},...void 0===e.clientTypeBody?{}:{clientTypeBody:e.clientTypeBody}},error:{message:"CHANNEL 消息正文解码失败",data:e.cause}}))};function Xr(e){return"left"===e||"removed"===e||"dismissed"===e}Ir.record("debug","sdk","session","runtime-created");let Zr="empty";const eo=mr.subscribe(e=>{if(wr)if("connection:changed"!==e.type)if("message:received"!==e.type&&"message:updated"!==e.type)if("auth:invalid"!==e.type){if("error"===e.type){const t="storage"===e.error.scope?"storage":"crypto"===e.error.scope?"crypto":"session";Ir.record("error","sdk",t,"runtime-error",()=>({error:{message:e.error.message,data:e.error.cause}}))}}else Ir.record("warn","sdk","session","auth-invalid",()=>({data:e.issue}));else Ir.record("trace","sdk","message",e.type,()=>({conversation:e.conversation,message:M(e.message),data:{source:e.source,channelLifecycleEffects:e.channelLifecycleEffects}}));else Ir.record("info","sdk","connection","connection-state-changed",()=>({data:{state:e.state}}))});function to(e){return e.cmdId===st.MES_CHAT_EDIT_MSG_C2C||e.cmdId===st.MES_GRPCHAT_EDIT_MSG_C2C||e.cmdId===st.MES_RADIO_EDIT_MSG_C2C}function ro(e,t){return Vt(e,{...e,body:t.body,contentType:t.contentType,encryption:t.encryption,edited:t.edited,recalled:t.recalled})}const oo=/* @__PURE__ */new Set;let no,so,ao,io,co,po,lo="auto",uo=!1,mo=!1,vo=0,yo=!1,go=()=>{},fo=null,ho=null;const Io=$(),wo=new AbortController,Co=/* @__PURE__ */new Set;let bo=0,So=!1;const To=Z(e=>mr.emit({type:"receiving:changed",receiving:e})),Eo=Z(e=>mr.emit({type:"syncing:changed",syncing:e}));let Mo,Ro,ko=!1;const xo=/* @__PURE__ */new Map,Do=/* @__PURE__ */new Map,Po=/* @__PURE__ */new Map,Ao=e=>Po.get(we(e))?.version??0;function jo(e,t){Po.set(we(e),{version:Ao(e)+1,...void 0===t?{}:{reason:t}})}let Oo=0;const _o=e=>xo.get(e)??0,No=e=>{xo.set(e,_o(e)+1)};function Lo(e,t){jo(e,t),po?.invalidate(e,{reason:t}),"channel"===e.conversationType&&No(e.conversationId),"group"===e.conversationType&&Do.set(e.conversationId,(Do.get(e.conversationId)??0)+1)}const Ko=ur.profile??(void 0===Sr?void 0:ie({client:Sr,clientType:gr,...void 0===Rr?{}:{storage:Rr}})),Fo=ur.channelProfile??(void 0===Sr?void 0:ce({client:Sr,clientType:gr,getUserId:async()=>{if(""!==hr)return hr;const e=await fr.getLoginContext();return e?.userId??""},...void 0===Rr?{}:{storage:Rr}})),Uo=ur.channelMembers??(void 0===Sr?void 0:le({client:Sr,clientType:gr,isActive:()=>wr,...void 0===Rr?{}:{storage:Rr}})),Bo=ur.channelMentionMembers??(void 0===Sr?void 0:ue({client:Sr,clientType:gr})),Go=y({...void 0===Bo?{}:{provider:Bo},...void 0===Rr?{}:{storage:Rr}}),Ho=ur.directory??(void 0===Sr?void 0:me({client:Sr,clientType:gr,getUserId:async()=>""!==hr?hr:(await fr.getLoginContext())?.userId??""})),Vo=R({...void 0===Ho?{}:{provider:Ho}});let $o;const qo=K({onProfileUpdated:function(e){Zo.updateConversationProfile({conversationType:"robot",conversationId:e.id},{title:e.displayName,avatar:e.avatarUrl??""})},...void 0===Sr?{}:{search:e=>nr(Sr,{...e,...void 0===gr?{}:{clientType:gr}}),bind:e=>or(Sr,{...e,...void 0===gr?{}:{clientType:gr}}),unbind:e=>rr(Sr,{...e,...void 0===gr?{}:{clientType:gr}}),getProfile:e=>tr(Sr,{...e,...void 0===gr?{}:{clientType:gr}}),confirmChat:e=>er(Sr,{robotId:e,...void 0===gr?{}:{clientType:gr}}),listChatMenus:e=>Zt(Sr,{robotId:e,...void 0===gr?{}:{clientType:gr}}),requestMenuReply:async e=>{const t=""!==hr?hr:(await fr.getLoginContext())?.userId??"";if(""===t)throw new Error("机器人指令回复缺少当前用户");const r=await Yt(Tr,{...e,userId:t});if(!wr)return;const o=Xt({robotId:e.robotId,userId:t,msgId:r.msgId,msgTime:r.msgTime,content:r.content},{selfId:t,keepRaw:!0});if(void 0!==o){if(void 0===$o)throw new Error("机器人指令回复尚未接入消息存储");await $o(o)}}}}),Wo=ur.expressionProvider??ve({...void 0===Sr?{}:{coreClient:Sr},...void 0===ur.expressions?.giphy?.apiKey?{}:{giphyApiKey:ur.expressions.giphy.apiKey}}),zo=D({provider:Wo,isActive:()=>wr}),Jo=ur.sessionFavoriteProvider??ye({...void 0===Sr?{}:{coreClient:Sr},getUserId:()=>hr}),Qo=ur.channelJoinApplications??(void 0===Sr?void 0:ge({client:Sr,clientType:gr})),Yo=ur.contactApplications??(void 0===Sr?void 0:fe({client:Sr,clientType:gr})),Xo=ur.groupApplications??(void 0===Sr?void 0:he({client:Sr,clientType:gr})),Zo=Ie({emitter:mr,diagnostics:Ir,profile:Ko,channelProfile:Fo,storage:Rr,getSelfId:()=>hr,loadOlderFromRemote:async e=>{const t=po?.enterForeground(e.conversation),r=Io.enterForeground(),o=To.begin();try{return void 0===co?{messages:[],exhausted:!0}:await co(e)}finally{o(),t?.(),r()}},loadNewerFromRemote:async e=>{const t=po?.enterForeground(e.conversation),r=Io.enterForeground(),o=To.begin();try{return void 0===Ro?{messages:[],exhausted:!0}:await Ro(e)}finally{o(),t?.(),r()}}}),en=S({download:async({messageId:e,itemIndex:t,signal:r})=>{const o=Zo.getConversationMessage({conversationType:"customerService",conversationId:"__customer_service__"},e),n=o?.body.customerService?.files[t];if(void 0===n)throw T({code:"IM_SDK_CUSTOMER_SERVICE_FILE_UNAVAILABLE",category:"state",operation:"customerService.downloadFile",retryable:!1});return await ar(n.url,r)},isActive:()=>wr,load:e=>void 0===Sr?Promise.reject(T({code:"IM_SDK_CORE_API_UNAVAILABLE",category:"contract",operation:"customerService.getProfile",retryable:!1})):sr(Sr,e),update:e=>Zo.updateConversationProfile({conversationType:"customerService",conversationId:"__customer_service__"},{title:e.displayName,avatar:e.avatarUrl})}),tn=en.api;let rn=()=>{};const on=A({namespaceFactory:vr,...void 0===Rr?{}:{storage:Rr},emitter:mr,getAccountId:()=>hr,isActive:()=>wr,clearMemoryCaches:()=>{en.clearCache(),Ko?.clearCache?.(),Fo?.clearCache?.(),Uo?.clearCache?.(),Go.clear(),rn(),po?.clear().catch(e=>mr.emit({type:"error",error:{scope:"storage",message:"清理最近历史缓存失败",cause:e}}))}});$o=e=>Zo.commitReceivedMessages([e],"live");const nn=U({provider:Jo,isActive:()=>wr,resolveMessage:async(e,t)=>Zo.getConversationMessage(e,t)??await(Rr?.getMessage(e,t))??void 0}),sn=mr.subscribe(e=>{if("message:removed"===e.type||"conversation-history:cleared"===e.type||"session:removed"===e.type){const t=we(e.conversation);if(xr.set(t,(xr.get(t)??0)+1),"message:removed"===e.type)Ar.delete(Or({conversation:e.conversation,messageId:e.messageId}));else for(const e of Ar.keys())e.startsWith(`${t}\0`)&&Ar.delete(e)}if(void 0!==Rr?.deleteDecryptRecovery)if("message:received"!==e.type&&"message:updated"!==e.type||!0===e.message.encryption.decryptFailed){if("message:removed"===e.type)Pr.delete(Or({conversation:e.conversation,messageId:e.messageId})),_r(e.conversation,()=>Rr.deleteDecryptRecovery(e.conversation,e.messageId)).catch(t=>mr.emit({type:"error",error:{scope:"storage",message:`删除消息密文记录失败(messageId=${e.messageId})`,cause:t}}));else if("conversation-history:cleared"===e.type){for(const[t,r]of Pr)we(r.conversation)===we(e.conversation)&&Pr.delete(t);_r(e.conversation,async()=>Rr.deleteConversationDecryptRecoveries?.(e.conversation)).catch(t=>mr.emit({type:"error",error:{scope:"storage",message:`清理会话密文记录失败(conversationId=${e.conversation.conversationId})`,cause:t}}))}}else{const t=we(e.conversation),r=xr.get(t)??0,o=Or({conversation:e.conversation,messageId:e.message.id}),n=Dr.get(o)??0,s=()=>wr&&r===(xr.get(t)??0)&&n===(Dr.get(o)??0);(async()=>{const t=(await(Rr.getDecryptRecoveries?.(e.conversation))??[]).find(t=>t.messageId===e.message.id);void 0!==t&&!to(t)&&s()&&(await Zo.commitReceivedMessages([e.message],"offline",{backfillOnly:!0}),await Nr(t,s))})().catch(t=>mr.emit({type:"error",error:{scope:"storage",message:`删除已恢复密文记录失败(messageId=${e.message.id})`,cause:t}}))}});const an=s({directory:Vo.contacts,getSelfId:()=>hr,...void 0===Ko?{}:{profile:{getUserProfile:Zo.readDirectProfile,...void 0===Ko.peekUserProfile?{}:{peekUserProfile:Ko.peekUserProfile.bind(Ko)}}},...void 0===Sr?{}:{coreClient:Sr},domainState:Zo,emitter:mr,terminateConversationSending:(e,t)=>go(e,t),resetDirectReadReceiptPreference:e=>Vr.api.readReceipts.resetConversation({conversationType:"direct",conversationId:e}),onRelationshipChanged:(e,t)=>{"friend"===t?Hr?.(e):"unknown"!==t&&Gr?.(e)}}),cn=m({...void 0===Yo?{}:{contact:Yo},...void 0===Xo?{}:{group:Xo},...void 0===Qo?{}:{channel:Qo},onContactAccepted:async(e,t)=>{an.updateRelationshipFromEvent(e,"friend"),await Zo.reconcileDirectContactEstablishedNotice(e,`contact-application:${t}`),Zo.refreshConversationProfile(e,"direct")},emitter:mr,isActive:()=>wr&&"ready"===Zr}),dn=k({domainState:Zo,emitter:mr,isActive:()=>wr}),pn=F({domainState:Zo,isAvailable:()=>wr&&"ready"===Zr}),ln=i(()=>Zo.getSessions()),un=Ce({onHidden:()=>gn(!0),onVisible:()=>gn(!1),onPageHide:()=>gn(!0),onPageShow:()=>gn(!1)},ur.network),mn=ur.cryptoExecutorFactory?.(yr)??be({generation:yr,diagnostics:Ir,lifecycleAware:un.supportsLifecycle}),vn=p({executor:mn,generation:yr,isActive:()=>wr}),yn=ur.crypto??{...gt(),async encryptSymmetricChunked(e){try{return await vn(e)}catch(e){throw vt(e)&&wr&&mr.emit({type:"error",error:{scope:"crypto",message:"媒体加密计算失败",cause:e}}),e}}};function gn(e){mn.setSuspended(e)}function fn(e){!wr||e instanceof Error&&"AbortError"===e.name||mr.emit({type:"error",error:{scope:"crypto",message:"密钥计算失败",cause:e}})}const hn=void 0!==ur.media?Se(ur.media,Ir):void 0,In=Te(),wn=mt(In),{prepareLocalMediaPreview:Cn,prepareLocalVideoPoster:bn,prepareLocalImageThumbnail:Sn}=z(In,()=>yr),Tn=void 0===Sr?void 0:wt({client:Sr,crypto:yn,cryptoExecutor:mn,generation:yr,clientType:gr,onError:(e,t)=>Wr?.("crypto",{message:e,cause:t})}),En=void 0===Sr?void 0:ht({client:Sr,clientType:gr,onError:(e,t)=>Wr?.("crypto",{scope:"send-key",message:e,cause:t})}),Mn=void 0===Sr?void 0:At({client:Sr,crypto:yn,cryptoExecutor:mn,generation:yr,clientType:gr,onError:(e,t)=>Wr?.("crypto",{scope:"group-key",message:e,cause:t})}),Rn=ur.channelKeyService??(void 0===Sr?void 0:Ee({loadSecretKey:e=>It(Sr,{channelId:e,clientType:gr}),onError:(e,t)=>Wr?.("crypto",{scope:"channel-key",message:e,cause:t})})),kn=async(e,t={})=>{if(void 0===Rn)return;const r=null===Rn.getCachedChannelKey(e);try{await Rn.getChannelKey(e)}catch{return}if(!1!==t.recoverExistingMessages&&r&&wr)try{await as({conversationType:"channel",conversationId:e},{recoverLegacyWithoutSidecar:!1})}catch(t){mr.emit({type:"error",error:{scope:"storage",message:`CHANNEL key 就绪后读取解密恢复记录失败(channelId=${e})`,cause:t}})}},xn=async e=>void 0===Rn?null:Rn.getChannelKey(e),Dn=e=>{if(void 0===Rn)return null;const t=Rn.getCachedChannelKey(e);return null===t&&kn(e),t},Pn=()=>Tn?.getCachedPrivateKey(hr)?.privateKey??null,An=async(e,t={})=>{const r=[];void 0!==Rn&&r.push(...[...new Set(e)].map(e=>kn(e,t))),void 0!==Tn&&""!==hr&&r.push(Tn.getUserPrivateKey(hr,{priority:t.priority??"background",signal:t.signal??wo.signal})),await Promise.all(r)},jn=e=>({crypto:yn,resolveChannelKey:e=>Rn?.getCachedChannelKey(e)??null,resolveUserPrivateKey:Pn,onDecryptError:t=>Qr(e,t),onDecryptRecovery:Lr}),On=W({fetch:async e=>{await(Mn?.getGroupKeys(e,{priority:"background"}))},onError:fn});function _n(e){wr&&void 0!==Mn&&""!==e&&On.enqueue(e)}function Nn(){On.dispose(),un.stop(),Tn?.dispose(),Mn?.dispose(),mn.dispose()}const Ln=async e=>{if(void 0===Mn)return null;const t=await Mn.getGroupKeys(e);return null===t?null:{publicKey:t.publicKey,version:t.version}},Kn=e=>{if(void 0===Mn)return null;const t=Mn.getCachedGroupKeys(e);return null!==t?t.privateKey:(_n(e),null)},Fn=async(e,t={})=>{const r=t.signal??wo.signal;if(Mt(r),void 0===Mn)return;const o=[...new Set(e)];let n,s=0;const a=async()=>{for(;void 0===n&&s<o.length;){if(!wr)return;const e=o[s++];try{await Mn.getGroupKeys(e,{priority:t.priority??"background",signal:r})}catch(e){throw n=e,e}}};await Promise.all([a(),a()]),Mt(r)},Un=e=>({crypto:yn,resolvePrivateKey:({groupId:e})=>Kn(e),onDecryptError:t=>Jr(e,t),onDecryptRecovery:Lr}),Bn=/* @__PURE__ */new Map,Gn=/* @__PURE__ */new Map,Hn=/* @__PURE__ */new Map,Vn=/* @__PURE__ */new Set,$n=/* @__PURE__ */new Set;function qn(e){return!0!==e.encryption.decryptFailed&&"unknown"!==e.contentType}function Wn(e){Hn.delete(we(e))}function zn(e,t){return e.length===t.length&&e.every((e,r)=>e===t[r])}function Jn(e){if("group"===e.conversation.conversationType)return Mn?.getCachedGroupKeyVersion(e.conversation.conversationId)??void 0}function Qn(e){return 2===e.wireEncrypt?"channel-base64-pad-tea":"group"===e.conversation.conversationType?"group-rsa-tea":"channel"===e.conversation.conversationType?"channel-web-rsa-tea":"direct-rsa-tea"}function Yn(e){return 101===e.contentType?Number.isInteger(e.type)&&e.type>0:27===e.contentType?0n===e.gameType?e.gameValue>=1n&&e.gameValue<=3n:1n===e.gameType&&e.gameValue>=1n&&e.gameValue<=6n:[1,2,3,4,5,7,8,11].includes(e.contentType)}function Xn(e,t){const r=new Map(Zo.getMessagesByConversation(e).filter(e=>void 0===t||e.id===t).map(e=>[e.id,e])),o=/* @__PURE__ */new Map;return{stop:mr.subscribe(n=>{if(!wr||"message:received"!==n.type&&"message:updated"!==n.type||"live"!==n.source||n.conversation.conversationType!==e.conversationType||n.conversation.conversationId!==e.conversationId||void 0!==t&&n.message.id!==t||!0===n.message.encryption.decryptFailed)return;const s=r.get(n.message.id);if(void 0===s||!ro(s,n.message)){const t=Or({conversation:e,messageId:n.message.id});o.set(t,Dr.get(t)??0)}}),hasChanged:e=>{const t=Or(e);return o.has(t)&&o.get(t)===(Dr.get(t)??0)}}}let Zn=0;const es=[],ts=/* @__PURE__ */new Map;let rs=0;function os(){for(;rs<2&&es.length>0;){const e=es.shift();rs+=1,Promise.resolve().then(async()=>{if(Mt(wo.signal),!e.isCurrent())throw new DOMException("端到端排队恢复所属账号、会话或消息已失效","AbortError");await ss(e.record,e.hasBodyChanged)}).then(e.resolve,e.reject).finally(()=>{rs-=1,os()})}}function ns(e,t){if("direct"!==e.conversation.conversationType&&"group"!==e.conversation.conversationType)return ss(e);const r=Or(e),o=Dr.get(r)??0,n=ts.get(r);if(n?.version===o&&n.isCurrent())return n.promise;const s=hr,a=we(e.conversation),i=xr.get(a)??0,c=Ao(e.conversation),d=()=>wr&&hr===s&&i===(xr.get(a)??0)&&c===Ao(e.conversation)&&o===(Dr.get(r)??0),p=void 0===t?Xn(e.conversation,e.messageId):void 0,l=t??(()=>p.hasChanged(e)),u=new Promise((t,r)=>{es.push({record:e,isCurrent:d,hasBodyChanged:l,resolve:t,reject:r})}).finally(()=>{p?.stop(),ts.get(r)?.promise===u&&ts.delete(r)});return ts.set(r,{version:o,isCurrent:d,promise:u}),os(),u}async function ss(e,t){const r=Or(e);e=Pr.get(r)??e;const o=Dr.get(r)??0,n=we(e.conversation),s=xr.get(n)??0,a=Ao(e.conversation),i=()=>wr&&a===Ao(e.conversation)&&s===(xr.get(n)??0)&&o===(Dr.get(r)??0),c=Bn.get(r);if(void 0!==c)return Gn.get(r)===o?c:(await c.catch(()=>{}),void(i()&&Pr.get(r)===e&&await ss(e,t)));const d=async()=>Zo.getConversationMessage(e.conversation,e.messageId)??await(Rr?.getMessage(e.conversation,e.messageId))??void 0,p=(async()=>{const n=await d();if(!i()||void 0===n)return;const s=to(e),a=()=>!("direct"!==e.conversation.conversationType&&"group"!==e.conversation.conversationType||!s)&&(t?.()&&Ar.set(r,o),Ar.get(r)===o);if(a())return await Zo.commitReceivedMessages([n],"offline",{backfillOnly:!0}),void await Nr(e,i);if(!0!==n.encryption.decryptFailed&&!s)return await Zo.commitReceivedMessages([n],"offline",{backfillOnly:!0}),void await Nr(e,i);let c,p;Ir.record("debug","sdk","crypto","decrypt-recovery-context",()=>({conversation:e.conversation,data:{messageId:e.messageId,messageSenderId:n.senderId,messageCreatedAt:n.createdAt,selfMessage:n.senderId===hr,source:e.source,wireEncrypt:e.wireEncrypt,sContentBytes:e.sContent.length,...void 0===e.cmdId?{}:{cmdId:e.cmdId},...void 0===e.encryptVersion?{}:{encryptVersion:e.encryptVersion}}}));let l="key-resolve",u=Qn(e);for(const t of[!1,!0]){const r=t?"force":"current";let o;try{l="bcontent";const n=Ut.decode(e.sContent);if(1===e.wireEncrypt){if(0===n.secretKey.length||0===n.cipherData.length)throw new Error("BContent.secretKey/cipherData 缺失");l="key-resolve";const s={priority:"background",signal:wo.signal,...t?{staleKey:"string"==typeof p?p:void 0}:{}},a="group"===e.conversation.conversationType?(await(Mn?.getGroupKeys(e.conversation.conversationId,s)))?.privateKey??null:(await(Tn?.getUserPrivateKey(hr,s)))?.privateKey??null;if(!i())return;t&&void 0!==p&&(o="string"==typeof p&&null!==a&&p!==a),!0===o&&Wn(e.conversation),t||(p=a);const d=Jn(e);if(null===a){Ir.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"no-key",...void 0===d?{}:{resolvedKeyVersion:d},...void 0===o?{}:{keyChanged:o}}}));continue}const u=await mn.decryptBatch({operationId:"end-to-end-recovery:"+ ++Zn,generation:yr,items:[{itemIndex:0,input:{secretKey:n.secretKey,cipherData:n.cipherData,privateKey:a}}],priority:"background",signal:wo.signal});if(!i())return;if(1!==u.length||0!==u[0]?.itemIndex)throw new yt("protocol-mismatch");const m=u[0].result;if(!m.ok)throw l=m.stage,new Error(`End-to-end recovery ${m.stage} failed`);const v=m.plain;Ir.record("debug","sdk","crypto","decrypt-recovery-byte-shape",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:Qn(e),rsaCipherBytes:n.secretKey.length,cipherDataBytes:n.cipherData.length,cipherDataBlockRemainder:n.cipherData.length%8,plainBytes:v.length,plainBlockRemainder:v.length%8,startsWithContentTypeField:8===v[0],startsWithMobileCardType:8===v[0]&&8===v[1],...X(v)}})),l="bmessage",c=Bt.decode(v)}else if("channel"===e.conversation.conversationType){if(0===n.cipherData.length)throw new Error("BContent.cipherData 缺失");l="key-resolve";const s=t?{...p instanceof Uint8Array?{staleKey:p}:{}}:void 0,a=void 0===Rn?.getChannelKeyCandidates?await(Rn?.getChannelKey(e.conversation.conversationId,s).then(e=>[{strategy:"canonical-base64-pad",key:e}]))??[]:await Rn.getChannelKeyCandidates(e.conversation.conversationId,s),i=Rn?.getCachedChannelKeyMetadata?.(e.conversation.conversationId);null!=i&&Ir.record("info","sdk","crypto","decrypt-recovery-key-material",()=>({conversation:e.conversation,data:{messageId:e.messageId,attempt:r,...i}}));const d=a.find(e=>"canonical-base64-pad"===e.strategy)?.key??null;if(t&&p instanceof Uint8Array&&null!==d&&(o=!zn(p,d)),!0===o&&Wn(e.conversation),t||(p=d?.slice()??null),0===a.length){Ir.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"no-key",...void 0===o?{}:{keyChanged:o}}}));continue}for(const t of a)try{l="tea";const s=yn.decryptSymmetric({teaKey:t.key,cipherData:n.cipherData});l="bmessage";const a=Bt.decode(s);if("legacy-ascii16"===t.strategy&&!Yn(a))throw new Error("legacy ASCII candidate 未通过已知 BMessage 语义校验");c=a,u=t.strategy,Ir.record("info","sdk","crypto","decrypt-recovery-candidate",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:t.strategy,finalStage:"recovered",reason:"recovered",...void 0===o?{}:{keyChanged:o}}}));break}catch(n){Ir.record("warn","sdk","crypto","decrypt-recovery-candidate",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:t.strategy,finalStage:l,reason:"decrypt-failed",...void 0===o?{}:{keyChanged:o}},error:{message:"CHANNEL decrypt recovery candidate failed",data:n}}))}}if(void 0!==c){Ir.record("info","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:u,finalStage:"recovered",reason:"recovered",...void 0===o?{}:{keyChanged:o}}}));break}}catch(t){if(vt(t)||t instanceof Error&&"AbortError"===t.name)throw t;const n=Jn(e);Ir.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"decrypt-failed",...void 0===n?{}:{resolvedKeyVersion:n},...void 0===o?{}:{keyChanged:o}},error:{message:"IM message decryption recovery failed",data:t}}))}}if(!i()||void 0===c)return void(void 0===c&&(!function(e,t){const r=we(e),o=Hn.get(r)??/* @__PURE__ */new Set;o.add(t),Hn.set(r,o)}(e.conversation,e.messageId),Ir.record("warn","sdk","crypto","decrypt-recovery-exhausted",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,strategy:Qn(e),attempts:2,finalStage:l}}))));const m=await d();if(!i()||void 0===m||!0!==m.encryption.decryptFailed&&!s)return;if(("direct"===e.conversation.conversationType||"group"===e.conversation.conversationType)&&s&&(a()||!ro(n,m)))return Ar.set(r,o),await Zo.commitReceivedMessages([m],"offline",{backfillOnly:!0}),void await Nr(e,i);const v="channel"!==e.conversation.conversationType||e.cmdId!==st.RADIO_NOTIFY_DELIVER&&101!==c.contentType?{...Ht(m,c,hr),...s?{edited:!0}:{}}:Gt({channelId:BigInt(e.conversation.conversationId),messageId:e.messageId,occurredAt:BigInt(m.serverTime??m.createdAt),notifyType:c.type,operatorId:c.oprUserId,targetUserIds:c.mnpledUserId,content:c.content,..."string"==typeof m.extensions?.historyCursor?{historyCursor:m.extensions.historyCursor}:{},..."string"==typeof m.extensions?.channelSequence?{sequence:BigInt(m.extensions.channelSequence)}:{},encrypted:!0},{cmdId:e.cmdId,keepRaw:void 0!==m.raw});await Zo.commitReceivedMessages([v],"offline",{backfillOnly:!0,refreshSessionSummary:!0}),await Nr(e,i)})().finally(()=>{Bn.get(r)===p&&(Bn.delete(r),Gn.delete(r))});return Bn.set(r,p),Gn.set(r,o),p}async function as(e,t={}){const r="direct"===e.conversationType||"group"===e.conversationType?Xn(e):void 0;try{const o=we(e),n=hr,s=xr.get(o)??0,a=Ao(e),i=()=>wr&&n===hr&&s===(xr.get(o)??0)&&a===Ao(e),c=await(Rr?.getDecryptRecoveries?.(e))??[];if(!i())return;const d=Hn.get(o),p=void 0===d?c:c.filter(e=>!d.has(e.messageId));if("direct"===e.conversationType||"group"===e.conversationType){let e=0;const t=async()=>{for(;e<p.length;){if(!i())return;const t=p[e++];await ns(t,()=>r.hasChanged(t))}},o=(await Promise.allSettled([t(),t()])).find(e=>"rejected"===e.status);if("rejected"===o?.status)throw o.reason}else await Promise.all(p.map(e=>ns(e)));if(!wr||!1===t.recoverLegacyWithoutSidecar)return;const l=Hn.get(o),u=new Set(c.filter(e=>void 0===l||!l.has(e.messageId)).map(e=>e.messageId)),m=Zo.getMessagesByConversation(e).filter(e=>!0===e.encryption.decryptFailed&&!u.has(e.id));if(0===m.length||Vn.has(o))return;if(Vn.add(o),Ir.record("info","sdk","crypto","decrypt-repair-start",()=>({conversation:e,data:{stuckCount:m.length,withoutSidecar:m.filter(e=>!c.some(t=>t.messageId===e.id)).length}})),"channel"===e.conversationType){const t=await fr.getLoginContext();if(null===t||void 0===Mo)return;for(const r of m.slice(0,20)){const o=r.extensions?.historyCursor;if("string"!=typeof o||""===o.trim())continue;const n=await Mo(e.conversationId,o,t.userId);if(!wr)return;n.length>0&&Zo.upsertMessages(n,"offline")}}else"group"===e.conversationType?await async function(e,t){if(void 0===co)return;const r=[...t].sort((e,t)=>e.sortKey.localeCompare(t.sortKey)),o=r[0],n=r.at(-1);if(void 0===o||void 0===n)return;const s=o.serverTime??o.createdAt;let a;for(let t=0;t<5;t++){const t=await co({conversation:e,oldestLoaded:n,...void 0===a?{}:{cursor:a},intent:"older",limit:50});if(!wr||t.exhausted||void 0===t.nextCursor)return;const r=Number(t.nextCursor);if(Number.isFinite(r)&&r<=s)return;a=t.nextCursor}}({conversationType:"group",conversationId:e.conversationId},m):"direct"===e.conversationType&&await Na()}catch(t){if(!wr||t instanceof Error&&"AbortError"===t.name)return;mr.emit({type:"error",error:{scope:"crypto",message:`解密失败消息恢复失败(conversationType=${e.conversationType}, conversationId=${e.conversationId})`,cause:t}})}finally{r?.stop()}}let is=()=>{throw new Error("离线 Reaction 写入失败:Reaction manager 尚未就绪")};function cs(e,t=!0){const r=e.channelPermissions,o=e.channelAccessSnapshot;return JSON.stringify(["group"===e.type?e.groupState??"active":void 0,e.channelState,void 0===r?void 0:[r.sendMessages,r.mentionAll,r.editProfile,r.manageMembers,r.manageAdmins,r.moderateMessages,r.manageMute,r.dismissChannel,r.transferOwnership],t&&void 0!==o?[o.role,o.baseState,o.resolvedState,o.allMembersMuted,o.currentUserMuted,o.mutePeriod]:void 0])}const ds=/* @__PURE__ */new Map;function ps(e){const t=Zo.getConversationContext(e);if(!wr||void 0===t||"group"===e.conversationType&&void 0!==t.groupState&&"active"!==t.groupState||"channel"===e.conversationType&&void 0!==t.channelState&&o(t.channelState))return;const r=Zo.getMessagesByConversation(e).at(-1);return JSON.stringify([hr,void 0===r?t.timestamp:void 0,cs(t),r?.id,r?.sortKey])}const ls=/* @__PURE__ */new Map;po=te({...void 0===Rr?.recentHistoryCache?{}:{cache:Rr.recentHistoryCache},fingerprint:ps,canRunBackground:function(){return wr&&"ready"===Zr&&So&&0===bo&&"authenticated"===la.state},onForeground:e=>{if("group"===e.conversationType){Mn?.promote(e.conversationId);for(const[t,r]of ls)r.some(t=>t.conversationId===e.conversationId)&&mn.promote(t)}else"channel"!==e.conversationType&&"direct"!==e.conversationType||Tn?.promote(hr)},fetchPage:async(e,t)=>{const r="group"===e.conversationType?Ia("group",{conversationType:"group",conversationId:e.conversationId}):void 0;try{const o=await ee({http:Tr,authProvider:fr,clientType:gr,groupDecrypt:()=>Un("history"),groupAsyncDecrypt:(e,t)=>{const r=Ca(!0===po?.hasForeground(e)?"foreground":"background",t);return r.assertCurrent?.(e),r},assertLoginContext:e=>{if(!wr||""!==hr&&e!==hr)throw new DOMException("最近历史请求的登录账号已改变","AbortError")},channelDecrypt:()=>jn("history"),prepareGroupKeys:Fn,prepareChannelKeys:(e,t)=>An(e,{...t,recoverExistingMessages:!1}),keyPriority:e=>!0===po?.hasForeground(e)?"foreground":"background"})(e,t);return void 0===r?o:{...o,messages:r.messages(o.messages),recoveries:o.recoveries?.filter(r.acceptsRecovery)}}finally{r?.stop()}},yieldToEventLoop:Kt,report:(e,t,r)=>Ir.record(e.endsWith("failed")?"warn":"debug","sdk","history",e,()=>({conversation:t,data:r}))});const us=mr.subscribe(e=>{if("connection:changed"===e.type)return"authenticated"!==e.state&&(So=!1),void po?.notifySchedulingChanged();if("session:updated"===e.type){if("group"!==e.conversation.conversationType&&"channel"!==e.conversation.conversationType)return;const t=we(e.conversation),r=ds.get(t),o={timestamp:e.session.timestamp,access:cs(e.session),capabilities:cs(e.session,!1),state:"group"===e.session.type?e.session.groupState??"active":e.session.channelState,hasPermissions:void 0!==e.session.channelPermissions,hasSnapshot:void 0!==e.session.channelAccessSnapshot};if(ds.set(t,o),"group"===e.conversation.conversationType&&"active"!==o.state&&r?.state!==o.state&&jo(e.conversation),"ready"===Zr&&void 0!==r&&(r.access!==o.access||!ko&&r.timestamp!==o.timestamp)){const t=!r.hasSnapshot&&o.hasSnapshot&&(r.capabilities===o.capabilities||!r.hasPermissions&&r.state===o.state);po?.invalidate(e.conversation,{preserveForeground:r.access===o.access||t})}return}return"session:removed"===e.type?(jo(e.conversation),ds.delete(we(e.conversation)),void("ready"===Zr&&po?.invalidate(e.conversation))):"conversation-history:cleared"===e.type?(jo(e.conversation),void("ready"===Zr&&po?.invalidate(e.conversation))):void("ready"===Zr&&!ko&&"conversation"in e&&void 0!==e.conversation&&("message:received"!==e.type&&"message:updated"!==e.type&&"message:removed"!==e.type||po?.invalidate(e.conversation,{preserveForeground:"message:received"===e.type})))});function ms(e,t=!0){const r="group"===e.conversation.conversationType?Ca("foreground"):void 0;r?.assertCurrent?.({conversationType:"group",conversationId:e.conversation.conversationId}),ko=!0;try{if(void 0===r){e.messages.length>0&&Zo.upsertMessages(e.messages,"offline",{backfillOnly:!0,refreshSessionSummary:t});for(const t of e.reactions)is(t);for(const t of po.takeRecoveries(e))Lr(t)}else{const o=po.takeRecoveries(e);for(const o of e.messages)r.publish([o],()=>Zo.upsertMessages([o],"offline",{backfillOnly:!0,refreshSessionSummary:t}));for(const t of e.reactions)r.publish([],()=>is(t));for(const e of o)r.publish([],()=>Lr(e))}}finally{ko=!1}}co=async({conversation:e,oldestLoaded:t,cursor:r,intent:n,limit:s,signal:a})=>{Mt(a);const{conversationId:i}=e,c=Zo.getConversationContext(e);if(void 0===c)throw new Error(`加载远端历史失败:会话不存在(conversationId=${i})`);if("direct"===c.type||"robot"===c.type||"customerService"===c.type)return{messages:[],exhausted:!0};if("establish-latest"===n&&30===s&&("group"===c.type||"channel"===c.type)){const e={conversationType:c.type,conversationId:i};if(void 0===ps(e))return{messages:[],exhausted:!0};const t=await po.readCached(e,!0).catch(t=>(Ir.record("warn","sdk","history","recent-history-cache-read-failed",()=>({conversation:e,error:{message:"读取最近历史缓存失败",data:t}})),null));null!==t&&po.isPageCurrent(t)&&Date.now()-t.fetchedAt>3e5&&ms(t,!1),Mt(a);const r=await po.latest(e,a).catch(t=>{if(!vt(t)&&wr&&void 0===ps(e))return null;throw t});if(null===r)return{messages:[],exhausted:!0};if(Mt(a),!wr||!po.isPageCurrent(r)||void 0===ps(e))throw new Error("最近历史请求已失效");if(ms(r),await po.confirmConsumed(r),Mt(a),!po.isPageCurrent(r))throw new Error("最近历史页在窗口提交前已失效");return{messages:r.messages,exhausted:r.exhausted,...void 0===r.nextCursor?{}:{nextCursor:r.nextCursor},replaceWindow:!0}}if("group"===c.type){if(void 0!==c.groupState&&"active"!==c.groupState)return{messages:[],exhausted:!0};const o={conversationType:"group",conversationId:i},d=hr,p=Ca(!0===po?.hasForeground(e)?"foreground":"background",a);p.assertCurrent?.(o);const l=Ia("group",o);try{const o=await fr.getLoginContext();if(null===o)return{messages:[],exhausted:!0};if(p.assertCurrent?.(),o.userId!==d)throw new DOMException("GROUP 历史请求的登录账号已改变","AbortError");const c="establish-latest"===n?Date.now():void 0===r?t?.serverTime??t?.createdAt??Date.now():lr(r,i),u=[],m=[],v=await Ot({asyncDecrypt:p,signal:a,http:Tr,userId:o.userId,clientType:gr,groupId:i,baseTime:c,direct:1,limit:s,decryptDeps:{...Un("history"),onDecryptRecovery:e=>m.push(e)},prepareKeys:t=>Fn(t,{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onReaction:e=>u.push(e)});p.assertCurrent?.();const y=l.messages(v.messages);for(const e of y)p.publish([e],()=>Zo.upsertMessages([e],"offline",{backfillOnly:!0,refreshSessionSummary:"establish-latest"===n}));for(const e of u)p.publish([],()=>is(e));for(const e of m)p.publish([],()=>{l.acceptsRecovery(e)&&Lr(e)});p.assertCurrent?.();return{messages:y,...q({conversationId:i,direction:"older",baseTime:c,batchSize:v.batchSize,boundaryTime:v.oldestEntryTime,limit:s}),..."establish-latest"===n?{replaceWindow:!0}:{}}}finally{l.stop()}}if("channel"===c.type){const s=qr("history");if(void 0!==c.channelState&&o(c.channelState))return Ir.record("info","sdk","history","channel-history-blocked",()=>({conversation:e,operationId:s,data:{state:c.channelState}})),{messages:[],exhausted:!0};const l=Oo,u=_o(i),m=await fr.getLoginContext();if(null===m)return{messages:[],exhausted:!0};if("establish-latest"===n){const t=await Wt({signal:a,http:Tr,userId:m.userId,clientType:gr,channelId:i,count:pr,operationId:s,decryptDeps:jn("history"),prepareKey:void 0===Rn&&void 0===Tn?void 0:t=>An([t],{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onContentDecodeError:Yr,onReaction:is});Mt(a);const r=Zo.getConversationContext(e);return!wr||l!==Oo||u!==_o(i)||"channel"!==r?.type||void 0!==r.channelState&&o(r.channelState)?{messages:[],exhausted:!0}:(Mt(a),t.messages.length>0&&Zo.upsertMessages(t.messages,"offline",{backfillOnly:!0,refreshSessionSummary:!0}),{messages:t.messages,exhausted:!t.hasOlder,...void 0===t.nextCursor?{}:{nextCursor:t.nextCursor},replaceWindow:!0})}let v,y=r??"";if(void 0===r&&void 0!==t){const e=t.extensions?.historyCursor;if("string"==typeof e&&""!==e.trim())y=e;else if(d=t,p=m.userId,void 0===d||d.senderId!==p||"pending"!==d.status&&"uploading"!==d.status&&"sending"!==d.status||"string"==typeof d.extensions?.historyCursor&&""!==d.extensions.historyCursor.trim())throw new Error(`CHANNEL historyCursor 缺失(channelId=${i}, messageId=${t.id})`)}Ir.record("debug","sdk","history","channel-history-page-start",()=>({conversation:e,operationId:s,data:{baseIndexPresent:""!==y,direction:1,contain:0,count:pr,historyGeneration:l,historyEpoch:u,clientTypeHeader:gr,clientTypeBody:gr}}));try{v=await zt({signal:a,http:Tr,userId:m.userId,clientType:gr,channelId:i,baseIndex:y,count:pr,contain:0,operationId:s,decryptDeps:jn("history"),prepareKey:void 0===Rn&&void 0===Tn?void 0:t=>An([t],{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onContentDecodeError:Yr,onReaction:is})}catch(t){throw Ir.record("error","sdk","history","channel-history-page-failed",()=>({conversation:e,operationId:s,data:{baseIndexPresent:""!==y,direction:1,contain:0,count:pr},error:{message:"CHANNEL 历史页加载失败",data:t}})),t}Mt(a);const g=Zo.getConversationContext(e);return!wr||l!==Oo||u!==_o(i)||"channel"!==g?.type||void 0!==g.channelState&&o(g.channelState)?{messages:[],exhausted:!0}:(Mt(a),v.messages.length>0&&Zo.upsertMessages(v.messages,"offline",{backfillOnly:!0}),Ir.record("debug","sdk","history","channel-history-page-complete",()=>({conversation:e,operationId:s,data:{responseBatchSize:v.batchSize,messageCount:v.messages.length,exhausted:v.exhausted,nextBaseIndexPresent:void 0!==v.nextBaseIndex}})),{messages:v.messages,exhausted:v.exhausted,...void 0===v.nextBaseIndex?{}:{nextCursor:v.nextBaseIndex}})}var d,p;throw new Error(`远端历史未实现:${c.type}`)};const vs=e=>{e.length>0&&Zo.upsertMessages(e,"offline",{backfillOnly:!0})},ys=async()=>{const e=await fr.getLoginContext();if(null===e)throw new Error("按消息 ID 回源失败:当前没有登录态");return{userId:e.userId}},gs=async(e,t)=>{const r={conversationType:"group",conversationId:e},o=Ia("group",r,t);try{const n=hr,s=Ao(r),a=()=>{if(!wr||hr!==n||s!==Ao(r))throw new DOMException("GROUP 消息查询所属账号或历史已失效","AbortError")},i=Ca("foreground",void 0,a);i.assertCurrent?.(r);const{userId:c}=await ys();if(a(),c!==n)throw new DOMException("GROUP 消息查询的登录账号已改变","AbortError");const d=[],p=[],l=Un("history"),u=await N(t,async t=>{a();const r=await kt({asyncDecrypt:i,http:Tr,userId:c,clientType:gr,groupId:e,messageIds:t,decryptDeps:{...l,onDecryptRecovery:e=>p.push(e)},prepareKeys:e=>Fn(e,{priority:"foreground"}),onReaction:e=>d.push(e)});if(a(),200!==r.code)throw Object.assign(new Error("GROUP 按 ID 查询业务失败"),{code:r.code});return r});a(),i.assertCurrent?.();const m=o.messages(u.messages).filter(e=>e.conversationType===r.conversationType&&e.conversationId===r.conversationId);for(const e of m)i.assertCurrent?.(),vs([e]),i.assertCurrent?.();for(const e of d)i.assertCurrent?.(),e.conversation.conversationType===r.conversationType&&e.conversation.conversationId===r.conversationId&&is(e),i.assertCurrent?.();for(const e of p)i.assertCurrent?.(),o.acceptsRecovery(e)&&e.conversation.conversationType===r.conversationType&&e.conversation.conversationId===r.conversationId&&Lr(e),i.assertCurrent?.();return{messages:m.map(e=>{const t=Zo.getConversationMessage(r,e.id);if(void 0===t)throw new Error("GROUP 按 ID 查询在领域合并后缺少消息");return t}),missingMessageIds:u.missingMessageIds}}finally{o.stop()}},fs=async(e,t)=>{const r={conversationType:"channel",conversationId:e},n=hr,s=Oo,a=_o(e),i=()=>{const t=Zo.getConversationContext(r);if(!wr||hr!==n||s!==Oo||a!==_o(e)||"channel"!==t?.type||void 0!==t.channelState&&o(t.channelState))throw new DOMException("CHANNEL 消息查询所属账号或历史已失效","AbortError")};i();const{userId:c}=await ys();if(i(),c!==n)throw new DOMException("CHANNEL 消息查询的登录账号已改变","AbortError");const d=[],p=[],l=await N(t,async t=>{i();const r=await Dt({http:Tr,userId:c,clientType:gr,channelId:e,messageIds:t,operationId:qr("history"),decryptDeps:{...jn("history"),onDecryptRecovery:e=>p.push({...e,source:"history"})},prepareKey:void 0===Rn&&void 0===Tn?void 0:async e=>{await An([e],{recoverExistingMessages:!1,priority:"foreground"}),i()},onContentDecodeError:Yr,onReaction:e=>d.push(e)});if(i(),0!==r.code)throw Object.assign(new Error("CHANNEL 按 ID 查询业务失败"),{code:r.code});return r});i();for(const e of l.messages)i(),vs([e]);for(const e of d)i(),is(e);for(const e of p)i(),Lr(e);i();return{messages:l.messages.map(e=>{const t=Zo.getConversationMessage(r,e.id);if(void 0===t)throw new Error("CHANNEL 按 ID 查询在领域合并后缺少消息");return t}),missingMessageIds:l.missingMessageIds}},hs=Me([Re({includeOppositeEnd:!0,resolveOwnKey:async e=>{const t=await(Tn?.getUserPrivateKey(e));return t?.publicKey?{publicKey:t.publicKey,version:t.version}:null}}),ke({resolveGroupKey:Ln}),xe({resolveChannelKey:xn}),De()]),Is=Pe([Ae(),je(),Oe()]),ws=_e([Ne(),Le(),Ke({resolveChannelKey:xn,resolveProfile:e=>Fo?.getProfile(e)??Promise.resolve(null)})]);let Cs=()=>{throw new Error("群收包回 ACK 失败:connection.sendFrame 尚未就绪")},bs=()=>!1,Ss=()=>{throw new Error("群发送 ACK 回填失败:connection.onChatAck 尚未就绪")},Ts=()=>{},Es=()=>{};const Ms={...Zo,removeConversationForMembershipTermination:(e,t)=>{Ts(e,t),"group"===e.conversationType?(On.remove(e.conversationId),jo(e),Mn?.clearGroupKeys(e.conversationId)):Rn?.clearChannelKey(e.conversationId),Zo.removeConversationForMembershipTermination(e,t),Br.api.resetBackground(e).catch(e=>mr.emit({type:"error",error:{scope:"storage",message:"终态删除后清理会话背景失败",cause:e}}))}},Rs=Et({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>hr,isAuthenticated:()=>bs(),reportReaction:e=>Wo.reportReaction(e),isEmojiSupported:x,logger:Wr});is=e=>{Rs.ingest(e,"offline")};const ks=Fe({manager:Rs,getSelfId:()=>hr,logger:Wr}),xs=Ue({domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>hr,emitter:mr,logger:Wr,keepRaw:!0,decrypt:{crypto:yn,resolvePrivateKey:({groupId:e})=>Kn(e),preparePrivateKey:async({groupId:e})=>{if(void 0===Mn)return null;const t=await Mn.getGroupKeys(e);return t?.privateKey??null},onDecryptError:e=>Jr("live",e),onDecryptRecovery:Lr},isActive:()=>wr});let Ds=0;const Ps=mr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&Ds++}),As=Be({domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>hr,emitter:mr,logger:Wr,keepRaw:!0,decrypt:{crypto:yn,resolveChannelKey:Dn,resolveUserPrivateKey:Pn,onDecryptRecovery:Lr,onDecryptError:e=>{const t=void 0!==Rn&&void 0===Rr?.saveDecryptRecovery&&2===e.encrypt&&"decrypt-failed"===e.reason;if(Qr("live",{...e,forceRefreshAttempted:t}),!t)return;const r=Rn.getCachedChannelKey(e.channelId)??void 0;Rn.getChannelKey(e.channelId,{staleKey:r}).catch(()=>{})}},isActive:()=>wr&&bs(),getConnectionEpoch:()=>Ds}),js=Ge({isActive:()=>wr,domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>hr,emitter:mr,logger:Wr,keepRaw:!0}),Os=He({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>hr,emitter:mr,logger:Wr,keepRaw:!0,decrypt:{crypto:yn,resolveChannelKey:Dn,resolveUserPrivateKey:Pn,onDecryptRecovery:Lr}}),_s=Ve({getSelfId:()=>hr,sendFrame:e=>Cs(e),emitter:mr}),Ns=$e({emitter:mr,getSelfId:()=>hr}),Ls=qe({sendFrame:e=>Cs(e),emitter:mr,getSelfId:()=>hr,domainState:{reconcileDirectContactEstablishedNotice:Zo.reconcileDirectContactEstablishedNotice,removeConversation:e=>{"string"!=typeof e?("direct"===e.conversationType&&go(e,"friend_relation_removed"),Zo.removeConversation(e)):Zo.removeConversation(e)}},resetDirectReadReceiptPreference:e=>Vr.api.readReceipts.resetConversation({conversationType:"direct",conversationId:e}),onRelationshipChanged:an.updateRelationshipFromEvent}),Ks=We({sendFrame:e=>Cs(e),emitter:mr,domainState:{applyTransferStatusBySerialNumber:Zo.applyTransferStatusBySerialNumber}}),Fs=ze({getSelfId:()=>hr,sendFrame:e=>Cs(e),emitter:mr}),Us=Je({getSelfId:()=>hr,domainState:Zo,sendFrame:e=>Cs(e),emitter:mr,onRelationshipChanged:an.updateRelationshipFromEvent}),Bs=Qe({sendFrame:e=>Cs(e),emitter:mr,getSelfId:()=>hr,isAuthenticated:()=>bs(),domainState:Zo}),Gs=Ye({sendFrame:e=>Cs(e),emitter:mr,getSelfId:()=>hr,isAuthenticated:()=>bs(),domainState:Zo}),Hs=[...Bs.handlers,...Gs.commandHandlers],Vs=oe({isActive:()=>wr&&bs(),getUserId:async()=>(await fr.getLoginContext())?.userId??null,pull:(e,t,r)=>ir({http:Tr,userId:e,clientType:gr,deliveredMsgIds:t,signal:r}),onBatch:e=>{Ir.record("info","sdk","call","signal-offline-pull",()=>({data:{count:e.items.length,cmdIds:e.items.map(e=>`0x${e.cmdId.toString(16)}`)}})),0===e.items.length&&mr.emit({type:"notification",cmdId:0,name:"OFFLINE_SIGNAL"})},onItem:e=>{if(mr.emit({type:"notification",cmdId:e.cmdId,name:"OFFLINE_SIGNAL"}),!wr||!bs())return;const t=Hs.find(t=>t.command===e.cmdId);t?.handler(e.cmdId,e.body)},onError:e=>mr.emit({type:"error",error:{scope:"sync",message:"音视频离线信令拉取失败",cause:e}})}),$s=mr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&Vs.stop()}),qs=Xe({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>hr,emitter:mr,logger:Wr,keepRaw:!0}),Ws=at({domainState:Ms,getSelfId:()=>hr,prefetchGroupKey:_n,clearGroupKeys:e=>{On.remove(e),jo({conversationType:"group",conversationId:e}),Mn?.clearGroupKeys(e)},clearConversationTermination:e=>Es(e)}),zs=mr.subscribe(e=>{"message:received"!==e.type&&"message:updated"!==e.type||Ws.handleMessage(e.message)}),Js=it({domainState:Ms,getSelfId:()=>hr,prepareChannelKey:e=>{Ir.record("debug","sdk","crypto","channel-key-prepare-requested",()=>({conversation:{conversationType:"channel",conversationId:e},data:{cacheHit:void 0!==Rn&&null!==Rn.getCachedChannelKey(e)}})),void 0!==Rn&&Rn.getChannelKey(e).catch(()=>{})},clearChannelKey:e=>{const t=void 0!==Rn&&null!==Rn.getCachedChannelKey(e);Rn?.clearChannelKey(e),Ir.record("info","sdk","crypto","channel-key-cleared",()=>({conversation:{conversationType:"channel",conversationId:e},data:{cacheHit:t}}))},clearConversationTermination:e=>Es(e),stopChannelHistory:e=>{const t=_o(e);No(e),Zo.messageWindow.info().conversationId===e&&Zo.messageWindow.reset(),Ir.record("info","sdk","history","channel-history-invalidated",()=>({conversation:{conversationType:"channel",conversationId:e},data:{previousEpoch:t,nextEpoch:_o(e)}}))}}),Qs=mr.subscribe(e=>{if("message:received"===e.type||"message:updated"===e.type){const t=e.message;"channel"===t.conversationType&&void 0!==t.body.system?.eventType&&Ir.record("info","sdk","conversation","channel-membership-event-observed",()=>({conversation:{conversationType:"channel",conversationId:t.conversationId},messageId:t.id,data:{eventType:t.body.system?.eventType,source:e.source??"live",targetSelf:t.body.system?.targetUserIds?.includes(hr)??!1,lifecycleEffects:!0===e.channelLifecycleEffects,stateBefore:Zo.getSession({conversationType:"channel",conversationId:t.conversationId})?.channelState??"missing"}})),Js.handleMessage(e.message,{source:e.source??"live",applyLifecycleEffects:e.channelLifecycleEffects})}}),Ys=/* @__PURE__ */new Set(["channel_member_left","channel_member_removed","channel_member_joined","channel_member_invited","channel_owner_transferred","channel_admin_added","channel_admin_removed","channel_member_renamed"]),Xs=/* @__PURE__ */new Set(["channel_member_left","channel_member_removed","channel_member_joined","channel_member_invited","channel_member_renamed"]),Zs=mr.subscribe(e=>{if("message:received"!==e.type&&"message:updated"!==e.type)return;if("live"!==(e.source??"live")&&!0!==e.channelLifecycleEffects)return;const t=e.message,r=t.body.system?.eventType;"channel"===t.conversationType&&void 0!==r&&(Ys.has(r)&&Uo?.invalidateChannelMembers(t.conversationId).catch(e=>{mr.emit({type:"error",error:{scope:"storage",message:"CHANNEL 成员缓存失效失败",cause:e}})}),Xs.has(r)&&Go.invalidate(t.conversationId).catch(e=>{mr.emit({type:"error",error:{scope:"storage",message:"CHANNEL @候选缓存失效失败",cause:e}})}))}),ea=c({fetchMessagesById:gs,onSourceUnavailable:e=>Ir.record("warn","sdk","message","pinned-source-unavailable",()=>({conversation:{conversationType:"group",conversationId:e.conversationId},data:{messageId:e.messageId,localCleared:!0,serverCleanup:"requires-conditional-authorized-api"}})),...void 0===Sr?{}:{coreClient:Sr},domainState:Zo,emitter:mr}),ta=e({fetchMessagesById:fs,onSourceUnavailable:e=>Ir.record("warn","sdk","message","pinned-source-unavailable",()=>({conversation:{conversationType:"channel",conversationId:e.conversationId},data:{messageId:e.messageId,localCleared:!0,serverCleanup:"requires-conditional-authorized-api"}})),...void 0===Sr?{}:{coreClient:Sr},domainState:Zo,emitter:mr}),ra=n({...void 0===Qo?{}:{joinApplications:Qo},http:Tr,clientType:gr,buildOfflineDecrypt:()=>jn("history"),onContentDecodeError:Yr,onReaction:is,...void 0===Rn&&void 0===Tn?{}:{prepareKey:(e,t)=>An([e],{signal:t,priority:!0===po?.hasForeground({conversationType:"channel",conversationId:e})?"foreground":"background"})}});Mo=async(e,t,r)=>{const{context:o}=await ra.loadMessageContext(e,t,r);return o.messages};const oa=r({authProvider:fr,emitter:mr,domainState:Zo,loadMessageContext:ra.loadMessageContext,isActive:()=>wr,getHistoryGeneration:()=>Oo,getHistoryEpoch:_o}),na=G({domainState:Zo,isActive:()=>wr,loadSummary:async({channelId:e,readCursor:t})=>{const r=await fr.getLoginContext();if(null===r||!wr||r.userId!==hr)throw new Error("CHANNEL 已读摘要:无有效登录上下文");return(await $t({http:Tr,userId:r.userId,clientType:gr,channels:[{channelId:e,readCursor:t}],keepRaw:!1})).find(t=>t.channelId===e)},report:(e,t,r)=>Ir.record("channel-read-summary-failed"===e?"warn":"debug","sdk","sync",e,()=>({conversation:t,data:r}))}),sa=Pt({domainState:Zo,updateReadIndex:async({channelId:e,readCursor:t})=>{const r=await fr.getLoginContext();if(null===r||!wr||r.userId!==hr)throw new Error("CHANNEL 已读 readIndexes/edit:无登录上下文");await cr({http:Tr,userId:r.userId,indexes:[{channelId:e,readCursor:t}]})},emitter:mr,logger:Wr,onReadCommitted:na.request,onReadSettled:na.settled,syncRead:{getSelfId:()=>hr,sendFrame:e=>Cs(e)}}),aa=Ze({getSelfId:()=>hr,applyRemoteRead:e=>sa.applyRemoteRead(e),emitter:mr,logger:Wr}),ia=et([pt({domainState:Zo,markGroupReadAll:async e=>{const t=await fr.getLoginContext();if(null===t)throw new Error("群已读 read_all:无登录上下文");await dr({http:Tr,userId:t.userId,groupId:e})},emitter:mr,logger:Wr,isAuthenticated:()=>bs(),syncRead:{getSelfId:()=>hr,sendFrame:e=>Cs(e)}}),sa,lt({domainState:Zo}),ut({domainState:Zo})]),ca=tt({getSelfId:()=>hr,sendFrame:e=>Cs(e),onListenerError:()=>mr.emit({type:"error",error:{scope:"unknown",message:"推送状态订阅者回调异常"}})}),da=rt({getSelfId:()=>hr,sendFrame:e=>Cs(e),onListenerError:()=>mr.emit({type:"error",error:{scope:"unknown",message:"页面状态订阅者回调异常"}})}),pa=mr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&(ca.setAuthenticated(!1),da.setAuthenticated(!1))}),la=ot({transport:Er,authProvider:fr,endpointProvider:ur.endpointProvider,emitter:mr,domainState:Zo,logger:Wr,decrypt:{crypto:yn,resolvePrivateKey:({msgType:e})=>1===e||1e3===e?Tn?.getCachedPrivateKey(hr)?.privateKey??null:null,onDecryptError:e=>zr("live",e),onDecryptRecovery:Lr},encryptSend:void 0===En&&void 0===Rn?void 0:{crypto:yn,resolvePublicKey:e=>En?.getPeerPublicKey(e)??Promise.resolve(null),resolveGroupKey:Ln},media:void 0!==hn?{transfer:hn,recoveryPort:Cr?.port,retainFailedUploads:ur.uploadRecovery?.retainFailedUploads,shouldPersistUpload:(e,t)=>void 0!==Cr&&ct(t,!0===ur.media?.multipartTransfer&&!1!==ur.media.multipartUpload).multipart,waitUntilOnline:e=>br.wait(e),preview:wn,onTransferError:e=>{Ir.record("error","core","media","media-transfer-failed",()=>({conversation:e.conversation,data:{stage:e.stage,kind:e.kind,messageId:e.messageId},error:{message:"媒体上传失败",data:e.cause}}))},onAlbumContentSize:e=>{Ir.record("rejected"===e.outcome?"error":"warn","core","media","rejected"===e.outcome?"media-album-content-rejected":"media-album-content-large",()=>({conversation:e.conversation,data:{messageId:e.messageId,itemCount:e.itemCount,...void 0===e.contentBytes?{}:{contentBytes:e.contentBytes}},...void 0===e.cause?{}:{error:{message:"媒体合集正文未通过发送前体积闸门",data:e.cause}}}))},...void 0===Fr?{}:{assetCache:Fr,onAssetCacheError:e=>{Ir.record("warn","core","media","media-asset-cache-put-failed",()=>({data:{operation:e.operation,kind:e.kind,messageId:e.messageId,byteLength:e.byteLength},error:{message:"发送媒体写入本机缓存失败",data:e.cause}}))}},...void 0===ur.media?.maxConcurrentUploads?{}:{maxConcurrentUploads:ur.media.maxConcurrentUploads}}:void 0,sendStrategies:hs,commandHandlers:[...da.commandHandlers,...ca.commandHandlers,...Ls,...Ns,...Ks,...Fs,...Us,...Hs,...ks,...xs,...qs,...As,...Os,..._s,...aa,...js],readStrategies:ia,canSendDirectReadReceipt:e=>{if(!Vr.isDirectReadReceiptEnabled(e))return!1;const t=an.peekRelationship(e);return void 0!==t&&"unknown"!==t?"friend"===t:void 0},recallStrategies:Is,channelMessageDeletion:{resolveProfile:e=>Fo?.getProfile(e)??Promise.resolve(null),onPermissionDenied:e=>Zo.refreshConversationProfile(e,"channel")},editStrategies:ws,storage:Rr,onHeartbeat:()=>da.onHeartbeat(),onAuthenticated:()=>{da.setAuthenticated(!0),ca.setAuthenticated(!0);for(const e of oo)e.resumeMedia();const e=uo;uo=!0,(e||"auto"===lo)&&Da().catch(()=>{}),Vs.start()},isOnline:()=>"undefined"==typeof navigator?void 0:navigator.onLine},ur.connection);Gr=e=>la.suppressDirectReadReceipts(e),Hr=e=>la.resumeDirectReadReceipts(e),Cs=la.sendFrame,bs=()=>"authenticated"===la.state,Ss=la.onChatAck,go=la.terminateConversationSending,Ts=la.markOutboxConversationTerminated,Es=la.clearOutboxConversationTerminated;const ua=L({operations:{getPending:la.getPendingOutbox,retry:la.retryOutboxMessage,cancel:la.cancelOutboxMessage},emitter:mr,isActive:()=>wr}),ma=l({mediaCrypto:{executor:mn,generation:yr,isActive:()=>wr},connection:la,domainState:Zo,crypto:yn,settleEmptyGroupRead:async e=>{const t=Do.get(e.conversationId)??0,r=Zo.getSession(e);let o=void 0===r,n=r?.unreadCount??0,s=r?.mentionUnreadCount??0,a=n,i=s;const c=()=>{const r=Zo.getSession(e);if(!wr||o||void 0===r||t!==(Do.get(e.conversationId)??0)||void 0!==r.groupState&&"active"!==r.groupState)throw new DOMException("群已读请求已失效","AbortError");return r},d=mr.subscribe(t=>{if("conversation"in t&&"group"===t.conversation?.conversationType&&t.conversation.conversationId===e.conversationId&&(("session:removed"===t.type||"conversation-history:cleared"===t.type||"session:updated"===t.type&&void 0!==t.session.groupState&&"active"!==t.session.groupState)&&(o=!0),"read:updated"===t.type||"session:updated"===t.type)){const t=Zo.getReadState(e);if(void 0===t)return;const r=t.mentionUnreadCount??0;a=Math.max(0,a-Math.max(0,n-t.unreadCount)),i=Math.max(0,i-Math.max(0,s-r)),n=t.unreadCount,s=r}});try{c();const t=await fr.getLoginContext();if(c(),null===t||t.userId!==hr)throw new Error("群已读 read_all:登录上下文已失效");await dr({http:Tr,userId:t.userId,groupId:e.conversationId});const r=c(),o=Zo.getReadState(e),n=Math.max(0,(o?.unreadCount??r.unreadCount)-a),s=Math.max(0,(o?.mentionUnreadCount??r.mentionUnreadCount??0)-i);Zo.setReadState({...o??{...e,readCursor:r.readCursor??"",unreadCount:r.unreadCount},mentionUnreadCount:s}),Zo.applyServerUnread(e,n)}finally{d()}},...void 0===hn?{}:{mediaTransfer:hn},prepareDirectReadReceipt:async e=>{try{await an.ensureRelationship(e)}catch(t){mr.emit({type:"error",error:{scope:"http",message:"Direct 已读已在本地提交,但联系人关系查询失败,未发送对端可见回执",cause:{peerId:e,error:t}}})}}}),va=O({recoveryPort:Cr?.port,connection:la,domainState:Zo,emitter:mr,isActive:()=>wr,preparePreview:Cn,prepareVideoPoster:bn,prepareImageThumbnail:Sn,onLocalPreviewError:({kind:e,byteLength:t,cause:r})=>{Ir.record("warn","sdk","media","local-preview-failed",()=>({generation:yr,data:{kind:e,byteLength:t},error:{message:r instanceof Error?r.message:String(r)}}))},...void 0===Fr?{}:{assetCache:Fr,onAssetCacheEvent:e=>{Ir.record("failed"===e.outcome?"warn":"debug","sdk","media",`media-asset-cache-${e.operation}-${e.outcome}`,()=>({data:{operation:e.operation,outcome:e.outcome,kind:e.kind,messageId:e.messageId,...void 0===e.byteLength?{}:{byteLength:e.byteLength}},...void 0===e.cause?{}:{error:{message:"媒体资产缓存操作失败",data:e.cause}}}))}},...void 0===hn?{}:{loaders:{loadImage:ma.operations.loadImage,loadVideo:ma.operations.loadVideo,loadVoice:ma.operations.loadVoice,loadFile:ma.operations.loadFile}}}),ya=J({isActive:()=>wr&&"ready"===Zr&&""!==hr,maintain:async()=>{va.prune(),la.expireRetainedUploads();const e=(await Promise.allSettled([Kr?Fr?.prune?.():void 0,Cr?.prune()])).find(e=>"rejected"===e.status);if("rejected"===e?.status)throw e.reason},onError:e=>Ir.record("warn","sdk","media","media-cache-maintenance-failed",()=>({error:{message:"媒体过期缓存清理失败",data:e}}))});rn=()=>{la.invalidateMediaAssetCacheWrites(),va.clearCache()},void 0===ur.transport&&"undefined"!=typeof window&&(la.setConnectionAllowed(!1),no=nt({onChange:(e,t)=>{if(!e){if(yo=!0,la.setConnectionAllowed(!1),!wr)return io?.then(()=>{});wr=!1,Vs.stop(),Ar.clear(),Nn(),wo.abort(),Io.dispose(),Eo.dispose(),To.dispose(),po?.dispose(),mo=!1,vo+=1,ga.stop();return Oa({localData:"preserve"},{requireStorageClose:!0,preserveUploadRecovery:!0,notifyReplacement:"replaced"===t}).then(()=>{})}},onError:e=>{ao=e,mr.emit({type:"error",error:{scope:"transport",message:"IM 页面连接协调不可用,请使用支持 Web Locks 的安全浏览器环境",cause:e}})}}));const ga=Ce({onOnline:()=>{br.setOnline(!0),la.notifyOnline()},onOffline:()=>{br.setOnline(!1),la.notifyOffline()},onVisible:()=>{ya.run(),la.notifyVisible();for(const e of oo)e.resumeMedia()},onPageHide:()=>{mo&&la.suspendForPageLifecycle()},onPageShow:()=>{if(ya.run(),mo){la.resumeFromPageLifecycle(),la.notifyVisible();for(const e of oo)e.resumeMedia()}}},ur.network);const fa=mr.subscribe(e=>{wr&&"auth:invalid"===e.type&&(Vs.stop(),mo=!1,vo+=1,yo=void 0!==no,no?.terminate(),ga.stop())});async function ha(e,t={}){const r=await(Tn?.getUserPrivateKey(e,{priority:t.priority??"background",signal:t.signal??wo.signal}))??null;return{crypto:yn,resolvePrivateKey:({msgType:e})=>1===e||1e3===e?r?.privateKey??null:null,onDecryptError:t=>zr("offline",t,e),onDecryptRecovery:Lr}}function Ia(e,t,r){const o=void 0===t?Zo.getMessages().filter(t=>t.conversationType===e):Zo.getMessagesByConversation(t).filter(e=>void 0===r||r.includes(e.id)),n=new Map(o.map(e=>[Or({conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id}),e])),s=/* @__PURE__ */new Set,a=mr.subscribe(o=>{if(("message:received"===o.type||"message:updated"===o.type)&&"live"===o.source&&o.conversation.conversationType===e&&(void 0===t||o.conversation.conversationId===t.conversationId&&(void 0===r||r.includes(o.message.id)))){const e=Or({conversation:o.conversation,messageId:o.message.id}),t=n.get(e);void 0!==t&&ro(t,o.message)||s.add(e)}});return{stop:()=>{a(),n.clear(),s.clear()},acceptsRecovery:e=>!s.has(Or(e)),messages:e=>e.map(e=>{const t={conversationType:e.conversationType,conversationId:e.conversationId};return s.has(Or({conversation:t,messageId:e.id}))?Zo.getConversationMessage(t,e.id)??e:e})}}function wa(e,t){const r=hr,o=new Map(Po),n=/* @__PURE__ */new Map,s=e=>{if(Mt(wo.signal),!wr||r!==hr)throw new DOMException("DIRECT 计算所属账号已失效","AbortError");void 0!==e&&n.set(we(e),e);for(const[e,t]of n)if((o.get(e)?.version??0)!==Ao(t))throw void 0!==Po.get(e)?.reason?Po.get(e).reason:new DOMException("DIRECT 计算所属会话已清理","AbortError");t?.()};return{publish(e,t){s();const r=t();return s(),r},executor:mn,generation:yr,operationId:"direct-batch:"+ ++Zn,priority:e,signal:wo.signal,assertCurrent:s,yieldToEventLoop:Kt}}function Ca(e,t,r){const o=hr,n=new Map(Po),s=/* @__PURE__ */new Map,a=e=>{if(Mt(wo.signal),Mt(t),!wr||hr!==o)throw new DOMException("GROUP 计算所属账号已失效","AbortError");void 0!==e&&s.set(we(e),e);for(const[e,t]of s)if((n.get(e)?.version??0)!==Ao(t))throw void 0!==Po.get(e)?.reason?Po.get(e).reason:new DOMException("GROUP 计算所属群密钥、权限或历史已失效","AbortError");r?.()};return{publish(e,t){a();const r=e.filter(e=>{if("group"!==e.conversationType||void 0===e.body.system)return!1;const t=Ft(e.body.system,hr);return null!==t&&"active"!==t.state}).map(e=>({conversationType:"group",conversationId:e.conversationId})),o=t();for(const e of r){const t=we(e);void 0===Po.get(t)?.reason&&n.set(t,{version:Ao(e)})}return a(),o},executor:{async decryptBatch(t){const r=[...s.values()];ls.set(t.operationId,r);try{const o="foreground"===e||r.some(e=>!0===po?.hasForeground(e))?"foreground":"background";return await mn.decryptBatch({...t,priority:o})}finally{ls.delete(t.operationId)}}},generation:yr,operationId:"group-batch:"+ ++Zn,priority:e,signal:t??wo.signal,assertCurrent:a,yieldToEventLoop:Kt}}async function ba(e,t,r,o,n){const s=[];let a;try{for(const e of t)n([],()=>{s.push(Promise.resolve(Zo.commitReceivedMessages([],"offline",void 0,{events:[e],apply:e=>Rs.ingest(e,"offline")})))});for(const t of e)n([t],()=>{s.push(Promise.resolve(Zo.commitReceivedMessages([t],"offline")))});for(const e of r)n([],()=>{Lr(e);const t=kr.get(Or(e));void 0!==t&&s.push(t)})}catch(e){a={cause:e}}const i=await Promise.allSettled(s);if(void 0!==a)throw a.cause;const c=i.find(e=>"rejected"===e.status);if("rejected"===c?.status)throw c.reason;o()}function Sa(e,t){return{endpoint:e,pullBatch:async({deliveredMsgInfos:r,limit:o})=>{const n=Ia("direct");try{const s=[],a=hr,i=wa("background");i.assertCurrent?.();const c=await fr.getLoginContext();if(null===c)throw new Error(`sync(${e}): 无登录上下文(authProvider.getLoginContext 返回 null)`);if(i.assertCurrent?.(),""!==a&&c.userId!==a)throw new DOMException("DIRECT 离线同步的登录账号已改变","AbortError");const d=await ha(c.userId);i.assertCurrent?.();const p=[],l=await t({http:Tr,userId:c.userId,clientType:gr,decryptDeps:{...d,onDecryptRecovery:e=>s.push(e)},asyncDecrypt:i,deliveredMsgInfos:r,...void 0===o?{}:{limit:o},onReaction:e=>p.push(e)});return i.assertCurrent?.(),{...l,reactions:p,commit:async()=>{try{await ba(n.messages(l.messages),p,s.filter(n.acceptsRecovery),()=>i.assertCurrent?.(),i.publish)}finally{n.stop()}}}}catch(e){throw n.stop(),e}}}}async function Ta(e){const t=[...new Map(e.map(e=>[we(e),e])).values()];let r=0;await(async()=>{for(;r<t.length;){if(!wr)return;const e=t[r++];if(void 0!==Zo.getSession(e)&&void 0!==ps(e))try{if(await Io.waitForBackground(wo.signal),!wr||void 0===Zo.getSession(e)||void 0===ps(e))continue;po.invalidate(e,{preserveForeground:!0}),await co({conversation:e,oldestLoaded:void 0,intent:"establish-latest",limit:30})}catch(t){if(!wr||void 0===Zo.getSession(e)||void 0===ps(e))continue;mr.emit({type:"error",error:{scope:"sync",message:"会话最新消息同步失败",cause:t}}),Ir.record("warn","sdk","sync","session-latest-summary-failed",()=>({conversation:e,error:{message:"会话最新消息同步失败",data:t}}))}}})()}async function Ea(){const e=qr("sync");Ir.record("info","sdk","sync","channel-sync-start",()=>({operationId:e,data:{clientTypeHeader:gr,sessionsClientTypeBody:"absent",offlineClientTypeBody:gr}}));try{await async function(e){if(void 0===Fo)return void Ir.record("info","sdk","sync","channel-sync-skipped",()=>({operationId:e,data:{reason:"profile-unavailable"}}));const t=await fr.getLoginContext();if(null===t)return void Ir.record("info","sdk","sync","channel-sync-skipped",()=>({operationId:e,data:{reason:"auth-unavailable"}}));const r=await Fo.listProfiles({forceRefresh:!0});if(!wr)return;if(0===r.length)return void Ir.record("info","sdk","sync","channel-sync-complete",()=>({operationId:e,data:{profileCount:0,sessionCount:0,offlineMessageCount:0}}));const n=new Map(r.map(e=>[e.id,e]));for(const e of r){if(Xr(e.channelState)){Rn?.clearChannelKey(e.id),Ms.removeConversationForMembershipTermination({conversationType:"channel",conversationId:e.id},`channel_${e.channelState}`);continue}const t=e.permissions.sendMessages?void 0:`channel_${e.channelState}`;Zo.setChannelRestriction(e.id,e.channelState,t,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}}),Zo.updateConversationProfile({conversationType:"channel",conversationId:e.id},{title:e.name,avatar:e.avatar}),void 0!==e.muted&&Zo.setMuted({conversationType:"channel",conversationId:e.id},e.muted)}const s=new Map(r.map(e=>{const t={conversationType:"channel",conversationId:e.id},r=Zo.getReadState(t),o=Zo.getSession(t);return[e.id,{revision:Zo.getChannelReadRevision(t),pending:Zo.hasPendingChannelRead(t),readCursor:r?.readCursor??o?.readCursor??"",unreadCount:o?.unreadCount??r?.unreadCount??0,mentionUnreadCount:o?.mentionUnreadCount??r?.mentionUnreadCount??0}]})),a=r.map(e=>({channelId:e.id,readCursor:s.get(e.id).readCursor}));Ir.record("debug","sdk","sync","channel-sessions-request",()=>({operationId:e,data:{channelCount:a.length,channelsWithReadCursor:a.filter(e=>""!==e.readCursor).length,clientTypeHeader:gr,clientTypeBody:gr}}));const i=await $t({http:Tr,userId:t.userId,clientType:gr,channels:a,operationId:e,decryptDeps:jn("offline"),prepareKeys:e=>An(e.filter(e=>{const t=n.get(e)?.channelState;return void 0===t||!o(t)})),onContentDecodeError:Yr,onReaction:is});if(!wr)return;Ir.record("debug","sdk","sync","channel-sessions-response",()=>({operationId:e,data:{sessionCount:i.length,lastMessageCount:i.filter(e=>void 0!==e.last).length,decryptFailedLastCount:i.filter(e=>!0===e.last?.encryption.decryptFailed).length,unknownContentLastCount:i.filter(e=>"unknown"===e.last?.contentType&&!0!==e.last.encryption.decryptFailed).length}}));const c=new Set(i.filter(e=>{const t=s.get(e.channelId),r={conversationType:"channel",conversationId:e.channelId},o=Zo.getReadState(r),n=Zo.getSession(r);return void 0===t||t.pending||Zo.hasPendingChannelRead(r)||Zo.getChannelReadRevision(r)!==t.revision||(o?.readCursor??n?.readCursor??"")!==t.readCursor||(n?.unreadCount??o?.unreadCount??0)!==t.unreadCount||(n?.mentionUnreadCount??o?.mentionUnreadCount??0)!==t.mentionUnreadCount}).map(e=>e.channelId)),d=i.filter(e=>void 0!==Zo.getConversationContext({conversationType:"channel",conversationId:e.channelId})).map(e=>{const t=n.get(e.channelId),r=t?.channelState,s=void 0!==r&&o(r)?r:o(e.channelState)?e.channelState:r??e.channelState,a="active"===s?void 0:s===e.channelState?e.sendDisabledReason:`channel_${s}`;return{...e,channelState:s,sendDisabledReason:a}});for(const e of d){const t=n.get(e.channelId);Zo.setChannelRestriction(e.channelId,e.channelState,e.sendDisabledReason,void 0===t?void 0:{permissions:t.permissions,...void 0===t.accessSnapshot?{}:{snapshot:t.accessSnapshot}}),void 0!==t&&(Zo.updateConversationProfile({conversationType:"channel",conversationId:e.channelId},{title:t.name,avatar:t.avatar}),void 0!==t.muted&&Zo.setMuted({conversationType:"channel",conversationId:e.channelId},t.muted)),c.has(e.channelId)||Zo.applyChannelReadSummary({conversationType:"channel",conversationId:e.channelId},e),o(e.channelState)&&Rn?.clearChannelKey(e.channelId)}const p=Oo,l=new Map(d.map(e=>[e.channelId,_o(e.channelId)])),u=e=>{const t=Zo.getConversationContext({conversationType:"channel",conversationId:e});return wr&&p===Oo&&l.get(e)===_o(e)&&void 0!==t&&(void 0===t.channelState||!o(t.channelState))},m=e=>{if(!wr||p!==Oo)return[];const t=e.filter(e=>u(e.conversationId));return t.length>0&&Zo.upsertMessages(t,"offline",{applyChannelLifecycleEffects:!0}),t};m(d.flatMap(e=>void 0===e.last?[]:[e.last])),await Ta(d.filter(e=>void 0===e.last&&!o(e.channelState)).map(e=>({conversationType:"channel",conversationId:e.channelId})));const v=d.filter(e=>!c.has(e.channelId)&&!o(e.channelState)&&e.unreadCount>0&&""!==e.readCursor);Ir.record("debug","sdk","sync","channel-offline-plan",()=>{const t={staleRead:0,historyBlocked:0,zeroUnread:0,emptyReadCursor:0};for(const e of d)c.has(e.channelId)?t.staleRead+=1:o(e.channelState)?t.historyBlocked+=1:e.unreadCount<=0?t.zeroUnread+=1:""===e.readCursor&&(t.emptyReadCursor+=1);return{operationId:e,data:{acceptedSessionCount:d.length,eligibleChannelCount:v.length,staleReadSkippedCount:t.staleRead,historyBlockedSkippedCount:t.historyBlocked,zeroUnreadSkippedCount:t.zeroUnread,emptyReadCursorSkippedCount:t.emptyReadCursor,direction:0,contain:0,count:pr}}});const y=[],g=new Map(v.map(e=>[e.channelId,e.readCursor])),f=[];for(const t of v){const r={conversationType:"channel",conversationId:t.channelId},o=!0!==Rr?.supportsChannelSyncCheckpoint?void 0:Jt(await Rr.getMeta(Qt(r)),r);if(!u(t.channelId))continue;const n=o?.startIndex===t.readCursor;f.push({channelId:t.channelId,baseIndex:n?o.baseIndex:t.readCursor}),Ir.record("debug","sdk","sync","channel-offline-resume",()=>({operationId:e,conversation:r,data:{resumed:n}}))}const h=[],I=[];let w;if(await qt({http:Tr,userId:t.userId,clientType:gr,operationId:e,pulls:f,messageCount:pr,signal:wo.signal,beforePage:()=>Io.waitForBackground(wo.signal),isChannelCurrent:u,yieldToEventLoop:Kt,decryptDeps:{...jn("offline"),onDecryptRecovery:e=>I.push(e)},prepareKeys:e=>An(e,{recoverExistingMessages:!1}),onContentDecodeError:Yr,onReaction:e=>h.push(e),onPage:async(e,t)=>{const r=h.splice(0),o=I.splice(0),n=(async()=>{for(const n of t.pulls){const s={conversationType:"channel",conversationId:n.channelId},a=()=>u(n.channelId);if(!a())continue;const i=o.filter(e=>e.conversation.conversationId===n.channelId),c=()=>{y.push(...m(e.filter(e=>e.conversationId===n.channelId)));for(const e of r)a()&&e.conversation.conversationId===n.channelId&&is(e)};if(!0!==Rr?.supportsChannelSyncCheckpoint){c();for(const e of i)a()&&Lr(e);continue}if(!await Zo.commitChannelSyncPage([s],c,a,async()=>{if(i.length>0&&void 0===Rr.saveDecryptRecovery)throw new Error("CHANNEL 同步不能保存解密恢复记录");for(const e of i)await Rr.saveDecryptRecovery(e)})||!a())continue;const d=t.nextBaseIndexes[n.channelId];void 0!==d&&await Zo.saveChannelSyncCheckpoint({version:1,conversation:s,startIndex:g.get(n.channelId),baseIndex:d},a);for(const e of i)a()&&ns(e).catch(e=>mr.emit({type:"error",error:{scope:"storage",message:"CHANNEL 解密恢复失败",cause:e}}))}})();Co.add(n);try{await n}finally{Co.delete(n)}}}).catch(e=>{w={cause:e}}),!wr)return;const C=d.flatMap(e=>{const t=e.last;if(void 0===t||qn(t))return[];const r=t.extensions?.historyCursor;return[{summary:e,last:t,historyCursor:"string"==typeof r?r.trim():""}]}),b=(e,t)=>`${e}:${t}`,S=/* @__PURE__ */new Map,T=/* @__PURE__ */new Set;for(const{summary:e,last:t}of C){const r=Zo.getConversationMessage({conversationType:"channel",conversationId:e.channelId},t.id);if(void 0===r||!qn(r))continue;const o=b(e.channelId,t.id);S.set(o,r),T.add(o)}for(const e of y)qn(e)&&S.set(b(e.conversationId,e.id),e);const E=C.filter(({summary:e,last:t,historyCursor:r})=>!(""===r||c.has(e.channelId)||o(e.channelState)||S.has(b(t.conversationId,t.id))||$n.has(b(t.conversationId,t.id)))),M=C.filter(({summary:e,last:t})=>!c.has(e.channelId)&&!o(e.channelState)&&!T.has(b(t.conversationId,t.id))&&S.has(b(t.conversationId,t.id))).length;Ir.record("debug","sdk","sync","channel-session-last-recovery-plan",()=>({operationId:e,data:{unusableLastCount:C.length,decryptFailedLastCount:C.filter(({last:e})=>!0===e.encryption.decryptFailed).length,unknownContentLastCount:C.filter(({last:e})=>"unknown"===e.contentType&&!0!==e.encryption.decryptFailed).length,localRecoveredCount:T.size,offlineRecoveredCount:M,contextRecoveryCount:E.length,staleReadSkippedCount:C.filter(e=>c.has(e.summary.channelId)).length,historyBlockedSkippedCount:C.filter(e=>o(e.summary.channelState)).length,missingHistoryCursorCount:C.filter(e=>""===e.historyCursor).length}}));const R=async({summary:r,last:n,historyCursor:s})=>{try{if(await Io.waitForBackground(wo.signal),!u(r.channelId))return;const{message:a}=await ra.loadMessageContext(r.channelId,s,t.userId,wo.signal),i=Zo.getConversationContext({conversationType:"channel",conversationId:r.channelId});if(!wr||"channel"!==i?.type||void 0!==i.channelState&&o(i.channelState))return;if("channel"!==a.conversationType||a.conversationId!==r.channelId||a.id!==n.id)throw new Error(`CHANNEL sessions.last 精确恢复结果不匹配(channelId=${r.channelId}, messageId=${n.id})`);if(!qn(a)){if("unknown"===a.contentType&&!0!==a.encryption.decryptFailed)return $n.add(b(a.conversationId,a.id)),void Ir.record("info","sdk","sync","channel-session-last-unknown-confirmed",()=>({operationId:e,conversation:{conversationType:"channel",conversationId:r.channelId},data:{messageId:n.id,reason:a.body.unknown?.reason}}));throw new Error(`CHANNEL sessions.last 精确恢复未取得可用正文(channelId=${r.channelId}, messageId=${n.id})`)}return a}catch(t){return void Ir.record("warn","sdk","sync","channel-session-last-recovery-failed",()=>({operationId:e,conversation:{conversationType:"channel",conversationId:r.channelId},error:{message:"CHANNEL sessions.last 精确恢复失败",data:t},data:{messageId:n.id}}))}},k=[];for(const e of E){if(!wr)break;k.push(await R(e))}for(const e of k)void 0!==e&&S.set(b(e.conversationId,e.id),e);const x=k.filter(e=>{if(void 0===e)return!1;const t=Zo.getConversationMessage({conversationType:"channel",conversationId:e.conversationId},e.id);return void 0===t||!qn(t)});if(m(x),void 0!==w)throw w.cause;Ir.record("info","sdk","sync","channel-sync-complete",()=>({operationId:e,data:{profileCount:r.length,terminalProfileCount:r.filter(e=>Xr(e.channelState)).length,sessionCount:i.length,acceptedSessionCount:d.length,sessionLastCount:d.filter(e=>void 0!==e.last).length,recoveredSessionLastCount:C.filter(({last:e})=>S.has(b(e.conversationId,e.id))).length,offlineMessageCount:y.length}}))}(e)}catch(t){throw Ir.record("error","sdk","sync","channel-sync-failed",()=>({operationId:e,error:{message:"CHANNEL 同步失败",data:t}})),t}}let Ma=null,Ra=!1;const ka=Lt({commitBatch:async function(e,t=[]){if(!wr)throw new Error("离线消息提交已取消");await Zo.commitReceivedMessages(e,"offline",void 0,{events:t??[],apply:e=>Rs.ingest(e,"offline")});const r=e.flatMap(e=>{const t=kr.get(Or({conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id}));return void 0===t?[]:[t]});if(await Promise.all(r),!wr)throw new Error("离线消息提交已取消")},pullers:[Sa("chat",St),Sa("owner_chat",Tt),{endpoint:"group",pullBatch:async({deliveredMsgInfos:e,limit:t})=>{const r=hr,o=Ca("background"),n=Ia("group");try{o.assertCurrent?.();const s=await fr.getLoginContext();if(null===s)throw new Error("sync(group): 无登录上下文(authProvider.getLoginContext 返回 null)");if(o.assertCurrent?.(),""!==r&&s.userId!==r)throw new DOMException("GROUP 离线同步的登录账号已改变","AbortError");const a=[],i=[],c=await _t({http:Tr,userId:s.userId,clientType:gr,decryptDeps:{...Un("offline"),onDecryptRecovery:e=>i.push(e)},asyncDecrypt:o,prepareKeys:Fn,deliveredMsgInfos:e,...void 0===t?{}:{limit:t},onReaction:e=>a.push(e)});return o.assertCurrent?.(),{...c,reactions:a,commit:async()=>{try{await ba(n.messages(c.messages),a,i.filter(n.acceptsRecovery),()=>o.assertCurrent?.(),o.publish)}finally{n.stop()}}}}catch(e){throw n.stop(),e}}}],domainState:Zo,emitter:mr,logger:Wr,yieldToEventLoop:Kt});const xa=H({domainState:Zo,storage:Rr,getSelfId:()=>hr,assertCurrent:()=>{if(!wr||wo.signal.aborted)throw new DOMException("客服历史恢复所属账号已失效","AbortError")},hasPendingSend:e=>la.getPendingOutbox().some(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId),fetch:async e=>{const t=hr,r=()=>{if(!wr||wo.signal.aborted||hr!==t)throw new DOMException("客服历史查询所属账号已失效","AbortError")},o=await ha(t);r();const n=await xt({http:Tr,userId:t,clientType:gr,messageIds:e,decryptDeps:o,asyncDecrypt:wa("background",r)});if(r(),200!==n.code)throw new Error(`客服历史原文查询失败:${n.code}`);return n.messages}});async function Da(){if(void 0!==no&&(!no.owned||yo))throw new Error("当前页面未持有 IM 连接,不能同步消息");const e=To.begin(),t=Eo.begin(),r=async function(){const e=hr,t=Ca("background"),r=Ia("group");try{t.assertCurrent?.();const o=await fr.getLoginContext();if(null===o)return;if(t.assertCurrent?.(),""!==e&&o.userId!==e)throw new DOMException("GROUP 会话同步的登录账号已改变","AbortError");const n=[],s=[],a=await jt({http:Tr,userId:o.userId,clientType:gr,decryptDeps:{...Un("offline"),onDecryptRecovery:e=>s.push(e)},asyncDecrypt:t,prepareKeys:Fn,onReaction:e=>n.push(e)});t.assertCurrent?.();for(const e of a.unreads)t.assertCurrent?.(),Zo.applyServerUnread({conversationType:"group",conversationId:e.groupId},e.unreadCount),_n(e.groupId);await ba(r.messages(a.messages),n,s.filter(r.acceptsRecovery),()=>t.assertCurrent?.(),t.publish),t.assertCurrent?.(),await Ta(a.unreads.map(e=>({conversationType:"group",conversationId:e.groupId}))),Nt(a)}finally{r.stop()}}().catch(e=>{throw mr.emit({type:"error",error:{scope:"sync",message:"群会话摘要同步失败",cause:e}}),e}),o=(null!==Ma?(Ra=!0,Ma):(Ma=(async()=>{let e;do{Ra=!1,e=void 0;try{await Ea()}catch(t){e=t}}while(Ra);if(void 0!==e)throw e})().finally(()=>{Ma=null}),Ma)).catch(e=>{throw mr.emit({type:"error",error:{scope:"sync",message:"CHANNEL 会话与离线消息同步失败",cause:e}}),e});bo+=1;try{const e=xa.run().catch(e=>{throw mr.emit({type:"error",error:{scope:"sync",message:"旧客服消息恢复失败,已保留未恢复的本机记录,可刷新重试",cause:e}}),e}),t=(await Promise.allSettled([ka.sync({rejectOnFailure:!0}),r,o,e])).find(e=>"rejected"===e.status);if("rejected"===t?.status)throw t.reason}finally{t(),e(),bo-=1,So="authenticated"===la.state,po?.notifySchedulingChanged()}}async function Pa(){if("ready"===Zr)return;Zr="preparing";const e=await fr.getLoginContext();if(wr){if(null!==e){if(await async function(e){if(void 0!==no&&wr){if(!yo){so??(so=no.start(vr.forAccount(e).name("ephemeral","connection",`client-${gr}`)));const t=await so;if(!wr)return;if(wr&&!yo&&t&&no.owned)return void la.setConnectionAllowed(!0)}if(la.setConnectionAllowed(!1),await la.connect(),void 0!==ao)throw Object.assign(new Error("Browser IM coordination is unavailable"),{code:"IM_CONNECTION_OWNERSHIP_UNAVAILABLE",cause:ao});throw Object.assign(new Error("Chat is active in another page; reload this page to continue here"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"})}}(e.userId),!wr)return;hr=e.userId;try{await(Cr?.prepare(e.userId))}catch{mr.emit({type:"error",error:{scope:"storage",message:"上传恢复记录不可用,本次上传仅支持当前页面内恢复"}})}if(!wr)return;if(un.start(),void 0!==Tn&&Tn.getUserPrivateKey(e.userId,{priority:"foreground"}).catch(fn),void 0!==Rr)try{if(await Rr.open({namespace:e.userId}),Kr=!0,!wr)return;try{await Vr.hydrate()}catch(e){mr.emit({type:"error",error:{scope:"storage",message:"IM 设置初始化失败,已暂停发送 direct 已读回执",cause:e}})}if(!wr)return;if(await Zo.hydrate(()=>wr),!wr)return;for(const e of Zo.getSessions())""===e.title&&"supergroup"!==e.type&&Zo.refreshConversationProfile(e.id,e.type);if(await la.hydrateOutbox(()=>wr),!wr)return}catch(e){mr.emit({type:"error",error:{scope:"storage",message:"本地存储初始化失败",cause:e}})}if(!wr)return;if(void 0!==Mn)for(const e of Zo.getSessions())"group"===e.type&&_n(e.id)}wr&&(Zr="ready",""!==hr&&ya.start())}}function Aa(){if(yo)return Promise.reject(Object.assign(new Error("Chat is active in another page"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"}));if("ready"===Zr)return Promise.resolve();if(null!==fo)return fo;const e=Date.now();return Ir.record("info","sdk","session","prepare-start"),fo=Pa().then(()=>Ir.record("info","sdk","session","prepare-complete",()=>({durationMs:Date.now()-e}))).catch(t=>{throw Ir.record("error","sdk","session","prepare-failed",()=>({durationMs:Date.now()-e,error:{message:"IM prepare 失败",data:t}})),t}).finally(()=>{fo=null}),fo}function ja(e){Ir.record("info","sdk","connection","disconnect",()=>({data:{reason:e}})),mo=!1,vo+=1,Vs.stop(),la.disconnect(e),ga.stop()}function Oa(e,t={}){if(void 0!==io)return io;let r,o;return io=new Promise((e,t)=>{r=e,o=t}),async function(e,t){const r=Date.now();let o;Ir.record("info","sdk","session","teardown-start",()=>({data:{localData:e?.localData??"preserve",pendingMessages:e?.pendingMessages??"fail"}})),wr=!1,Ar.clear(),Nn(),wo.abort(),Io.dispose(),Eo.dispose(),To.dispose(),na.dispose(),t.notifyReplacement&&mr.emit({type:"session:replaced"});const n=ya.dispose(),s=po?.dispose();us(),pa(),ca.dispose(),da.dispose(),Vs.stop(),Bs.dispose(),Gs.dispose(),Rs.dispose(),ua.dispose(),va.dispose(),In.dispose(),cn.dispose(),an.dispose();const a=la.disposeMediaTasks({preserveRecovery:!0===t.preserveUploadRecovery});for(const e of oo)e.close();oo.clear(),Oo+=1,la.markOutboxForLogout(e?.pendingMessages??"fail"),ea.dispose(),ta.dispose(),ra.dispose(),Go.dispose(),Vo.dispose(),qo.dispose(),Br.dispose();const i=Vr.dispose();dn.dispose();const c=Zo.invalidateAndDrainDraftOperations();pn.dispose(),zs(),Qs(),Zs(),Ps(),Js.dispose(),sa.reset(),Rn?.clearAll(),Hn.clear(),Vn.clear(),$n.clear(),ja("im-logout"),(t.requireStorageClose||!0===no?.owned)&&await(fo?.catch(()=>{}));try{await a}catch{mr.emit({type:"error",error:{scope:"storage",message:"上传任务清理未完成,请检查本地数据与网络状态"}})}await n;try{await(Cr?.dispose(!0===t.preserveUploadRecovery))}catch(e){o=e,mr.emit({type:"error",error:{scope:"storage",message:"上传恢复记录清理失败,请清除此站点的本地数据"}})}await c,await i,await s,await Promise.allSettled([...Co]),await Zo.waitForChannelSyncPersistence(),await Promise.allSettled([...kr.values(),...Bn.values()]),await Promise.all([...jr.values()]),Zo.clearSession();const d="purge"===e?.localData?hr:"";let p,l=""===d?void 0:o,u=!0;if(void 0!==Rr)try{await Rr.close()}catch(e){u=!1,""!==d&&(l=e),!1!==t.reportStorageErrors&&mr.emit({type:"error",error:{scope:"storage",message:""===d?"关闭本地存储失败":"关闭本地存储失败,已跳过删除本账号本地库",cause:e}})}if(""!==d&&u)try{void 0!==Mr?await Mr.purgeCurrentAccount({namespaceFactory:vr,accountId:d}):await ae(d,{namespaceFactory:vr}),void 0===l&&(p=d)}catch(e){l=e,!1!==t.reportStorageErrors&&mr.emit({type:"error",error:{scope:"storage",message:"删除本账号本地库失败",cause:e}})}if(Zr="empty",Ir.record("info","sdk","session","teardown-complete",()=>({durationMs:Date.now()-r,data:{purgedAccountId:p,purgeFailed:void 0!==l}})),sn(),eo(),$s(),fa(),yo=!0,(t.requireStorageClose||void 0!==no)&&!u)throw new Error("Previous chat page could not close its account storage");return no?.stop(),{...void 0===p?{}:{purgedAccountId:p},...void 0===l?{}:{purgeError:l}}}(e,t).then(r,o),io}function _a(e){const t=e.conversationId,r=hr,n=Oo,s=_o(t);let a,i;return async({readCursor:c,cursor:d,signal:p,isCurrent:l})=>{const u=Io.enterForeground();try{const u=()=>{const a=Zo.getConversationContext(e);return wr&&hr===r&&l()&&n===Oo&&s===_o(t)&&"channel"===a?.type&&(void 0===a.channelState||!o(a.channelState))};if(Mt(p),!u())return;if(void 0!==d&&(a!==c||void 0===i))return;const m=await fr.getLoginContext();if(Mt(p),null===m||m.userId!==r||!u())return;const v=[],y=[],g=await Rt({http:Tr,userId:m.userId,clientType:gr,channelId:t,index:d??c,containAnchor:void 0===d,signal:p,decryptDeps:{...jn("history"),onDecryptRecovery:e=>y.push({...e,source:"history"})},prepareKey:e=>An([e],{recoverExistingMessages:!1,priority:"foreground",signal:p}),onContentDecodeError:Yr,onReaction:e=>v.push(e)});if(Mt(p),!u())return;if(void 0===d){const e=g.messages.find(e=>e.extensions?.historyCursor===c);if(void 0===e)return;a=c,i=e.sortKey}if(void 0===i)return;if(g.messages.length>0&&Zo.upsertMessages(g.messages,"offline",{backfillOnly:!0}),!u())return;for(const e of v){if(!u())return;is(e)}for(const e of y){if(!u())return;Lr(e)}if(!u())return;return{messages:g.messages.map(t=>{const r=Zo.getConversationMessage(e,t.id);if(void 0===r)throw new Error("首未读历史邻页在领域合并后缺少消息");return r}),readCursorSortKey:i,exhausted:!g.hasNewer,...void 0===g.nextCursor?{}:{nextCursor:g.nextCursor}}}finally{u()}}}async function Na(){const e=Ia("direct");try{const t=[],r=[],o=hr,n=wa("background");n.assertCurrent?.();const s=await fr.getLoginContext();if(null===s)throw new Error("pullOfflineChat: 无登录上下文(authProvider.getLoginContext 返回 null)");if(n.assertCurrent?.(),""!==o&&s.userId!==o)throw new DOMException("DIRECT 离线拉取的登录账号已改变","AbortError");const a={...await ha(s.userId),onDecryptRecovery:e=>t.push(e)},i=await Ct({http:Tr,userId:s.userId,clientType:gr,decryptDeps:a,asyncDecrypt:n,onReaction:e=>r.push(e)}),c=await bt({http:Tr,userId:s.userId,clientType:gr,decryptDeps:a,asyncDecrypt:wa("background",n.assertCurrent),onReaction:e=>r.push(e)});n.assertCurrent?.();const d=e.messages([...i,...c]);return await ba(d,r,t.filter(e.acceptsRecovery),()=>n.assertCurrent?.(),n.publish),d}finally{e.stop()}}Ro=async({conversation:e,newestLoaded:t,cursor:r,limit:n,signal:s})=>{Mt(s);const{conversationId:a}=e,i=Zo.getConversationContext(e);if(void 0===i)throw new Error(`加载更新消息失败:会话不存在(conversationId=${a})`);if("direct"===i.type||"robot"===i.type||"customerService"===i.type)return{messages:[],exhausted:!0};if("group"===i.type){if(void 0!==i.groupState&&"active"!==i.groupState)return{messages:[],exhausted:!0};const o={conversationType:"group",conversationId:a},c=hr,d=Ca(!0===po?.hasForeground(e)?"foreground":"background",s);d.assertCurrent?.(o);const p=Ia("group",o);try{const o=await fr.getLoginContext();if(null===o)return{messages:[],exhausted:!0};if(d.assertCurrent?.(),o.userId!==c)throw new DOMException("GROUP 历史请求的登录账号已改变","AbortError");const i=void 0===r?t?.serverTime??t?.createdAt:lr(r,a);if(void 0===i)throw new Error(`GROUP 向新分页缺少可信 baseTime(groupId=${a}, messageId=${t?.id??""})`);const l=[],u=[],m=await Ot({asyncDecrypt:d,signal:s,http:Tr,userId:o.userId,clientType:gr,groupId:a,baseTime:i,direct:2,limit:n,decryptDeps:{...Un("history"),onDecryptRecovery:e=>u.push(e)},prepareKeys:t=>Fn(t,{signal:s,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onReaction:e=>l.push(e)});d.assertCurrent?.();const v=p.messages(m.messages);for(const e of v)d.publish([e],()=>Zo.upsertMessages([e],"offline",{backfillOnly:!0}));for(const e of l)d.publish([],()=>is(e));for(const e of u)d.publish([],()=>{p.acceptsRecovery(e)&&Lr(e)});d.assertCurrent?.();return{messages:v,...q({conversationId:a,direction:"newer",baseTime:i,batchSize:m.batchSize,boundaryTime:m.newestEntryTime,limit:n})}}finally{p.stop()}}if("channel"===i.type){if(void 0!==i.channelState&&o(i.channelState))return{messages:[],exhausted:!0};const n=r??t?.extensions?.historyCursor;if("string"!=typeof n||""===n.trim())throw new Error(`CHANNEL 向新分页缺少可信 historyCursor(channelId=${a}, messageId=${t?.id??""})`);const c=Oo,d=_o(a),p=await fr.getLoginContext();if(null===p)return{messages:[],exhausted:!0};const l=void 0===r?(await ra.loadMessageContext(a,n,p.userId,s)).context:await ra.loadNewerPage(a,n,p.userId,s);Mt(s);const u=Zo.getConversationContext(e);return!wr||c!==Oo||d!==_o(a)||"channel"!==u?.type||void 0!==u.channelState&&o(u.channelState)?{messages:[],exhausted:!0}:(l.messages.length>0&&Zo.upsertMessages(l.messages,"offline",{backfillOnly:!0}),{messages:l.messages,exhausted:!l.hasNewer,...l.hasNewer&&void 0!==l.nextCursor?{nextCursor:l.nextCursor}:{}})}throw new Error(`向新分页未实现:${i.type}`)};function La(e){const t=_({...e,operation:"openConversation"});return Object.assign(new Error(t.code),t,{name:"ImConversationOpenError"})}function Ka(e){if(!wr)throw La({code:"IM_SDK_CONVERSATION_RUNTIME_RELEASED",category:"state",retryable:!1,conversation:e})}function Fa(e,t){return{id:e.conversationId,type:e.conversationType,title:t.title.trim()||e.conversationId,...void 0===t.avatar?{}:{avatar:t.avatar},lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:t.muted??!1,...void 0===t.groupState?{}:{groupState:t.groupState},...void 0===t.channelState?{}:{channelState:t.channelState},...void 0===t.channelPermissions?{}:{channelPermissions:t.channelPermissions},...void 0===t.channelAccessSnapshot?{}:{channelAccessSnapshot:t.channelAccessSnapshot},...void 0===t.sendDisabledReason?{}:{sendDisabledReason:t.sendDisabledReason}}}const Ua={...a({...void 0===Sr?{}:{coreClient:Sr},authProvider:fr,http:Tr,resolveInput:ln,domainState:Zo,operations:{list:function(){return Zo.getConversationList()},pullOffline:Na,sync:async function(){await Da()},prefetchRecent:(e,t)=>po.prefetchRecent(e,t)},beforeDeleteConversation:Lo,terminateConversationSending:(e,t)=>la.terminateConversationSending(e,t),resetConversationBackground:e=>Br.api.resetBackground(e),reportStorageError:(e,t)=>mr.emit({type:"error",error:{scope:"storage",message:e,cause:t}}),markChannelRead:(e,t)=>la.markRead(e,t,"channel"),settleConversationRead:async e=>{const t=await Ga(e,{initialPosition:"latest"},"read");try{await t.markConversationRead()}finally{t.close()}}}),...Br.api,ensureOpenableConversation:async function(e){const t=function(e){const t=e?.conversationType,r=e?.conversationId;if("supergroup"===t)throw La({code:"IM_SDK_SUPERGROUP_UNSUPPORTED",category:"unsupported",retryable:!1,conversation:e});if("direct"!==t&&"group"!==t&&"channel"!==t&&"robot"!==t&&"customerService"!==t||"string"!=typeof r||""===r.trim())throw La({code:"IM_SDK_CONVERSATION_INVALID",category:"validation",retryable:!1,...void 0===e?{}:{conversation:e}});return Object.freeze({conversationType:t,conversationId:r.trim()})}(e);if(Ka(t),void 0!==Zo.getSession(t))return t;const r=To.begin();let o=!1;const n=mr.subscribe(e=>{"session:removed"===e.type&&e.conversation.conversationType===t.conversationType&&e.conversation.conversationId===t.conversationId&&(o=!0)}),s=()=>{if(Ka(t),o)throw La({code:"IM_SDK_CONVERSATION_OPEN_INVALIDATED",category:"state",retryable:!0,conversation:t})};try{if("direct"===t.conversationType){const e=Vo.peekItem("individual",t.conversationId);if(void 0!==e)return Zo.prepareConversation(Fa(t,{title:e.displayName||e.cardDisplayName,...void 0===e.avatarUrl?{}:{avatar:e.avatarUrl}})),t;const r=await an.getRelationship(t.conversationId);if(s(),"friend"!==r)throw La({code:"IM_SDK_DIRECT_CONTACT_REQUIRED",category:"permission",retryable:!1,conversation:t,details:Object.freeze({relationship:r})});const o=await an.getProfile(t.conversationId);if(s(),null===o||o.id!==t.conversationId)throw La({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});return Zo.prepareConversation(Fa(t,{title:o.remark??o.nickname,...void 0===o.avatar?{}:{avatar:o.avatar},...void 0===o.muted?{}:{muted:o.muted}})),t}if("group"===t.conversationType){const e=Zo.isMembershipTerminated(t),r=Vo.peekItem("group",t.conversationId);if(void 0!==r&&!e)return Zo.prepareConversation(Fa(t,{title:r.displayName||r.cardDisplayName,...void 0===r.avatarUrl?{}:{avatar:r.avatarUrl},groupState:"active"})),t;if(void 0===Ko)throw La({code:"IM_SDK_CONVERSATION_PROFILE_UNAVAILABLE",category:"contract",retryable:!1,conversation:t});const o=await Ko.getGroupProfile(t.conversationId,e?{forceRefresh:!0}:void 0);if(s(),null===o||o.id!==t.conversationId)throw La({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});if(!1===o.isInGroup||e&&!0!==o.isInGroup||void 0!==o.status&&2!==o.status)throw La({code:"IM_SDK_GROUP_CONVERSATION_UNAVAILABLE",category:"permission",retryable:!1,conversation:t,details:Object.freeze({...void 0===o.status?{}:{status:o.status},...void 0===o.isInGroup?{}:{isInGroup:o.isInGroup}})});return Zo.prepareConversation(Fa(t,{title:o.name,...void 0===o.avatar?{}:{avatar:o.avatar},...void 0===o.muted?{}:{muted:o.muted},groupState:"active"}),{membershipConfirmed:e}),e&&(s(),Es({conversationType:"group",conversationId:t.conversationId})),t}if("customerService"===t.conversationType){if("__customer_service__"!==t.conversationId||void 0===Zo.getConversationContext(t))throw new Error("客服会话只能由已接收消息创建");return t}if("robot"===t.conversationType){const e=qo.peek(t.conversationId);return Zo.prepareConversation(Fa(t,{title:e?.displayName??t.conversationId,...void 0===e?.avatarUrl?{}:{avatar:e.avatarUrl}})),t}if(void 0===Fo)throw La({code:"IM_SDK_CONVERSATION_PROFILE_UNAVAILABLE",category:"contract",retryable:!1,conversation:t});const e=Zo.isMembershipTerminated(t),r=await Fo.getProfile(t.conversationId,e?{forceRefresh:!0}:void 0);if(s(),null===r||r.id!==t.conversationId)throw La({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});const o="active"===r.channelState||"muted"===r.channelState,n="muted"===r.channelState&&!0===r.accessSnapshot?.allMembersMuted&&"owner"!==r.role&&"admin"!==r.role;if(!o||n)throw La({code:"IM_SDK_CHANNEL_CONVERSATION_UNAVAILABLE",category:"permission",retryable:!1,conversation:t,details:Object.freeze({channelState:r.channelState,role:r.role,hiddenByAllMemberMute:n})});return Zo.prepareConversation(Fa(t,{title:r.name,...void 0===r.avatar?{}:{avatar:r.avatar},...void 0===r.muted?{}:{muted:r.muted},channelState:r.channelState,channelPermissions:r.permissions,...void 0===r.accessSnapshot?{}:{channelAccessSnapshot:r.accessSnapshot},...r.permissions.sendMessages?{}:{sendDisabledReason:`channel_${r.channelState}`}}),{membershipConfirmed:e}),e&&(s(),Es({conversationType:"channel",conversationId:t.conversationId})),t}catch(e){if(function(e){return e instanceof Error&&"ImConversationOpenError"===e.name&&"string"==typeof e.code}(e))throw e;const r=function(e){if("object"==typeof e&&null!==e&&"string"==typeof e.code&&"string"==typeof e.category&&"boolean"==typeof e.retryable){const t=e;return{code:t.code,category:t.category,retryable:t.retryable}}return e instanceof de?{code:"IM_SDK_CONVERSATION_PROFILE_READ_FAILED",category:"network",retryable:!0}:e instanceof pe||e instanceof Error&&"DirectoryMappingError"===e.name?{code:"IM_SDK_CONVERSATION_PROFILE_INVALID",category:"contract",retryable:!1}:{code:"IM_SDK_CONVERSATION_OPEN_PREREQUISITE_FAILED",category:"state",retryable:!1}}(e);throw La({...r,conversation:t,cause:e})}finally{n(),r()}},getContext:e=>Zo.getConversationContext(e)};function Ba(e,t,r=!0){if(!wr)throw e.close(),new Error("IM SDK 账号运行时已释放,不能打开会话");return t?.aborted&&(e.close(),Mt(t)),function(e,t=!0){const r=new AbortController,o={...e,resumeMedia(){t&&wr&&!r.signal.aborted&&"authenticated"===la.state&&"robot"!==e.ref.conversationType&&la.resumePausedMediaUploads(e.ref,r.signal).catch(()=>{wr&&!r.signal.aborted&&mr.emit({type:"error",error:{scope:"unknown",message:"当前会话上传恢复失败,请重新选择文件"}})})},close(){r.abort(),e.close(),oo.delete(o)}};return b(o,e),oo.add(o),t&&o.resumeMedia(),o}(e,r)}async function Ga(e,t={},r){if(!wr)throw new Error("IM SDK 账号运行时已释放,不能打开会话");const o=po?.enterForeground(e),n=Io.enterForeground(),s=To.begin();try{const o={beginReceiving:To.begin,domainState:Zo,invalidateHistory:Lo,emitter:mr,drafts:dn.api,sendText:ma.operations.sendText,sendContact:ma.operations.sendContact,sendImage:ma.operations.sendImage,sendVideo:ma.operations.sendVideo,sendVoice:ma.operations.sendVoice,sendFile:ma.operations.sendFile,sendGif:ma.operations.sendGif,sendMediaAlbum:ma.operations.sendMediaAlbum,sendExpression:ma.operations.sendExpression,sendGame:ma.operations.sendGame,sendMiniProgram:ma.operations.sendMiniProgram,sendTransfer:ma.operations.sendTransfer,sendGift:ma.operations.sendGift,sendLiveRoom:ma.operations.sendLiveRoom,replaceVideo:ma.operations.replaceInterruptedVideo,replaceFile:ma.operations.replaceInterruptedFile,forwardMessages:ma.operations.forwardMessages,recallMessage:ma.operations.recallMessage,editMessage:ma.operations.editMessage,setReaction:({conversation:e,parentMessageId:t,emoji:r,action:o})=>{if("robot"===e.conversationType||"customerService"===e.conversationType)return Promise.resolve({ok:!1,reason:"restricted"});const n={conversationType:e.conversationType,conversationId:e.conversationId};return"toggle"===o?Rs.toggle({conversation:n,parentMessageId:t,emoji:r}):Rs.set({conversation:n,parentMessageId:t,emoji:r,action:"add"===o?0:1})},markRead:ma.operations.markRead,markConversationRead:ma.operations.markConversationRead,markVisibleMessages:ma.operations.markVisibleMessages,markDirectMediaConsumed:ma.operations.markDirectMediaConsumed,prepareMediaPreview:Cn,getSelfId:()=>hr,isOutboxOwned:e=>la.getPendingOutbox().some(t=>t.id===e),hasOutboxForConversation:e=>la.getPendingOutbox().some(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId)};switch(e.conversationType){case"direct":{const n={conversationType:"direct",conversationId:e.conversationId},s=await C(n,{...o,getRelationship:an.getRelationship,shouldCheckRelationship:()=>"authenticated"===la.state,appendContactRequiredTextFailure:e=>Zo.appendDirectContactRequiredTextFailure({conversationId:e.conversationId,senderId:hr,text:e.text,...void 0===e.refMessageId?{}:{refMessageId:e.refMessageId}}),setMuted:(e,t)=>Ua.setMuted(e,t),fetchMessagesByIdBatch:e=>(async(e,t)=>{const r=Ia("direct",e,t);try{const o=hr,n=Ao(e),s=()=>{if(!wr||hr!==o||n!==Ao(e))throw new DOMException("DIRECT 消息查询所属账号或历史已失效","AbortError")};s();const{userId:a}=await ys();if(s(),a!==o)throw new DOMException("DIRECT 消息查询的登录账号已改变","AbortError");const i=await ha(a,{priority:"foreground"});s();const c=[],d=[],p=await N(t,async t=>{s();const r=await xt({http:Tr,userId:a,clientType:gr,messageIds:t,asyncDecrypt:wa("foreground",s),decryptDeps:{...i,onDecryptRecovery:e=>d.push(e)},onPlaintextFallback:t=>Ir.record("warn","sdk","crypto","direct-quoted-plaintext-fallback",()=>({conversation:e,data:{...t,endpoint:"/offline/v1/chat/msg/by_id",wireEncrypt:1,reason:"mislabeled-plaintext"}})),onReaction:e=>c.push(e)});if(s(),200!==r.code)throw Object.assign(new Error("DIRECT 按 ID 查询业务失败"),{code:r.code});return r});s();const l=r.messages(p.messages).filter(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId);for(const e of l)s(),vs([e]),s();for(const t of c)s(),t.conversation.conversationType===e.conversationType&&t.conversation.conversationId===e.conversationId&&is(t),s();for(const t of d)s(),r.acceptsRecovery(t)&&t.conversation.conversationType===e.conversationType&&t.conversation.conversationId===e.conversationId&&Lr(t),s();const u=l.map(t=>{const r=Zo.getConversationMessage(e,t.id);if(void 0===r)throw new Error("DIRECT 按 ID 查询在领域合并后缺少消息");return r}),m=new Set(u.map(e=>e.id)),v=new Set(p.missingMessageIds);for(const e of p.messages)m.has(e.id)||v.add(e.id);return{messages:u,missingMessageIds:[...v]}}finally{r.stop()}})(n,e)},t),a=Ba(s,t.signal,"read"!==r);return as(n),a}case"group":{const n={conversationType:"group",conversationId:e.conversationId},s=Ba(await w(n,{...o,getSendPermissionError:e=>{const t=Zo.getConversationContext(n),r="group"===t?.type?t.groupState:"unknown";if(void 0!==r&&"active"!==r)return _({code:"IM_SDK_GROUP_SEND_FORBIDDEN",category:"permission",operation:e,retryable:!1,conversation:n,details:Object.freeze({groupState:r})})},setMuted:(e,t)=>Ua.setMuted(e,t),fetchMessagesByIdBatch:e=>gs(n.conversationId,e)},t),t.signal,"read"!==r);return as(n),s}case"channel":{const n={conversationType:"channel",conversationId:e.conversationId},s=Ba(await I(n,{...o,loadEntryUnreadPage:_a(n),getSelfId:()=>hr,deleteMessageForEveryone:la.deleteChannelMessageForEveryone,reconcilePage:oa.reconcilePage,getSendPermissionError:e=>{const t=Zo.getConversationContext(n),r="channel"===t?.type&&void 0!==t.channelState?t.channelState:"unknown_restricted",o=dt({channelState:r,nowMs:Date.now(),..."channel"!==t?.type||void 0===t.channelAccessSnapshot?{}:{snapshot:t.channelAccessSnapshot},..."channel"!==t?.type||void 0===t.channelPermissions?{}:{permissions:t.channelPermissions}});if("active"!==o.channelState||!o.permissions.sendMessages)return _({code:"IM_SDK_CHANNEL_SEND_FORBIDDEN",category:"permission",operation:e,retryable:!1,conversation:n,details:Object.freeze({channelState:o.channelState,...void 0===o.muteReason?{}:{muteReason:o.muteReason}})})},setMuted:(e,t)=>Ua.setMuted(e,t),fetchMessagesByIdBatch:e=>fs(n.conversationId,e)},t),t.signal,"read"!==r);return as(n),s}case"customerService":{const n={conversationType:"customerService",conversationId:e.conversationId};return Ba(await h(n,{...o,setMuted:async()=>{throw new Error("客服会话不支持免打扰设置")}},t),t.signal,"read"!==r)}case"robot":{const n={conversationType:"robot",conversationId:e.conversationId};return Ba(await f(n,{...o,setMuted:(e,t)=>Ua.setMuted(e,t)},t),t.signal,"read"!==r)}default:throw new Error(`openConversation:${e.conversationType} 产品 handler 未注册`)}}finally{s(),o?.(),n()}}return{advancedMessageDiagnostics:{sendDirectText:async e=>{await ma.operations.sendText({conversationId:e.peerId,conversationType:"direct",text:e.text,encrypted:e.encrypted})}},openConversation:Ga,localData:on,directory:Vo.search,customerService:tn,robots:qo.api,search:pn.api,applications:cn.api,expressions:zo.api,sessionFavorites:nn.api,outbox:ua.api,drafts:dn.api,connection:u({operations:{prepare:Aa,connect:function(e){if(yo)return Promise.reject(Object.assign(new Error("Chat is active in another page"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"}));if(!wr||yo)return Promise.reject(new Error("IM 连接已停止,请刷新页面后重试"));if(mo=!0,"authenticated"===la.state)return Promise.resolve();if(null!==ho)return ho;lo=e?.initialSync??"auto",uo=!1;const t=Date.now();Ir.record("info","sdk","connection","connect-start",()=>({data:{initialSync:lo}}));const r=vo;return ho=(async()=>{await Aa(),wr&&mo&&r===vo&&(ga.start(),await la.connect())})().then(()=>Ir.record("info","sdk","connection","connect-complete",()=>({durationMs:Date.now()-t}))).catch(e=>{throw Ir.record("error","sdk","connection","connect-failed",()=>({durationMs:Date.now()-t,error:{message:"IM connect 失败",data:e}})),e}).finally(()=>{ho=null}),ho},disconnect:ja,subscribe:function(e){return mr.subscribe(e)},getSnapshot:function(){return{connectionState:la.state,pendingOutbox:la.getPendingOutbox()}},getLifecycle:function(){return{sessionState:Zr,connectionState:la.state,...""!==hr?{userId:hr}:{},prepared:"ready"===Zr,connectionDesired:mo,authenticated:"authenticated"===la.state,receiving:To.receiving,syncing:Eo.receiving}}},getState:()=>la.state}),conversations:Ua,settings:Vr.api,push:ca.api,activity:da.api,contact:an,group:d({directory:Vo.groups,...void 0===Ko?{}:{profile:{getGroupProfile:async(e,t)=>{const r=Zo.beginConversationProfileRead({conversationType:"group",conversationId:e},t);try{const o=await Ko.getGroupProfile(e,t);return null!==o&&r({id:o.id,title:o.name,avatar:o.avatar}),o}finally{r.finish()}},...void 0===Ko.getGroupMemberNames?{}:{getGroupMemberNames:Ko.getGroupMemberNames.bind(Ko)},...void 0===Ko.listGroupMembers?{}:{listGroupMembers:Ko.listGroupMembers.bind(Ko)},...void 0===Ko.peekGroupMembers?{}:{peekGroupMembers:Ko.peekGroupMembers.bind(Ko)},...void 0===Ko.peekGroupProfile?{}:{peekGroupProfile:Ko.peekGroupProfile.bind(Ko)},...void 0===Ko.peekGroupMemberNames?{}:{peekGroupMemberNames:Ko.peekGroupMemberNames.bind(Ko)}}},...void 0===Sr?{}:{coreClient:Sr},...void 0===hn?{}:{avatarTransfer:hn},domainState:{...Ms,prepareConversation:e=>Zo.prepareConversation(e)},emitter:mr,pinned:ea.operations}),channel:t({directory:Vo.channels,...void 0===Fo?{}:{channelProfile:{listProfiles:Fo.listProfiles.bind(Fo),getProfile:async(e,t)=>{const r=Zo.beginConversationProfileRead({conversationType:"channel",conversationId:e},t);try{const o=await Fo.getProfile(e,t);return null!==o&&r({id:o.id,title:o.name,avatar:o.avatar}),o}finally{r.finish()}}}},...void 0===Uo?{}:{channelMembers:Uo},...void 0===Bo?{}:{channelMentionMembers:Bo},mentionCandidates:Go.api,applications:ra.applications,pinned:ta.operations,...void 0===Sr?{}:{coreClient:Sr},...void 0===hn?{}:{avatarTransfer:hn},crypto:yn,domainState:{prepareConversation:e=>Zo.prepareConversation(e),setChannelRestriction:Zo.setChannelRestriction,removeConversationForMembershipTermination:Ms.removeConversationForMembershipTermination,updateConversationProfile:Zo.updateConversationProfile,refreshConversationProfile:Zo.refreshConversationProfile},emitter:mr,...void 0===Rn?{}:{cacheCreatedSecretKey:(e,t)=>Rn.primeChannelKey(e,t)},getSelfUserId:async()=>""!==hr?hr:(await fr.getLoginContext())?.userId??""}),media:va.api,calls:v(Bs),groupCalls:P(Gs),teardown:Oa}}export{ur as createSessionRuntime};
|
|
1
|
+
import{createChannelPinnedRuntime as e,createChannelApi as t,createChannelLegacyMessageRepair as r,isChannelHistoryBlocked as o,createChannelOperationsRuntime as n}from"../domains/channel.js";import{createContactApi as s}from"../domains/contact.js";import{createConversationsApi as a,createConversationInputResolver as i}from"../domains/conversation.js";import{createGroupPinnedRuntime as c,createGroupApi as d}from"../domains/group.js";import{createMediaUploadComputation as p}from"../domains/media-byte-computation.js";import{createMessageOperationsRuntime as l}from"../domains/message.js";import{createConnectionApi as u}from"../domains/session.js";import{createApplicationsRuntime as m}from"../product/applications.js";import{createDirectCallsApi as v}from"../product/calls.js";import{createChannelMentionCandidatesRuntime as y}from"../product/channel-mention-candidates.js";import{createConversationBackgroundRuntime as g}from"../product/conversation-background.js";import{createRobotConversationHandle as h,createCustomerServiceConversationHandle as f,createChannelConversationHandle as I,createGroupConversationHandle as w,createDirectConversationHandle as C,linkConversationHandleDomainAccess as b}from"../product/conversation-handle.js";import{createCustomerServiceApi as S,createCustomerServiceError as T}from"../product/customer-service.js";import{createSdkDiagnosticWriter as E,toImDiagnosticMessage as R}from"../product/diagnostics.js";import{createDirectoryRuntime as M}from"../product/directory.js";import{createDraftsRuntime as k}from"../product/draft.js";import{isImReactionEmojiToken as D}from"../product/emoji-catalog.js";import{createExpressionsRuntime as x}from"../product/expressions.js";import{createGroupCallsApi as P}from"../product/group-calls.js";import{createLocalDataRuntime as A}from"../product/local-data.js";import{createDefaultMediaAssetCacheStrategyRegistry as j,createMediaTasksRuntime as O}from"../product/media.js";import{createImSdkError as _}from"../product/message.js";import{fetchMessagesByIdWithCaseVariants as N}from"../product/messages-by-id.js";import{createOutboxRuntime as L}from"../product/outbox.js";import{createRobotDirectoryRuntime as K}from"../product/robots.js";import{createSearchRuntime as F}from"../product/search.js";import{createSessionFavoritesRuntime as U}from"../product/session-favorites.js";import{createImSettingsRuntime as B}from"../product/settings.js";import{createChannelReadSummaryRefresh as G}from"./channel-read-summary-refresh.js";import{createCustomerServiceLegacyRecovery as H}from"./customer-service-legacy-recovery.js";import{recordDecryptFailedDiagnostic as V}from"./decrypt-diagnostics.js";import{createForegroundWorkCoordinator as $}from"./foreground-work-coordinator.js";import{resolveGroupHistoryPageBoundary as q}from"./group-history-page-boundary.js";import{createKeyPrefetchQueue as W}from"./key-prefetch.js";import{createLocalMediaPreviewPreparation as z}from"./local-media-preview.js";import{createMediaCacheMaintenance as J}from"./media-cache-maintenance.js";import{createAccountMediaUploadRecovery as Q,createMediaOnlineWaiter as Y}from"./media-upload-recovery.js";import{inspectProtobufWireShape as X}from"./protobuf-wire-shape.js";import{createReceivingActivity as Z}from"./receiving-activity.js";import{createRecentHistoryFetcher as ee}from"./recent-history-fetcher.js";import{createRecentHistoryPrefetch as te}from"./recent-history-prefetch.js";import{createSessionHttpClients as re}from"./session-http-clients.js";import{createSignalOfflinePoller as oe}from"./signal-offline-poller.js";import{createWsTransport as ne}from"../../../im-browser/src/transport/ws-transport.js";import{createIndexedDbStorageAdapter as se,deleteIndexedDbNamespace as ae}from"../../../im-browser/src/storage/indexed-db-storage-adapter.js";import{createProfileHttpAdapter as ie}from"../../../im-browser/src/http/profile-http-adapter.js";import{createChannelHttpAdapter as ce,ChannelHttpError as de,ChannelProfileMappingError as pe}from"../../../im-browser/src/http/channel-http-adapter.js";import{createChannelMemberHttpAdapter as le}from"../../../im-browser/src/http/channel-member-http-adapter.js";import{createChannelMentionMemberHttpAdapter as ue}from"../../../im-browser/src/http/channel-mention-member-http-adapter.js";import{createDirectoryHttpAdapter as me}from"../../../im-browser/src/http/directory-http-adapter.js";import{createExpressionHttpAdapter as ve}from"../../../im-browser/src/http/expression-http-adapter.js";import{createSessionFavoriteHttpAdapter as ye}from"../../../im-browser/src/http/session-favorite-http-adapter.js";import{createChannelJoinApplicationHttpAdapter as ge}from"../../../im-browser/src/http/channel-join-application-http-adapter.js";import{createContactApplicationHttpAdapter as he,createGroupApplicationHttpAdapter as fe}from"../../../im-browser/src/http/application-http-adapters.js";import{createDomainState as Ie}from"../../../im-core/src/state/domain-state.js";import{encodeConversationKey as we}from"../../../im-core/src/conversation-identity.js";import{createNetworkMonitor as Ce}from"../../../im-browser/src/network/network-monitor.js";import{createCryptoTaskExecutor as be}from"../../../im-browser/src/crypto/crypto-task-executor.js";import{createMediaTransferAdapter as Se}from"../../../im-browser/src/media/media-transfer-adapter.js";import{createMediaPreviewPreparationExecutor as Te}from"../../../im-browser/src/media/media-preview-preparation-executor.js";import{createChannelKeyService as Ee}from"../../../im-browser/src/crypto/channel-key-service.js";import{createSendStrategyRegistry as Re}from"../../../im-core/src/message-flow/send/send-strategy-registry.js";import{createDirectSendStrategy as Me}from"../../../im-core/src/message-flow/send/direct-send-strategy.js";import{createGroupSendStrategy as ke}from"../../../im-core/src/message-flow/send/group-send-strategy.js";import{createChannelSendStrategy as De}from"../../../im-core/src/message-flow/send/channel-send-strategy.js";import{createRobotSendStrategy as xe}from"../../../im-core/src/message-flow/send/robot-send-strategy.js";import{createRecallStrategyRegistry as Pe,createDirectRecallStrategy as Ae,createGroupRecallStrategy as je,createChannelRecallStrategy as Oe}from"../../../im-core/src/message-flow/recall/recall-strategy.js";import{createEditStrategyRegistry as _e,createDirectEditStrategy as Ne,createGroupEditStrategy as Le,createChannelEditStrategy as Ke}from"../../../im-core/src/message-flow/edit/edit-strategy.js";import{createReactionReceiveHandlers as Fe}from"../../../im-core/src/message-flow/reaction/reaction-receive-handlers.js";import{createGroupReceiveHandlers as Ue}from"../../../im-core/src/message-flow/receive/group-receive-handlers.js";import{createChannelReceiveHandlers as Be}from"../../../im-core/src/message-flow/receive/channel-receive-handlers.js";import{createRobotReceiveHandlers as Ge}from"../../../im-core/src/message-flow/receive/robot-receive-handlers.js";import{createChannelNotifyReceiveHandlers as He}from"../../../im-core/src/message-flow/receive/channel-notify-receive-handlers.js";import{createChannelApplicationReceiveHandlers as Ve}from"../../../im-core/src/message-flow/receive/channel-application-receive-handlers.js";import{createSessionFavoriteReceiveHandlers as $e}from"../../../im-core/src/message-flow/receive/session-favorite-receive-handlers.js";import{createFriendActionReceiveHandlers as qe}from"../../../im-core/src/message-flow/receive/friend-action-receive-handlers.js";import{createWalletNotifyReceiveHandlers as We}from"../../../im-core/src/message-flow/receive/wallet-notify-receive-handlers.js";import{createContactApplicationReceiveHandlers as ze}from"../../../im-core/src/message-flow/receive/contact-application-receive-handlers.js";import{createContactApplicationAnswerReceiveHandlers as Je}from"../../../im-core/src/message-flow/receive/contact-application-answer-receive-handlers.js";import{createDirectCallManager as Qe}from"../../../im-core/src/message-flow/call/direct-call-manager.js";import{createGroupCallManager as Ye}from"../../../im-core/src/message-flow/call/group-call-manager.js";import{createGroupEventReceiveHandlers as Xe}from"../../../im-core/src/message-flow/receive/group-event-receive-handlers.js";import{createChannelReadReceiveHandlers as Ze}from"../../../im-core/src/message-flow/read/channel-read-receive-handlers.js";import{createReadStrategyRegistry as et}from"../../../im-core/src/message-flow/read/read-strategy.js";import{createPushRegistration as tt}from"../../../im-core/src/push/push-registration.js";import{createClientActivity as rt}from"../../../im-core/src/connection/client-activity.js";import{createImConnection as ot}from"../../../im-core/src/connection/connection-manager.js";import{createBrowserConnectionOwnership as nt}from"../../../im-browser/src/network/browser-connection-ownership.js";import{CmdId as st}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{createGroupRestrictionCoordinator as at}from"../../../im-core/src/state/group-restriction-coordinator.js";import{createChannelRestrictionCoordinator as it}from"../../../im-core/src/state/channel-restriction-coordinator.js";import{resolveMediaUploadPlan as ct}from"../../../im-browser/src/media/media-transfer-policy.js";import{resolveChannelAccess as dt}from"../../../im-core/src/state/channel-permissions.js";import{createGroupReadStrategy as pt}from"../../../im-core/src/message-flow/read/group-read-strategy.js";import{createRobotReadStrategy as lt}from"../../../im-core/src/message-flow/read/robot-read-strategy.js";import{createCustomerServiceReadStrategy as ut}from"../../../im-core/src/message-flow/read/customer-service-read-strategy.js";import{createMediaPreviewAdapter as mt}from"../../../im-browser/src/media/media-preview-adapter.js";import{isCryptoExecutionError as vt,CryptoExecutionError as yt}from"../../../im-core/src/ports/crypto-task-executor.js";import{createRsaTeaCryptoAdapter as gt}from"../../../im-browser/src/crypto/rsa-tea-crypto-adapter.js";import{createImDiagnosticLogger as ht}from"../../../im-core/src/diagnostics.js";import{createPeerPublicKeyService as ft}from"../../../im-browser/src/crypto/peer-public-key-service.js";import{getChannelSecretKey as It}from"../../../im-browser/src/http/requests/get-channel-secret-key.js";import{createEncryptKeyService as wt}from"../../../im-browser/src/crypto/encrypt-key-service.js";import{pullOfflineInboundChat as Ct,pullOfflineOwnerChat as bt,pullOfflineInboundChatBatch as St,pullOfflineOwnerChatBatch as Tt}from"../../../im-browser/src/http/requests/pull-offline-chat.js";import{createReactionManager as Et}from"../../../im-core/src/message-flow/reaction/reaction-manager.js";import{throwIfAborted as Rt}from"../../../im-core/src/abort.js";import{pullChannelMessageContext as Mt}from"../../../im-browser/src/http/requests/channel-message-context.js";import{pullGroupMessagesById as kt,pullDirectMessagesById as Dt,pullChannelMessagesById as xt}from"../../../im-browser/src/http/requests/pull-messages-by-id.js";import{createChannelReadStrategy as Pt}from"../../../im-core/src/message-flow/read/channel-read-strategy.js";import{createGroupKeyService as At}from"../../../im-browser/src/crypto/group-key-service.js";import{pullOfflineGroupSession as jt,pullGroupHistory as Ot,pullOfflineGroupBatch as _t}from"../../../im-browser/src/http/requests/pull-offline-group.js";import{compareBySortKey as Nt}from"../../../im-core/src/mapping/sort.js";import{assertOfflineChatBatchComplete as Lt}from"../../../im-core/src/mapping/offline-mapper.js";import{createSyncManager as Kt}from"../../../im-core/src/sync/sync-manager.js";import{isMessageRecoveryBodyEqual as Ft}from"../../../im-core/src/mapping/merge.js";import{yieldToBrowser as Ut}from"../../../im-browser/src/scheduling/yield-to-browser.js";import{resolveGroupRestriction as Bt}from"../../../im-core/src/mapping/group-notify-mapper.js";import{bContentCodec as Gt,bMessageCodec as Ht}from"../../../im-protocol/src/protobuf/registry.js";import{mapIncomingChannelNotify as Vt}from"../../../im-core/src/mapping/channel-notify-mapper.js";import{recoverDecryptedMessage as $t}from"../../../im-core/src/mapping/decrypt-recovery.js";import{pullChannelSessions as qt,pullChannelLatestPage as Wt,pullChannelOfflineMessages as zt,pullChannelHistory as Jt}from"../../../im-browser/src/http/requests/pull-offline-channel.js";import{parseChannelSyncCheckpoint as Qt,channelSyncCheckpointKey as Yt}from"../../../im-core/src/sync/channel-sync-checkpoint.js";import{requestRobotMenuReply as Xt}from"../../../im-browser/src/http/requests/robot-menu-reply.js";import{mapIncomingRobotFixedChat as Zt}from"../../../im-core/src/mapping/robot-message-mapper.js";import{getRobotChatMenus as er,confirmRobotChat as tr,getRobotProfile as rr}from"../../../im-browser/src/http/requests/robot-profile.js";import{unbindRobotFromConversation as or,bindRobotToConversation as nr}from"../../../im-browser/src/http/requests/bind-robot-conversation.js";import{searchRobots as sr}from"../../../im-browser/src/http/requests/search-robots.js";import{getCustomerServiceProfile as ar,downloadCustomerServiceFile as ir}from"../../../im-browser/src/http/requests/customer-service-profile.js";import{pullOfflineSignal as cr}from"../../../im-browser/src/http/requests/pull-offline-signal.js";import{updateChannelReadIndexes as dr}from"../../../im-browser/src/http/requests/channel-read-index.js";import{markGroupReadAll as pr}from"../../../im-browser/src/http/requests/mark-group-read-all.js";const lr=30;function ur(e,t){const r=Number(e);if(!Number.isSafeInteger(r)||r<0)throw new Error(`GROUP history cursor 非法(groupId=${t})`);return r}function mr(mr,vr,yr,gr=0){const hr=mr.clientType??2,fr={...mr.authProvider,getLoginContext:async()=>{const e=await mr.authProvider.getLoginContext();return null===e?null:{...e,clientType:hr}}};let Ir="";const wr=E(mr.debug,()=>({generation:gr,...""===Ir?{}:{accountId:Ir}}));let Cr=!0;const br=mr.uploadRecovery?.enabled?Q(yr):void 0,Sr=Y(!1!==globalThis.navigator?.onLine),{coreClient:Tr,http:Er}=re({coreClient:mr.coreClient,http:mr.http,authProvider:fr,endpointProvider:mr.endpointProvider,clientType:hr,isActive:()=>Cr,onRequestError:mr.onRequestError,onHandlerError:e=>wr.record("error","sdk","session","request-error-handler-failed",()=>({error:{message:"宿主请求错误处理器失败",data:e}}))}),Rr=mr.transport??ne(),Mr=mr.adapters?.storage,kr=void 0!==Mr?Mr.create({namespaceFactory:yr}):"undefined"==typeof indexedDB?void 0:se({namespaceFactory:yr,mediaAssetCache:{strategies:j()}}),Dr=/* @__PURE__ */new Map,xr=/* @__PURE__ */new Map,Pr=/* @__PURE__ */new Map,Ar=/* @__PURE__ */new Map,jr=/* @__PURE__ */new Map,Or=/* @__PURE__ */new Map,_r=e=>`${we(e.conversation)}\0${e.messageId}`;function Nr(e,t){const r=we(e),o=(Or.get(r)??Promise.resolve()).then(t),n=o.then(()=>{},()=>{});return Or.set(r,n),n.then(()=>{Or.get(r)===n&&Or.delete(r)}),o}function Lr(e,t){return Nr(e.conversation,async()=>{t()&&(await(kr?.deleteDecryptRecovery?.(e.conversation,e.messageId)),t()&&(jr.delete(_r(e)),Ar.delete(_r(e)),Dr.delete(_r(e))))})}const Kr=e=>{const t=kr?.saveDecryptRecovery;if(void 0===t)return;const r=_r(e),o=(Pr.get(r)??0)+1;Pr.set(r,o),jr.delete(r),Ar.set(r,e);const n=we(e.conversation),s=xr.get(n)??0,a=()=>Cr&&s===(xr.get(n)??0)&&o===Pr.get(r),i=Nr(e.conversation,async()=>{a()&&await t(e)});Dr.set(r,i),i.then(()=>{if(Dr.get(r)===i&&Dr.delete(r),a())return ns(e)}).catch(t=>vr.emit({type:"error",error:{scope:"storage",message:`保存解密恢复记录失败(conversationType=${e.conversation.conversationType}, messageId=${e.messageId})`,cause:t}}))};let Fr=!1;const Ur="object"==typeof(Br=kr)&&null!==Br&&"get"in Br&&"function"==typeof Br.get&&"put"in Br&&"function"==typeof Br.put&&"clear"in Br&&"function"==typeof Br.clear?kr:void 0;var Br;const Gr=g({...void 0===kr?{}:{storage:kr},...void 0===Tr?{}:{coreClient:Tr}});let Hr,Vr;const $r=B({...void 0===kr?{}:{storage:kr},conversationBackgrounds:Gr.api,onDirectReadReceiptDisabled:e=>Hr?.(e)});let qr=0;function Wr(e){return qr+=1,`channel-${e}-${gr}-${qr}`}const zr=ht(wr),Jr=(e,t,r=Ir)=>{const o=t.fromId===r?t.toId:t.fromId;V(wr,{conversation:{conversationType:"direct",conversationId:o},source:e,messageId:t.msgId,senderId:t.fromId,receiverId:t.toId,messageType:t.msgType,encrypt:t.encrypt,encryptVersion:t.encryptVersion,reason:t.reason,resolverSource:"direct-private-key",...void 0===t.cmdId?{}:{commandId:t.cmdId},...void 0===t.cause?{}:{cause:t.cause}})},Qr=(e,t)=>{V(wr,{conversation:{conversationType:"group",conversationId:t.groupId},source:e,messageId:t.msgId,senderId:t.fromId,messageType:t.msgType,encrypt:t.encrypt,encryptVersion:t.encryptVersion,reason:t.reason,resolverSource:"group-private-key",...void 0===t.cmdId?{}:{commandId:t.cmdId},...void 0===t.cause?{}:{cause:t.cause}})},Yr=(e,t)=>{V(wr,{conversation:{conversationType:"channel",conversationId:t.channelId},source:e,messageId:t.messageId,encrypt:t.encrypt,reason:t.reason,resolverSource:"channel-symmetric-key",endpoint:t.endpoint,surface:t.surface,decryptStage:t.decryptStage,keySource:t.keySource,keyByteLength:t.keyByteLength,payloadByteLength:t.payloadByteLength,...void 0===t.cipherDataByteLength?{}:{cipherDataByteLength:t.cipherDataByteLength},...void 0===t.decryptedByteLength?{}:{decryptedByteLength:t.decryptedByteLength},...void 0===t.forceRefreshAttempted?{}:{forceRefreshAttempted:t.forceRefreshAttempted},...void 0===t.clientTypeHeader?{}:{clientTypeHeader:t.clientTypeHeader},...void 0===t.clientTypeBody?{}:{clientTypeBody:t.clientTypeBody},...void 0===t.operationId?{}:{operationId:t.operationId},...void 0===t.cause?{}:{cause:t.cause}})},Xr=e=>{wr.record("warn","sdk","protocol","channel-content-decode",()=>({conversation:{conversationType:"channel",conversationId:e.channelId},...void 0===e.operationId?{}:{operationId:e.operationId},data:{messageId:e.messageId,encrypt:e.encrypt,contentLength:e.contentLength,...void 0===e.endpoint?{}:{endpoint:e.endpoint},...void 0===e.surface?{}:{surface:e.surface},...void 0===e.clientTypeHeader?{}:{clientTypeHeader:e.clientTypeHeader},...void 0===e.clientTypeBody?{}:{clientTypeBody:e.clientTypeBody}},error:{message:"CHANNEL 消息正文解码失败",data:e.cause}}))};function Zr(e){return"left"===e||"removed"===e||"dismissed"===e}wr.record("debug","sdk","session","runtime-created");let eo="empty";const to=vr.subscribe(e=>{if(Cr)if("connection:changed"!==e.type)if("message:received"!==e.type&&"message:updated"!==e.type)if("auth:invalid"!==e.type){if("error"===e.type){const t="storage"===e.error.scope?"storage":"crypto"===e.error.scope?"crypto":"session";wr.record("error","sdk",t,"runtime-error",()=>({error:{message:e.error.message,data:e.error.cause}}))}}else wr.record("warn","sdk","session","auth-invalid",()=>({data:e.issue}));else wr.record("trace","sdk","message",e.type,()=>({conversation:e.conversation,message:R(e.message),data:{source:e.source,channelLifecycleEffects:e.channelLifecycleEffects}}));else wr.record("info","sdk","connection","connection-state-changed",()=>({data:{state:e.state}}))});function ro(e){return e.cmdId===st.MES_CHAT_EDIT_MSG_C2C||e.cmdId===st.MES_GRPCHAT_EDIT_MSG_C2C||e.cmdId===st.MES_RADIO_EDIT_MSG_C2C}const oo=/* @__PURE__ */new Set;let no,so,ao,io,co,po,lo="auto",uo=!1,mo=!1,vo=0,yo=!1,go=()=>{},ho=null,fo=null;const Io=$(),wo=new AbortController,Co=/* @__PURE__ */new Set;let bo=0,So=!1;const To=Z(e=>vr.emit({type:"receiving:changed",receiving:e})),Eo=Z(e=>vr.emit({type:"syncing:changed",syncing:e}));let Ro,Mo,ko=!1;const Do=/* @__PURE__ */new Map,xo=/* @__PURE__ */new Map,Po=/* @__PURE__ */new Map,Ao=e=>Po.get(we(e))?.version??0;function jo(e,t){Po.set(we(e),{version:Ao(e)+1,...void 0===t?{}:{reason:t}})}let Oo=0;const _o=e=>Do.get(e)??0,No=e=>{Do.set(e,_o(e)+1)};function Lo(e,t){jo(e,t),po?.invalidate(e,{reason:t}),"channel"===e.conversationType&&No(e.conversationId),"group"===e.conversationType&&xo.set(e.conversationId,(xo.get(e.conversationId)??0)+1)}const Ko=mr.profile??(void 0===Tr?void 0:ie({client:Tr,clientType:hr,...void 0===kr?{}:{storage:kr}})),Fo=mr.channelProfile??(void 0===Tr?void 0:ce({client:Tr,clientType:hr,getUserId:async()=>{if(""!==Ir)return Ir;const e=await fr.getLoginContext();return e?.userId??""},...void 0===kr?{}:{storage:kr}})),Uo=mr.channelMembers??(void 0===Tr?void 0:le({client:Tr,clientType:hr,isActive:()=>Cr,...void 0===kr?{}:{storage:kr}})),Bo=mr.channelMentionMembers??(void 0===Tr?void 0:ue({client:Tr,clientType:hr})),Go=y({...void 0===Bo?{}:{provider:Bo},...void 0===kr?{}:{storage:kr}}),Ho=mr.directory??(void 0===Tr?void 0:me({client:Tr,clientType:hr,getUserId:async()=>""!==Ir?Ir:(await fr.getLoginContext())?.userId??""})),Vo=M({...void 0===Ho?{}:{provider:Ho}});let $o;const qo=K({onProfileUpdated:function(e){Zo.updateConversationProfile({conversationType:"robot",conversationId:e.id},{title:e.displayName,avatar:e.avatarUrl??""})},...void 0===Tr?{}:{search:e=>sr(Tr,{...e,...void 0===hr?{}:{clientType:hr}}),bind:e=>nr(Tr,{...e,...void 0===hr?{}:{clientType:hr}}),unbind:e=>or(Tr,{...e,...void 0===hr?{}:{clientType:hr}}),getProfile:e=>rr(Tr,{...e,...void 0===hr?{}:{clientType:hr}}),confirmChat:e=>tr(Tr,{robotId:e,...void 0===hr?{}:{clientType:hr}}),listChatMenus:e=>er(Tr,{robotId:e,...void 0===hr?{}:{clientType:hr}}),requestMenuReply:async e=>{const t=""!==Ir?Ir:(await fr.getLoginContext())?.userId??"";if(""===t)throw new Error("机器人指令回复缺少当前用户");const r=await Xt(Er,{...e,userId:t});if(!Cr)return;const o=Zt({robotId:e.robotId,userId:t,msgId:r.msgId,msgTime:r.msgTime,content:r.content},{selfId:t,keepRaw:!0});if(void 0!==o){if(void 0===$o)throw new Error("机器人指令回复尚未接入消息存储");await $o(o)}}}}),Wo=mr.expressionProvider??ve({...void 0===Tr?{}:{coreClient:Tr},...void 0===mr.expressions?.giphy?.apiKey?{}:{giphyApiKey:mr.expressions.giphy.apiKey}}),zo=x({provider:Wo,isActive:()=>Cr}),Jo=mr.sessionFavoriteProvider??ye({...void 0===Tr?{}:{coreClient:Tr},getUserId:()=>Ir}),Qo=mr.channelJoinApplications??(void 0===Tr?void 0:ge({client:Tr,clientType:hr})),Yo=mr.contactApplications??(void 0===Tr?void 0:he({client:Tr,clientType:hr})),Xo=mr.groupApplications??(void 0===Tr?void 0:fe({client:Tr,clientType:hr})),Zo=Ie({emitter:vr,diagnostics:wr,profile:Ko,channelProfile:Fo,storage:kr,getSelfId:()=>Ir,loadOlderFromRemote:async e=>{const t=po?.enterForeground(e.conversation),r=Io.enterForeground(),o=To.begin();try{return void 0===co?{messages:[],exhausted:!0}:await co(e)}finally{o(),t?.(),r()}},loadNewerFromRemote:async e=>{const t=po?.enterForeground(e.conversation),r=Io.enterForeground(),o=To.begin();try{return void 0===Mo?{messages:[],exhausted:!0}:await Mo(e)}finally{o(),t?.(),r()}}}),en=S({download:async({messageId:e,itemIndex:t,signal:r})=>{const o=Zo.getConversationMessage({conversationType:"customerService",conversationId:"__customer_service__"},e),n=o?.body.customerService?.files[t];if(void 0===n)throw T({code:"IM_SDK_CUSTOMER_SERVICE_FILE_UNAVAILABLE",category:"state",operation:"customerService.downloadFile",retryable:!1});return await ir(n.url,r)},isActive:()=>Cr,load:e=>void 0===Tr?Promise.reject(T({code:"IM_SDK_CORE_API_UNAVAILABLE",category:"contract",operation:"customerService.getProfile",retryable:!1})):ar(Tr,e),update:e=>Zo.updateConversationProfile({conversationType:"customerService",conversationId:"__customer_service__"},{title:e.displayName,avatar:e.avatarUrl})}),tn=en.api;let rn=()=>{};const on=A({namespaceFactory:yr,...void 0===kr?{}:{storage:kr},emitter:vr,getAccountId:()=>Ir,isActive:()=>Cr,clearMemoryCaches:()=>{en.clearCache(),Ko?.clearCache?.(),Fo?.clearCache?.(),Uo?.clearCache?.(),Go.clear(),rn(),po?.clear().catch(e=>vr.emit({type:"error",error:{scope:"storage",message:"清理最近历史缓存失败",cause:e}}))}});$o=e=>Zo.commitReceivedMessages([e],"live");const nn=U({provider:Jo,isActive:()=>Cr,resolveMessage:async(e,t)=>Zo.getConversationMessage(e,t)??await(kr?.getMessage(e,t))??void 0}),sn=vr.subscribe(e=>{if("message:removed"===e.type||"conversation-history:cleared"===e.type||"session:removed"===e.type){const t=we(e.conversation);if(xr.set(t,(xr.get(t)??0)+1),"message:removed"===e.type)jr.delete(_r({conversation:e.conversation,messageId:e.messageId}));else for(const e of jr.keys())e.startsWith(`${t}\0`)&&jr.delete(e)}if(void 0!==kr?.deleteDecryptRecovery)if("message:received"!==e.type&&"message:updated"!==e.type||!0===e.message.encryption.decryptFailed){if("message:removed"===e.type)Ar.delete(_r({conversation:e.conversation,messageId:e.messageId})),Nr(e.conversation,()=>kr.deleteDecryptRecovery(e.conversation,e.messageId)).catch(t=>vr.emit({type:"error",error:{scope:"storage",message:`删除消息密文记录失败(messageId=${e.messageId})`,cause:t}}));else if("conversation-history:cleared"===e.type){for(const[t,r]of Ar)we(r.conversation)===we(e.conversation)&&Ar.delete(t);Nr(e.conversation,async()=>kr.deleteConversationDecryptRecoveries?.(e.conversation)).catch(t=>vr.emit({type:"error",error:{scope:"storage",message:`清理会话密文记录失败(conversationId=${e.conversation.conversationId})`,cause:t}}))}}else{const t=we(e.conversation),r=xr.get(t)??0,o=_r({conversation:e.conversation,messageId:e.message.id}),n=Pr.get(o)??0,s=()=>Cr&&r===(xr.get(t)??0)&&n===(Pr.get(o)??0);(async()=>{const t=(await(kr.getDecryptRecoveries?.(e.conversation))??[]).find(t=>t.messageId===e.message.id);void 0!==t&&!ro(t)&&s()&&(await Zo.commitReceivedMessages([e.message],"offline",{backfillOnly:!0}),await Lr(t,s))})().catch(t=>vr.emit({type:"error",error:{scope:"storage",message:`删除已恢复密文记录失败(messageId=${e.message.id})`,cause:t}}))}});const an=s({directory:Vo.contacts,getSelfId:()=>Ir,...void 0===Ko?{}:{profile:{getUserProfile:Zo.readDirectProfile,...void 0===Ko.peekUserProfile?{}:{peekUserProfile:Ko.peekUserProfile.bind(Ko)}}},...void 0===Tr?{}:{coreClient:Tr},domainState:Zo,emitter:vr,terminateConversationSending:(e,t)=>go(e,t),resetDirectReadReceiptPreference:e=>$r.api.readReceipts.resetConversation({conversationType:"direct",conversationId:e}),onRelationshipChanged:(e,t)=>{"friend"===t?Vr?.(e):"unknown"!==t&&Hr?.(e)}}),cn=m({...void 0===Yo?{}:{contact:Yo},...void 0===Xo?{}:{group:Xo},...void 0===Qo?{}:{channel:Qo},onContactAccepted:async(e,t)=>{an.updateRelationshipFromEvent(e,"friend"),await Zo.reconcileDirectContactEstablishedNotice(e,`contact-application:${t}`),Zo.refreshConversationProfile(e,"direct")},emitter:vr,isActive:()=>Cr&&"ready"===eo}),dn=k({domainState:Zo,emitter:vr,isActive:()=>Cr}),pn=F({domainState:Zo,isAvailable:()=>Cr&&"ready"===eo}),ln=i(()=>Zo.getSessions()),un=Ce({onHidden:()=>gn(!0),onVisible:()=>gn(!1),onPageHide:()=>gn(!0),onPageShow:()=>gn(!1)},mr.network),mn=mr.cryptoExecutorFactory?.(gr)??be({generation:gr,diagnostics:wr,lifecycleAware:un.supportsLifecycle}),vn=p({executor:mn,generation:gr,isActive:()=>Cr}),yn=mr.crypto??{...gt(),async encryptSymmetricChunked(e){try{return await vn(e)}catch(e){throw vt(e)&&Cr&&vr.emit({type:"error",error:{scope:"crypto",message:"媒体加密计算失败",cause:e}}),e}}};function gn(e){mn.setSuspended(e)}function hn(e){!Cr||e instanceof Error&&"AbortError"===e.name||vr.emit({type:"error",error:{scope:"crypto",message:"密钥计算失败",cause:e}})}const fn=void 0!==mr.media?Se(mr.media,wr):void 0,In=Te(),wn=mt(In),{prepareLocalMediaPreview:Cn,prepareLocalVideoPoster:bn,prepareLocalImageThumbnail:Sn}=z(In,()=>gr),Tn=void 0===Tr?void 0:wt({client:Tr,crypto:yn,cryptoExecutor:mn,generation:gr,clientType:hr,onError:(e,t)=>zr?.("crypto",{message:e,cause:t})}),En=void 0===Tr?void 0:ft({client:Tr,clientType:hr,onError:(e,t)=>zr?.("crypto",{scope:"send-key",message:e,cause:t})}),Rn=void 0===Tr?void 0:At({client:Tr,crypto:yn,cryptoExecutor:mn,generation:gr,clientType:hr,onError:(e,t)=>zr?.("crypto",{scope:"group-key",message:e,cause:t})}),Mn=mr.channelKeyService??(void 0===Tr?void 0:Ee({loadSecretKey:e=>It(Tr,{channelId:e,clientType:hr}),onError:(e,t)=>zr?.("crypto",{scope:"channel-key",message:e,cause:t})})),kn=async(e,t={})=>{if(void 0===Mn)return;const r=null===Mn.getCachedChannelKey(e);try{await Mn.getChannelKey(e)}catch{return}if(!1!==t.recoverExistingMessages&&r&&Cr)try{await as({conversationType:"channel",conversationId:e},{recoverLegacyWithoutSidecar:!1})}catch(t){vr.emit({type:"error",error:{scope:"storage",message:`CHANNEL key 就绪后读取解密恢复记录失败(channelId=${e})`,cause:t}})}},Dn=async e=>void 0===Mn?null:Mn.getChannelKey(e),xn=e=>{if(void 0===Mn)return null;const t=Mn.getCachedChannelKey(e);return null===t&&kn(e),t},Pn=()=>Tn?.getCachedPrivateKey(Ir)?.privateKey??null,An=async(e,t={})=>{const r=[];void 0!==Mn&&r.push(...[...new Set(e)].map(e=>kn(e,t))),void 0!==Tn&&""!==Ir&&r.push(Tn.getUserPrivateKey(Ir,{priority:t.priority??"background",signal:t.signal??wo.signal})),await Promise.all(r)},jn=e=>({crypto:yn,resolveChannelKey:e=>Mn?.getCachedChannelKey(e)??null,resolveUserPrivateKey:Pn,onDecryptError:t=>Yr(e,t),onDecryptRecovery:Kr}),On=W({fetch:async e=>{await(Rn?.getGroupKeys(e,{priority:"background"}))},onError:hn});function _n(e){Cr&&void 0!==Rn&&""!==e&&On.enqueue(e)}function Nn(){On.dispose(),un.stop(),Tn?.dispose(),Rn?.dispose(),mn.dispose()}const Ln=async e=>{if(void 0===Rn)return null;const t=await Rn.getGroupKeys(e);return null===t?null:{publicKey:t.publicKey,version:t.version}},Kn=e=>{if(void 0===Rn)return null;const t=Rn.getCachedGroupKeys(e);return null!==t?t.privateKey:(_n(e),null)},Fn=async(e,t={})=>{const r=t.signal??wo.signal;if(Rt(r),void 0===Rn)return;const o=[...new Set(e)];let n,s=0;const a=async()=>{for(;void 0===n&&s<o.length;){if(!Cr)return;const e=o[s++];try{await Rn.getGroupKeys(e,{priority:t.priority??"background",signal:r})}catch(e){throw n=e,e}}};await Promise.all([a(),a()]),Rt(r)},Un=e=>({crypto:yn,resolvePrivateKey:({groupId:e})=>Kn(e),onDecryptError:t=>Qr(e,t),onDecryptRecovery:Kr}),Bn=/* @__PURE__ */new Map,Gn=/* @__PURE__ */new Map,Hn=/* @__PURE__ */new Map,Vn=/* @__PURE__ */new Set,$n=/* @__PURE__ */new Set;function qn(e){return!0!==e.encryption.decryptFailed&&"unknown"!==e.contentType}function Wn(e){Hn.delete(we(e))}function zn(e,t){return e.length===t.length&&e.every((e,r)=>e===t[r])}function Jn(e){if("group"===e.conversation.conversationType)return Rn?.getCachedGroupKeyVersion(e.conversation.conversationId)??void 0}function Qn(e){return 2===e.wireEncrypt?"channel-base64-pad-tea":"group"===e.conversation.conversationType?"group-rsa-tea":"channel"===e.conversation.conversationType?"channel-web-rsa-tea":"direct-rsa-tea"}function Yn(e){return 101===e.contentType?Number.isInteger(e.type)&&e.type>0:27===e.contentType?0n===e.gameType?e.gameValue>=1n&&e.gameValue<=3n:1n===e.gameType&&e.gameValue>=1n&&e.gameValue<=6n:[1,2,3,4,5,7,8,11].includes(e.contentType)}function Xn(e,t){const r=new Map(Zo.getMessagesByConversation(e).filter(e=>void 0===t||e.id===t).map(e=>[e.id,e])),o=/* @__PURE__ */new Map;return{stop:vr.subscribe(n=>{if(!Cr||"message:received"!==n.type&&"message:updated"!==n.type||"live"!==n.source||n.conversation.conversationType!==e.conversationType||n.conversation.conversationId!==e.conversationId||void 0!==t&&n.message.id!==t||!0===n.message.encryption.decryptFailed)return;const s=r.get(n.message.id);if(void 0===s||!Ft(s,n.message)){const t=_r({conversation:e,messageId:n.message.id});o.set(t,Pr.get(t)??0)}}),hasChanged:e=>{const t=_r(e);return o.has(t)&&o.get(t)===(Pr.get(t)??0)}}}let Zn=0;const es=[],ts=/* @__PURE__ */new Map;let rs=0;function os(){for(;rs<2&&es.length>0;){const e=es.shift();rs+=1,Promise.resolve().then(async()=>{if(Rt(wo.signal),!e.isCurrent())throw new DOMException("端到端排队恢复所属账号、会话或消息已失效","AbortError");await ss(e.record,e.hasBodyChanged)}).then(e.resolve,e.reject).finally(()=>{rs-=1,os()})}}function ns(e,t){if("direct"!==e.conversation.conversationType&&"group"!==e.conversation.conversationType)return ss(e);const r=_r(e),o=Pr.get(r)??0,n=ts.get(r);if(n?.version===o&&n.isCurrent())return n.promise;const s=Ir,a=we(e.conversation),i=xr.get(a)??0,c=Ao(e.conversation),d=()=>Cr&&Ir===s&&i===(xr.get(a)??0)&&c===Ao(e.conversation)&&o===(Pr.get(r)??0),p=void 0===t?Xn(e.conversation,e.messageId):void 0,l=t??(()=>p.hasChanged(e)),u=new Promise((t,r)=>{es.push({record:e,isCurrent:d,hasBodyChanged:l,resolve:t,reject:r})}).finally(()=>{p?.stop(),ts.get(r)?.promise===u&&ts.delete(r)});return ts.set(r,{version:o,isCurrent:d,promise:u}),os(),u}async function ss(e,t){const r=_r(e);e=Ar.get(r)??e;const o=Pr.get(r)??0,n=we(e.conversation),s=xr.get(n)??0,a=Ao(e.conversation),i=()=>Cr&&a===Ao(e.conversation)&&s===(xr.get(n)??0)&&o===(Pr.get(r)??0),c=Bn.get(r);if(void 0!==c)return Gn.get(r)===o?c:(await c.catch(()=>{}),void(i()&&Ar.get(r)===e&&await ss(e,t)));const d=async()=>Zo.getConversationMessage(e.conversation,e.messageId)??await(kr?.getMessage(e.conversation,e.messageId))??void 0,p=(async()=>{const n=await d();if(!i()||void 0===n)return;const s=ro(e),a=()=>!("direct"!==e.conversation.conversationType&&"group"!==e.conversation.conversationType||!s)&&(t?.()&&jr.set(r,o),jr.get(r)===o);if(a())return await Zo.commitReceivedMessages([n],"offline",{backfillOnly:!0}),void await Lr(e,i);if(!0!==n.encryption.decryptFailed&&!s)return await Zo.commitReceivedMessages([n],"offline",{backfillOnly:!0}),void await Lr(e,i);let c,p;wr.record("debug","sdk","crypto","decrypt-recovery-context",()=>({conversation:e.conversation,data:{messageId:e.messageId,messageSenderId:n.senderId,messageCreatedAt:n.createdAt,selfMessage:n.senderId===Ir,source:e.source,wireEncrypt:e.wireEncrypt,sContentBytes:e.sContent.length,...void 0===e.cmdId?{}:{cmdId:e.cmdId},...void 0===e.encryptVersion?{}:{encryptVersion:e.encryptVersion}}}));let l="key-resolve",u=Qn(e);for(const t of[!1,!0]){const r=t?"force":"current";let o;try{l="bcontent";const n=Gt.decode(e.sContent);if(1===e.wireEncrypt){if(0===n.secretKey.length||0===n.cipherData.length)throw new Error("BContent.secretKey/cipherData 缺失");l="key-resolve";const s={priority:"background",signal:wo.signal,...t?{staleKey:"string"==typeof p?p:void 0}:{}},a="group"===e.conversation.conversationType?(await(Rn?.getGroupKeys(e.conversation.conversationId,s)))?.privateKey??null:(await(Tn?.getUserPrivateKey(Ir,s)))?.privateKey??null;if(!i())return;t&&void 0!==p&&(o="string"==typeof p&&null!==a&&p!==a),!0===o&&Wn(e.conversation),t||(p=a);const d=Jn(e);if(null===a){wr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"no-key",...void 0===d?{}:{resolvedKeyVersion:d},...void 0===o?{}:{keyChanged:o}}}));continue}const u=await mn.decryptBatch({operationId:"end-to-end-recovery:"+ ++Zn,generation:gr,items:[{itemIndex:0,input:{secretKey:n.secretKey,cipherData:n.cipherData,privateKey:a}}],priority:"background",signal:wo.signal});if(!i())return;if(1!==u.length||0!==u[0]?.itemIndex)throw new yt("protocol-mismatch");const m=u[0].result;if(!m.ok)throw l=m.stage,new Error(`End-to-end recovery ${m.stage} failed`);const v=m.plain;wr.record("debug","sdk","crypto","decrypt-recovery-byte-shape",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:Qn(e),rsaCipherBytes:n.secretKey.length,cipherDataBytes:n.cipherData.length,cipherDataBlockRemainder:n.cipherData.length%8,plainBytes:v.length,plainBlockRemainder:v.length%8,startsWithContentTypeField:8===v[0],startsWithMobileCardType:8===v[0]&&8===v[1],...X(v)}})),l="bmessage",c=Ht.decode(v)}else if("channel"===e.conversation.conversationType){if(0===n.cipherData.length)throw new Error("BContent.cipherData 缺失");l="key-resolve";const s=t?{...p instanceof Uint8Array?{staleKey:p}:{}}:void 0,a=void 0===Mn?.getChannelKeyCandidates?await(Mn?.getChannelKey(e.conversation.conversationId,s).then(e=>[{strategy:"canonical-base64-pad",key:e}]))??[]:await Mn.getChannelKeyCandidates(e.conversation.conversationId,s),i=Mn?.getCachedChannelKeyMetadata?.(e.conversation.conversationId);null!=i&&wr.record("info","sdk","crypto","decrypt-recovery-key-material",()=>({conversation:e.conversation,data:{messageId:e.messageId,attempt:r,...i}}));const d=a.find(e=>"canonical-base64-pad"===e.strategy)?.key??null;if(t&&p instanceof Uint8Array&&null!==d&&(o=!zn(p,d)),!0===o&&Wn(e.conversation),t||(p=d?.slice()??null),0===a.length){wr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"no-key",...void 0===o?{}:{keyChanged:o}}}));continue}for(const t of a)try{l="tea";const s=yn.decryptSymmetric({teaKey:t.key,cipherData:n.cipherData});l="bmessage";const a=Ht.decode(s);if("legacy-ascii16"===t.strategy&&!Yn(a))throw new Error("legacy ASCII candidate 未通过已知 BMessage 语义校验");c=a,u=t.strategy,wr.record("info","sdk","crypto","decrypt-recovery-candidate",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:t.strategy,finalStage:"recovered",reason:"recovered",...void 0===o?{}:{keyChanged:o}}}));break}catch(n){wr.record("warn","sdk","crypto","decrypt-recovery-candidate",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:t.strategy,finalStage:l,reason:"decrypt-failed",...void 0===o?{}:{keyChanged:o}},error:{message:"CHANNEL decrypt recovery candidate failed",data:n}}))}}if(void 0!==c){wr.record("info","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:u,finalStage:"recovered",reason:"recovered",...void 0===o?{}:{keyChanged:o}}}));break}}catch(t){if(vt(t)||t instanceof Error&&"AbortError"===t.name)throw t;const n=Jn(e);wr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"decrypt-failed",...void 0===n?{}:{resolvedKeyVersion:n},...void 0===o?{}:{keyChanged:o}},error:{message:"IM message decryption recovery failed",data:t}}))}}if(!i()||void 0===c)return void(void 0===c&&(!function(e,t){const r=we(e),o=Hn.get(r)??/* @__PURE__ */new Set;o.add(t),Hn.set(r,o)}(e.conversation,e.messageId),wr.record("warn","sdk","crypto","decrypt-recovery-exhausted",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,strategy:Qn(e),attempts:2,finalStage:l}}))));const m=await d();if(!i()||void 0===m||!0!==m.encryption.decryptFailed&&!s)return;if(("direct"===e.conversation.conversationType||"group"===e.conversation.conversationType)&&s&&(a()||!Ft(n,m)))return jr.set(r,o),await Zo.commitReceivedMessages([m],"offline",{backfillOnly:!0}),void await Lr(e,i);const v="channel"!==e.conversation.conversationType||e.cmdId!==st.RADIO_NOTIFY_DELIVER&&101!==c.contentType?{...$t(m,c,Ir),...s?{edited:!0}:{}}:Vt({channelId:BigInt(e.conversation.conversationId),messageId:e.messageId,occurredAt:BigInt(m.serverTime??m.createdAt),notifyType:c.type,operatorId:c.oprUserId,targetUserIds:c.mnpledUserId,content:c.content,..."string"==typeof m.extensions?.historyCursor?{historyCursor:m.extensions.historyCursor}:{},..."string"==typeof m.extensions?.channelSequence?{sequence:BigInt(m.extensions.channelSequence)}:{},encrypted:!0},{cmdId:e.cmdId,keepRaw:void 0!==m.raw});await Zo.commitReceivedMessages([v],"offline",{backfillOnly:!0,refreshSessionSummary:!0}),await Lr(e,i)})().finally(()=>{Bn.get(r)===p&&(Bn.delete(r),Gn.delete(r))});return Bn.set(r,p),Gn.set(r,o),p}async function as(e,t={}){const r="direct"===e.conversationType||"group"===e.conversationType?Xn(e):void 0;try{const o=we(e),n=Ir,s=xr.get(o)??0,a=Ao(e),i=()=>Cr&&n===Ir&&s===(xr.get(o)??0)&&a===Ao(e),c=await(kr?.getDecryptRecoveries?.(e))??[];if(!i())return;const d=Hn.get(o),p=void 0===d?c:c.filter(e=>!d.has(e.messageId));if("direct"===e.conversationType||"group"===e.conversationType){let e=0;const t=async()=>{for(;e<p.length;){if(!i())return;const t=p[e++];await ns(t,()=>r.hasChanged(t))}},o=(await Promise.allSettled([t(),t()])).find(e=>"rejected"===e.status);if("rejected"===o?.status)throw o.reason}else await Promise.all(p.map(e=>ns(e)));if(!Cr||!1===t.recoverLegacyWithoutSidecar)return;const l=Hn.get(o),u=new Set(c.filter(e=>void 0===l||!l.has(e.messageId)).map(e=>e.messageId)),m=Zo.getMessagesByConversation(e).filter(e=>!0===e.encryption.decryptFailed&&!u.has(e.id));if(0===m.length||Vn.has(o))return;if(Vn.add(o),wr.record("info","sdk","crypto","decrypt-repair-start",()=>({conversation:e,data:{stuckCount:m.length,withoutSidecar:m.filter(e=>!c.some(t=>t.messageId===e.id)).length}})),"channel"===e.conversationType){const t=await fr.getLoginContext();if(null===t||void 0===Ro)return;for(const r of m.slice(0,20)){const o=r.extensions?.historyCursor;if("string"!=typeof o||""===o.trim())continue;const n=await Ro(e.conversationId,o,t.userId);if(!Cr)return;n.length>0&&Zo.upsertMessages(n,"offline")}}else"group"===e.conversationType?await async function(e,t){if(void 0===co)return;const r=[...t].sort((e,t)=>e.sortKey.localeCompare(t.sortKey)),o=r[0],n=r.at(-1);if(void 0===o||void 0===n)return;const s=o.serverTime??o.createdAt;let a;for(let t=0;t<5;t++){const t=await co({conversation:e,oldestLoaded:n,...void 0===a?{}:{cursor:a},intent:"older",limit:50});if(!Cr||t.exhausted||void 0===t.nextCursor)return;const r=Number(t.nextCursor);if(Number.isFinite(r)&&r<=s)return;a=t.nextCursor}}({conversationType:"group",conversationId:e.conversationId},m):"direct"===e.conversationType&&await La()}catch(t){if(!Cr||t instanceof Error&&"AbortError"===t.name)return;vr.emit({type:"error",error:{scope:"crypto",message:`解密失败消息恢复失败(conversationType=${e.conversationType}, conversationId=${e.conversationId})`,cause:t}})}finally{r?.stop()}}let is=()=>{throw new Error("离线 Reaction 写入失败:Reaction manager 尚未就绪")};function cs(e,t=!0){const r=e.channelPermissions,o=e.channelAccessSnapshot;return JSON.stringify(["group"===e.type?e.groupState??"active":void 0,e.channelState,void 0===r?void 0:[r.sendMessages,r.mentionAll,r.editProfile,r.manageMembers,r.manageAdmins,r.moderateMessages,r.manageMute,r.dismissChannel,r.transferOwnership],t&&void 0!==o?[o.role,o.baseState,o.resolvedState,o.allMembersMuted,o.currentUserMuted,o.mutePeriod]:void 0])}const ds=/* @__PURE__ */new Map;function ps(e){const t=Zo.getConversationContext(e);if(!Cr||void 0===t||"group"===e.conversationType&&void 0!==t.groupState&&"active"!==t.groupState||"channel"===e.conversationType&&void 0!==t.channelState&&o(t.channelState))return;const r=Zo.getMessagesByConversation(e).at(-1);return JSON.stringify([Ir,void 0===r?t.timestamp:void 0,cs(t),r?.id,r?.sortKey])}const ls=/* @__PURE__ */new Map;po=te({...void 0===kr?.recentHistoryCache?{}:{cache:kr.recentHistoryCache},fingerprint:ps,canRunBackground:function(){return Cr&&"ready"===eo&&So&&0===bo&&"authenticated"===la.state},onForeground:e=>{if("group"===e.conversationType){Rn?.promote(e.conversationId);for(const[t,r]of ls)r.some(t=>t.conversationId===e.conversationId)&&mn.promote(t)}else"channel"!==e.conversationType&&"direct"!==e.conversationType||Tn?.promote(Ir)},fetchPage:async(e,t)=>{const r="group"===e.conversationType?Ia("group",{conversationType:"group",conversationId:e.conversationId}):void 0;try{const o=await ee({http:Er,authProvider:fr,clientType:hr,groupDecrypt:()=>Un("history"),groupAsyncDecrypt:(e,t)=>{const r=Ca(!0===po?.hasForeground(e)?"foreground":"background",t);return r.assertCurrent?.(e),r},assertLoginContext:e=>{if(!Cr||""!==Ir&&e!==Ir)throw new DOMException("最近历史请求的登录账号已改变","AbortError")},channelDecrypt:()=>jn("history"),prepareGroupKeys:Fn,prepareChannelKeys:(e,t)=>An(e,{...t,recoverExistingMessages:!1}),keyPriority:e=>!0===po?.hasForeground(e)?"foreground":"background"})(e,t);return void 0===r?o:{...o,messages:r.messages(o.messages),recoveries:o.recoveries?.filter(r.acceptsRecovery)}}finally{r?.stop()}},yieldToEventLoop:Ut,report:(e,t,r)=>wr.record(e.endsWith("failed")?"warn":"debug","sdk","history",e,()=>({conversation:t,data:r}))});const us=vr.subscribe(e=>{if("connection:changed"===e.type)return"authenticated"!==e.state&&(So=!1),void po?.notifySchedulingChanged();if("session:updated"===e.type){if("group"!==e.conversation.conversationType&&"channel"!==e.conversation.conversationType)return;const t=we(e.conversation),r=ds.get(t),o={timestamp:e.session.timestamp,access:cs(e.session),capabilities:cs(e.session,!1),state:"group"===e.session.type?e.session.groupState??"active":e.session.channelState,hasPermissions:void 0!==e.session.channelPermissions,hasSnapshot:void 0!==e.session.channelAccessSnapshot};if(ds.set(t,o),"group"===e.conversation.conversationType&&"active"!==o.state&&r?.state!==o.state&&jo(e.conversation),"ready"===eo&&void 0!==r&&(r.access!==o.access||!ko&&r.timestamp!==o.timestamp)){const t=!r.hasSnapshot&&o.hasSnapshot&&(r.capabilities===o.capabilities||!r.hasPermissions&&r.state===o.state);po?.invalidate(e.conversation,{preserveForeground:r.access===o.access||t})}return}return"session:removed"===e.type?(jo(e.conversation),ds.delete(we(e.conversation)),void("ready"===eo&&po?.invalidate(e.conversation))):"conversation-history:cleared"===e.type?(jo(e.conversation),void("ready"===eo&&po?.invalidate(e.conversation))):void("ready"===eo&&!ko&&"conversation"in e&&void 0!==e.conversation&&("message:received"!==e.type&&"message:updated"!==e.type&&"message:removed"!==e.type||po?.invalidate(e.conversation,{preserveForeground:"message:received"===e.type})))});function ms(e,t=!0){const r="group"===e.conversation.conversationType?Ca("foreground"):void 0;r?.assertCurrent?.({conversationType:"group",conversationId:e.conversation.conversationId}),ko=!0;try{if(void 0===r){e.messages.length>0&&Zo.upsertMessages(e.messages,"offline",{backfillOnly:!0,refreshSessionSummary:t});for(const t of e.reactions)is(t);for(const t of po.takeRecoveries(e))Kr(t)}else{const o=po.takeRecoveries(e);for(const o of e.messages)r.publish([o],()=>Zo.upsertMessages([o],"offline",{backfillOnly:!0,refreshSessionSummary:t}));for(const t of e.reactions)r.publish([],()=>is(t));for(const e of o)r.publish([],()=>Kr(e))}}finally{ko=!1}}co=async({conversation:e,oldestLoaded:t,cursor:r,intent:n,limit:s,signal:a})=>{Rt(a);const{conversationId:i}=e,c=Zo.getConversationContext(e);if(void 0===c)throw new Error(`加载远端历史失败:会话不存在(conversationId=${i})`);if("direct"===c.type||"robot"===c.type||"customerService"===c.type)return{messages:[],exhausted:!0};if("establish-latest"===n&&30===s&&("group"===c.type||"channel"===c.type)){const e={conversationType:c.type,conversationId:i};if(void 0===ps(e))return{messages:[],exhausted:!0};const t=await po.readCached(e,!0).catch(t=>(wr.record("warn","sdk","history","recent-history-cache-read-failed",()=>({conversation:e,error:{message:"读取最近历史缓存失败",data:t}})),null));null!==t&&po.isPageCurrent(t)&&Date.now()-t.fetchedAt>3e5&&ms(t,!1),Rt(a);const r=await po.latest(e,a).catch(t=>{if(!vt(t)&&Cr&&void 0===ps(e))return null;throw t});if(null===r)return{messages:[],exhausted:!0};if(Rt(a),!Cr||!po.isPageCurrent(r)||void 0===ps(e))throw new Error("最近历史请求已失效");if(ms(r),await po.confirmConsumed(r),Rt(a),!po.isPageCurrent(r))throw new Error("最近历史页在窗口提交前已失效");return{messages:r.messages,exhausted:r.exhausted,...void 0===r.nextCursor?{}:{nextCursor:r.nextCursor},replaceWindow:!0}}if("group"===c.type){if(void 0!==c.groupState&&"active"!==c.groupState)return{messages:[],exhausted:!0};const o={conversationType:"group",conversationId:i},d=Ir,p=Ca(!0===po?.hasForeground(e)?"foreground":"background",a);p.assertCurrent?.(o);const l=Ia("group",o);try{const o=await fr.getLoginContext();if(null===o)return{messages:[],exhausted:!0};if(p.assertCurrent?.(),o.userId!==d)throw new DOMException("GROUP 历史请求的登录账号已改变","AbortError");const c="establish-latest"===n?Date.now():void 0===r?t?.serverTime??t?.createdAt??Date.now():ur(r,i),u=[],m=[],v=await Ot({asyncDecrypt:p,signal:a,http:Er,userId:o.userId,clientType:hr,groupId:i,baseTime:c,direct:1,limit:s,decryptDeps:{...Un("history"),onDecryptRecovery:e=>m.push(e)},prepareKeys:t=>Fn(t,{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onReaction:e=>u.push(e)});p.assertCurrent?.();const y=l.messages(v.messages);for(const e of y)p.publish([e],()=>Zo.upsertMessages([e],"offline",{backfillOnly:!0,refreshSessionSummary:"establish-latest"===n}));for(const e of u)p.publish([],()=>is(e));for(const e of m)p.publish([],()=>{l.acceptsRecovery(e)&&Kr(e)});p.assertCurrent?.();return{messages:y,...q({conversationId:i,direction:"older",baseTime:c,batchSize:v.batchSize,boundaryTime:v.oldestEntryTime,limit:s}),..."establish-latest"===n?{replaceWindow:!0}:{}}}finally{l.stop()}}if("channel"===c.type){const s=Wr("history");if(void 0!==c.channelState&&o(c.channelState))return wr.record("info","sdk","history","channel-history-blocked",()=>({conversation:e,operationId:s,data:{state:c.channelState}})),{messages:[],exhausted:!0};const l=Oo,u=_o(i),m=await fr.getLoginContext();if(null===m)return{messages:[],exhausted:!0};if("establish-latest"===n){const t=await Wt({signal:a,http:Er,userId:m.userId,clientType:hr,channelId:i,count:lr,operationId:s,decryptDeps:jn("history"),prepareKey:void 0===Mn&&void 0===Tn?void 0:t=>An([t],{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onContentDecodeError:Xr,onReaction:is});Rt(a);const r=Zo.getConversationContext(e);return!Cr||l!==Oo||u!==_o(i)||"channel"!==r?.type||void 0!==r.channelState&&o(r.channelState)?{messages:[],exhausted:!0}:(Rt(a),t.messages.length>0&&Zo.upsertMessages(t.messages,"offline",{backfillOnly:!0,refreshSessionSummary:!0}),{messages:t.messages,exhausted:!t.hasOlder,...void 0===t.nextCursor?{}:{nextCursor:t.nextCursor},replaceWindow:!0})}let v,y=r??"";if(void 0===r&&void 0!==t){const e=t.extensions?.historyCursor;if("string"==typeof e&&""!==e.trim())y=e;else if(d=t,p=m.userId,void 0===d||d.senderId!==p||"pending"!==d.status&&"uploading"!==d.status&&"sending"!==d.status||"string"==typeof d.extensions?.historyCursor&&""!==d.extensions.historyCursor.trim())throw new Error(`CHANNEL historyCursor 缺失(channelId=${i}, messageId=${t.id})`)}wr.record("debug","sdk","history","channel-history-page-start",()=>({conversation:e,operationId:s,data:{baseIndexPresent:""!==y,direction:1,contain:0,count:lr,historyGeneration:l,historyEpoch:u,clientTypeHeader:hr,clientTypeBody:hr}}));try{v=await Jt({signal:a,http:Er,userId:m.userId,clientType:hr,channelId:i,baseIndex:y,count:lr,contain:0,operationId:s,decryptDeps:jn("history"),prepareKey:void 0===Mn&&void 0===Tn?void 0:t=>An([t],{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onContentDecodeError:Xr,onReaction:is})}catch(t){throw wr.record("error","sdk","history","channel-history-page-failed",()=>({conversation:e,operationId:s,data:{baseIndexPresent:""!==y,direction:1,contain:0,count:lr},error:{message:"CHANNEL 历史页加载失败",data:t}})),t}Rt(a);const g=Zo.getConversationContext(e);return!Cr||l!==Oo||u!==_o(i)||"channel"!==g?.type||void 0!==g.channelState&&o(g.channelState)?{messages:[],exhausted:!0}:(Rt(a),v.messages.length>0&&Zo.upsertMessages(v.messages,"offline",{backfillOnly:!0}),wr.record("debug","sdk","history","channel-history-page-complete",()=>({conversation:e,operationId:s,data:{responseBatchSize:v.batchSize,messageCount:v.messages.length,exhausted:v.exhausted,nextBaseIndexPresent:void 0!==v.nextBaseIndex}})),{messages:v.messages,exhausted:v.exhausted,...void 0===v.nextBaseIndex?{}:{nextCursor:v.nextBaseIndex}})}var d,p;throw new Error(`远端历史未实现:${c.type}`)};const vs=e=>{e.length>0&&Zo.upsertMessages(e,"offline",{backfillOnly:!0})},ys=async()=>{const e=await fr.getLoginContext();if(null===e)throw new Error("按消息 ID 回源失败:当前没有登录态");return{userId:e.userId}},gs=async(e,t)=>{const r={conversationType:"group",conversationId:e},o=Ia("group",r,t);try{const n=Ir,s=Ao(r),a=()=>{if(!Cr||Ir!==n||s!==Ao(r))throw new DOMException("GROUP 消息查询所属账号或历史已失效","AbortError")},i=Ca("foreground",void 0,a);i.assertCurrent?.(r);const{userId:c}=await ys();if(a(),c!==n)throw new DOMException("GROUP 消息查询的登录账号已改变","AbortError");const d=[],p=[],l=Un("history"),u=await N(t,async t=>{a();const r=await kt({asyncDecrypt:i,http:Er,userId:c,clientType:hr,groupId:e,messageIds:t,decryptDeps:{...l,onDecryptRecovery:e=>p.push(e)},prepareKeys:e=>Fn(e,{priority:"foreground"}),onReaction:e=>d.push(e)});if(a(),200!==r.code)throw Object.assign(new Error("GROUP 按 ID 查询业务失败"),{code:r.code});return r});a(),i.assertCurrent?.();const m=o.messages(u.messages).filter(e=>e.conversationType===r.conversationType&&e.conversationId===r.conversationId);for(const e of m)i.assertCurrent?.(),vs([e]),i.assertCurrent?.();for(const e of d)i.assertCurrent?.(),e.conversation.conversationType===r.conversationType&&e.conversation.conversationId===r.conversationId&&is(e),i.assertCurrent?.();for(const e of p)i.assertCurrent?.(),o.acceptsRecovery(e)&&e.conversation.conversationType===r.conversationType&&e.conversation.conversationId===r.conversationId&&Kr(e),i.assertCurrent?.();return{messages:m.map(e=>{const t=Zo.getConversationMessage(r,e.id);if(void 0===t)throw new Error("GROUP 按 ID 查询在领域合并后缺少消息");return t}),missingMessageIds:u.missingMessageIds}}finally{o.stop()}},hs=async(e,t)=>{const r={conversationType:"channel",conversationId:e},n=Ir,s=Oo,a=_o(e),i=()=>{const t=Zo.getConversationContext(r);if(!Cr||Ir!==n||s!==Oo||a!==_o(e)||"channel"!==t?.type||void 0!==t.channelState&&o(t.channelState))throw new DOMException("CHANNEL 消息查询所属账号或历史已失效","AbortError")};i();const{userId:c}=await ys();if(i(),c!==n)throw new DOMException("CHANNEL 消息查询的登录账号已改变","AbortError");const d=[],p=[],l=await N(t,async t=>{i();const r=await xt({http:Er,userId:c,clientType:hr,channelId:e,messageIds:t,operationId:Wr("history"),decryptDeps:{...jn("history"),onDecryptRecovery:e=>p.push({...e,source:"history"})},prepareKey:void 0===Mn&&void 0===Tn?void 0:async e=>{await An([e],{recoverExistingMessages:!1,priority:"foreground"}),i()},onContentDecodeError:Xr,onReaction:e=>d.push(e)});if(i(),0!==r.code)throw Object.assign(new Error("CHANNEL 按 ID 查询业务失败"),{code:r.code});return r});i();for(const e of l.messages)i(),vs([e]);for(const e of d)i(),is(e);for(const e of p)i(),Kr(e);i();return{messages:l.messages.map(e=>{const t=Zo.getConversationMessage(r,e.id);if(void 0===t)throw new Error("CHANNEL 按 ID 查询在领域合并后缺少消息");return t}),missingMessageIds:l.missingMessageIds}},fs=Re([Me({includeOppositeEnd:!0,resolveOwnKey:async e=>{const t=await(Tn?.getUserPrivateKey(e));return t?.publicKey?{publicKey:t.publicKey,version:t.version}:null}}),ke({resolveGroupKey:Ln}),De({resolveChannelKey:Dn}),xe()]),Is=Pe([Ae(),je(),Oe()]),ws=_e([Ne(),Le(),Ke({resolveChannelKey:Dn,resolveProfile:e=>Fo?.getProfile(e)??Promise.resolve(null)})]);let Cs=()=>{throw new Error("群收包回 ACK 失败:connection.sendFrame 尚未就绪")},bs=()=>!1,Ss=()=>{throw new Error("群发送 ACK 回填失败:connection.onChatAck 尚未就绪")},Ts=()=>{},Es=()=>{};const Rs={...Zo,removeConversationForMembershipTermination:(e,t)=>{Ts(e,t),"group"===e.conversationType?(On.remove(e.conversationId),jo(e),Rn?.clearGroupKeys(e.conversationId)):Mn?.clearChannelKey(e.conversationId),Zo.removeConversationForMembershipTermination(e,t),Gr.api.resetBackground(e).catch(e=>vr.emit({type:"error",error:{scope:"storage",message:"终态删除后清理会话背景失败",cause:e}}))}},Ms=Et({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>Ir,isAuthenticated:()=>bs(),reportReaction:e=>Wo.reportReaction(e),isEmojiSupported:D,logger:zr});is=e=>{Ms.ingest(e,"offline")};const ks=Fe({manager:Ms,getSelfId:()=>Ir,logger:zr}),Ds=Ue({domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0,decrypt:{crypto:yn,resolvePrivateKey:({groupId:e})=>Kn(e),preparePrivateKey:async({groupId:e})=>{if(void 0===Rn)return null;const t=await Rn.getGroupKeys(e);return t?.privateKey??null},onDecryptError:e=>Qr("live",e),onDecryptRecovery:Kr},isActive:()=>Cr});let xs=0;const Ps=vr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&xs++}),As=Be({domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0,decrypt:{crypto:yn,resolveChannelKey:xn,resolveUserPrivateKey:Pn,onDecryptRecovery:Kr,onDecryptError:e=>{const t=void 0!==Mn&&void 0===kr?.saveDecryptRecovery&&2===e.encrypt&&"decrypt-failed"===e.reason;if(Yr("live",{...e,forceRefreshAttempted:t}),!t)return;const r=Mn.getCachedChannelKey(e.channelId)??void 0;Mn.getChannelKey(e.channelId,{staleKey:r}).catch(()=>{})}},isActive:()=>Cr&&bs(),getConnectionEpoch:()=>xs}),js=Ge({isActive:()=>Cr,domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0}),Os=He({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0,decrypt:{crypto:yn,resolveChannelKey:xn,resolveUserPrivateKey:Pn,onDecryptRecovery:Kr}}),_s=Ve({getSelfId:()=>Ir,sendFrame:e=>Cs(e),emitter:vr}),Ns=$e({emitter:vr,getSelfId:()=>Ir}),Ls=qe({sendFrame:e=>Cs(e),emitter:vr,getSelfId:()=>Ir,domainState:{reconcileDirectContactEstablishedNotice:Zo.reconcileDirectContactEstablishedNotice,removeConversation:e=>{"string"!=typeof e?("direct"===e.conversationType&&go(e,"friend_relation_removed"),Zo.removeConversation(e)):Zo.removeConversation(e)}},resetDirectReadReceiptPreference:e=>$r.api.readReceipts.resetConversation({conversationType:"direct",conversationId:e}),onRelationshipChanged:an.updateRelationshipFromEvent}),Ks=We({sendFrame:e=>Cs(e),emitter:vr,domainState:{applyTransferStatusBySerialNumber:Zo.applyTransferStatusBySerialNumber}}),Fs=ze({getSelfId:()=>Ir,sendFrame:e=>Cs(e),emitter:vr}),Us=Je({getSelfId:()=>Ir,domainState:Zo,sendFrame:e=>Cs(e),emitter:vr,onRelationshipChanged:an.updateRelationshipFromEvent}),Bs=Qe({sendFrame:e=>Cs(e),emitter:vr,getSelfId:()=>Ir,isAuthenticated:()=>bs(),domainState:Zo}),Gs=Ye({sendFrame:e=>Cs(e),emitter:vr,getSelfId:()=>Ir,isAuthenticated:()=>bs(),domainState:Zo}),Hs=[...Bs.handlers,...Gs.commandHandlers],Vs=oe({isActive:()=>Cr&&bs(),getUserId:async()=>(await fr.getLoginContext())?.userId??null,pull:(e,t,r)=>cr({http:Er,userId:e,clientType:hr,deliveredMsgIds:t,signal:r}),onBatch:e=>{wr.record("info","sdk","call","signal-offline-pull",()=>({data:{count:e.items.length,cmdIds:e.items.map(e=>`0x${e.cmdId.toString(16)}`)}})),0===e.items.length&&vr.emit({type:"notification",cmdId:0,name:"OFFLINE_SIGNAL"})},onItem:e=>{if(vr.emit({type:"notification",cmdId:e.cmdId,name:"OFFLINE_SIGNAL"}),!Cr||!bs())return;const t=Hs.find(t=>t.command===e.cmdId);t?.handler(e.cmdId,e.body)},onError:e=>vr.emit({type:"error",error:{scope:"sync",message:"音视频离线信令拉取失败",cause:e}})}),$s=vr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&Vs.stop()}),qs=Xe({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0}),Ws=at({domainState:Rs,getSelfId:()=>Ir,prefetchGroupKey:_n,clearGroupKeys:e=>{On.remove(e),jo({conversationType:"group",conversationId:e}),Rn?.clearGroupKeys(e)},clearConversationTermination:e=>Es(e)}),zs=vr.subscribe(e=>{"message:received"!==e.type&&"message:updated"!==e.type||Ws.handleMessage(e.message)}),Js=it({domainState:Rs,getSelfId:()=>Ir,prepareChannelKey:e=>{wr.record("debug","sdk","crypto","channel-key-prepare-requested",()=>({conversation:{conversationType:"channel",conversationId:e},data:{cacheHit:void 0!==Mn&&null!==Mn.getCachedChannelKey(e)}})),void 0!==Mn&&Mn.getChannelKey(e).catch(()=>{})},clearChannelKey:e=>{const t=void 0!==Mn&&null!==Mn.getCachedChannelKey(e);Mn?.clearChannelKey(e),wr.record("info","sdk","crypto","channel-key-cleared",()=>({conversation:{conversationType:"channel",conversationId:e},data:{cacheHit:t}}))},clearConversationTermination:e=>Es(e),stopChannelHistory:e=>{const t=_o(e);No(e),Zo.messageWindow.info().conversationId===e&&Zo.messageWindow.reset(),wr.record("info","sdk","history","channel-history-invalidated",()=>({conversation:{conversationType:"channel",conversationId:e},data:{previousEpoch:t,nextEpoch:_o(e)}}))}}),Qs=vr.subscribe(e=>{if("message:received"===e.type||"message:updated"===e.type){const t=e.message;"channel"===t.conversationType&&void 0!==t.body.system?.eventType&&wr.record("info","sdk","conversation","channel-membership-event-observed",()=>({conversation:{conversationType:"channel",conversationId:t.conversationId},messageId:t.id,data:{eventType:t.body.system?.eventType,source:e.source??"live",targetSelf:t.body.system?.targetUserIds?.includes(Ir)??!1,lifecycleEffects:!0===e.channelLifecycleEffects,stateBefore:Zo.getSession({conversationType:"channel",conversationId:t.conversationId})?.channelState??"missing"}})),Js.handleMessage(e.message,{source:e.source??"live",applyLifecycleEffects:e.channelLifecycleEffects})}}),Ys=/* @__PURE__ */new Set(["channel_member_left","channel_member_removed","channel_member_joined","channel_member_invited","channel_owner_transferred","channel_admin_added","channel_admin_removed","channel_member_renamed"]),Xs=/* @__PURE__ */new Set(["channel_member_left","channel_member_removed","channel_member_joined","channel_member_invited","channel_member_renamed"]),Zs=vr.subscribe(e=>{if("message:received"!==e.type&&"message:updated"!==e.type)return;if("live"!==(e.source??"live")&&!0!==e.channelLifecycleEffects)return;const t=e.message,r=t.body.system?.eventType;"channel"===t.conversationType&&void 0!==r&&(Ys.has(r)&&Uo?.invalidateChannelMembers(t.conversationId).catch(e=>{vr.emit({type:"error",error:{scope:"storage",message:"CHANNEL 成员缓存失效失败",cause:e}})}),Xs.has(r)&&Go.invalidate(t.conversationId).catch(e=>{vr.emit({type:"error",error:{scope:"storage",message:"CHANNEL @候选缓存失效失败",cause:e}})}))}),ea=c({fetchMessagesById:gs,onSourceUnavailable:e=>wr.record("warn","sdk","message","pinned-source-unavailable",()=>({conversation:{conversationType:"group",conversationId:e.conversationId},data:{messageId:e.messageId,localCleared:!0,serverCleanup:"requires-conditional-authorized-api"}})),...void 0===Tr?{}:{coreClient:Tr},domainState:Zo,emitter:vr}),ta=e({fetchMessagesById:hs,onSourceUnavailable:e=>wr.record("warn","sdk","message","pinned-source-unavailable",()=>({conversation:{conversationType:"channel",conversationId:e.conversationId},data:{messageId:e.messageId,localCleared:!0,serverCleanup:"requires-conditional-authorized-api"}})),...void 0===Tr?{}:{coreClient:Tr},domainState:Zo,emitter:vr}),ra=n({...void 0===Qo?{}:{joinApplications:Qo},http:Er,clientType:hr,buildOfflineDecrypt:()=>jn("history"),onContentDecodeError:Xr,onReaction:is,...void 0===Mn&&void 0===Tn?{}:{prepareKey:(e,t)=>An([e],{signal:t,priority:!0===po?.hasForeground({conversationType:"channel",conversationId:e})?"foreground":"background"})}});Ro=async(e,t,r)=>{const{context:o}=await ra.loadMessageContext(e,t,r);return o.messages};const oa=r({authProvider:fr,emitter:vr,domainState:Zo,loadMessageContext:ra.loadMessageContext,isActive:()=>Cr,getHistoryGeneration:()=>Oo,getHistoryEpoch:_o}),na=G({domainState:Zo,isActive:()=>Cr,loadSummary:async({channelId:e,readCursor:t})=>{const r=await fr.getLoginContext();if(null===r||!Cr||r.userId!==Ir)throw new Error("CHANNEL 已读摘要:无有效登录上下文");return(await qt({http:Er,userId:r.userId,clientType:hr,channels:[{channelId:e,readCursor:t}],keepRaw:!1})).find(t=>t.channelId===e)},report:(e,t,r)=>wr.record("channel-read-summary-failed"===e?"warn":"debug","sdk","sync",e,()=>({conversation:t,data:r}))}),sa=Pt({domainState:Zo,updateReadIndex:async({channelId:e,readCursor:t})=>{const r=await fr.getLoginContext();if(null===r||!Cr||r.userId!==Ir)throw new Error("CHANNEL 已读 readIndexes/edit:无登录上下文");await dr({http:Er,userId:r.userId,indexes:[{channelId:e,readCursor:t}]})},emitter:vr,logger:zr,onReadCommitted:na.request,onReadSettled:na.settled,syncRead:{getSelfId:()=>Ir,sendFrame:e=>Cs(e)}}),aa=Ze({getSelfId:()=>Ir,applyRemoteRead:e=>sa.applyRemoteRead(e),emitter:vr,logger:zr}),ia=et([pt({domainState:Zo,markGroupReadAll:async e=>{const t=await fr.getLoginContext();if(null===t)throw new Error("群已读 read_all:无登录上下文");await pr({http:Er,userId:t.userId,groupId:e})},emitter:vr,logger:zr,isAuthenticated:()=>bs(),syncRead:{getSelfId:()=>Ir,sendFrame:e=>Cs(e)}}),sa,lt({domainState:Zo}),ut({domainState:Zo})]),ca=tt({getSelfId:()=>Ir,sendFrame:e=>Cs(e),onListenerError:()=>vr.emit({type:"error",error:{scope:"unknown",message:"推送状态订阅者回调异常"}})}),da=rt({getSelfId:()=>Ir,sendFrame:e=>Cs(e),onListenerError:()=>vr.emit({type:"error",error:{scope:"unknown",message:"页面状态订阅者回调异常"}})}),pa=vr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&(ca.setAuthenticated(!1),da.setAuthenticated(!1))}),la=ot({transport:Rr,authProvider:fr,endpointProvider:mr.endpointProvider,emitter:vr,domainState:Zo,logger:zr,decrypt:{crypto:yn,resolvePrivateKey:({msgType:e})=>1===e||1e3===e?Tn?.getCachedPrivateKey(Ir)?.privateKey??null:null,onDecryptError:e=>Jr("live",e),onDecryptRecovery:Kr},encryptSend:void 0===En&&void 0===Mn?void 0:{crypto:yn,resolvePublicKey:e=>En?.getPeerPublicKey(e)??Promise.resolve(null),resolveGroupKey:Ln},media:void 0!==fn?{transfer:fn,recoveryPort:br?.port,retainFailedUploads:mr.uploadRecovery?.retainFailedUploads,shouldPersistUpload:(e,t)=>void 0!==br&&ct(t,!0===mr.media?.multipartTransfer&&!1!==mr.media.multipartUpload).multipart,waitUntilOnline:e=>Sr.wait(e),preview:wn,onTransferError:e=>{wr.record("error","core","media","media-transfer-failed",()=>({conversation:e.conversation,data:{stage:e.stage,kind:e.kind,messageId:e.messageId},error:{message:"媒体上传失败",data:e.cause}}))},onAlbumContentSize:e=>{wr.record("rejected"===e.outcome?"error":"warn","core","media","rejected"===e.outcome?"media-album-content-rejected":"media-album-content-large",()=>({conversation:e.conversation,data:{messageId:e.messageId,itemCount:e.itemCount,...void 0===e.contentBytes?{}:{contentBytes:e.contentBytes}},...void 0===e.cause?{}:{error:{message:"媒体合集正文未通过发送前体积闸门",data:e.cause}}}))},...void 0===Ur?{}:{assetCache:Ur,onAssetCacheError:e=>{wr.record("warn","core","media","media-asset-cache-put-failed",()=>({data:{operation:e.operation,kind:e.kind,messageId:e.messageId,byteLength:e.byteLength},error:{message:"发送媒体写入本机缓存失败",data:e.cause}}))}},...void 0===mr.media?.maxConcurrentUploads?{}:{maxConcurrentUploads:mr.media.maxConcurrentUploads}}:void 0,sendStrategies:fs,commandHandlers:[...da.commandHandlers,...ca.commandHandlers,...Ls,...Ns,...Ks,...Fs,...Us,...Hs,...ks,...Ds,...qs,...As,...Os,..._s,...aa,...js],readStrategies:ia,canSendDirectReadReceipt:e=>{if(!$r.isDirectReadReceiptEnabled(e))return!1;const t=an.peekRelationship(e);return void 0!==t&&"unknown"!==t?"friend"===t:void 0},recallStrategies:Is,channelMessageDeletion:{resolveProfile:e=>Fo?.getProfile(e)??Promise.resolve(null),onPermissionDenied:e=>Zo.refreshConversationProfile(e,"channel")},editStrategies:ws,storage:kr,onHeartbeat:()=>da.onHeartbeat(),onAuthenticated:()=>{da.setAuthenticated(!0),ca.setAuthenticated(!0);for(const e of oo)e.resumeMedia();const e=uo;uo=!0,(e||"auto"===lo)&&Pa().catch(()=>{}),Vs.start()},isOnline:()=>"undefined"==typeof navigator?void 0:navigator.onLine},mr.connection);Hr=e=>la.suppressDirectReadReceipts(e),Vr=e=>la.resumeDirectReadReceipts(e),Cs=la.sendFrame,bs=()=>"authenticated"===la.state,Ss=la.onChatAck,go=la.terminateConversationSending,Ts=la.markOutboxConversationTerminated,Es=la.clearOutboxConversationTerminated;const ua=L({operations:{getPending:la.getPendingOutbox,retry:la.retryOutboxMessage,cancel:la.cancelOutboxMessage},emitter:vr,isActive:()=>Cr}),ma=l({mediaCrypto:{executor:mn,generation:gr,isActive:()=>Cr},connection:la,domainState:Zo,crypto:yn,settleEmptyGroupRead:async e=>{const t=xo.get(e.conversationId)??0,r=Zo.getSession(e);let o=void 0===r,n=r?.unreadCount??0,s=r?.mentionUnreadCount??0,a=n,i=s;const c=()=>{const r=Zo.getSession(e);if(!Cr||o||void 0===r||t!==(xo.get(e.conversationId)??0)||void 0!==r.groupState&&"active"!==r.groupState)throw new DOMException("群已读请求已失效","AbortError");return r},d=vr.subscribe(t=>{if("conversation"in t&&"group"===t.conversation?.conversationType&&t.conversation.conversationId===e.conversationId&&(("session:removed"===t.type||"conversation-history:cleared"===t.type||"session:updated"===t.type&&void 0!==t.session.groupState&&"active"!==t.session.groupState)&&(o=!0),"read:updated"===t.type||"session:updated"===t.type)){const t=Zo.getReadState(e);if(void 0===t)return;const r=t.mentionUnreadCount??0;a=Math.max(0,a-Math.max(0,n-t.unreadCount)),i=Math.max(0,i-Math.max(0,s-r)),n=t.unreadCount,s=r}});try{c();const t=await fr.getLoginContext();if(c(),null===t||t.userId!==Ir)throw new Error("群已读 read_all:登录上下文已失效");await pr({http:Er,userId:t.userId,groupId:e.conversationId});const r=c(),o=Zo.getReadState(e),n=Math.max(0,(o?.unreadCount??r.unreadCount)-a),s=Math.max(0,(o?.mentionUnreadCount??r.mentionUnreadCount??0)-i);Zo.setReadState({...o??{...e,readCursor:r.readCursor??"",unreadCount:r.unreadCount},mentionUnreadCount:s}),Zo.applyServerUnread(e,n)}finally{d()}},...void 0===fn?{}:{mediaTransfer:fn},prepareDirectReadReceipt:async e=>{try{await an.ensureRelationship(e)}catch(t){vr.emit({type:"error",error:{scope:"http",message:"Direct 已读已在本地提交,但联系人关系查询失败,未发送对端可见回执",cause:{peerId:e,error:t}}})}}}),va=O({recoveryPort:br?.port,connection:la,domainState:Zo,emitter:vr,isActive:()=>Cr,preparePreview:Cn,prepareVideoPoster:bn,prepareImageThumbnail:Sn,onLocalPreviewError:({kind:e,byteLength:t,cause:r})=>{wr.record("warn","sdk","media","local-preview-failed",()=>({generation:gr,data:{kind:e,byteLength:t},error:{message:r instanceof Error?r.message:String(r)}}))},...void 0===Ur?{}:{assetCache:Ur,onAssetCacheEvent:e=>{wr.record("failed"===e.outcome?"warn":"debug","sdk","media",`media-asset-cache-${e.operation}-${e.outcome}`,()=>({data:{operation:e.operation,outcome:e.outcome,kind:e.kind,messageId:e.messageId,...void 0===e.byteLength?{}:{byteLength:e.byteLength}},...void 0===e.cause?{}:{error:{message:"媒体资产缓存操作失败",data:e.cause}}}))}},...void 0===fn?{}:{loaders:{loadImage:ma.operations.loadImage,loadVideo:ma.operations.loadVideo,loadVoice:ma.operations.loadVoice,loadFile:ma.operations.loadFile}}}),ya=J({isActive:()=>Cr&&"ready"===eo&&""!==Ir,maintain:async()=>{va.prune(),la.expireRetainedUploads();const e=(await Promise.allSettled([Fr?Ur?.prune?.():void 0,br?.prune()])).find(e=>"rejected"===e.status);if("rejected"===e?.status)throw e.reason},onError:e=>wr.record("warn","sdk","media","media-cache-maintenance-failed",()=>({error:{message:"媒体过期缓存清理失败",data:e}}))});rn=()=>{la.invalidateMediaAssetCacheWrites(),va.clearCache()},void 0===mr.transport&&"undefined"!=typeof window&&(la.setConnectionAllowed(!1),no=nt({onChange:(e,t)=>{if(!e){if(yo=!0,la.setConnectionAllowed(!1),!Cr)return io?.then(()=>{});Cr=!1,Vs.stop(),jr.clear(),Nn(),wo.abort(),Io.dispose(),Eo.dispose(),To.dispose(),po?.dispose(),mo=!1,vo+=1,ga.stop();return _a({localData:"preserve"},{requireStorageClose:!0,preserveUploadRecovery:!0,notifyReplacement:"replaced"===t}).then(()=>{})}},onError:e=>{ao=e,vr.emit({type:"error",error:{scope:"transport",message:"IM 页面连接协调不可用,请使用支持 Web Locks 的安全浏览器环境",cause:e}})}}));const ga=Ce({onOnline:()=>{Sr.setOnline(!0),la.notifyOnline()},onOffline:()=>{Sr.setOnline(!1),la.notifyOffline()},onVisible:()=>{ya.run(),la.notifyVisible();for(const e of oo)e.resumeMedia()},onPageHide:()=>{mo&&la.suspendForPageLifecycle()},onPageShow:()=>{if(ya.run(),mo){la.resumeFromPageLifecycle(),la.notifyVisible();for(const e of oo)e.resumeMedia()}}},mr.network);const ha=vr.subscribe(e=>{Cr&&"auth:invalid"===e.type&&(Vs.stop(),mo=!1,vo+=1,yo=void 0!==no,no?.terminate(),ga.stop())});async function fa(e,t={}){const r=await(Tn?.getUserPrivateKey(e,{priority:t.priority??"background",signal:t.signal??wo.signal}))??null;return{crypto:yn,resolvePrivateKey:({msgType:e})=>1===e||1e3===e?r?.privateKey??null:null,onDecryptError:t=>Jr("offline",t,e),onDecryptRecovery:Kr}}function Ia(e,t,r){const o=void 0===t?Zo.getMessages().filter(t=>t.conversationType===e):Zo.getMessagesByConversation(t).filter(e=>void 0===r||r.includes(e.id)),n=new Map(o.map(e=>[_r({conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id}),e])),s=/* @__PURE__ */new Set,a=vr.subscribe(o=>{if(("message:received"===o.type||"message:updated"===o.type)&&o.conversation.conversationType===e&&(void 0===t||o.conversation.conversationId===t.conversationId&&(void 0===r||r.includes(o.message.id)))){const e=_r({conversation:o.conversation,messageId:o.message.id}),t=n.get(e);"live"!==o.source||void 0!==t&&Ft(t,o.message)||s.add(e),n.set(e,o.message)}});return{stop:()=>{a(),n.clear(),s.clear()},acceptsRecovery:e=>!s.has(_r(e)),messages:e=>e.map(e=>{const t={conversationType:e.conversationType,conversationId:e.conversationId};return s.has(_r({conversation:t,messageId:e.id}))?Zo.getConversationMessage(t,e.id)??e:e})}}function wa(e,t){const r=Ir,o=new Map(Po),n=/* @__PURE__ */new Map,s=e=>{if(Rt(wo.signal),!Cr||r!==Ir)throw new DOMException("DIRECT 计算所属账号已失效","AbortError");void 0!==e&&n.set(we(e),e);for(const[e,t]of n)if((o.get(e)?.version??0)!==Ao(t))throw void 0!==Po.get(e)?.reason?Po.get(e).reason:new DOMException("DIRECT 计算所属会话已清理","AbortError");t?.()};return{publish(e,t){s();const r=t();return s(),r},executor:mn,generation:gr,operationId:"direct-batch:"+ ++Zn,priority:e,signal:wo.signal,assertCurrent:s,yieldToEventLoop:Ut}}function Ca(e,t,r){const o=Ir,n=new Map(Po),s=/* @__PURE__ */new Map,a=e=>{if(Rt(wo.signal),Rt(t),!Cr||Ir!==o)throw new DOMException("GROUP 计算所属账号已失效","AbortError");void 0!==e&&s.set(we(e),e);for(const[e,t]of s)if((n.get(e)?.version??0)!==Ao(t))throw void 0!==Po.get(e)?.reason?Po.get(e).reason:new DOMException("GROUP 计算所属群密钥、权限或历史已失效","AbortError");r?.()};return{publish(e,t){a();const r=e.filter(e=>{if("group"!==e.conversationType||void 0===e.body.system)return!1;const t=Bt(e.body.system,Ir);return null!==t&&"active"!==t.state}).map(e=>({conversationType:"group",conversationId:e.conversationId})),o=t();for(const e of r){const t=we(e);void 0===Po.get(t)?.reason&&n.set(t,{version:Ao(e)})}return a(),o},executor:{async decryptBatch(t){const r=[...s.values()];ls.set(t.operationId,r);try{const o="foreground"===e||r.some(e=>!0===po?.hasForeground(e))?"foreground":"background";return await mn.decryptBatch({...t,priority:o})}finally{ls.delete(t.operationId)}}},generation:gr,operationId:"group-batch:"+ ++Zn,priority:e,signal:t??wo.signal,assertCurrent:a,yieldToEventLoop:Ut}}async function ba(e,t,r,o,n){const s=[];let a;try{0===e.length&&0===t.length&&n([],()=>{s.push(Promise.resolve(Zo.commitReceivedMessages([],"offline")))});for(const e of t)n([],()=>{s.push(Promise.resolve(Zo.commitReceivedMessages([],"offline",void 0,{events:[e],apply:e=>Ms.ingest(e,"offline")})))});for(const t of e){const e=Zo.prepareOfflineMessageUpdate(t,o);("boolean"==typeof e?e:await e)&&n([t],()=>{s.push(Promise.resolve(Zo.commitReceivedMessages([t],"offline")))})}for(const e of r)n([],()=>{Kr(e);const t=Dr.get(_r(e));void 0!==t&&s.push(t)})}catch(e){a={cause:e}}const i=await Promise.allSettled(s);if(void 0!==a)throw a.cause;const c=i.find(e=>"rejected"===e.status);if("rejected"===c?.status)throw c.reason;o()}function Sa(e,t){return{endpoint:e,pullBatch:async({deliveredMsgInfos:r,limit:o})=>{const n=Ia("direct");try{const s=[],a=Ir,i=wa("background");i.assertCurrent?.();const c=await fr.getLoginContext();if(null===c)throw new Error(`sync(${e}): 无登录上下文(authProvider.getLoginContext 返回 null)`);if(i.assertCurrent?.(),""!==a&&c.userId!==a)throw new DOMException("DIRECT 离线同步的登录账号已改变","AbortError");const d=await fa(c.userId);i.assertCurrent?.();const p=[],l=await t({http:Er,userId:c.userId,clientType:hr,decryptDeps:{...d,onDecryptRecovery:e=>s.push(e)},asyncDecrypt:i,deliveredMsgInfos:r,...void 0===o?{}:{limit:o},onReaction:e=>p.push(e)});return i.assertCurrent?.(),{...l,reactions:p,commit:async()=>{try{await ba(n.messages(l.messages).sort(Nt),p,s.filter(n.acceptsRecovery),()=>i.assertCurrent?.(),i.publish)}finally{n.stop()}}}}catch(e){throw n.stop(),e}}}}async function Ta(e,t){const r=[...new Map(e.map(e=>[we(e),e])).values()],o=[];let n=0;if(await(async()=>{for(;n<r.length;){if(!Cr)return;const e=r[n++],s="group"===e.conversationType?{conversationType:"group",conversationId:e.conversationId}:void 0,a=void 0!==s&&void 0!==t&&t.groupIds.has(e.conversationId)&&Zo.hasRecoverableConversationDeletion(s)?{ref:s,userId:t.userId}:void 0;if(a||void 0!==Zo.getSession(e)&&void 0!==ps(e))try{if(await Io.waitForBackground(wo.signal),!Cr)return;if(a&&await Ea(a.ref,a.userId))continue;if(!Cr||void 0===Zo.getSession(e)||void 0===ps(e))continue;po.invalidate(e,{preserveForeground:!0}),await co({conversation:e,oldestLoaded:void 0,intent:"establish-latest",limit:30})}catch(t){if(a){o.push(t);continue}if(!Cr||void 0===Zo.getSession(e)||void 0===ps(e))continue;vr.emit({type:"error",error:{scope:"sync",message:"会话最新消息同步失败",cause:t}}),wr.record("warn","sdk","sync","session-latest-summary-failed",()=>({conversation:e,error:{message:"会话最新消息同步失败",data:t}}))}}})(),o.length>0)throw new AggregateError(o,"已删除群会话恢复失败")}async function Ea(e,t){if(!Zo.hasRecoverableConversationDeletion(e))return!1;const r=Ca("background");r.assertCurrent?.(e);const o=Ia("group",e);try{const n=[],s=[],a=await Ot({http:Er,userId:t,clientType:hr,groupId:e.conversationId,baseTime:Date.now(),direct:1,limit:30,signal:wo.signal,asyncDecrypt:r,decryptDeps:{...Un("history"),onDecryptRecovery:e=>n.push(e)},prepareKeys:e=>Fn(e,{priority:"background",signal:wo.signal}),onReaction:e=>s.push(e)});r.assertCurrent?.(e);const i=o.messages(a.messages).sort(Nt);return await ba(i,s,n.filter(o.acceptsRecovery),()=>r.assertCurrent?.(e),r.publish),void 0!==Zo.getSession(e)}finally{o.stop()}}async function Ra(){const e=Wr("sync");wr.record("info","sdk","sync","channel-sync-start",()=>({operationId:e,data:{clientTypeHeader:hr,sessionsClientTypeBody:"absent",offlineClientTypeBody:hr}}));try{await async function(e){const t=Oo,r=new Map(Do),n=e=>Cr&&t===Oo&&(r.get(e)??0)===_o(e);if(void 0===Fo)return void wr.record("info","sdk","sync","channel-sync-skipped",()=>({operationId:e,data:{reason:"profile-unavailable"}}));const s=await fr.getLoginContext();if(null===s)return void wr.record("info","sdk","sync","channel-sync-skipped",()=>({operationId:e,data:{reason:"auth-unavailable"}}));const a=(await Fo.listProfiles({forceRefresh:!0})).filter(e=>n(e.id));if(!Cr)return;if(0===a.length)return void wr.record("info","sdk","sync","channel-sync-complete",()=>({operationId:e,data:{profileCount:0,sessionCount:0,offlineMessageCount:0}}));const i=new Map(a.map(e=>[e.id,e]));for(const e of a){if(Zr(e.channelState)){Mn?.clearChannelKey(e.id),Rs.removeConversationForMembershipTermination({conversationType:"channel",conversationId:e.id},`channel_${e.channelState}`);continue}const t=e.permissions.sendMessages?void 0:`channel_${e.channelState}`;Zo.setChannelRestriction(e.id,e.channelState,t,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}}),Zo.updateConversationProfile({conversationType:"channel",conversationId:e.id},{title:e.name,avatar:e.avatar}),void 0!==e.muted&&Zo.setMuted({conversationType:"channel",conversationId:e.id},e.muted)}const c=new Map(a.map(e=>{const t={conversationType:"channel",conversationId:e.id},r=Zo.getReadState(t),o=Zo.getSession(t);return[e.id,{revision:Zo.getChannelReadRevision(t),pending:Zo.hasPendingChannelRead(t),readCursor:r?.readCursor??o?.readCursor??"",unreadCount:o?.unreadCount??r?.unreadCount??0,mentionUnreadCount:o?.mentionUnreadCount??r?.mentionUnreadCount??0}]})),d=a.map(e=>({channelId:e.id,readCursor:c.get(e.id).readCursor}));wr.record("debug","sdk","sync","channel-sessions-request",()=>({operationId:e,data:{channelCount:d.length,channelsWithReadCursor:d.filter(e=>""!==e.readCursor).length,clientTypeHeader:hr,clientTypeBody:hr}}));const p=await qt({http:Er,userId:s.userId,clientType:hr,channels:d,operationId:e,decryptDeps:jn("offline"),prepareKeys:e=>An(e.filter(e=>{const t=i.get(e)?.channelState;return void 0===t||!o(t)})),onContentDecodeError:Xr,onReaction:is});if(!Cr)return;wr.record("debug","sdk","sync","channel-sessions-response",()=>({operationId:e,data:{sessionCount:p.length,lastMessageCount:p.filter(e=>void 0!==e.last).length,decryptFailedLastCount:p.filter(e=>!0===e.last?.encryption.decryptFailed).length,unknownContentLastCount:p.filter(e=>"unknown"===e.last?.contentType&&!0!==e.last.encryption.decryptFailed).length}}));const l=new Set(p.filter(e=>{const t=c.get(e.channelId),r={conversationType:"channel",conversationId:e.channelId},o=Zo.getReadState(r),n=Zo.getSession(r);return void 0===t||t.pending||Zo.hasPendingChannelRead(r)||Zo.getChannelReadRevision(r)!==t.revision||(o?.readCursor??n?.readCursor??"")!==t.readCursor||(n?.unreadCount??o?.unreadCount??0)!==t.unreadCount||(n?.mentionUnreadCount??o?.mentionUnreadCount??0)!==t.mentionUnreadCount}).map(e=>e.channelId)),u=p.filter(e=>n(e.channelId)&&void 0!==Zo.getConversationContext({conversationType:"channel",conversationId:e.channelId})).map(e=>{const t=i.get(e.channelId),r=t?.channelState,n=void 0!==r&&o(r)?r:o(e.channelState)?e.channelState:r??e.channelState,s="active"===n?void 0:n===e.channelState?e.sendDisabledReason:`channel_${n}`;return{...e,channelState:n,sendDisabledReason:s}});for(const e of u){const t=i.get(e.channelId);Zo.setChannelRestriction(e.channelId,e.channelState,e.sendDisabledReason,void 0===t?void 0:{permissions:t.permissions,...void 0===t.accessSnapshot?{}:{snapshot:t.accessSnapshot}}),void 0!==t&&(Zo.updateConversationProfile({conversationType:"channel",conversationId:e.channelId},{title:t.name,avatar:t.avatar}),void 0!==t.muted&&Zo.setMuted({conversationType:"channel",conversationId:e.channelId},t.muted)),l.has(e.channelId)||Zo.applyChannelReadSummary({conversationType:"channel",conversationId:e.channelId},e),o(e.channelState)&&Mn?.clearChannelKey(e.channelId)}const m=e=>{const t=Zo.getConversationContext({conversationType:"channel",conversationId:e});return n(e)&&void 0!==t&&(void 0===t.channelState||!o(t.channelState))},v=(e,r=!0)=>{if(!Cr||t!==Oo)return[];const o=e.filter(e=>m(e.conversationId));return o.length>0&&Zo.upsertMessages(o,"offline",{applyChannelLifecycleEffects:r}),o},y=async(e,t,r=[],o=[],n=!0)=>{const s=()=>m(e.conversationId),a=()=>{if(!s())throw new DOMException("社群离线提交所属会话已失效","AbortError")};if(!s())return!1;const i=Ia("channel",e);try{const c=[];for(const e of[...t].sort(Nt)){const t=Zo.prepareOfflineMessageUpdate(e,a);("boolean"==typeof t?t:await t)&&c.push(e)}a();const d=async()=>{const e=o.filter(i.acceptsRecovery);if(e.length>0&&void 0===kr?.saveDecryptRecovery)throw new Error("CHANNEL 同步不能保存解密恢复记录");for(const t of e)await kr.saveDecryptRecovery(t)};if(!0===kr?.supportsChannelSyncCheckpoint)return await Zo.commitChannelSyncPage([e],()=>{v(i.messages(c),n);for(const e of r)s()&&is(e)},s,d);await Zo.commitReceivedMessages(i.messages(c),"offline",{applyChannelLifecycleEffects:n},{events:r,apply:e=>Ms.ingest(e,"offline")});for(const e of o.filter(i.acceptsRecovery))a(),Kr(e),await Dr.get(_r(e));return s()}finally{i.stop()}},g=[],h=/* @__PURE__ */new Set;for(const e of u)if(void 0!==e.last)try{await y({conversationType:"channel",conversationId:e.channelId},[e.last])}catch(t){g.push(t),h.add(e.channelId)}const f=/* @__PURE__ */new Set;for(const t of u){const r={conversationType:"channel",conversationId:t.channelId};if(void 0!==t.last||t.unreadCount<=0||""!==t.readCursor||o(t.channelState)||!Zo.hasRecoverableConversationDeletion(r,{includeRestored:!0}))continue;const n=Ia("channel",r);try{if(await Io.waitForBackground(wo.signal),!m(t.channelId))continue;const o=[],a=[],i=await Wt({http:Er,userId:s.userId,clientType:hr,channelId:t.channelId,count:lr,operationId:e,signal:wo.signal,decryptDeps:{...jn("history"),onDecryptRecovery:e=>a.push(e)},prepareKey:e=>An([e],{signal:wo.signal,priority:"background"}),onContentDecodeError:Xr,onReaction:e=>o.push(e)});await y(r,n.messages(i.messages),o,a.filter(n.acceptsRecovery),!1)&&f.add(t.channelId)}catch(e){g.push(e),h.add(t.channelId)}finally{n.stop()}}await Ta(u.filter(e=>void 0===e.last&&!o(e.channelState)&&!f.has(e.channelId)&&!h.has(e.channelId)).map(e=>({conversationType:"channel",conversationId:e.channelId})));const I=u.filter(e=>!h.has(e.channelId)&&!l.has(e.channelId)&&!o(e.channelState)&&e.unreadCount>0&&""!==e.readCursor);wr.record("debug","sdk","sync","channel-offline-plan",()=>{const t={staleRead:0,historyBlocked:0,zeroUnread:0,emptyReadCursor:0};for(const e of u)l.has(e.channelId)?t.staleRead+=1:o(e.channelState)?t.historyBlocked+=1:e.unreadCount<=0?t.zeroUnread+=1:""===e.readCursor&&(t.emptyReadCursor+=1);return{operationId:e,data:{acceptedSessionCount:u.length,eligibleChannelCount:I.length,staleReadSkippedCount:t.staleRead,historyBlockedSkippedCount:t.historyBlocked,zeroUnreadSkippedCount:t.zeroUnread,emptyReadCursorSkippedCount:t.emptyReadCursor,direction:0,contain:0,count:lr}}});const w=[],C=new Map(I.map(e=>[e.channelId,e.readCursor])),b=[];for(const t of I){const r={conversationType:"channel",conversationId:t.channelId},o=!0!==kr?.supportsChannelSyncCheckpoint?void 0:Qt(await kr.getMeta(Yt(r)),r);if(!m(t.channelId))continue;const n=o?.startIndex===t.readCursor;b.push({channelId:t.channelId,baseIndex:n?o.baseIndex:t.readCursor}),wr.record("debug","sdk","sync","channel-offline-resume",()=>({operationId:e,conversation:r,data:{resumed:n}}))}const S=[],T=[];let E;if(await zt({http:Er,userId:s.userId,clientType:hr,operationId:e,pulls:b,messageCount:lr,signal:wo.signal,beforePage:()=>Io.waitForBackground(wo.signal),isChannelCurrent:m,yieldToEventLoop:Ut,decryptDeps:{...jn("offline"),onDecryptRecovery:e=>T.push(e)},prepareKeys:e=>An(e,{recoverExistingMessages:!1}),onContentDecodeError:Xr,onReaction:e=>S.push(e),onPage:async(e,t)=>{const r=S.splice(0),o=T.splice(0),n=(async()=>{for(const n of t.pulls){const s={conversationType:"channel",conversationId:n.channelId},a=()=>m(n.channelId);if(!a())continue;const i=o.filter(e=>e.conversation.conversationId===n.channelId),c=e.filter(e=>e.conversationId===n.channelId),d=await y(s,c,r.filter(e=>e.conversation.conversationId===n.channelId),i);if(d&&w.push(...c),!0!==kr?.supportsChannelSyncCheckpoint)continue;if(!d||!a())continue;const p=t.nextBaseIndexes[n.channelId];void 0!==p&&await Zo.saveChannelSyncCheckpoint({version:1,conversation:s,startIndex:C.get(n.channelId),baseIndex:p},a);for(const e of i)a()&&ns(e).catch(e=>vr.emit({type:"error",error:{scope:"storage",message:"CHANNEL 解密恢复失败",cause:e}}))}})();Co.add(n);try{await n}finally{Co.delete(n)}}}).catch(e=>{E={cause:e}}),!Cr)return;const R=u.flatMap(e=>{const t=e.last;if(void 0===t||qn(t))return[];const r=t.extensions?.historyCursor;return[{summary:e,last:t,historyCursor:"string"==typeof r?r.trim():""}]}),M=(e,t)=>`${e}:${t}`,k=/* @__PURE__ */new Map,D=/* @__PURE__ */new Set;for(const{summary:e,last:t}of R){const r=Zo.getConversationMessage({conversationType:"channel",conversationId:e.channelId},t.id);if(void 0===r||!qn(r))continue;const o=M(e.channelId,t.id);k.set(o,r),D.add(o)}for(const e of w)qn(e)&&k.set(M(e.conversationId,e.id),e);const x=R.filter(({summary:e,last:t,historyCursor:r})=>!(""===r||l.has(e.channelId)||o(e.channelState)||k.has(M(t.conversationId,t.id))||$n.has(M(t.conversationId,t.id)))),P=R.filter(({summary:e,last:t})=>!l.has(e.channelId)&&!o(e.channelState)&&!D.has(M(t.conversationId,t.id))&&k.has(M(t.conversationId,t.id))).length;wr.record("debug","sdk","sync","channel-session-last-recovery-plan",()=>({operationId:e,data:{unusableLastCount:R.length,decryptFailedLastCount:R.filter(({last:e})=>!0===e.encryption.decryptFailed).length,unknownContentLastCount:R.filter(({last:e})=>"unknown"===e.contentType&&!0!==e.encryption.decryptFailed).length,localRecoveredCount:D.size,offlineRecoveredCount:P,contextRecoveryCount:x.length,staleReadSkippedCount:R.filter(e=>l.has(e.summary.channelId)).length,historyBlockedSkippedCount:R.filter(e=>o(e.summary.channelState)).length,missingHistoryCursorCount:R.filter(e=>""===e.historyCursor).length}}));const A=async({summary:t,last:r,historyCursor:n})=>{try{if(await Io.waitForBackground(wo.signal),!m(t.channelId))return;const{message:a}=await ra.loadMessageContext(t.channelId,n,s.userId,wo.signal),i=Zo.getConversationContext({conversationType:"channel",conversationId:t.channelId});if(!Cr||"channel"!==i?.type||void 0!==i.channelState&&o(i.channelState))return;if("channel"!==a.conversationType||a.conversationId!==t.channelId||a.id!==r.id)throw new Error(`CHANNEL sessions.last 精确恢复结果不匹配(channelId=${t.channelId}, messageId=${r.id})`);if(!qn(a)){if("unknown"===a.contentType&&!0!==a.encryption.decryptFailed)return $n.add(M(a.conversationId,a.id)),void wr.record("info","sdk","sync","channel-session-last-unknown-confirmed",()=>({operationId:e,conversation:{conversationType:"channel",conversationId:t.channelId},data:{messageId:r.id,reason:a.body.unknown?.reason}}));throw new Error(`CHANNEL sessions.last 精确恢复未取得可用正文(channelId=${t.channelId}, messageId=${r.id})`)}return a}catch(o){return void wr.record("warn","sdk","sync","channel-session-last-recovery-failed",()=>({operationId:e,conversation:{conversationType:"channel",conversationId:t.channelId},error:{message:"CHANNEL sessions.last 精确恢复失败",data:o},data:{messageId:r.id}}))}},j=[];for(const e of x){if(!Cr)break;j.push(await A(e))}for(const e of j)void 0!==e&&k.set(M(e.conversationId,e.id),e);const O=j.filter(e=>{if(void 0===e)return!1;const t=Zo.getConversationMessage({conversationType:"channel",conversationId:e.conversationId},e.id);return void 0===t||!qn(t)});if(v(O),1===g.length&&void 0===E)throw g[0];if(g.length>0)throw new AggregateError([...g,...void 0===E?[]:[E.cause]],"社群摘要或离线恢复保存失败");if(void 0!==E)throw E.cause;wr.record("info","sdk","sync","channel-sync-complete",()=>({operationId:e,data:{profileCount:a.length,terminalProfileCount:a.filter(e=>Zr(e.channelState)).length,sessionCount:p.length,acceptedSessionCount:u.length,sessionLastCount:u.filter(e=>void 0!==e.last).length,recoveredSessionLastCount:R.filter(({last:e})=>k.has(M(e.conversationId,e.id))).length,offlineMessageCount:w.length}}))}(e)}catch(t){throw wr.record("error","sdk","sync","channel-sync-failed",()=>({operationId:e,error:{message:"CHANNEL 同步失败",data:t}})),t}}let Ma=null,ka=!1;const Da=Kt({commitBatch:async function(e,t=[]){if(!Cr)throw new Error("离线消息提交已取消");await Zo.commitReceivedMessages(e,"offline",void 0,{events:t??[],apply:e=>Ms.ingest(e,"offline")});const r=e.flatMap(e=>{const t=Dr.get(_r({conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id}));return void 0===t?[]:[t]});if(await Promise.all(r),!Cr)throw new Error("离线消息提交已取消")},pullers:[Sa("chat",St),Sa("owner_chat",Tt),{endpoint:"group",pullBatch:async({deliveredMsgInfos:e,limit:t})=>{const r=Ir,o=Ca("background"),n=Ia("group");try{o.assertCurrent?.();const s=await fr.getLoginContext();if(null===s)throw new Error("sync(group): 无登录上下文(authProvider.getLoginContext 返回 null)");if(o.assertCurrent?.(),""!==r&&s.userId!==r)throw new DOMException("GROUP 离线同步的登录账号已改变","AbortError");const a=[],i=[],c=await _t({http:Er,userId:s.userId,clientType:hr,decryptDeps:{...Un("offline"),onDecryptRecovery:e=>i.push(e)},asyncDecrypt:o,prepareKeys:Fn,deliveredMsgInfos:e,...void 0===t?{}:{limit:t},onReaction:e=>a.push(e)});return o.assertCurrent?.(),{...c,reactions:a,commit:async()=>{try{await ba(n.messages(c.messages).sort(Nt),a,i.filter(n.acceptsRecovery),()=>o.assertCurrent?.(),o.publish)}finally{n.stop()}}}}catch(e){throw n.stop(),e}}}],domainState:Zo,emitter:vr,logger:zr,yieldToEventLoop:Ut});const xa=H({domainState:Zo,storage:kr,getSelfId:()=>Ir,assertCurrent:()=>{if(!Cr||wo.signal.aborted)throw new DOMException("客服历史恢复所属账号已失效","AbortError")},hasPendingSend:e=>la.getPendingOutbox().some(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId),fetch:async e=>{const t=Ir,r=()=>{if(!Cr||wo.signal.aborted||Ir!==t)throw new DOMException("客服历史查询所属账号已失效","AbortError")},o=await fa(t);r();const n=await Dt({http:Er,userId:t,clientType:hr,messageIds:e,decryptDeps:o,asyncDecrypt:wa("background",r)});if(r(),200!==n.code)throw new Error(`客服历史原文查询失败:${n.code}`);return n.messages}});async function Pa(){if(void 0!==no&&(!no.owned||yo))throw new Error("当前页面未持有 IM 连接,不能同步消息");const e=To.begin(),t=Eo.begin(),r=async function(){const e=Ir,t=Ca("background"),r=Ia("group");try{t.assertCurrent?.();const o=await fr.getLoginContext();if(null===o)return;if(t.assertCurrent?.(),""!==e&&o.userId!==e)throw new DOMException("GROUP 会话同步的登录账号已改变","AbortError");const n=[],s=[],a=await jt({http:Er,userId:o.userId,clientType:hr,decryptDeps:{...Un("offline"),onDecryptRecovery:e=>s.push(e)},asyncDecrypt:t,prepareKeys:Fn,onReaction:e=>n.push(e)});t.assertCurrent?.();for(const e of a.unreads)t.assertCurrent?.(),Zo.applyServerUnread({conversationType:"group",conversationId:e.groupId},e.unreadCount),_n(e.groupId);await ba(r.messages(a.messages).sort(Nt),n,s.filter(r.acceptsRecovery),()=>t.assertCurrent?.(),t.publish),t.assertCurrent?.(),await Ta(a.unreads.map(e=>({conversationType:"group",conversationId:e.groupId})),{userId:o.userId,groupIds:new Set(a.unreads.filter(e=>e.unreadCount>0).map(e=>e.groupId))}),t.assertCurrent?.(),Lt(a)}finally{r.stop()}}().catch(e=>{throw vr.emit({type:"error",error:{scope:"sync",message:"群会话摘要同步失败",cause:e}}),e}),o=(null!==Ma?(ka=!0,Ma):(Ma=(async()=>{let e;do{ka=!1,e=void 0;try{await Ra()}catch(t){e=t}}while(ka);if(void 0!==e)throw e})().finally(()=>{Ma=null}),Ma)).catch(e=>{throw vr.emit({type:"error",error:{scope:"sync",message:"CHANNEL 会话与离线消息同步失败",cause:e}}),e});bo+=1;try{const e=xa.run().catch(e=>{throw vr.emit({type:"error",error:{scope:"sync",message:"旧客服消息恢复失败,已保留未恢复的本机记录,可刷新重试",cause:e}}),e}),t=(await Promise.allSettled([Da.sync({rejectOnFailure:!0}),r,o,e])).find(e=>"rejected"===e.status);if("rejected"===t?.status)throw t.reason}finally{t(),e(),bo-=1,So="authenticated"===la.state,po?.notifySchedulingChanged()}}async function Aa(){if("ready"===eo)return;eo="preparing";const e=await fr.getLoginContext();if(Cr){if(null!==e){if(await async function(e){if(void 0!==no&&Cr){if(!yo){so??(so=no.start(yr.forAccount(e).name("ephemeral","connection",`client-${hr}`)));const t=await so;if(!Cr)return;if(Cr&&!yo&&t&&no.owned)return void la.setConnectionAllowed(!0)}if(la.setConnectionAllowed(!1),await la.connect(),void 0!==ao)throw Object.assign(new Error("Browser IM coordination is unavailable"),{code:"IM_CONNECTION_OWNERSHIP_UNAVAILABLE",cause:ao});throw Object.assign(new Error("Chat is active in another page; reload this page to continue here"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"})}}(e.userId),!Cr)return;Ir=e.userId;try{await(br?.prepare(e.userId))}catch{vr.emit({type:"error",error:{scope:"storage",message:"上传恢复记录不可用,本次上传仅支持当前页面内恢复"}})}if(!Cr)return;if(un.start(),void 0!==Tn&&Tn.getUserPrivateKey(e.userId,{priority:"foreground"}).catch(hn),void 0!==kr)try{if(await kr.open({namespace:e.userId}),Fr=!0,!Cr)return;try{await $r.hydrate()}catch(e){vr.emit({type:"error",error:{scope:"storage",message:"IM 设置初始化失败,已暂停发送 direct 已读回执",cause:e}})}if(!Cr)return;if(await Zo.hydrate(()=>Cr),!Cr)return;for(const e of Zo.getSessions())""===e.title&&"supergroup"!==e.type&&Zo.refreshConversationProfile(e.id,e.type);if(await la.hydrateOutbox(()=>Cr),!Cr)return}catch(e){vr.emit({type:"error",error:{scope:"storage",message:"本地存储初始化失败",cause:e}})}if(!Cr)return;if(void 0!==Rn)for(const e of Zo.getSessions())"group"===e.type&&_n(e.id)}Cr&&(eo="ready",""!==Ir&&ya.start())}}function ja(){if(yo)return Promise.reject(Object.assign(new Error("Chat is active in another page"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"}));if("ready"===eo)return Promise.resolve();if(null!==ho)return ho;const e=Date.now();return wr.record("info","sdk","session","prepare-start"),ho=Aa().then(()=>wr.record("info","sdk","session","prepare-complete",()=>({durationMs:Date.now()-e}))).catch(t=>{throw wr.record("error","sdk","session","prepare-failed",()=>({durationMs:Date.now()-e,error:{message:"IM prepare 失败",data:t}})),t}).finally(()=>{ho=null}),ho}function Oa(e){wr.record("info","sdk","connection","disconnect",()=>({data:{reason:e}})),mo=!1,vo+=1,Vs.stop(),la.disconnect(e),ga.stop()}function _a(e,t={}){if(void 0!==io)return io;let r,o;return io=new Promise((e,t)=>{r=e,o=t}),async function(e,t){const r=Date.now();let o;wr.record("info","sdk","session","teardown-start",()=>({data:{localData:e?.localData??"preserve",pendingMessages:e?.pendingMessages??"fail"}})),Cr=!1,jr.clear(),Nn(),wo.abort(),Io.dispose(),Eo.dispose(),To.dispose(),na.dispose(),t.notifyReplacement&&vr.emit({type:"session:replaced"});const n=ya.dispose(),s=po?.dispose();us(),pa(),ca.dispose(),da.dispose(),Vs.stop(),Bs.dispose(),Gs.dispose(),Ms.dispose(),ua.dispose(),va.dispose(),In.dispose(),cn.dispose(),an.dispose();const a=la.disposeMediaTasks({preserveRecovery:!0===t.preserveUploadRecovery});for(const e of oo)e.close();oo.clear(),Oo+=1,la.markOutboxForLogout(e?.pendingMessages??"fail"),ea.dispose(),ta.dispose(),ra.dispose(),Go.dispose(),Vo.dispose(),qo.dispose(),Gr.dispose();const i=$r.dispose();dn.dispose();const c=Zo.invalidateAndDrainDraftOperations();pn.dispose(),zs(),Qs(),Zs(),Ps(),Js.dispose(),sa.reset(),Mn?.clearAll(),Hn.clear(),Vn.clear(),$n.clear(),Oa("im-logout"),(t.requireStorageClose||!0===no?.owned)&&await(ho?.catch(()=>{}));try{await a}catch{vr.emit({type:"error",error:{scope:"storage",message:"上传任务清理未完成,请检查本地数据与网络状态"}})}await n;try{await(br?.dispose(!0===t.preserveUploadRecovery))}catch(e){o=e,vr.emit({type:"error",error:{scope:"storage",message:"上传恢复记录清理失败,请清除此站点的本地数据"}})}await c,await i,await s,await Promise.allSettled([...Co]),await Zo.waitForChannelSyncPersistence(),await Promise.allSettled([...Dr.values(),...Bn.values()]),await Promise.all([...Or.values()]),Zo.clearSession();const d="purge"===e?.localData?Ir:"";let p,l=""===d?void 0:o,u=!0;if(void 0!==kr)try{await kr.close()}catch(e){u=!1,""!==d&&(l=e),!1!==t.reportStorageErrors&&vr.emit({type:"error",error:{scope:"storage",message:""===d?"关闭本地存储失败":"关闭本地存储失败,已跳过删除本账号本地库",cause:e}})}if(""!==d&&u)try{void 0!==Mr?await Mr.purgeCurrentAccount({namespaceFactory:yr,accountId:d}):await ae(d,{namespaceFactory:yr}),void 0===l&&(p=d)}catch(e){l=e,!1!==t.reportStorageErrors&&vr.emit({type:"error",error:{scope:"storage",message:"删除本账号本地库失败",cause:e}})}if(eo="empty",wr.record("info","sdk","session","teardown-complete",()=>({durationMs:Date.now()-r,data:{purgedAccountId:p,purgeFailed:void 0!==l}})),sn(),to(),$s(),ha(),yo=!0,(t.requireStorageClose||void 0!==no)&&!u)throw new Error("Previous chat page could not close its account storage");return no?.stop(),{...void 0===p?{}:{purgedAccountId:p},...void 0===l?{}:{purgeError:l}}}(e,t).then(r,o),io}function Na(e){const t=e.conversationId,r=Ir,n=Oo,s=_o(t);let a,i;return async({readCursor:c,cursor:d,signal:p,isCurrent:l})=>{const u=Io.enterForeground();try{const u=()=>{const a=Zo.getConversationContext(e);return Cr&&Ir===r&&l()&&n===Oo&&s===_o(t)&&"channel"===a?.type&&(void 0===a.channelState||!o(a.channelState))};if(Rt(p),!u())return;if(void 0!==d&&(a!==c||void 0===i))return;const m=await fr.getLoginContext();if(Rt(p),null===m||m.userId!==r||!u())return;const v=[],y=[],g=await Mt({http:Er,userId:m.userId,clientType:hr,channelId:t,index:d??c,containAnchor:void 0===d,signal:p,decryptDeps:{...jn("history"),onDecryptRecovery:e=>y.push({...e,source:"history"})},prepareKey:e=>An([e],{recoverExistingMessages:!1,priority:"foreground",signal:p}),onContentDecodeError:Xr,onReaction:e=>v.push(e)});if(Rt(p),!u())return;if(void 0===d){const e=g.messages.find(e=>e.extensions?.historyCursor===c);if(void 0===e)return;a=c,i=e.sortKey}if(void 0===i)return;if(g.messages.length>0&&Zo.upsertMessages(g.messages,"offline",{backfillOnly:!0}),!u())return;for(const e of v){if(!u())return;is(e)}for(const e of y){if(!u())return;Kr(e)}if(!u())return;return{messages:g.messages.map(t=>{const r=Zo.getConversationMessage(e,t.id);if(void 0===r)throw new Error("首未读历史邻页在领域合并后缺少消息");return r}),readCursorSortKey:i,exhausted:!g.hasNewer,...void 0===g.nextCursor?{}:{nextCursor:g.nextCursor}}}finally{u()}}}async function La(){const e=Ia("direct");try{const t=[],r=[],o=Ir,n=wa("background");n.assertCurrent?.();const s=await fr.getLoginContext();if(null===s)throw new Error("pullOfflineChat: 无登录上下文(authProvider.getLoginContext 返回 null)");if(n.assertCurrent?.(),""!==o&&s.userId!==o)throw new DOMException("DIRECT 离线拉取的登录账号已改变","AbortError");const a={...await fa(s.userId),onDecryptRecovery:e=>t.push(e)},i=await Ct({http:Er,userId:s.userId,clientType:hr,decryptDeps:a,asyncDecrypt:n,onReaction:e=>r.push(e)}),c=await bt({http:Er,userId:s.userId,clientType:hr,decryptDeps:a,asyncDecrypt:wa("background",n.assertCurrent),onReaction:e=>r.push(e)});n.assertCurrent?.();const d=e.messages([...i,...c]);return await ba(d,r,t.filter(e.acceptsRecovery),()=>n.assertCurrent?.(),n.publish),d}finally{e.stop()}}Mo=async({conversation:e,newestLoaded:t,cursor:r,limit:n,signal:s})=>{Rt(s);const{conversationId:a}=e,i=Zo.getConversationContext(e);if(void 0===i)throw new Error(`加载更新消息失败:会话不存在(conversationId=${a})`);if("direct"===i.type||"robot"===i.type||"customerService"===i.type)return{messages:[],exhausted:!0};if("group"===i.type){if(void 0!==i.groupState&&"active"!==i.groupState)return{messages:[],exhausted:!0};const o={conversationType:"group",conversationId:a},c=Ir,d=Ca(!0===po?.hasForeground(e)?"foreground":"background",s);d.assertCurrent?.(o);const p=Ia("group",o);try{const o=await fr.getLoginContext();if(null===o)return{messages:[],exhausted:!0};if(d.assertCurrent?.(),o.userId!==c)throw new DOMException("GROUP 历史请求的登录账号已改变","AbortError");const i=void 0===r?t?.serverTime??t?.createdAt:ur(r,a);if(void 0===i)throw new Error(`GROUP 向新分页缺少可信 baseTime(groupId=${a}, messageId=${t?.id??""})`);const l=[],u=[],m=await Ot({asyncDecrypt:d,signal:s,http:Er,userId:o.userId,clientType:hr,groupId:a,baseTime:i,direct:2,limit:n,decryptDeps:{...Un("history"),onDecryptRecovery:e=>u.push(e)},prepareKeys:t=>Fn(t,{signal:s,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onReaction:e=>l.push(e)});d.assertCurrent?.();const v=p.messages(m.messages);for(const e of v)d.publish([e],()=>Zo.upsertMessages([e],"offline",{backfillOnly:!0}));for(const e of l)d.publish([],()=>is(e));for(const e of u)d.publish([],()=>{p.acceptsRecovery(e)&&Kr(e)});d.assertCurrent?.();return{messages:v,...q({conversationId:a,direction:"newer",baseTime:i,batchSize:m.batchSize,boundaryTime:m.newestEntryTime,limit:n})}}finally{p.stop()}}if("channel"===i.type){if(void 0!==i.channelState&&o(i.channelState))return{messages:[],exhausted:!0};const n=r??t?.extensions?.historyCursor;if("string"!=typeof n||""===n.trim())throw new Error(`CHANNEL 向新分页缺少可信 historyCursor(channelId=${a}, messageId=${t?.id??""})`);const c=Oo,d=_o(a),p=await fr.getLoginContext();if(null===p)return{messages:[],exhausted:!0};const l=void 0===r?(await ra.loadMessageContext(a,n,p.userId,s)).context:await ra.loadNewerPage(a,n,p.userId,s);Rt(s);const u=Zo.getConversationContext(e);return!Cr||c!==Oo||d!==_o(a)||"channel"!==u?.type||void 0!==u.channelState&&o(u.channelState)?{messages:[],exhausted:!0}:(l.messages.length>0&&Zo.upsertMessages(l.messages,"offline",{backfillOnly:!0}),{messages:l.messages,exhausted:!l.hasNewer,...l.hasNewer&&void 0!==l.nextCursor?{nextCursor:l.nextCursor}:{}})}throw new Error(`向新分页未实现:${i.type}`)};function Ka(e){const t=_({...e,operation:"openConversation"});return Object.assign(new Error(t.code),t,{name:"ImConversationOpenError"})}function Fa(e){if(!Cr)throw Ka({code:"IM_SDK_CONVERSATION_RUNTIME_RELEASED",category:"state",retryable:!1,conversation:e})}function Ua(e,t){return{id:e.conversationId,type:e.conversationType,title:t.title.trim()||e.conversationId,...void 0===t.avatar?{}:{avatar:t.avatar},lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:t.muted??!1,...void 0===t.groupState?{}:{groupState:t.groupState},...void 0===t.channelState?{}:{channelState:t.channelState},...void 0===t.channelPermissions?{}:{channelPermissions:t.channelPermissions},...void 0===t.channelAccessSnapshot?{}:{channelAccessSnapshot:t.channelAccessSnapshot},...void 0===t.sendDisabledReason?{}:{sendDisabledReason:t.sendDisabledReason}}}const Ba={...a({...void 0===Tr?{}:{coreClient:Tr},authProvider:fr,http:Er,resolveInput:ln,domainState:Zo,operations:{list:function(){return Zo.getConversationList()},pullOffline:La,sync:async function(){await Pa()},prefetchRecent:(e,t)=>po.prefetchRecent(e,t)},beforeDeleteConversation:Lo,terminateConversationSending:(e,t)=>la.terminateConversationSending(e,t),resetConversationBackground:e=>Gr.api.resetBackground(e),reportStorageError:(e,t)=>vr.emit({type:"error",error:{scope:"storage",message:e,cause:t}}),markChannelRead:(e,t)=>la.markRead(e,t,"channel"),settleConversationRead:async e=>{const t=await Ha(e,{initialPosition:"latest"},"read");try{await t.markConversationRead()}finally{t.close()}}}),...Gr.api,ensureOpenableConversation:async function(e){const t=function(e){const t=e?.conversationType,r=e?.conversationId;if("supergroup"===t)throw Ka({code:"IM_SDK_SUPERGROUP_UNSUPPORTED",category:"unsupported",retryable:!1,conversation:e});if("direct"!==t&&"group"!==t&&"channel"!==t&&"robot"!==t&&"customerService"!==t||"string"!=typeof r||""===r.trim())throw Ka({code:"IM_SDK_CONVERSATION_INVALID",category:"validation",retryable:!1,...void 0===e?{}:{conversation:e}});return Object.freeze({conversationType:t,conversationId:r.trim()})}(e);if(Fa(t),void 0!==Zo.getSession(t))return t;const r=To.begin();let o=!1;const n=vr.subscribe(e=>{"session:removed"===e.type&&e.conversation.conversationType===t.conversationType&&e.conversation.conversationId===t.conversationId&&(o=!0)}),s=()=>{if(Fa(t),o)throw Ka({code:"IM_SDK_CONVERSATION_OPEN_INVALIDATED",category:"state",retryable:!0,conversation:t})};try{if("direct"===t.conversationType){const e=Vo.peekItem("individual",t.conversationId);if(void 0!==e)return Zo.prepareConversation(Ua(t,{title:e.displayName||e.cardDisplayName,...void 0===e.avatarUrl?{}:{avatar:e.avatarUrl}})),t;const r=await an.getRelationship(t.conversationId);if(s(),"friend"!==r)throw Ka({code:"IM_SDK_DIRECT_CONTACT_REQUIRED",category:"permission",retryable:!1,conversation:t,details:Object.freeze({relationship:r})});const o=await an.getProfile(t.conversationId);if(s(),null===o||o.id!==t.conversationId)throw Ka({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});return Zo.prepareConversation(Ua(t,{title:o.remark??o.nickname,...void 0===o.avatar?{}:{avatar:o.avatar},...void 0===o.muted?{}:{muted:o.muted}})),t}if("group"===t.conversationType){const e=Zo.isMembershipTerminated(t),r=Vo.peekItem("group",t.conversationId);if(void 0!==r&&!e)return Zo.prepareConversation(Ua(t,{title:r.displayName||r.cardDisplayName,...void 0===r.avatarUrl?{}:{avatar:r.avatarUrl},groupState:"active"})),t;if(void 0===Ko)throw Ka({code:"IM_SDK_CONVERSATION_PROFILE_UNAVAILABLE",category:"contract",retryable:!1,conversation:t});const o=await Ko.getGroupProfile(t.conversationId,e?{forceRefresh:!0}:void 0);if(s(),null===o||o.id!==t.conversationId)throw Ka({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});if(!1===o.isInGroup||e&&!0!==o.isInGroup||void 0!==o.status&&2!==o.status)throw Ka({code:"IM_SDK_GROUP_CONVERSATION_UNAVAILABLE",category:"permission",retryable:!1,conversation:t,details:Object.freeze({...void 0===o.status?{}:{status:o.status},...void 0===o.isInGroup?{}:{isInGroup:o.isInGroup}})});return Zo.prepareConversation(Ua(t,{title:o.name,...void 0===o.avatar?{}:{avatar:o.avatar},...void 0===o.muted?{}:{muted:o.muted},groupState:"active"}),{membershipConfirmed:e}),e&&(s(),Es({conversationType:"group",conversationId:t.conversationId})),t}if("customerService"===t.conversationType){if("__customer_service__"!==t.conversationId||void 0===Zo.getConversationContext(t))throw new Error("客服会话只能由已接收消息创建");return t}if("robot"===t.conversationType){const e=qo.peek(t.conversationId);return Zo.prepareConversation(Ua(t,{title:e?.displayName??t.conversationId,...void 0===e?.avatarUrl?{}:{avatar:e.avatarUrl}})),t}if(void 0===Fo)throw Ka({code:"IM_SDK_CONVERSATION_PROFILE_UNAVAILABLE",category:"contract",retryable:!1,conversation:t});const e=Zo.isMembershipTerminated(t),r=await Fo.getProfile(t.conversationId,e?{forceRefresh:!0}:void 0);if(s(),null===r||r.id!==t.conversationId)throw Ka({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});const o="active"===r.channelState||"muted"===r.channelState,n="muted"===r.channelState&&!0===r.accessSnapshot?.allMembersMuted&&"owner"!==r.role&&"admin"!==r.role;if(!o||n)throw Ka({code:"IM_SDK_CHANNEL_CONVERSATION_UNAVAILABLE",category:"permission",retryable:!1,conversation:t,details:Object.freeze({channelState:r.channelState,role:r.role,hiddenByAllMemberMute:n})});return Zo.prepareConversation(Ua(t,{title:r.name,...void 0===r.avatar?{}:{avatar:r.avatar},...void 0===r.muted?{}:{muted:r.muted},channelState:r.channelState,channelPermissions:r.permissions,...void 0===r.accessSnapshot?{}:{channelAccessSnapshot:r.accessSnapshot},...r.permissions.sendMessages?{}:{sendDisabledReason:`channel_${r.channelState}`}}),{membershipConfirmed:e}),e&&(s(),Es({conversationType:"channel",conversationId:t.conversationId})),t}catch(e){if(function(e){return e instanceof Error&&"ImConversationOpenError"===e.name&&"string"==typeof e.code}(e))throw e;const r=function(e){if("object"==typeof e&&null!==e&&"string"==typeof e.code&&"string"==typeof e.category&&"boolean"==typeof e.retryable){const t=e;return{code:t.code,category:t.category,retryable:t.retryable}}return e instanceof de?{code:"IM_SDK_CONVERSATION_PROFILE_READ_FAILED",category:"network",retryable:!0}:e instanceof pe||e instanceof Error&&"DirectoryMappingError"===e.name?{code:"IM_SDK_CONVERSATION_PROFILE_INVALID",category:"contract",retryable:!1}:{code:"IM_SDK_CONVERSATION_OPEN_PREREQUISITE_FAILED",category:"state",retryable:!1}}(e);throw Ka({...r,conversation:t,cause:e})}finally{n(),r()}},getContext:e=>Zo.getConversationContext(e)};function Ga(e,t,r=!0){if(!Cr)throw e.close(),new Error("IM SDK 账号运行时已释放,不能打开会话");return t?.aborted&&(e.close(),Rt(t)),function(e,t=!0){const r=new AbortController,o={...e,resumeMedia(){t&&Cr&&!r.signal.aborted&&"authenticated"===la.state&&"robot"!==e.ref.conversationType&&la.resumePausedMediaUploads(e.ref,r.signal).catch(()=>{Cr&&!r.signal.aborted&&vr.emit({type:"error",error:{scope:"unknown",message:"当前会话上传恢复失败,请重新选择文件"}})})},close(){r.abort(),e.close(),oo.delete(o)}};return b(o,e),oo.add(o),t&&o.resumeMedia(),o}(e,r)}async function Ha(e,t={},r){if(!Cr)throw new Error("IM SDK 账号运行时已释放,不能打开会话");const o=po?.enterForeground(e),n=Io.enterForeground(),s=To.begin();try{const o={beginReceiving:To.begin,domainState:Zo,invalidateHistory:Lo,emitter:vr,drafts:dn.api,sendText:ma.operations.sendText,sendContact:ma.operations.sendContact,sendImage:ma.operations.sendImage,sendVideo:ma.operations.sendVideo,sendVoice:ma.operations.sendVoice,sendFile:ma.operations.sendFile,sendGif:ma.operations.sendGif,sendMediaAlbum:ma.operations.sendMediaAlbum,sendExpression:ma.operations.sendExpression,sendGame:ma.operations.sendGame,sendMiniProgram:ma.operations.sendMiniProgram,sendTransfer:ma.operations.sendTransfer,sendGift:ma.operations.sendGift,sendLiveRoom:ma.operations.sendLiveRoom,replaceVideo:ma.operations.replaceInterruptedVideo,replaceFile:ma.operations.replaceInterruptedFile,forwardMessages:ma.operations.forwardMessages,recallMessage:ma.operations.recallMessage,editMessage:ma.operations.editMessage,setReaction:({conversation:e,parentMessageId:t,emoji:r,action:o})=>{if("robot"===e.conversationType||"customerService"===e.conversationType)return Promise.resolve({ok:!1,reason:"restricted"});const n={conversationType:e.conversationType,conversationId:e.conversationId};return"toggle"===o?Ms.toggle({conversation:n,parentMessageId:t,emoji:r}):Ms.set({conversation:n,parentMessageId:t,emoji:r,action:"add"===o?0:1})},markRead:ma.operations.markRead,markConversationRead:ma.operations.markConversationRead,markVisibleMessages:ma.operations.markVisibleMessages,markDirectMediaConsumed:ma.operations.markDirectMediaConsumed,prepareMediaPreview:Cn,getSelfId:()=>Ir,isOutboxOwned:e=>la.getPendingOutbox().some(t=>t.id===e),hasOutboxForConversation:e=>la.getPendingOutbox().some(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId)};switch(e.conversationType){case"direct":{const n={conversationType:"direct",conversationId:e.conversationId},s=await C(n,{...o,getRelationship:an.getRelationship,shouldCheckRelationship:()=>"authenticated"===la.state,appendContactRequiredTextFailure:e=>Zo.appendDirectContactRequiredTextFailure({conversationId:e.conversationId,senderId:Ir,text:e.text,...void 0===e.refMessageId?{}:{refMessageId:e.refMessageId}}),setMuted:(e,t)=>Ba.setMuted(e,t),fetchMessagesByIdBatch:e=>(async(e,t)=>{const r=Ia("direct",e,t);try{const o=Ir,n=Ao(e),s=()=>{if(!Cr||Ir!==o||n!==Ao(e))throw new DOMException("DIRECT 消息查询所属账号或历史已失效","AbortError")};s();const{userId:a}=await ys();if(s(),a!==o)throw new DOMException("DIRECT 消息查询的登录账号已改变","AbortError");const i=await fa(a,{priority:"foreground"});s();const c=[],d=[],p=await N(t,async t=>{s();const r=await Dt({http:Er,userId:a,clientType:hr,messageIds:t,asyncDecrypt:wa("foreground",s),decryptDeps:{...i,onDecryptRecovery:e=>d.push(e)},onPlaintextFallback:t=>wr.record("warn","sdk","crypto","direct-quoted-plaintext-fallback",()=>({conversation:e,data:{...t,endpoint:"/offline/v1/chat/msg/by_id",wireEncrypt:1,reason:"mislabeled-plaintext"}})),onReaction:e=>c.push(e)});if(s(),200!==r.code)throw Object.assign(new Error("DIRECT 按 ID 查询业务失败"),{code:r.code});return r});s();const l=r.messages(p.messages).filter(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId);for(const e of l)s(),vs([e]),s();for(const t of c)s(),t.conversation.conversationType===e.conversationType&&t.conversation.conversationId===e.conversationId&&is(t),s();for(const t of d)s(),r.acceptsRecovery(t)&&t.conversation.conversationType===e.conversationType&&t.conversation.conversationId===e.conversationId&&Kr(t),s();const u=l.map(t=>{const r=Zo.getConversationMessage(e,t.id);if(void 0===r)throw new Error("DIRECT 按 ID 查询在领域合并后缺少消息");return r}),m=new Set(u.map(e=>e.id)),v=new Set(p.missingMessageIds);for(const e of p.messages)m.has(e.id)||v.add(e.id);return{messages:u,missingMessageIds:[...v]}}finally{r.stop()}})(n,e)},t),a=Ga(s,t.signal,"read"!==r);return as(n),a}case"group":{const n={conversationType:"group",conversationId:e.conversationId},s=Ga(await w(n,{...o,getSendPermissionError:e=>{const t=Zo.getConversationContext(n),r="group"===t?.type?t.groupState:"unknown";if(void 0!==r&&"active"!==r)return _({code:"IM_SDK_GROUP_SEND_FORBIDDEN",category:"permission",operation:e,retryable:!1,conversation:n,details:Object.freeze({groupState:r})})},setMuted:(e,t)=>Ba.setMuted(e,t),fetchMessagesByIdBatch:e=>gs(n.conversationId,e)},t),t.signal,"read"!==r);return as(n),s}case"channel":{const n={conversationType:"channel",conversationId:e.conversationId},s=Ga(await I(n,{...o,loadEntryUnreadPage:Na(n),getSelfId:()=>Ir,deleteMessageForEveryone:la.deleteChannelMessageForEveryone,reconcilePage:oa.reconcilePage,getSendPermissionError:e=>{const t=Zo.getConversationContext(n),r="channel"===t?.type&&void 0!==t.channelState?t.channelState:"unknown_restricted",o=dt({channelState:r,nowMs:Date.now(),..."channel"!==t?.type||void 0===t.channelAccessSnapshot?{}:{snapshot:t.channelAccessSnapshot},..."channel"!==t?.type||void 0===t.channelPermissions?{}:{permissions:t.channelPermissions}});if("active"!==o.channelState||!o.permissions.sendMessages)return _({code:"IM_SDK_CHANNEL_SEND_FORBIDDEN",category:"permission",operation:e,retryable:!1,conversation:n,details:Object.freeze({channelState:o.channelState,...void 0===o.muteReason?{}:{muteReason:o.muteReason}})})},setMuted:(e,t)=>Ba.setMuted(e,t),fetchMessagesByIdBatch:e=>hs(n.conversationId,e)},t),t.signal,"read"!==r);return as(n),s}case"customerService":{const n={conversationType:"customerService",conversationId:e.conversationId};return Ga(await f(n,{...o,setMuted:async()=>{throw new Error("客服会话不支持免打扰设置")}},t),t.signal,"read"!==r)}case"robot":{const n={conversationType:"robot",conversationId:e.conversationId};return Ga(await h(n,{...o,setMuted:(e,t)=>Ba.setMuted(e,t)},t),t.signal,"read"!==r)}default:throw new Error(`openConversation:${e.conversationType} 产品 handler 未注册`)}}finally{s(),o?.(),n()}}return{advancedMessageDiagnostics:{sendDirectText:async e=>{await ma.operations.sendText({conversationId:e.peerId,conversationType:"direct",text:e.text,encrypted:e.encrypted})}},openConversation:Ha,localData:on,directory:Vo.search,customerService:tn,robots:qo.api,search:pn.api,applications:cn.api,expressions:zo.api,sessionFavorites:nn.api,outbox:ua.api,drafts:dn.api,connection:u({operations:{prepare:ja,connect:function(e){if(yo)return Promise.reject(Object.assign(new Error("Chat is active in another page"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"}));if(!Cr||yo)return Promise.reject(new Error("IM 连接已停止,请刷新页面后重试"));if(mo=!0,"authenticated"===la.state)return Promise.resolve();if(null!==fo)return fo;lo=e?.initialSync??"auto",uo=!1;const t=Date.now();wr.record("info","sdk","connection","connect-start",()=>({data:{initialSync:lo}}));const r=vo;return fo=(async()=>{await ja(),Cr&&mo&&r===vo&&(ga.start(),await la.connect())})().then(()=>wr.record("info","sdk","connection","connect-complete",()=>({durationMs:Date.now()-t}))).catch(e=>{throw wr.record("error","sdk","connection","connect-failed",()=>({durationMs:Date.now()-t,error:{message:"IM connect 失败",data:e}})),e}).finally(()=>{fo=null}),fo},disconnect:Oa,subscribe:function(e){return vr.subscribe(e)},getSnapshot:function(){return{connectionState:la.state,pendingOutbox:la.getPendingOutbox()}},getLifecycle:function(){return{sessionState:eo,connectionState:la.state,...""!==Ir?{userId:Ir}:{},prepared:"ready"===eo,connectionDesired:mo,authenticated:"authenticated"===la.state,receiving:To.receiving,syncing:Eo.receiving}}},getState:()=>la.state}),conversations:Ba,settings:$r.api,push:ca.api,activity:da.api,contact:an,group:d({directory:Vo.groups,...void 0===Ko?{}:{profile:{getGroupProfile:async(e,t)=>{const r=Zo.beginConversationProfileRead({conversationType:"group",conversationId:e},t);try{const o=await Ko.getGroupProfile(e,t);return null!==o&&r({id:o.id,title:o.name,avatar:o.avatar}),o}finally{r.finish()}},...void 0===Ko.getGroupMemberNames?{}:{getGroupMemberNames:Ko.getGroupMemberNames.bind(Ko)},...void 0===Ko.listGroupMembers?{}:{listGroupMembers:Ko.listGroupMembers.bind(Ko)},...void 0===Ko.peekGroupMembers?{}:{peekGroupMembers:Ko.peekGroupMembers.bind(Ko)},...void 0===Ko.peekGroupProfile?{}:{peekGroupProfile:Ko.peekGroupProfile.bind(Ko)},...void 0===Ko.peekGroupMemberNames?{}:{peekGroupMemberNames:Ko.peekGroupMemberNames.bind(Ko)}}},...void 0===Tr?{}:{coreClient:Tr},...void 0===fn?{}:{avatarTransfer:fn},domainState:{...Rs,prepareConversation:e=>Zo.prepareConversation(e)},emitter:vr,pinned:ea.operations}),channel:t({directory:Vo.channels,...void 0===Fo?{}:{channelProfile:{listProfiles:Fo.listProfiles.bind(Fo),getProfile:async(e,t)=>{const r=Zo.beginConversationProfileRead({conversationType:"channel",conversationId:e},t);try{const o=await Fo.getProfile(e,t);return null!==o&&r({id:o.id,title:o.name,avatar:o.avatar}),o}finally{r.finish()}}}},...void 0===Uo?{}:{channelMembers:Uo},...void 0===Bo?{}:{channelMentionMembers:Bo},mentionCandidates:Go.api,applications:ra.applications,pinned:ta.operations,...void 0===Tr?{}:{coreClient:Tr},...void 0===fn?{}:{avatarTransfer:fn},crypto:yn,domainState:{prepareConversation:e=>Zo.prepareConversation(e),setChannelRestriction:Zo.setChannelRestriction,removeConversationForMembershipTermination:Rs.removeConversationForMembershipTermination,updateConversationProfile:Zo.updateConversationProfile,refreshConversationProfile:Zo.refreshConversationProfile},emitter:vr,...void 0===Mn?{}:{cacheCreatedSecretKey:(e,t)=>Mn.primeChannelKey(e,t)},getSelfUserId:async()=>""!==Ir?Ir:(await fr.getLoginContext())?.userId??""}),media:va.api,calls:v(Bs),groupCalls:P(Gs),teardown:_a}}export{mr as createSessionRuntime};
|