k2-im 0.2.12 → 0.2.13

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.
Files changed (28) hide show
  1. package/dist/chat-kit-pinia.d.ts +3 -3
  2. package/dist/chat-kit.d.ts +2 -2
  3. package/dist/index.d.ts +2 -2
  4. package/dist/modules/api-protocol-client/src/client.js +1 -1
  5. package/dist/modules/api-protocol-client/src/nonce.js +1 -1
  6. package/dist/modules/crypto/browser.js +1 -1
  7. package/dist/modules/crypto/driver.js +1 -1
  8. package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -1
  9. package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -1
  10. package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -1
  11. package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -1
  12. package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -1
  13. package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -1
  14. package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -1
  15. package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -1
  16. package/dist/modules/im-core/src/abort.js +1 -1
  17. package/dist/modules/im-core/src/mapping/message-id.js +1 -1
  18. package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -1
  19. package/dist/modules/im-core/src/state/domain-state.js +1 -1
  20. package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -1
  21. package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -1
  22. package/dist/modules/im-sdk/src/product/media.js +1 -1
  23. package/dist/modules/im-sdk/src/runtime/media-upload-recovery.js +1 -1
  24. package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -1
  25. package/dist/request-crypto.d.ts +3 -2
  26. package/dist/sdk.d.ts +1 -1
  27. package/dist/vendor/crypto/index_bg.wasm +0 -0
  28. package/package.json +1 -1
@@ -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{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
+ 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 _}from"../mapping/message-id.js";import{backfillGroupMention as k}from"../mapping/group-message-mapper.js";import{isConversationUnreadMessage as L}from"../mapping/unread-divider.js";function O(e,t){for(let n=e.length-1;n>=0;n-=1){const o=e[n];if(t(o))return o}}function H(e){return"direct"===e||"robot"===e||"customerService"===e?"local":"server"}function z(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 q="im:deleted-conversations",G="im:terminated-conversations",W="im:membership-reset-sort-keys",J="im:pending-message-reactions",Q="im:transfer-status-records",V=["sendMessages","mentionAll","editProfile","manageMembers","manageAdmins","moderateMessages","manageMute","dismissChannel","transferOwnership"];function X(e,t){return e===t||void 0!==e&&void 0!==t&&V.every(n=>e[n]===t[n])}function Y(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 Z(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&&X(e.channelPermissions,t.channelPermissions)&&Y(e.channelAccessSnapshot,t.channelAccessSnapshot)&&e.sendDisabledReason===t.sendDisabledReason}function ee(x){const V=I({getSelfId:x.getSelfId}),ee=/* @__PURE__ */new Map,te=/* @__PURE__ */new Map,ne=E(),oe=E(),re=S(),se=h(),ie=M(),ae=/* @__PURE__ */new Map,ce=/* @__PURE__ */new Map;let de=0;function ue(e){ce.set(e,++de)}let le=1;const ve=/* @__PURE__ */new Set,fe=/* @__PURE__ */new Map,pe=/* @__PURE__ */new Set,ye=/* @__PURE__ */new Map,{storage:me}=x;let ge=Promise.resolve();const he=/* @__PURE__ */new Map,Ce=/* @__PURE__ */new Map,we=/* @__PURE__ */new Map;let Ie=0;const Te=x.unreadMode??H,Me=/* @__PURE__ */new Set;function Se(e={}){const t=T({storage:me,loadOlderFromRemote:x.loadOlderFromRemote,loadNewerFromRemote:x.loadNewerFromRemote,shouldIncludeMessage:et,normalizeStoredUpload:en,...e});return Me.add(t),t}const be=Se();function Ee(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 Ke(e,t){const n=V.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 Ue(e,n){const o=Ke(t(e),e.id);void 0===o||V.has(e.id,e)||V.upsert(o);const r=V.upsert(e,n);return{...r,previous:o,changed:void 0===o?r.changed:!D(o,r.message)}}function Ae(e){const t=new Map(V.getByConversation(e).map(e=>[e.id,e]));for(const n of Me)if(Re(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 Re(t,n){const o=t.info();return void 0===o.conversation?o.conversationId===n.conversationId:e(o.conversation)===e(n)}let Pe=!1;function Ne(t){return`${e(t.conversation)}\0${t.parentMessageId}`}function xe(){if(void 0===me||Pe)return;const e=[...ee.values()].flat();Tt(()=>me.setMeta(J,e)).catch(e=>ot("保存待处理 Reaction 失败",e))}function $e(e){const t=e.body.transfer;if("transfer"!==e.contentType||void 0===t)return e;const n=te.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 De(t,n){const o=`${e(t)}\0${n}`;return!!ee.delete(o)&&(xe(),!0)}function Be(t){const n=`${e(t)}\0`;let o=!1;for(const e of ee.keys())e.startsWith(n)&&(ee.delete(e),o=!0);return o&&xe(),o}function je(e,t){const n=Ke(e.conversation,e.parentMessageId);if(void 0===n){const t=Ne(e),n=ee.get(t)??[];return n.some(t=>t.id===e.id)?"duplicate":(ee.set(t,[...n,e]),xe(),"pending")}if(mt(n),void 0!==n.recalled||void 0!==n.deletedForEveryone)return"duplicate";const o=w(n.reactions,e,x.getSelfId?.()??"");return o===n.reactions?"duplicate":(on([{...n,reactions:o}],t),"applied")}function Fe(n,o){const r=t(n),s=`${e(r)}\0${n.id}`,i=ee.get(s);if(void 0!==i){ee.delete(s),xe();for(const e of i)je(e,o)}}function _e(e){for(const t of[...ee.values()]){const n=t[0];if(void 0===n)continue;const o=Ke(n.conversation,n.parentMessageId);void 0!==o&&(void 0!==o.recalled||void 0!==o.deletedForEveryone?De(n.conversation,n.parentMessageId):Fe(o,e))}}let ke=0;const Le=/* @__PURE__ */new Map,Oe=/* @__PURE__ */new Map,He=/* @__PURE__ */new Map,ze=/* @__PURE__ */new Map,qe=/* @__PURE__ */new Map;function Ge(t){return e(t)}function We(e){return Je(e)||ve.has(Ge(e))||ve.has(e.conversationId)}function Je(e){return pe.has(Ge(e))||pe.has(e.conversationId)}function Qe(t,n={}){return(!0===n.includeRestored||We(t))&&!Je(t)&&fe.has(e(t))}function Ve(){return[...ve,...fe.values()]}function Xe(e){const t=ve.delete(Ge(e)),n=ve.delete(e.conversationId);return t||n}function Ye(e){const t=Xe(e),n=pe.delete(Ge(e)),o=pe.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 et(n){const o=t(n);if(Je(o)||We(o)&&void 0===oe.get(o))return!1;if("group"!==o.conversationType)return!0;const r=ye.get(e(o));return void 0===r||n.sortKey>=r}function tt(t){const n=e(t),o=(Oe.get(n)??0)+1;return Oe.set(n,o),o}function nt(t){const n=e(t),o=(Le.get(n)??0)+1;return Le.set(n,o),o}function ot(e,t){x.emitter.emit({type:"error",error:{scope:"storage",message:e,cause:t}})}function rt(e){x.emitter.emit({type:"session:updated",session:e,conversation:o(e)})}const st=/* @__PURE__ */new Set,it=/* @__PURE__ */new Set,at=/* @__PURE__ */new Map,ct=/* @__PURE__ */new Map;let dt=0,ut=Promise.resolve(),lt=0,vt=Promise.resolve(),ft=0;const pt=/* @__PURE__ */new Map;let yt;function mt(n){const o=e(t(n));yt?.keys.has(o)&&yt.messages.set(`${o}\0${n.id}`,n)}function gt(t){const n=e(t);pt.set(n,(pt.get(n)??0)+1)}function ht(e){return yt?.writes.push(e),void 0!==yt&&e.catch(()=>{}),e}async function Ct(e){const t=(await Promise.allSettled(e)).find(e=>"rejected"===e.status);if(void 0!==t)throw t.reason}function wt(e){const t=vt.then(e);return vt=t.then(()=>{},()=>{}),t}function It(t,n){const o=ft,r=t.map(t=>[e(t),pt.get(e(t))??0]);return()=>o===ft&&n()&&r.every(([e,t])=>(pt.get(e)??0)===t)}function Tt(e){const t=0===lt?(()=>{try{return e()}catch(e){return Promise.reject(e)}})():ut.then(e),n=t.then(()=>{},()=>{});st.add(n),n.finally(()=>st.delete(n));for(const e of it)e.writes.push(t);return ht(t)}function Mt(e){lt+=1;const t=Promise.all([...st]),n=ut.then(()=>t).then(e);return ut=n.then(()=>{},()=>{}),ut.finally(()=>{lt-=1}),ht(n)}function St(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 bt(n){if(void 0!==me&&!Pe&&0!==n.length){for(const o of it)for(const r of n)o.messages.add(`${e(t(r))}\0${r.id}`);Tt(()=>me.saveMessages(n.map(St))).catch(e=>ot("消息落盘失败",e))}}function Et(e){const{lastMessageSendState:t,manuallyUnread:n,...o}=e;return o}function Kt(t){if(void 0!==me&&!Pe){for(const n of it)n.sessions.add(e(o(t)));Tt(()=>me.saveSessions([Et(t)])).catch(e=>ot("会话落盘失败",e))}}function Ut(e,t,n){if(void 0===me||Pe)return;const o=++dt;at.set(e,{version:o,persist:()=>Ut(e,t,n)});for(const t of it)t.metadata.add(e);const r=ct.get(e),s=Tt(()=>void 0===r?me.setMeta(e,t()):r.then(()=>me.setMeta(e,t()))),i=s.then(()=>{},()=>{});ct.set(e,i),i.then(()=>{ct.get(e)===i&&ct.delete(e)}),s.then(()=>{at.get(e)?.version===o&&at.delete(e)},e=>ot(n,e))}function At(){Ut(q,Ve,"删除会话标记保存失败")}function Rt(){Ut(G,()=>[...pe],"成员资格终止标记保存失败")}function Pt(){Ut(W,()=>[...ye.entries()],"重新入群的历史起点保存失败")}function Nt(t){if(void 0!==me&&!Pe){for(const n of it)void 0!==t.conversationType&&n.reads.add(e({conversationType:t.conversationType,conversationId:t.conversationId}));Tt(()=>me.saveReadState(t)).catch(e=>ot("已读态落盘失败",e))}}function xt(t){if(e(t),"supergroup"===t.conversationType)throw new Error("supergroup 草稿未实现,不得 fallback 到其他会话类型")}function $t(e){return xt(e),Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function Dt(e,t,n){if(xt(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 Bt(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 jt(t,n){xt(t);const o=e(t),r=(he.get(o)??Promise.resolve()).catch(()=>{}).then(n),s=r.then(()=>{},()=>{});return he.set(o,s),s.finally(()=>{he.get(o)===s&&he.delete(o)}),r}async function Ft(t,n){const o=$t(t),r=e(o);if(void 0!==n&&(!Number.isFinite(n)||n<0))throw new Error(`草稿 expectedUpdatedAt 非法:${n}`);const s=Ie,i=we.get(r)??0;return await jt(o,async()=>{const e=se.get(o);if(null===e||void 0!==n&&e.updatedAt!==n)return!1;if(void 0!==me&&await me.deleteDraft(o),s!==Ie||i!==(we.get(r)??0))throw new Error("草稿状态已失效,拒绝过期清理回灌内存");return se.delete(o),x.emitter.emit({type:"draft:cleared",conversation:o}),!0})}function _t(t,n,o,r,s){const i=gn(t);if(void 0===i)return;const a={...i,...void 0===s||s===Oe.get(e(t))?{title:n,avatar:o??i.avatar}:{},...void 0!==r?{muted:r}:{}};Z(i,a)||hn(a)}function kt(t,n){const o=x.profile;if(void 0===o)return Promise.resolve(null);const r={conversationType:"direct",conversationId:t},s=e(r),i=qe.get(t);if(!0!==n?.forceRefresh&&void 0!==i&&i.revision===Le.get(s))return i.promise;const a=ke,c=nt(r),d=tt(r),u=(async()=>{const e=await o.getUserProfile(t,n);if(null!==e&&e.id===t&&a===ke&&c===Le.get(s)){const n=e.remark?.trim()?e.remark:e.nickname||t;_t(r,n,e.avatar??"",e.muted,d)}return e})().finally(()=>{qe.get(t)?.promise===u&&qe.delete(t)});return qe.set(t,{revision:c,promise:u}),u}async function Lt(t,n){const{conversationId:o,conversationType:r}=t;if("direct"===r){try{await kt(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&&(ze.has(s)||He.has(s)))return!1;const a=ke,c=nt(t),d=tt(t);i&&ze.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!==ke||c!==Le.get(s))return!1;null!==e&&(_t(t,e.name,e.avatar??"",e.muted,d),3===e.status&&mn({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!==ke||c!==Le.get(s))return!1;if(null!==e){_t(t,e.name,e.avatar??"",e.muted,d);const r=gn(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 fn(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 mn({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}`;fn(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===ke&&ze.get(s)===c&&ze.delete(s)}}function Ot(e){return L(e,x.getSelfId?.()??"")}function Ht(e){const t=re.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 Ae(o).find(e=>e.extensions?.historyCursor===t.readCursor)?.sortKey??t.readCursorSortKey}const o="string"==typeof e?V.getByConversation(e).find(e=>e.id===t.readCursor):Ke(e,t.readCursor);return o?.sortKey??t.readCursorSortKey}function zt(e,t){let n=0;for(const o of V.getByConversation(e))N(o)&&Ot(o)&&(void 0===t||o.sortKey>t)&&(n+=1);return n}function qt(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 Gt(e,t){let n=0;for(const o of V.getByConversation(e))!0!==o.readBySelf&&qt(o)&&(void 0===t||o.sortKey>t)&&(n+=1);return n}function Wt(e,t=!0){const n=void 0===e.conversationType?ne.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=re.get(r);if("channel"===o.conversationType&&ue(o.conversationId),re.set(o),t&&Nt(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 Jt(n,o){if(void 0===n||n.sortKey===o.sortKey)return;const r=t(o),s=re.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)&&Wt({...s,readCursorSortKey:o.sortKey});const c=e(r);"group"===o.conversationType&&ye.get(c)===n.sortKey&&(ye.set(c,o.sortKey),Pt())}function Qt(e){const t=e?.channelAccessSnapshot?.role;return"owner"===t||"admin"===t}function Vt(e,t,n,o,r=gn(e)){const s=o??re.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:Qt(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 Xt(e,t){if(void 0===e)return;const n=ne.get({conversationType:e.type,conversationId:e.id});void 0!==n&&Z(n,e)||(ne.set(e),oe.delete({conversationType:e.type,conversationId:e.id}),rt(e),t&&Kt(e),""===e.title&&Lt({conversationType:e.type,conversationId:e.id}))}function Yt(e,t,n="preserve",o=gn(e)){const r=O(t,e=>function(e,t){return!!N(e)&&("channel"!==e.conversationType||void 0===e.deletedForEveryone||Qt(t))}(e,o)),s="string"==typeof e?o?.type:e.conversationType;return Vt(e,r,void 0===r&&"channel"===s&&!Qt(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!==ne.get(e))&&Xt(Yt(e,V.getByConversation(e)),!0)}function en(e){if("uploading"!==e.status&&("failed"!==e.status||e.failure?.code!==R))return e;const t=V.get(e.id,e);return void 0!==t&&t.conversationType===e.conversationType&&t.conversationId===e.conversationId?t:P(A(e))}function tn(n,o=()=>!0){const r=[],s=j(n,x.getSelfId?.()??"").map(e=>{const t=en(e);let n={...t,sortKey:c(t)};if(n=A(n),"group"===n.conversationType&&"text"===n.contentType){const e=k(n.body.text??"",n.mention);void 0!==e&&(n.mention=e)}return $e(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=>Ae(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}=Ue(e);if(Jt(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?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 nn(e){const t=en(e);let n={...t,sortKey:c(t)};if(n=A(n),"group"===n.conversationType&&"text"===n.contentType){const e=k(n.body.text??"",n.mention);void 0!==e&&(n.mention=e)}return $e(n)}function on(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=fe.get(e(n));void 0!==i&&!Je(n)&&m(r,i)&&Xe(n)&&(o=!0)}o&&At(),n=n.filter(n=>{const o=fe.get(e(t(n)));return void 0===o||m(n,o)||void 0!==Ke(t(n),n.id)})}if("live"===o){let i=!1,a=!1;for(const c of n){const n=t(c);if(Ze(c,s)){const t=Ye(n);t.deleted&&(i=!0),t.terminal&&("group"===n.conversationType?(ye.set(e(n),c.sortKey),Pt()):"channel"===n.conversationType&&ye.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||Je(n)||!Xe(n)||(i=!0)}i&&At(),a&&Rt()}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=ve.size>0||pe.size>0?n.filter(e=>{const n=t(e),o=!We(n)||!0===r.backfillOnly&&void 0!==oe.get(n)&&!Je(n);return o||a(e,"tombstone"),o}):n,d=function(n){const o=/* @__PURE__ */new Map;if(0===ye.size)return o;for(const r of j(n,x.getSelfId?.()??"")){if("group"!==r.conversationType)continue;const n=t(r),s=e(n),i=ye.get(s);if(void 0===i)continue;const a=Ke(n,r.id);if(void 0===a||a.sortKey!==i)continue;const c=F(a,r,x.getSelfId?.()??"");c.sortKey!==i&&(ye.set(s,c.sortKey),o.set(s,c.id))}return o.size>0&&Pt(),o}(c),u=n=>d.get(e(t(n)))===n.id,v=ye.size>0?c.filter(e=>{const t=u(e)||et(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($e),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=>Ae(e)),S=l(M,I),b=[],E=[];for(const n of S){if("channel"===n.conversationType&&yt?.keys.has(e(t(n)))&&!yt.current())continue;const{previous:s,message:i,isNew:a,changed:c}=Ue(n,{authoritativeFailure:!0===r.authoritativeOutboxFailure});if(mt(i),!0===r.backfillOnly&&!0===r.refreshSessionSummary){const n=t(i);p.set(e(n),n)}if(!a&&!c)continue;Jt(s,i);for(const e of Me)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=Ht(d),n=void 0===t||s.sortKey>t,o=e(d);n&&N(s)&&Ot(s)&&void 0===s.recalled&&void 0===s.deletedForEveryone&&g.set(o,(g.get(o)??0)-1),n&&qt(s)&&void 0===s.recalled&&void 0===s.deletedForEveryone&&C.set(o,(C.get(o)??0)-1)}Je(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);Ot(n)&&w.add(s),K.has(s)||K.set(s,Ht(r));const i=K.get(s),a=void 0===i||n.sortKey>i;if(N(n)&&a&&Ot(n)&&!0!==n.readBySelf&&void 0===n.recalled&&void 0===n.deletedForEveryone){const e=Te(n.conversationType);("local"===e||"server"===e&&"live"===o)&&y.set(s,(y.get(s)??0)+1)}a&&!0!==n.readBySelf&&qt(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&&Zt(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=re.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,Wt(n)}Zt(t,E.some(e=>e.conversationType===t.conversationType&&e.conversationId===t.conversationId&&N(e)))}bt(b.filter(e=>void 0!==Ke(t(e),e.id)));for(const e of b)void 0===e.recalled&&void 0===e.deletedForEveryone?Fe(e,o):De(t(e),e.id)}function rn(e,t,n=Date.now()){const o={conversationType:"direct",conversationId:e},r=Ke(o,t),s=O(V.getByConversation(o),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!==V.get(c,o))return;on([{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 sn=/* @__PURE__ */new Map;let an=0;function cn(e){const t=re.get(e);if(!0!==t?.manuallyUnread)return!1;const n={...t};return delete n.manuallyUnread,Wt(n),Zt(e),!0}function dn(e,t,n,r,s){const i="string"==typeof e?e:e.conversationId,a=gn(e),c="string"==typeof e?void 0===a?void 0:o(a):e;if(void 0!==a&&"server"!==Te(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&&ae.delete(i);const d=re.get(e);let u=d?.readCursor??"",l=d?.readCursorSortKey;const v=void 0===n||""===n?void 0:void 0===c?V.getByConversation(i).find(e=>e.id===n)??Ee(n,i):Ke(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),Wt({...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&&!We(c))}function un(e){const t=ae.get(e.conversation.conversationId);return t?.handle.transactionId===e.transactionId?t:void 0}function ln(e,t,n,o=!1){const r=gn(e),s=Ke(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||ae.delete(e.conversationId);const i=re.get(e),a=void 0===i?r.mentionUnreadCount:i.mentionUnreadCount;Wt({...e,readCursor:n,readCursorSortKey:s.sortKey,unreadCount:i?.unreadCount??r.unreadCount,...void 0===a?{}:{mentionUnreadCount:a}}),Zt(e)}function vn(e,t,n){const o=e.conversation,r=o.conversationId,i=un(e);if(void 0===i)throw new Error(`CHANNEL 乐观已读事务已失效(channelId=${r})`);const a=Ke(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)}),ln(o,t,n,!0))}function fn(t,n,o,r){const s={conversationType:"channel",conversationId:t},i=e(s);if(We(s)&&void 0===oe.get(s)&&!Qe(s))return;const a=gn(s);if(void 0===a){nt(s),ze.delete(i);return void hn({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 状态`);nt(s),ze.delete(i);const c=r?.permissions,d=r?.snapshot;if(a.channelState===n&&a.sendDisabledReason===o&&X(a.channelPermissions,c)&&Y(a.channelAccessSnapshot,d))return void(void 0!==ne.get(s)&&Zt(s));const u={...a,channelState:n,channelPermissions:c,channelAccessSnapshot:d,sendDisabledReason:o};void 0!==ne.get(s)?hn(Yt(s,V.getByConversation(s),"preserve",u)):hn(u)}async function pn(e,t){if(""===t.trim())throw new Error("本机删除消息需要非空 messageId");const n=()=>{if(ie.isPinnedMessage(e,t))throw Object.assign(new Error("置顶消息必须先取消置顶才能删除"),{code:"IM_MESSAGE_PINNED"})};n();const o=Ke(e,t),r=V.get(t,e),s=void 0!==r&&r.conversationType===e.conversationType&&r.conversationId===e.conversationId,i=V.getByConversation(e).filter(e=>e.id!==t),a=void 0===ne.get(e)?void 0:Yt(e,i,"clear"),c=void 0===a?void 0:Et(a);function d(e){return void 0!==e&&(void 0===r||!D(r,e))}const u=void 0===me?{deleted:!1,superseded:!1}:await Mt(async()=>{n();const r=Ke(e,t)??o??await me.getMessage(e,t)??void 0;if(n(),d(V.get(t,e)))return{deleted:!1,superseded:!0};const s=await me.deleteMessage(e,t,c);if(ie.isPinnedMessage(e,t)){const o=Ke(e,t)??r;void 0!==o&&await me.saveMessages([St(o)]);const s=ne.get(e);return void 0!==s&&await me.saveSessions([Et(s)]),n(),{deleted:!1,superseded:!0}}return{deleted:s,superseded:!1}});if(u.superseded||d(V.get(t,e)))return!1;const l=s&&V.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===ne.get(e)?void 0:Yt(e,V.getByConversation(e),"clear");return Xt(f,!1),void 0===f||void 0!==a&&Z(a,f)||Kt(f),De(e,t),x.emitter.emit({type:"message:removed",conversation:{...e},messageId:t,scope:"local-only"}),!0}function yn(t,o={}){const r="string"==typeof t?t:t.conversationId,s=ne.get(t),i=ie.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(tt(a),He.delete(e(a)),"direct"===a.conversationType&&(nt(a),qe.delete(a.conversationId)),gt(a),"direct"===a.conversationType||"group"===a.conversationType||"channel"===a.conversationType)if(!0===o.terminal)fe.delete(e(a));else{const t=g(a,Ae(a),fe.get(e(a)));void 0!==t&&fe.set(e(a),t)}const c=V.getByConversation(a).length;!function(t){const n=$t(t),o=e(n);we.set(o,(we.get(o)??0)+1),null!==se.get(n)&&(se.delete(n),x.emitter.emit({type:"draft:cleared",conversation:n})),jt(n,async()=>{void 0!==me&&await me.deleteDraft(n)}).catch(e=>ot("删会话草稿失败",e))}(a),Be(a),ne.delete(t),oe.delete(t),"channel"===a.conversationType&&(ue(a.conversationId),ae.delete(a.conversationId)),re.delete(t),V.deleteByConversation(t),ie.clear(t);const d=Ge(a);if(!0===o.terminal){pe.add(d);const e=ye.delete(d);ve.delete(d),ve.delete(r),e&&Pt(),x.diagnostics?.record("info","core","conversation","membership-terminated",()=>({conversation:a,data:{reason:o.terminalReason??"membership-terminated",removedMessageCount:c}}))}else ve.add(d);for(const e of Me)Re(e,a)&&e.reset();x.emitter.emit({type:"session:removed",conversationId:r,conversation:a}),At(),!0===o.terminal&&Rt(),void 0!==me&&Mt(async()=>{await Ct([me.deleteConversationMessages(a),me.deleteSession(a),me.deleteReadState(a),me.removePinnedMessage(a)])}).catch(e=>ot("删除会话持久数据失败",e))}function mn(e,t){yn(e,{terminal:!0,terminalReason:t})}function gn(e){if("string"==typeof e){const t=[...ne.getAll(),...oe.getAll()].filter(t=>t.id===e);if(t.length>1)throw new Error(`裸 conversationId 存在多类型歧义:${e}`);return t[0]}return ne.get(e)??oe.get(e)}function hn(e){const t=o(e);void 0!==ne.get(t)?(ne.set(e),rt(e),Kt(e)):(oe.set(e),x.emitter.emit({type:"conversation-context:updated",conversation:t}))}async function Cn(n,o){let r=await me.getMessages(n,{limit:50});const s=o=>o.filter(o=>e(t(o))===e(n)&&et(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 me.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:on,commitReceivedMessages:function(n,o,r,s){if(void 0===me){for(const e of s?.events??[])s.apply(e);return void on(n,o,r)}const i={writes:[],messages:/* @__PURE__ */new Set,sessions:/* @__PURE__ */new Set,reads:/* @__PURE__ */new Set,metadata:/* @__PURE__ */new Set};it.add(i);try{const a=(s?.events??[]).filter(e=>"ignored"!==s.apply(e));on(n,o,r);const c=a.flatMap(e=>{const t=Ke(e.conversation,e.parentMessageId);return void 0===t?[]:[t]});a.length>0&&xe();const d=/* @__PURE__ */new Map,u=[];for(const o of[...n,...c]){const n=t(o),r=e(n),s=Ke(n,o.id);void 0!==s&&(d.set(r,n),i.messages.has(`${r}\0${s.id}`)||u.push(s))}bt(u);for(const[e,t]of d){const n=ne.get(t),o=re.get(t);void 0===n||i.sessions.has(e)||Kt(n),void 0===o||i.reads.has(e)||Nt(o)}for(const[e,t]of at)i.metadata.has(e)||t.persist()}finally{it.delete(i)}return Ct(i.writes)},prepareOfflineMessageUpdate:function(n,o){if(void 0===me)return!0;const r=t(n),s=fe.get(e(r));if(void 0===s||We(r)||m(n,s)||void 0!==Ke(r,n.id))return!0;const i=ft,a=e(r),c=pt.get(a)??0;o();let d=!1,u=Ke(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 me.getMessage(r,n.id).then(s=>{if(o(),i!==ft||(pt.get(a)??0)!==c)throw new DOMException("消息提交前的本地历史读取已失效","AbortError");return!d&&(void 0===Ke(r,n.id)&&null!==s&&s.id===n.id&&e(t(s))===a&&et(s)&&V.upsert(s),!0)}).finally(l)},applyReaction:je,rollbackReaction:function(t,n,o){const r=Ke(t,n);if(void 0===r){const r=`${e(t)}\0${n}`,s=ee.get(r);if(void 0===s)return!1;const i=s.filter(e=>e.id!==o);return i.length!==s.length&&(0===i.length?ee.delete(r):ee.set(r,i),xe(),!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,on([i],"live"),!0},appendDirectContactRequiredNotice:rn,appendDirectMessageRefusedNotice:function(e,t,n=Date.now()){const o={conversationType:"direct",conversationId:e},r=`${t}:message-refused`;if(void 0!==V.get(r,o))return;const s=V.get(t,o),c="direct"===s?.conversationType&&s.conversationId===e?a(s):n;on([{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=_(),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 on([o],"live"),rn(e.conversationId,n,t+1),o},reconcileDirectContactEstablishedNotice:function(e,t,n=Date.now()){const o=sn.get(e);if(void 0!==o)return o;const r={conversationType:"direct",conversationId:e},s=an,a=(async()=>{const o=V.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(o,e=>"direct_contact_established"===e.body.system?.eventType)?.createdAt??0,u=d>=c&&d>0;if(0===a.length&&u)return;const l=Ht(r);for(const e of a)try{const t=await pn(r,e.id),n=Ke(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!==an)return;const v=re.get(r);if(void 0!==v&&(Wt({...v,...void 0===v.readCursorSortKey&&void 0!==l?{readCursorSortKey:l}:{},unreadCount:zt(r,l)}),Zt(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!==V.get(r,{conversationType:"direct",conversationId:e}))return;on([{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(()=>{sn.get(e)===a&&sn.delete(e)});return sn.set(e,a),a},recallMessage:function(e,t,n){const o=Ke(e,t);void 0!==o&&on([{...o,recalled:n,body:{}}],"live")},deleteChannelMessageForEveryone:function(e,t,n){const o=Ke(e,t);void 0!==o&&"channel"===o.conversationType&&on([{...o,recalled:void 0,deletedForEveryone:n,body:{}}],"live")},editMessage:function(e,t,n,o){const r=Ke(e,t);if(void 0===r)return;const s={...r,body:n,edited:!0};void 0!==o?s.mention=o:delete s.mention,on([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}(te.get(e),{serialNumber:e,status:t,...void 0===n?{}:{occurredTime:n}});te.set(o.serialNumber,o),await async function(){if(void 0===me)return;const e=[...te.values()],t=ge.then(()=>me.setMeta(Q,e));ht(t),ge=t.catch(()=>{});try{await t}catch(e){throw ot("保存转账状态记录失败",e),e}}();const r=/* @__PURE__ */new Map;for(const t of u(V.getAll(),e,o.status,o.occurredTime))r.set(t.id,t);for(const t of ne.getAll()){const n=Ae({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&&on([...r.values()],"live")},getMessage:e=>V.get(e),getMessagesById:e=>V.getById(e),getConversationMessage:Ke,getLoadedMessagesByConversation:Ae,hasRecoverableConversationDeletion:Qe,resolveConversationMessage:async function(n,o,r={}){const s=Ke(n,o);if(void 0!==s||void 0===me)return s;try{const r=await me.getMessage(n,o);if(null===r||e(t(r))!==e(n))return;return nn(r)}catch(e){if(ot("按消息 ID 读取本地历史失败",e),!0===r.throwOnStorageError)throw e;return}},getMessages:()=>V.getAll(),getMessagesByConversation:e=>V.getByConversation(e),deleteLocalMessage:pn,clearLocalConversationHistory:async function(e){gt(e);const t={...e},n=new Map(V.getByConversation(t).map(e=>[e.id,e])),o=ne.get(t),r=re.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:Vt(t,void 0,"clear",s);if(void 0!==me){if(void 0===me.clearConversationHistory)throw new Error("当前 storage 未实现 clearConversationHistory,拒绝非原子清空本机会话历史");await Mt(()=>me.clearConversationHistory(t,void 0===i?void 0:Et(i),s))}const a=re.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)&&Wt(s,!1);for(const[e,o]of n){const n=V.get(e,t);void 0!==n&&D(o,n)&&V.delete(t,e)}const c=V.getByConversation(t);for(const e of Me)e.clearConversation(t)&&e.applyIncoming(c);Be(t),void 0!==ne.get(t)&&Xt(Yt(t,c,"clear"),!1),x.emitter.emit({type:"conversation-history:cleared",conversation:t,scope:"local-only"})},commitChannelSyncPage:function(n,o,r,s){const i=It(n,r);return wt(async()=>{if(!i())return!1;if(void 0===me)throw new Error("CHANNEL 严格同步提交需要 storage");const r={writes:[],messages:/* @__PURE__ */new Map,keys:new Set(n.map(e)),current:i};let a;yt=r;try{const e=o();if(e instanceof Promise)throw e.catch(()=>{}),new Error("CHANNEL 页 mutation 必须同步执行")}catch(e){a={cause:e}}finally{yt=void 0}if(await Ct(r.writes),void 0!==a)throw a.cause;if(!i())return!1;const c=[...r.messages.values()].flatMap(e=>{const n=Ke(t(e),e.id);return void 0===n?[]:[St(n)]}),d=[];c.length>0&&d.push(Tt(()=>me.saveMessages(c)));for(const e of n){const t=ne.get(e),n=re.get(e),o=ie.get(e);void 0!==t&&d.push(Tt(()=>me.saveSessions([Et(t)]))),void 0!==n&&d.push(Tt(()=>me.saveReadState(n))),d.push(Tt(()=>void 0===o?me.removePinnedMessage(e):me.savePinnedMessage(o)))}const u=[[J,[...ee.values()].flat()],[Q,[...te.values()]],[q,Ve()],[G,[...pe]],[W,[...ye.entries()]]];for(const[e,t]of u)d.push(Tt(()=>me.setMeta(e,t)));return void 0!==s&&d.push(Tt(async()=>{i()&&await s()})),await Ct(d),i()})},saveChannelSyncCheckpoint:function(e,t){const n=f(e,e.conversation);if(void 0===n)return Promise.reject(new Error("CHANNEL 同步位置无效"));const o=It([n.conversation],t);return wt(async()=>{if(!o())return!1;if(void 0===me)throw new Error("CHANNEL 同步位置保存需要 storage");let e=!1;return await Tt(async()=>{o()&&(await me.setMeta(p(n.conversation),n),e=!0)}),e&&o()})},waitForChannelSyncPersistence:async function(){for(;;){const e=vt,t=ut;if(await Promise.all([e,t,...st]),e===vt&&t===ut&&0===st.size)return}},getSession:e=>ne.get(e),getConversationContext:gn,isMembershipTerminated:Je,prepareConversation:function(e,t={}){const n=o(e);if("supergroup"===n.conversationType)throw new Error("prepareConversation:supergroup 未实现");const r=gn(n);if(void 0!==r){const t=r.title||e.title,n=r.avatar??e.avatar;return void(t===r.title&&n===r.avatar||hn({...r,title:t,avatar:n}))}if(Je(n)){if(!0!==t.membershipConfirmed)throw new Error("准备聊天失败:需要重新确认成员资格");pe.delete(Ge(n)),pe.delete(n.conversationId),Rt()}hn({...e,...void 0===e.channelPermissions?{}:{channelPermissions:{...e.channelPermissions}},...void 0===e.channelAccessSnapshot?{}:{channelAccessSnapshot:{...e.channelAccessSnapshot}}}),(re.get(n)?.unreadCount??0)>0&&!We(n)&&Zt(n,!0)},ensureConversation:function(t){const n=o(t);if(e(n),"supergroup"===n.conversationType)throw new Error("ensureConversation:supergroup 未实现");const r=ne.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=Ye(n);return i.deleted&&At(),i.terminal&&Rt(),ne.set(s),oe.delete(n),rt(s),Kt(s),s},getSessions:()=>ne.getAll(),getConversationList:function(){const e=[];for(const t of ne.getAll()){const n=o(t);e.push({...t,draft:se.get(n)})}return b(e)},getReadState:e=>re.get(e),getPinnedMessage:e=>ie.get(e),setPinnedMessage:function(e,t){const o=function(e){const t=Ke(n(e),e.messageId);return void 0===t?e:{...e,preview:{state:"ready",message:t}}}(e);ie.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===me||Pe||Tt(()=>me.savePinnedMessage(e)).catch(e=>ot("置顶消息落盘失败",e))}(o))},clearPinnedMessage:function(e,t){const o="string"==typeof e?e:e.conversationId,r=ie.get(e);if(!ie.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===me||Pe||Tt(()=>me.removePinnedMessage(e)).catch(e=>ot("置顶消息删除失败",e))}(e)},isPinnedMessage:(e,t)=>ie.isPinnedMessage(e,t),setReadState:e=>{const t=void 0===e.conversationType?ne.get(e.conversationId):void 0,n=void 0===e.conversationType&&void 0!==t?{...e,conversationType:t.type}:e;"channel"===n.conversationType&&ue(n.conversationId),re.set(n),Nt(n)},markConversationUnread:function(e){const t=ne.get(e);if(void 0===t)return!1;const n=re.get(e)??{...e,readCursor:t.readCursor??"",unreadCount:t.unreadCount,mentionUnreadCount:t.mentionUnreadCount};return!(n.unreadCount>0||!0===n.manuallyUnread)&&(Wt({...n,manuallyUnread:!0}),Zt(e),!0)},clearConversationManualUnread:cn,advanceRead:function(e,n){const o="string"==typeof e?V.getByConversation(e).find(e=>e.id===n)??Ee(n,e):Ke(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=Ht(r);if(void 0!==i&&i>=o.sortKey)return void("string"!=typeof e&&cn(e));const a={...r,readCursor:n,readCursorSortKey:o.sortKey,unreadCount:zt(r,o.sortKey),mentionUnreadCount:Gt(r,o.sortKey)};return Wt(a),Zt(r),a},applyServerUnread:dn,applyChannelReadPosition:ln,getChannelReadRevision:e=>ce.get(e.conversationId)??de,hasPendingChannelRead:e=>ae.has(e.conversationId),applyChannelReadSummary:(e,t)=>dn(e,t.unreadCount,void 0,t.readCursor,t.hasUnreadMention),beginChannelReadTransaction:function(e){const t=e.conversationId,n=gn(e);if(void 0===n||"channel"!==n.type)throw new Error(`CHANNEL 乐观已读事务要求 channel 会话(conversationId=${t}, type=${n?.type??"missing"})`);if(ae.has(t))throw new Error(`CHANNEL 乐观已读事务已存在(channelId=${t})`);const o={conversation:e,transactionId:le++},r=re.get(e)??{conversationId:t,readCursor:n.readCursor??"",unreadCount:n.unreadCount,...void 0===n.mentionUnreadCount?{}:{mentionUnreadCount:n.mentionUnreadCount}};return ae.set(t,{handle:o,baseReadState:{...r},steps:[],committedThrough:-1}),ue(t),o},applyChannelReadOptimistically:vn,applyChannelConversationReadOptimistically:function(e,t,n){vn(e,t,n);const o=un(e).steps.at(-1);if(void 0!==o.clearedCounts)return;const i=re.get(e.conversation),a=Ae(e.conversation).filter(e=>r(s(e),o)>0&&Ot(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(qt).length);o.clearedCounts={unread:i.unreadCount-c,mention:(i.mentionUnreadCount??0)-d},Wt({...i,unreadCount:c,mentionUnreadCount:d}),Zt(e.conversation)},commitChannelReadTransaction:function(e,t){const n=un(e);if(void 0===n)return!1;let o=-1;for(let e=n.steps.length-1;e>=0;e-=1)if(n.steps[e].readCursor===t){o=e;break}if(o<0)throw new Error(`CHANNEL 已确认 cursor 不属于乐观事务(channelId=${e.conversation.conversationId}, cursor=${t})`);return n.committedThrough=Math.max(n.committedThrough,o),ue(e.conversation.conversationId),n.committedThrough===n.steps.length-1&&ae.delete(e.conversation.conversationId),!0},rollbackChannelReadTransaction:function(e){const t=un(e);if(void 0===t)return!1;const n=e.conversation,o=n.conversationId,r=re.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 ae.delete(o),Wt(u),Zt(n),!0},setGroupRestriction:function(e,t,n){const o=gn({conversationType:"group",conversationId:e});if(void 0===o){return void hn({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;hn({...o,groupState:t,sendDisabledReason:n})},setChannelRestriction:fn,setPinned:function(e,t){const n=ne.get(e);if(void 0===n||n.pinned===t)return;const o={...n,pinned:t,topTime:t?Date.now():void 0};ne.set(o),rt(o),Kt(o)},setMuted:function(e,t){const n=gn(e);if(void 0===n||n.muted===t)return;hn({...n,muted:t})},removeConversation:function(e){yn(e)},removeConversationForMembershipTermination:mn,refreshConversationProfile:function(e,t){Lt({conversationType:t,conversationId:e},{force:!0})},readDirectProfile:kt,beginConversationProfileRead:function(t,n){const o={...t},r=e(o),s=ke,i=!0!==n?.forceRefresh&&(ze.has(r)||He.has(r))?void 0:tt(o);void 0!==i&&!0===n?.forceRefresh&&He.set(r,i);const a=()=>{s===ke&&void 0!==i&&He.get(r)===i&&He.delete(r)};return Object.assign(e=>{try{if(void 0===i||e.id!==o.conversationId||s!==ke)return;_t(o,e.title,e.avatar??"",void 0,i)}finally{a()}},{finish:a})},recoverChannelFromProfile:function(e){return Lt({conversationType:"channel",conversationId:e},{force:!0,allowChannelRecovery:!0})},updateConversationProfile:function(e,t){const n=gn(e);if(void 0===n)return;tt(o(n));const r={...n,...void 0!==t.title?{title:t.title}:{},...void 0!==t.avatar?{avatar:t.avatar}:{}};Z(n,r)||hn(r)},getTotalUnread:function(e){return z(ne.getAll(),e)},getDraft:function(e){return se.get($t(e))},saveDraft:async function(t,n){const o=$t(t),r=e(o),s=Dt(o,n,0),i=Ie,a=we.get(r)??0;return await jt(o,async()=>{const e=se.get(o),t=Math.max(Date.now(),(Ce.get(r)??e?.updatedAt??0)+1),n=Dt(o,s,t);if(null!==e&&Bt(e,n))return e;if(void 0!==me&&await me.saveDraft(n),i!==Ie||a!==(we.get(r)??0))throw new Error("草稿状态已失效,拒绝过期写入回灌内存");return se.set(n),Ce.set(r,t),x.emitter.emit({type:"draft:updated",conversation:n.ref,draft:n}),n})},clearDraft:async function(e){await Ft(e)},clearDraftIfUnchanged:async function(e,t){return await Ft(e,t)},invalidateAndDrainDraftOperations:async function(){for(Ie+=1;he.size>0;)await Promise.all([...he.values()])},clearSession(){ft+=1,ke+=1,Ie+=1,an+=1,sn.clear(),Le.clear(),Oe.clear(),He.clear(),ze.clear(),qe.clear(),V.clear(),ne.clear(),oe.clear(),re.clear(),se.clear(),he.clear(),Ce.clear(),we.clear(),ae.clear(),ce.clear(),de+=1,ie.clearAll(),ve.clear(),fe.clear(),pe.clear(),ye.clear(),at.clear(),ee.clear();for(const e of Me)e.reset()},hydrate:async function(t=()=>!0){if(void 0!==me&&t()){Pe=!0;try{const r=await me.getMeta(q);if(!t())return;if(null!==r)for(const t of r)if("string"==typeof t)ve.add(t);else{const n=y(t);fe.set(e(n.conversation),n)}const s=await me.getMeta(G);if(!t())return;if(null!==s)for(const e of s)pe.add(e);const i=await me.getMeta(W);if(!t())return;if(null!==i)for(const[e,t]of i)"string"==typeof e&&"string"==typeof t&&ye.set(e,t);const a=await me.getMeta(J);if(!t())return;if(null!==a)for(const e of a){const t=Ne(e);ee.set(t,[...ee.get(t)??[],e])}const c=await me.getMeta(Q);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)||te.set(t,{serialNumber:t,status:n,...void 0===o?{}:{occurredTime:o}})}const d=await me.getPinnedMessages();if(!t())return;for(const e of d){if(!t())return;We({conversationType:e.conversationType,conversationId:e.conversationId})||ie.set(e)&&x.emitter.emit({type:"pinned-message:updated",conversationId:e.conversationId,conversation:n(e),pinnedMessage:e,reason:"hydrate"})}const u=(await me.getSessions()).filter(e=>!We({conversationType:e.type,conversationId:e.id}));if(!t())return;for(const e of u){if(!t())return;const n=Yt(o(e),[],"preserve",e),r=o(n),s=ne.get(r);ne.set(n),oe.delete(r),void 0!==s&&Z(s,n)||rt(n)}const l=await me.getReadStates();if(!t())return;for(const e of l)"channel"===e.conversationType&&ue(e.conversationId),re.set(e);const v=Ie,f=await me.getDrafts();if(!t())return;if(v!==Ie)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=Dt(n.ref,n,n.updatedAt);if(We(o.ref)){try{if(await me.deleteDraft(o.ref),!t())return}catch(e){if(!t())return;ot("清理已删会话残留草稿失败",e)}continue}const r=e(o.ref);Ce.set(r,Math.max(Ce.get(r)??0,o.updatedAt));const s=se.get(o.ref);null!==s&&s.updatedAt===o.updatedAt&&Bt(s,o)||(se.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 Cn(n,t);if(!t())return;const s=[];if(tn(r.map(e=>{const t=en(A(e));return t!==e&&s.push(t),t}),t),!t())return;if(s.length>0)try{if(await me.saveMessages(s),!t())return}catch(e){if(!t())return;ot("本地消息修复态落盘失败",e)}if(!t())return;Zt(n)}}catch(e){t()&&ot("本地历史回读失败",e)}finally{Pe=!1,t()&&_e("offline")}}},loadOlderMessages:async function(n,o){if(void 0===me)return[];try{const r=await me.getMessages(n,o),s="string"==typeof n?r.filter(et):r.filter(o=>e(t(o))===e(n)).filter(et),i=Pe;let a;Pe=!0;try{a=tn(s)}finally{Pe=i}return Pe||_e("offline"),a.map(e=>Ke(t(e),e.id)??e)}catch(e){return ot("加载更早消息失败",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===me)return(()=>{const e=V.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 me.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 ot("会话内搜索失败",e),e}const l=u.exhausted?void 0:u.nextBeforeSortKey,v=new Map(V.getByConversation(n).map(e=>[e.id,e])),f=/* @__PURE__ */new Map;for(const o of u.items){const r=nn(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:be,createMessageWindow:function(e={}){const t=Se(e);let n=!1;return{window:t,dispose(){n||(n=!0,t.reset(),Me.delete(t))}}}}}export{ee as createDomainState,H as defaultConversationUnreadMode,z as sumSessionsUnread};
@@ -1 +1 @@
1
- import{GroupHistoryPageBoundaryError as e}from"../runtime/group-history-page-boundary.js";import{resolveConversationEntryUnread as t}from"./conversation-entry-unread.js";import{isSupportedImageFile as o}from"./image-format.js";import{toMessageMention as r}from"./mention.js";import{createImSdkError as n,unknownOperationErrorToImSdkError as a,toProductMessage as s,toMessageView as i,areMessageViewsEqual as d,mediaFailureToImSdkError as c}from"./message.js";import{fetchMessagesByIdInBatches as l}from"./messages-by-id.js";import{throwIfAborted as g}from"../../../im-core/src/abort.js";import{isConversationUnreadMessage as m}from"../../../im-core/src/mapping/unread-divider.js";import{LocalMessageWindowReadError as v}from"../../../im-core/src/state/local-message-window-read-error.js";import{isValidLiveRoomBody as y}from"../../../im-core/src/mapping/live-room-body.js";import{isValidGiftBody as f}from"../../../im-core/src/mapping/gift-body.js";import{isValidTransferBody as u}from"../../../im-core/src/mapping/transfer-body.js";import{isValidMiniProgramBody as I}from"../../../im-core/src/mapping/mini-program-body.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as _,MEDIA_ALBUM_MAX_ITEMS as w}from"../../../im-core/src/mapping/media-album-body.js";import{isMessageVisibleInTimeline as p}from"../../../im-core/src/mapping/session-mapper.js";import{MEDIA_THUMBNAIL_MAX_BYTES as E}from"../../../im-core/src/media-thumbnail-policy.js";function M(t,o,r){return t instanceof e?n({code:t.code,category:t.category,retryable:t.retryable,operation:o,conversation:r,cause:t}):a(t,o,r)}const S=/* @__PURE__ */new WeakMap;function D(e,t){const o=S.get(t);if(void 0===o)throw new Error("ConversationHandle advanced 访问能力尚未注册");S.set(e,o)}const T={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"not-own":{code:"IM_SDK_RECALL_NOT_OWN",category:"permission",retryable:!1},"not-sent":{code:"IM_SDK_RECALL_NOT_SENT",category:"state",retryable:!1},expired:{code:"IM_SDK_RECALL_EXPIRED",category:"state",retryable:!1},"server-expired":{code:"IM_SDK_RECALL_EXPIRED",category:"state",retryable:!1},unsupported:{code:"IM_SDK_RECALL_UNSUPPORTED",category:"unsupported",retryable:!1},timeout:{code:"IM_SDK_RECALL_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_RECALL_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_RECALL_DISCONNECTED",category:"network",retryable:!0}},h={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"not-own":{code:"IM_SDK_EDIT_NOT_OWN",category:"permission",retryable:!1},"not-sent":{code:"IM_SDK_EDIT_NOT_SENT",category:"state",retryable:!1},recalled:{code:"IM_SDK_EDIT_RECALLED",category:"state",retryable:!1},deleted:{code:"IM_SDK_EDIT_DELETED",category:"state",retryable:!1},expired:{code:"IM_SDK_EDIT_EXPIRED",category:"state",retryable:!1},unsupported:{code:"IM_SDK_EDIT_UNSUPPORTED",category:"unsupported",retryable:!1},empty:{code:"IM_SDK_EDIT_EMPTY",category:"validation",retryable:!1},restricted:{code:"IM_SDK_EDIT_RESTRICTED",category:"permission",retryable:!1},"unsupported-content":{code:"IM_SDK_EDIT_CONTENT_UNSUPPORTED",category:"unsupported",retryable:!1},"no-key":{code:"IM_SDK_EDIT_KEY_UNAVAILABLE",category:"state",retryable:!1},"encrypt-failed":{code:"IM_SDK_EDIT_ENCRYPT_FAILED",category:"state",retryable:!1},timeout:{code:"IM_SDK_EDIT_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_EDIT_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_EDIT_DISCONNECTED",category:"network",retryable:!0}},A={"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"unsupported-message":{code:"IM_SDK_REACTION_MESSAGE_UNSUPPORTED",category:"unsupported",retryable:!1},"invalid-emoji":{code:"IM_SDK_REACTION_EMOJI_INVALID",category:"validation",retryable:!1},restricted:{code:"IM_SDK_REACTION_FORBIDDEN",category:"permission",retryable:!1},disconnected:{code:"IM_SDK_REACTION_DISCONNECTED",category:"network",retryable:!0},timeout:{code:"IM_SDK_REACTION_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_REACTION_FAILED",category:"state",retryable:!1}},b={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},unsupported:{code:"IM_SDK_CHANNEL_DELETE_UNSUPPORTED",category:"unsupported",retryable:!1},"not-sent":{code:"IM_SDK_CHANNEL_DELETE_NOT_SENT",category:"state",retryable:!1},unavailable:{code:"IM_SDK_CHANNEL_DELETE_UNAVAILABLE",category:"state",retryable:!1},forbidden:{code:"IM_SDK_CHANNEL_DELETE_FORBIDDEN",category:"permission",retryable:!1},timeout:{code:"IM_SDK_CHANNEL_DELETE_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_CHANNEL_DELETE_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_CHANNEL_DELETE_DISCONNECTED",category:"network",retryable:!0}};function O(e,t,o){const r=n({...t,operation:"messages.deleteForEveryone",conversation:e});return Object.assign(new Error(r.code,void 0),r)}function N(e,t,o,r){if(("group"===t.conversationType||"channel"===t.conversationType)&&e.getPinnedMessage(t)?.messageId===o){const e=n({code:"IM_SDK_MESSAGE_PINNED",category:"state",operation:r,retryable:!1,conversation:t,details:{messageId:o}});throw Object.assign(new Error(e.code),e)}}function P(e,t){const o=n({code:"IM_SDK_MESSAGE_ANCHOR_UNAVAILABLE",category:"state",operation:"history.loadAround",retryable:!0,conversation:e,details:{messageId:t}});return Object.assign(new Error(o.code),o)}const R=209715200,C=2147483648,L=31457280,K=4294967295,U=E;const k={"empty-input":{code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",retryable:!1},"too-many-targets":{code:"IM_SDK_FORWARD_TOO_MANY_TARGETS",category:"validation",retryable:!1},"unsupported-target-type":{code:"IM_SDK_FORWARD_TARGET_UNSUPPORTED",category:"unsupported",retryable:!1},"type-not-allowed":{code:"IM_SDK_FORWARD_CONTENT_UNSUPPORTED",category:"unsupported",retryable:!1},"media-not-ready":{code:"IM_SDK_FORWARD_MEDIA_NOT_READY",category:"state",retryable:!0},"album-item-not-found":{code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",retryable:!1},"conversation-blocked":{code:"IM_SDK_FORWARD_TARGET_BLOCKED",category:"permission",retryable:!1},"send-failed":{code:"IM_SDK_FORWARD_SEND_FAILED",category:"state",retryable:!1}};async function x(e,r,E,D,b={},O={}){g(O.signal);const x=Object.freeze({...e}),G=r.pageSize??30,j={historySource:"group"===x.conversationType||"channel"===x.conversationType?"remote":"local",retention:{maxMessages:6*G},...void 0===b.shouldEstablishRemoteLatestOnOpen?{}:{shouldEstablishRemoteLatest:(e,t)=>!0===b.shouldEstablishRemoteLatestOnOpen?.(t)}};let F=r.domainState.createMessageWindow({...j});const V=/* @__PURE__ */new WeakSet,z=/* @__PURE__ */new WeakSet,H=/* @__PURE__ */new Set,W=/* @__PURE__ */new Set,Y=/* @__PURE__ */new Map;let $,X,Q=!1,q=!1,J=!1,Z=!0,ee=0,te=Object.freeze({state:"none"});const oe=!0===O.captureEntryUnread&&"robot"!==x.conversationType,re=oe?r.domainState.getSession(x):void 0,ne=Math.max(0,!0===re?.manuallyUnread?0:re?.unreadCount??0),ae=oe?r.domainState.getReadState(x):void 0,se=r.getSelfId(),ie=/* @__PURE__ */new Map,de=/* @__PURE__ */new Set;let ce,le,ge,me,ve,ye=ae?.readCursorSortKey,fe=oe?Object.freeze(ne>0?{state:"pending",count:ne}:{state:"none"}):void 0,ue=0;function Ie(e=new DOMException("历史导航已被新的操作取代","AbortError")){const t=ge;ge=void 0;const o=++ue;return t?.controller.abort(e),o}function _e(){const e={version:Ie(),controller:new AbortController};return ge=e,e}function we(e){ge===e&&(ge=void 0)}let pe,Ee,Me=0,Se=!1;if(oe)for(const e of r.domainState.getLoadedMessagesByConversation(x))ie.set(e.id,m(e,se)),ae?.readCursor===("channel"===x.conversationType?e.extensions?.historyCursor:e.id)&&(ye=e.sortKey);const De=new AbortController,Te=/* @__PURE__ */new WeakMap;let he,Ae=/* @__PURE__ */new Map;function be(){if(q)throw new Error("ConversationHandle 已关闭")}function Oe(){const e=F.window.info();return{messages:F.window.list(),context:r.domainState.getConversationContext(x),draft:r.domainState.getDraft(x),loading:Y.size>0,stale:Q,hasOlder:e.hasMore,hasNewer:e.hasNewer,error:X,entryUnread:te,entryUnreadNavigation:fe}}function Ne(e){const t=Te.get(e);if(void 0!==t)return t;const o=i(e),r=Ae.get(e.id),n=void 0!==r&&d(r,o)?r:o;return Te.set(e,n),n}function Pe(e){const t=e.context,o=Object.freeze(e.messages.map(Ne));return Ae=new Map(o.map(e=>[e.id,e])),{ref:x,...void 0===t?{}:{display:Object.freeze({title:t.title,...void 0===t.avatar?{}:{avatar:t.avatar}})},messages:o,entryUnread:e.entryUnread,...void 0===e.entryUnreadNavigation?{}:{entryUnreadNavigation:e.entryUnreadNavigation},draft:e.draft,loading:e.loading,stale:e.stale,hasOlder:e.hasOlder,hasNewer:e.hasNewer,...void 0===e.error?{}:{error:e.error}}}function Re(){Be();const e=Oe();if(void 0!==he&&(o=e,function(e,t){return e.length===t.length&&e.every((e,o)=>e===t[o])}((t=he).messages,o.messages)&&(t.context?.title??"")===(o.context?.title??"")&&(t.context?.avatar??"")===(o.context?.avatar??"")&&t.draft===o.draft&&t.loading===o.loading&&t.stale===o.stale&&t.hasOlder===o.hasOlder&&t.hasNewer===o.hasNewer&&t.error===o.error&&t.entryUnread===o.entryUnread&&t.entryUnreadNavigation===o.entryUnreadNavigation))return;var t,o;he=e;const n=Pe(e);for(const e of H)try{e(n)}catch(e){r.emitter.emit({type:"error",error:{scope:"unknown",message:"ConversationHandle 订阅者回调异常",cause:e}})}}async function Ce(e){const t=F.window.list().find(t=>t.id===e)??r.domainState.getConversationMessage(x,e);if(void 0!==t)return{anchor:t,fallbackSeed:t};const o=await r.domainState.resolveConversationMessage(x,e,{throwOnStorageError:!0});return void 0===o?void 0:{anchor:o,fallbackSeed:o}}async function Le(e,t,o,r=!1){o();const{anchor:n}=t;if(void 0!==t.remoteSeed)return Ke(e,t.remoteSeed,o,r);const a=await e.openAt(x,{anchorSortKey:n.sortKey,limit:G});o();const s=e.list().find(e=>e.id===n.id);if(!0===e.info().remotePagination&&void 0!==s)return Ke(e,s,o,r);if(e.list().some(e=>e.id===n.id))return a;if(void 0===t.fallbackSeed)throw P(x,n.id);if("local"===j.historySource){const o=e.info();return e.openAt(x,{anchorSortKey:n.sortKey,limit:G,seedMessages:[...a.messages,t.fallbackSeed],seedHasOlder:o.hasMore,seedHasNewer:o.hasNewer})}return Ke(e,t.fallbackSeed,o,r)}async function Ke(e,t,o,r){const n=await e.openAt(x,{anchorSortKey:t.sortKey,limit:G,seedMessages:[t],seedHasNewer:!0,seedRemotePagination:{}});return o(),r?(await Ue(e,t,o),{...n,messages:e.list()}):n}async function Ue(e,t,o){for(const r of["older","newer"])if(!e.list().some(e=>p(e)&&("older"===r?e.sortKey<t.sortKey:e.sortKey>t.sortKey)))for(let t=0;t<4;t+=1){o();const t=e.info();if(!("older"===r?t.hasMore:t.hasNewer))break;const n="older"===r?await e.loadOlder({limit:G}):await e.loadNewer({limit:G});if(o(),n.stale)throw new DOMException("消息定位窗口已失效","AbortError");if(n.messages.length>0)break}}function ke(e,t,o){be();const n=F,a=o?.window??n.window,s=o?.isCurrent??(()=>!q&&F===n),i=()=>{if(be(),!s())throw new DOMException("历史操作已被新的导航取代","AbortError")};if(void 0!==$)return Promise.reject(new Error("清空本机会话历史期间拒绝启动新的历史加载"));const d=Y.get(e);if(void 0!==d)return d;const c=r.beginReceiving?.();X=void 0;const l=Promise.resolve().then(()=>(i(),t())).then(e=>(i(),void 0===b.reconcilePage?e:b.reconcilePage(e,a))).then(e=>{i(),Q=!0===e.stale}),g=(void 0===o?.cancelled?l:Promise.race([l,o.cancelled])).catch(t=>{const o=t instanceof v?t.cause:t;throw s()&&(X=M(o,`history.${e}`,x)),Z?t:o}).finally(()=>{c?.(),Y.delete(e),q||Re()});return Y.set(e,g),Re(),g}function xe(){F.window.applyIncoming(r.domainState.getMessagesByConversation(x).slice(-G))}function Ge(e){return!0===b.shouldEstablishRemoteLatestOnOpen?.(e.list())||!0===e.info().remotePagination&&(ne>0||"first-unread"===O.initialPosition&&(r.domainState.getSession(x)?.unreadCount??0)>0)}async function je(){Se=!1,J?J=!1:await ke("latest",()=>F.window.open(x,{limit:G})),xe(),Ge(F.window)&&(await ke("latest:remote",()=>F.window.loadOlder({limit:G,establishLatestOnly:!0})),xe()),Se=!Q,Ve(F.window.list())}function Fe(){if(be(),ve?.version===ue)return ve.promise;const e=_e(),{version:t}=e,o=async function({version:e,controller:t}){const o=F,n=r.domainState.createMessageWindow(j),a=()=>!q&&!t.signal.aborted&&ue===e&&F===o,s=()=>{if(!a())throw new DOMException("回最新已被新的导航取代","AbortError")};let i,d=!1;const c=new Promise((e,t)=>{i=t}),l=()=>{d||n.dispose(),i(t.signal.reason)};t.signal.addEventListener("abort",l,{once:!0});const g={window:n.window,isCurrent:a,cancelled:c},m=(e,t)=>ke(e,async()=>{const e=await t();if(e.stale)throw new DOMException("最新历史窗口已失效","AbortError");return e},g),v=(async()=>{await m(`latest:${e}`,()=>n.window.open(x,{limit:G})),s(),n.window.applyIncoming(r.domainState.getMessagesByConversation(x).slice(-G)),Ge(n.window)&&(await m(`latest:remote:${e}`,()=>n.window.loadOlder({limit:G,establishLatestOnly:!0})),s(),n.window.applyIncoming(r.domainState.getMessagesByConversation(x).slice(-G))),F=n,d=!0,o.dispose(),Se=!0,Q=!1,Ve(n.window.list()),Re()})();try{await Promise.race([v,c])}finally{t.signal.removeEventListener("abort",l),d||n.dispose()}}(e).finally(()=>{we(e),ve?.version===t&&(ve=void 0)});return ve={version:t,promise:o},o}function Ve(e){const t=b.resolveReadMessageId?.(e);pe=void 0===b.resolveReadMessageId?e.at(-1):e.find(e=>e.id===t)}function ze(e){return!(de.has(e.id)||void 0===ce||e.sortKey>ce||void 0!==ye&&e.sortKey<=ye)&&(ie.get(e.id)??m(e,se))}function Be(){if(!oe||ne<=0||void 0!==le||void 0===ce||"none"===fe?.state)return;const e=F.window.list();if(!e.some(e=>e.sortKey===ce))return;const t=e.filter(e=>ze(e)&&p(e)&&void 0===e.recalled&&void 0===e.deletedForEveryone);if(t.length<ne)return;const o=t.slice(-ne);if(o.every(e=>"system"===e.contentType))return void(fe=Object.freeze({state:"none"}));const r=o[0];le=r.id,te=Object.freeze({state:"located",firstMessageId:r.id,count:ne}),fe=Object.freeze({state:"located",firstMessageId:r.id,count:ne})}const He=r.emitter.subscribe(e=>{if(!q&&"conversation"in e&&void 0!==e.conversation&&e.conversation.conversationType===x.conversationType&&e.conversation.conversationId===x.conversationId){if("conversation-history:cleared"!==e.type&&"session:removed"!==e.type||(De.abort(),Ie(),te=Object.freeze({state:"none"}),oe&&(fe=Object.freeze({state:"none"})),Me+=1,Ee?.dispose(),Ee=void 0,Se=!1,pe=void 0),"message:received"===e.type&&"live"===e.source&&(oe&&de.add(e.message.id),Se&&(void 0===pe||e.message.sortKey>pe.sortKey)&&(void 0===b.resolveReadMessageId||b.resolveReadMessageId([e.message])===e.message.id)&&(pe=e.message)),"draft:updated"===e.type||"draft:cleared"===e.type){const t="draft:updated"===e.type?e.draft:null;for(const e of W)try{e(t)}catch(e){r.emitter.emit({type:"error",error:{scope:"unknown",message:"ConversationHandle 草稿订阅者回调异常",cause:e}})}}Re()}});function We(){return"first-unread"===O.initialPosition?async function(){const e=r.domainState.getSession(x),o=Math.max(0,!0===e?.manuallyUnread?0:e?.unreadCount??0),n=r.domainState.getReadState(x),a=n?.readCursor,s=void 0===a||""===a?void 0:"channel"===x.conversationType?r.domainState.getLoadedMessagesByConversation(x).find(e=>e.extensions?.historyCursor===a):r.domainState.getConversationMessage(x,a),i=s?.sortKey??n?.readCursorSortKey;if(te=await t({conversation:x,pageSize:G,unreadCount:o,...void 0===i?{}:{readCursorSortKey:i},signal:De.signal,..."channel"!==x.conversationType||void 0===a||""===a||void 0===r.loadEntryUnreadPage?{}:{loadReadCursorPage:async e=>{const t=F.window.getRevision(),o=()=>!q&&!De.signal.aborted&&F.window.getRevision()===t,n=await r.loadEntryUnreadPage({readCursor:a,...void 0===e?{}:{cursor:e},signal:De.signal,isCurrent:o});if(g(De.signal),!o())throw new DOMException("首未读定位已被新的窗口操作作废","AbortError");return n}},selfId:r.getSelfId(),list:()=>F.window.list(),hasOlder:()=>F.window.info().hasMore,hasNewer:()=>F.window.info().hasNewer,openLatest:je,openAt:(e,t)=>{if(void 0===t&&"channel"===x.conversationType&&void 0!==a&&""!==a&&void 0!==r.loadEntryUnreadPage)return Promise.resolve();J=!1;const o=t?.messages.map(e=>r.domainState.getConversationMessage(x,e.id)??e),n=t?.messages.find(t=>t.sortKey===e)?.id,s=void 0===n?e:o?.find(e=>e.id===n)?.sortKey??e;return ke(`entry-unread:${e}`,()=>F.window.openAt(x,{anchorSortKey:s,limit:G,...void 0===t?{}:{seedMessages:o,seedHasNewer:t.hasNewer,seedRemotePagination:void 0===t.nextCursor?{}:{newerCursor:t.nextCursor}}}))},loadOlder:()=>ke("entry-unread:older",()=>F.window.loadOlder({limit:G})),loadNewer:()=>ke("entry-unread:newer",()=>F.window.loadNewer({limit:G}))}),"located"===te.state&&!0===F.window.info().remotePagination){const e=te.firstMessageId,t=F.window.list().find(t=>t.id===e);void 0!==t&&await ke("entry-unread:context",async()=>(await Ue(F.window,t,()=>{g(De.signal),be()}),{conversationId:x.conversationId,messages:F.window.list(),stale:!1}));const o=F.window.list().find(t=>t.id===e);void 0!==o&&p(o)&&void 0===o.recalled&&void 0===o.deletedForEveryone||(te=Object.freeze({state:"unavailable"}))}}():je()}const Ye=()=>{De.abort(O.signal?.reason),F.dispose()};O.signal?.addEventListener("abort",Ye,{once:!0});try{if(g(O.signal),"local-first"===O.initialLoad){await ke("initial:local",()=>F.window.open(x,{limit:G})),g(O.signal),xe(),J=!0;try{await We()}catch(e){if(g(O.signal),e instanceof v)throw e;X=M(e,"history.initial",x),"first-unread"===O.initialPosition&&(te=Object.freeze({state:"unavailable"}))}finally{J=!1}}else await We();g(O.signal)}catch(e){throw q=!0,De.abort(),He(),H.clear(),F.dispose(),e instanceof v?e.cause:e}finally{O.signal?.removeEventListener("abort",Ye)}function $e(e,t){const o=r.domainState.getConversationMessage(x,e);return void 0!==o&&o.conversationType===x.conversationType&&o.conversationId===x.conversationId?{ok:!0,message:s(o)}:{ok:!1,error:n({code:void 0===o?"IM_SDK_MESSAGE_STATE_MISSING":"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:x})}}async function Xe(e,t,o){const r=await(b.getSendPermissionError?.(e));if(be(),void 0!==r){if(void 0===o||"customerService"===x.conversationType)return{ok:!1,error:r};const e=await o(r);return be(),e}try{const e=await t();return be(),e}catch(t){if(q)throw t;return{ok:!1,error:a(t,e,x)}}}async function Qe(e,t={}){const o="name"in e?e.name:void 0,r=t.fileName??("string"==typeof o&&""!==o?o:void 0);return{...x,data:e,...""===e.type?{}:{mimeType:e.type},...void 0===r?{}:{filename:r},..."robot"===x.conversationType?{encrypted:!1}:{},...void 0===t.localPreviewUrl?{}:{localPreviewUrl:t.localPreviewUrl},...void 0===t.localPreviewMetadata?{}:{localPreviewMetadata:t.localPreviewMetadata},...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}}}function qe(e){return void 0===e||Number.isFinite(e.width)&&e.width>0&&Number.isFinite(e.height)&&e.height>0}function Je(e){return qe(e)&&(void 0===e?.duration||Number.isFinite(e.duration)&&e.duration>0)&&(void 0===e?.posterData||e.posterData instanceof Uint8Array&&e.posterData.length>0&&e.posterData.length<=U)}function Ze(e){return void 0!==e&&"duration"in e&&void 0!==e.duration&&Number.isFinite(e.duration)&&e.duration>0}function et(e,t,o){return{ok:!1,error:n({code:e,category:t,operation:o,retryable:!1,conversation:x})}}function tt(e,t){if(null===e||"object"!=typeof e||e.kind!==t)return!1;if(!Number.isSafeInteger(e.width)||e.width<=0||e.width>K||!Number.isSafeInteger(e.height)||e.height<=0||e.height>K)return!1;let o;try{o=new URL(e.url)}catch{return!1}if("http:"!==o.protocol&&"https:"!==o.protocol||""!==o.username||""!==o.password)return!1;const r=e.resourceId;if(void 0!==r&&("string"!=typeof r||""===r.trim()))return!1;if("gif"===t)return!Object.prototype.hasOwnProperty.call(e,"packageId");const n=e.packageId;return"string"==typeof r&&""!==r.trim()&&"string"==typeof n&&""!==n.trim()}function ot(e){if("customerService"===x.conversationType)throw rt(n({code:"IM_SDK_CUSTOMER_SERVICE_READ_ONLY",category:"permission",operation:e,retryable:!1,conversation:x}))}function rt(e){return Object.assign(new Error(e.code),e,{name:"ImMessageActionError"})}function nt(e,t,o){if("direct"===e||"group"===e||"channel"===e||"robot"===e)return Object.freeze({conversationType:e,conversationId:t});throw rt(n({code:"IM_SDK_FORWARD_RESULT_INVALID",category:"contract",operation:o,retryable:!1,conversation:x,details:{targetConversationType:e,targetConversationId:t}}))}async function at(e,t,o){let s;try{s=await r.forwardMessages({messages:t,targets:o.map(e=>{if("customerService"===e.conversationType)throw new Error("客服会话不能作为转发目标");return{conversationType:e.conversationType,conversationId:e.conversationId}})})}catch(t){throw rt(a(t,e,x))}return be(),Object.freeze({sent:Object.freeze(s.results.flatMap(t=>t.ok?[{conversation:nt(t.targetConversationType,t.targetConversationId,e),messageId:t.newMessageId}]:[])),failed:Object.freeze(s.results.flatMap(t=>t.ok?[]:[{sourceMessageId:t.sourceMessageId,conversation:Object.freeze({conversationType:t.targetConversationType,conversationId:t.targetConversationId}),error:n({...k[t.reason],operation:e,conversation:{conversationType:t.targetConversationType,conversationId:t.targetConversationId}})}])),skippedSourceMessageIds:Object.freeze([...s.skippedSourceIds])})}function st(e,t){const o=r.domainState.getConversationMessage(x,e);if(void 0===o){const o=r.domainState.getMessagesById(e)[0];throw rt(n({code:void 0===o?"IM_SDK_MESSAGE_NOT_FOUND":"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:x}))}if(o.conversationType!==x.conversationType||o.conversationId!==x.conversationId)throw rt(n({code:"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:x}));return o}function it(e,t){return rt(n({...t,operation:e,conversation:x}))}function dt(e,t){const o=n({code:e,category:"state",operation:"messages.deleteLocal",retryable:!1,conversation:x,...void 0===t?{}:{cause:t}});return Object.assign(new Error(e),o,{name:"ImLocalMessageDeletionError"})}function ct(e,t){const o=n({code:e,category:"state",operation:"history.clearLocal",retryable:!1,conversation:x,...void 0===t?{}:{cause:t}});return Object.assign(new Error(e),o,{name:"ImLocalConversationHistoryClearError"})}async function lt(e,t){if(void 0!==e)try{await r.domainState.clearDraftIfUnchanged(x,e)}catch(e){r.emitter.emit({type:"error",error:{scope:"storage",message:`消息已被本地发送流程接受,但清理草稿失败(${t})`,cause:e}})}}async function gt(e,t,n,a,s){return Xe(e,async()=>{if("image"===t){const t=await o(n);if(be(),!t)return et("IM_SDK_IMAGE_FORMAT_UNSUPPORTED","unsupported",e)}const i=await Qe(n,a);if(be(),void 0!==t&&void 0===i.localPreviewMetadata&&void 0!==r.prepareMediaPreview){const o=new AbortController,a=await r.prepareMediaPreview({operationId:`${x.conversationType}:${x.conversationId}:${e}:${++ee}`,kind:t,file:n,signal:o.signal});if(be(),void 0===a||("image"===t?!qe(a):!Je(a)))return et("image"===t?"IM_SDK_IMAGE_PREVIEW_METADATA_INVALID":"IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",e);i.localPreviewMetadata=a}if("video"===t&&(void 0!==r.prepareMediaPreview||void 0!==i.localPreviewMetadata)&&!Ze(i.localPreviewMetadata))return et("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",e);const d=b.recheckSendPermissionError?.(e);if(void 0!==d)return{ok:!1,error:d};const l=await s({...i,...void 0===a.filesAlbum?{}:{filesAlbum:a.filesAlbum},...void 0===a.caption||""===a.caption?{}:{caption:a.caption}});return l.ok?(be(),$e(l.messageId,e)):{ok:!1,error:c(l.reason,e,x)}})}function mt(e,t,o){const a=st(e,o);if(!(a.contentType===t||"file"===t&&"filesAlbum"===a.contentType&&1===a.body.filesAlbum?.items.length)||"failed"!==a.status||"media.uploadInterrupted"!==a.failure?.displayCode&&"media.cancelled"!==a.failure?.displayCode&&("media.uploadTimeout"!==a.failure?.displayCode||!1!==a.failure.retryable)||r.isOutboxOwned(e))throw rt(n({code:"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:o,retryable:!1,conversation:x}));return a}async function vt(e,t,o,n,a,s){return mt(t,o,e),Xe(e,async()=>{const i=await Qe(n,a);if("video"===o&&void 0===i.localPreviewMetadata&&void 0!==r.prepareMediaPreview){const t=new AbortController,o=await r.prepareMediaPreview({operationId:`${x.conversationType}:${x.conversationId}:${e}:${++ee}`,kind:"video",file:n,signal:t.signal});if(be(),void 0===o||!Je(o))return et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",e);i.localPreviewMetadata=o}if("video"===o&&(void 0!==r.prepareMediaPreview||void 0!==i.localPreviewMetadata)&&!Ze(i.localPreviewMetadata))return et("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",e);const d=b.recheckSendPermissionError?.(e);if(void 0!==d)return{ok:!1,error:d};mt(t,o,e);const l=await s(t,{...i,...void 0===a.caption||""===a.caption?{}:{caption:a.caption}});return l.ok?(be(),$e(l.messageId,e)):{ok:!1,error:c(l.reason,e,x)}})}Z=!1,function(){if(!oe||ne<=0)return;if(!0===F.window.info().remotePagination&&!Se&&"located"!==te.state)return;z.add(F.window);const e=F.window.list().filter(e=>!de.has(e.id));ce=e.at(-1)?.sortKey;for(const t of e)ie.has(t.id)||ie.set(t.id,m(t,se));if("first-unread"===O.initialPosition&&"located"===te.state)return le=te.firstMessageId,void(fe=Object.freeze({state:"located",count:ne,firstMessageId:te.firstMessageId}));Be()}();const yt={ref:x,getSnapshot:function(){return be(),Pe(Oe())},subscribe:e=>(be(),H.add(e),()=>H.delete(e)),resolveMessage:async e=>{be();const t=F.window.list().find(t=>t.id===e)??await r.domainState.resolveConversationMessage(x,e);return void 0===t?null:Ne(t)},history:{loadEntryUnread:e=>function(e={}){if(be(),e.signal?.aborted)return Promise.reject(e.signal.reason);if(void 0!==me){if(!me.controller.signal.aborted&&me.version===ue&&me.callerSignal===e.signal)return me.promise;me.controller.abort()}if(void 0===fe||"none"===fe.state)return Promise.resolve(!1);const o=_e(),{version:n,controller:a}=o,s=F.window.list(),i=s.find(e=>e.id===le),d=F.window.info();if(void 0===$&&0===Y.size&&!Q&&!De.signal.aborted&&z.has(F.window)&&void 0!==i&&p(i)&&void 0===i.recalled&&void 0===i.deletedForEveryone&&(!d.hasMore||s.some(e=>p(e)&&e.sortKey<i.sortKey))&&(!d.hasNewer||s.some(e=>p(e)&&e.sortKey>i.sortKey)))return te=Object.freeze({state:"located",firstMessageId:i.id,count:ne}),fe=Object.freeze({state:"located",firstMessageId:i.id,count:ne}),Re(),we(o),Promise.resolve(!0);const c=r.domainState.createMessageWindow(j),l=()=>!q&&!a.signal.aborted&&ue===n,g=()=>{if(!l())throw new DOMException("进入未读定位已被新的导航取代","AbortError")},m=async e=>{g();let t=await e();if(g(),void 0!==b.reconcilePage&&(t=await b.reconcilePage(t,c.window)),g(),t.stale)throw new DOMException("进入未读窗口已失效","AbortError");c.window.applyIncoming(c.window.list().map(e=>r.domainState.getConversationMessage(x,e.id)??e))};let y,f=!1;const u=new Promise((e,t)=>{y=t}),I=()=>{f||c.dispose(),y(a.signal.reason)},_=()=>a.abort(e.signal?.reason),w=()=>a.abort(De.signal.reason);a.signal.addEventListener("abort",I,{once:!0}),e.signal?.addEventListener("abort",_,{once:!0}),De.signal.addEventListener("abort",w,{once:!0}),De.signal.aborted&&w();const E=r.beginReceiving?.(),S=(async()=>{try{let e=!1;void 0===ce&&(await m(()=>c.window.open(x,{limit:G})),Ge(c.window)&&await m(()=>c.window.loadOlder({limit:G,establishLatestOnly:!0})),ce=c.window.list().filter(e=>!de.has(e.id)).at(-1)?.sortKey,e=!0);const o=le,n=void 0===o?void 0:await Ce(o);if(g(),void 0!==o&&void 0===n)return fe=Object.freeze({state:"unavailable",count:ne}),!1;const s=void 0===n?await t({conversation:x,pageSize:G,maxExtraPages:Number.POSITIVE_INFINITY,preserveLocatedWindow:!0===c.window.info().remotePagination,...void 0===ce?{}:{entryUpperSortKey:ce},unreadCount:ne,...void 0===ye?{}:{readCursorSortKey:ye},signal:a.signal,selfId:se,isEntryUnread:ze,..."channel"===x.conversationType&&ae?.readCursor&&void 0!==r.loadEntryUnreadPage?{loadReadCursorPage:async e=>{const t=await r.loadEntryUnreadPage({readCursor:ae.readCursor,...void 0===e?{}:{cursor:e},signal:a.signal,isCurrent:l});return g(),t}}:{},paginationKey:()=>c.window.getPaginationKey(),list:()=>c.window.list(),hasOlder:()=>c.window.info().hasMore,hasNewer:()=>c.window.info().hasNewer,openLatest:async()=>{e?e=!1:(await m(()=>c.window.open(x,{limit:G})),Ge(c.window)&&await m(()=>c.window.loadOlder({limit:G,establishLatestOnly:!0})))},openAt:(t,o)=>(e=!1,m(()=>c.window.openAt(x,{anchorSortKey:t,limit:G,...void 0===o?{}:{seedMessages:o.messages.map(e=>r.domainState.getConversationMessage(x,e.id)??e),seedHasNewer:o.hasNewer,seedRemotePagination:void 0===o.nextCursor?{}:{newerCursor:o.nextCursor}}}))),loadOlder:()=>m(()=>c.window.loadOlder({limit:G})),loadNewer:()=>m(()=>c.window.loadNewer({limit:G}))}):await(async()=>(await m(()=>Le(c.window,n,g)),{state:"located",firstMessageId:n.anchor.id,count:ne}))();if(g(),"located"!==s.state)return fe=Object.freeze("none"===s.state?{state:"none"}:{state:"unavailable",count:ne}),!1;const i=c.window.list().find(e=>e.id===s.firstMessageId);if(void 0===i||!p(i)||void 0!==i.recalled||void 0!==i.deletedForEveryone)return fe=Object.freeze({state:"unavailable",count:ne}),!1;!0===c.window.info().remotePagination&&await m(async()=>(await Ue(c.window,i,g),{conversationId:x.conversationId,messages:c.window.list(),stale:!1})),g();const d=c.window.list().find(e=>e.id===s.firstMessageId);if(void 0===d||!p(d)||void 0!==d.recalled||void 0!==d.deletedForEveryone)return fe=Object.freeze({state:"unavailable",count:ne}),!1;const v=F;return F=c,f=!0,v.dispose(),z.add(c.window),le=s.firstMessageId,te=s,fe=Object.freeze({state:"located",count:ne,firstMessageId:s.firstMessageId}),X=void 0,!0}catch(e){const t=e instanceof v?e.cause:e;if(l()){const e=M(t,"history.loadEntryUnread",x);fe=Object.freeze({state:"failed",count:ne,error:e})}throw t}})(),D=Promise.race([S,u]).finally(()=>{a.signal.removeEventListener("abort",I),we(o),e.signal?.removeEventListener("abort",_),De.signal.removeEventListener("abort",w),f||c.dispose(),E?.(),me?.controller===a&&(me=void 0),q||Re()});return me={version:n,callerSignal:e.signal,controller:a,promise:D},D}(e),loadLatest:async()=>Fe(),loadOlder:async()=>(be(),Ie(),ke("older",()=>F.window.loadOlder({limit:G}))),loadNewer:async()=>{be(),Ie(),await ke("newer",()=>F.window.loadNewer({limit:G})),be(),F.window.info().hasNewer||(xe(),Re())},loadAround:async(e,t={})=>{if(be(),!0===t.signal?.aborted)throw new DOMException("消息定位已取消","AbortError");const o=_e(),{version:a,controller:s}=o;if(void 0===$&&"channel"===x.conversationType&&V.has(F.window)&&r.domainState.getPinnedMessage(x)?.messageId===e&&F.window.list().some(t=>t.id===e&&B(t)))return void we(o);const i=F,d=()=>!q&&!s.signal.aborted&&ue===a&&F===i,c=()=>{if(be(),!d())throw new DOMException("消息定位已被新的导航取代","AbortError")};let l,g,m=!1;const v=new Promise((e,t)=>{g=t}),y=()=>{m||l?.dispose(),g(s.signal.reason)},f=()=>s.abort(t.signal?.reason);s.signal.addEventListener("abort",y,{once:!0}),t.signal?.addEventListener("abort",f,{once:!0});const u=(async()=>{const t=await async function(e,t){if(t(),void 0!==$)throw new Error("清空本机会话历史期间拒绝启动新的历史加载");const o=await Ce(e);t();const n=o?.fallbackSeed;if(void 0!==o&&("channel"!==x.conversationType||void 0!==n&&B(n)))return"channel"===x.conversationType&&!0===F.window.info().remotePagination?{...o,remoteSeed:n}:o;if(void 0===r.fetchMessagesByIdBatch)throw P(x,e);if(void 0!==$)throw new Error("清空本机会话历史期间拒绝启动新的历史加载");const a=await r.fetchMessagesByIdBatch([e]);t();const s=a.messages.find(t=>t.id===e&&t.conversationType===x.conversationType&&t.conversationId===x.conversationId);if(void 0!==s){if("channel"===x.conversationType){if(!B(s))throw P(x,e);return{anchor:s,remoteSeed:s}}return{anchor:s,fallbackSeed:s}}if(!a.missingMessageIds.includes(e))throw P(x,e)}(e,c);if(c(),void 0===t)throw function(e,t){const o=n({code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",operation:"history.loadAround",retryable:!1,conversation:e,details:{messageId:t}});return Object.assign(new Error(o.code),o)}(x,e);if(t.anchor.conversationType!==x.conversationType||t.anchor.conversationId!==x.conversationId)throw P(x,e);l=r.domainState.createMessageWindow(j);const o=l.window;await ke(`around:${e}:${a}`,async()=>(c(),Le(o,t,c,!0)),{window:o,isCurrent:d,cancelled:v}),c(),F=l,void 0!==t.remoteSeed&&V.add(o),m=!0,i.dispose(),Re()})();try{await Promise.race([u,v])}finally{t.signal?.removeEventListener("abort",f),s.signal.removeEventListener("abort",y),we(o),m||l?.dispose()}},clearLocal:async()=>(be(),ot("history.clearLocal"),function(){if(q)return Promise.reject(new Error("ConversationHandle 已关闭"));if(void 0!==$)return $;const e=new DOMException("本次清历史已取消旧窗口导航","AbortError");Ie(e),r.invalidateHistory?.(x,e);const t=[...Y.values()],o=Promise.all(t.map(t=>t.catch(t=>{if(t!==e)throw t}))).then(async()=>{be();const e=[...r.domainState.getMessagesByConversation(x),...F.window.list()];if(r.hasOutboxForConversation(x)||e.some(e=>r.isOutboxOwned(e.id)))throw ct("IM_SDK_LOCAL_HISTORY_CLEAR_OUTBOX_OWNED");if(e.some(e=>"pending"===e.status||"uploading"===e.status||"sending"===e.status))throw ct("IM_SDK_LOCAL_HISTORY_CLEAR_MESSAGE_IN_FLIGHT");return await r.domainState.clearLocalConversationHistory(x),be(),Object.freeze({scope:"local-only",remoteHistory:"remote-history-may-restore"})}).catch(e=>{if(e instanceof Error&&"ImLocalConversationHistoryClearError"===e.name)throw e;throw ct("IM_SDK_LOCAL_HISTORY_CLEAR_FAILED",e)}).finally(()=>{$===o&&($=void 0)});return $=o,o}())},messages:{sendText:async(e,t={})=>{be();const o=E(x,e,t);if("code"in o)return{ok:!1,error:o};const n=r.domainState.getDraft(x)?.updatedAt;return Xe("messages.sendText",async()=>{const e=await r.sendText(o);return be(),await lt(n,"messages.sendText"),$e(e.id,"messages.sendText")},async e=>{const t=b.appendTextPermissionFailure?.(o);return void 0===t?{ok:!1,error:e}:(await lt(n,"messages.sendText"),{ok:!0,message:s(t)})})},sendContact:async(e,t={})=>{be();const o=e.targetId.trim(),a=e.displayName.trim();if(""===o||""===a)return{ok:!1,error:n({code:""===o?"IM_SDK_CONTACT_CARD_TARGET_REQUIRED":"IM_SDK_CONTACT_CARD_NAME_REQUIRED",category:"validation",operation:"messages.sendContact",retryable:!1,conversation:x})};const s={...x,contact:{...e,targetId:o,displayName:a},encrypted:"direct"!==x.conversationType&&"robot"!==x.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}};return Xe("messages.sendContact",async()=>$e((await r.sendContact(s)).id,"messages.sendContact"))},sendImage:async(e,t={})=>(be(),e.size>L?et("IM_SDK_IMAGE_TOO_LARGE","validation","messages.sendImage"):void 0!==t.caption&&""!==t.caption?et("IM_SDK_IMAGE_CAPTION_UNSUPPORTED","unsupported","messages.sendImage"):qe(t.localPreviewMetadata)?gt("messages.sendImage","image",e,t,r.sendImage):et("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation","messages.sendImage")),sendMediaAlbum:async(e,t={})=>(be(),async function(e,t){const n="messages.sendMediaAlbum";if(0===e.length)return et("IM_SDK_MEDIA_ALBUM_EMPTY","validation",n);if(e.length>w)return et("IM_SDK_MEDIA_ALBUM_TOO_MANY","validation",n);if(void 0!==t.caption&&Array.from(t.caption).length>_)return et("IM_SDK_MEDIA_ALBUM_CAPTION_TOO_LONG","validation",n);for(const t of e){if("image/gif"===t.file.type)return et("IM_SDK_MEDIA_ALBUM_GIF_UNSUPPORTED","unsupported",n);if("image"===t.kind){if(t.file.size>L)return et("IM_SDK_IMAGE_TOO_LARGE","validation",n);if(!qe(t.localPreviewMetadata))return et("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation",n)}else{if(t.file.size>R)return et("IM_SDK_VIDEO_TOO_LARGE","validation",n);if(!Je(t.localPreviewMetadata))return et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",n)}}return Xe(n,async()=>{for(const t of e){if("image"!==t.kind)continue;const e=await o(t.file);if(be(),!e)return et("IM_SDK_IMAGE_FORMAT_UNSUPPORTED","unsupported",n)}const a=await Promise.all(e.map(async e=>{if(void 0!==e.localPreviewMetadata||void 0===r.prepareMediaPreview)return e.localPreviewMetadata;const t=new AbortController;return r.prepareMediaPreview({operationId:`${x.conversationType}:${x.conversationId}:${n}:${++ee}`,kind:e.kind,file:e.file,signal:t.signal})}));be();const s=[];for(const[t,o]of e.entries()){const e=a[t];if("image"===o.kind&&!qe(e))return et("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation",n);if("video"===o.kind){if(!Je(e))return et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",n);if(void 0!==r.prepareMediaPreview&&!Ze(e))return et("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",n)}const i="name"in o.file?o.file.name:void 0;s.push({kind:o.kind,data:o.file,...""===o.file.type?{}:{mimeType:o.file.type},..."string"==typeof i&&""!==i?{filename:i}:{},...void 0===o.localPreviewUrl?{}:{localPreviewUrl:o.localPreviewUrl},...void 0===e?{}:{localPreviewMetadata:e}})}const i=b.recheckSendPermissionError?.(n);if(void 0!==i)return{ok:!1,error:i};const d=await r.sendMediaAlbum({...x,items:s,...void 0===t.caption||""===t.caption.trim()?{}:{caption:t.caption},...void 0===t.hd?{}:{hd:t.hd},...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}});return d.ok?(be(),$e(d.messageId,n)):{ok:!1,error:c(d.reason,n,x)}})}(e,t)),sendVideo:async(e,t={})=>(be(),e.size>R?et("IM_SDK_VIDEO_TOO_LARGE","validation","messages.sendVideo"):Je(t.localPreviewMetadata)?gt("messages.sendVideo","video",e,t,r.sendVideo):et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation","messages.sendVideo")),replaceInterruptedVideo:async(e,t,o={})=>(be(),t.size>R?et("IM_SDK_VIDEO_TOO_LARGE","validation","messages.replaceInterruptedVideo"):Je(o.localPreviewMetadata)?vt("messages.replaceInterruptedVideo",e,"video",t,o,r.replaceVideo):et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation","messages.replaceInterruptedVideo")),sendVoice:async(e,t)=>(be(),Xe("messages.sendVoice",async()=>{const o=await Qe(e,t),n=b.recheckSendPermissionError?.("messages.sendVoice");if(void 0!==n)return{ok:!1,error:n};const a=await r.sendVoice({...o,durationMs:t.durationMs,...void 0===t.waveform?{}:{waveform:[...t.waveform]}});return a.ok?(be(),$e(a.messageId,"messages.sendVoice")):{ok:!1,error:c(a.reason,"messages.sendVoice",x)}})),sendFile:async(e,t={})=>{if(be(),e.size>C)return et("IM_SDK_FILE_TOO_LARGE","validation","messages.sendFile");if(void 0!==t.caption&&Array.from(t.caption).length>_)return et("IM_SDK_MEDIA_ALBUM_CAPTION_TOO_LONG","validation","messages.sendFile");const o=t.fileName??("name"in e?e.name:void 0);return"string"!=typeof o||""===o.trim()?et("IM_SDK_FILE_NAME_REQUIRED","validation","messages.sendFile"):gt("messages.sendFile",void 0,e,t,r.sendFile)},sendGif:async(e,t={})=>(be(),e.size>3145728?et("IM_SDK_GIF_TOO_LARGE","validation","messages.sendGif"):await async function(e){const t=e.type.trim().toLowerCase();if(""!==t&&"image/gif"!==t)return!1;const o=new Uint8Array(await e.slice(0,6).arrayBuffer());if(6!==o.length)return!1;const r=String.fromCharCode(...o);return"GIF87a"===r||"GIF89a"===r}(e)?gt("messages.sendGif",void 0,e,t,e=>r.sendGif(e)):et("IM_SDK_GIF_INVALID","validation","messages.sendGif")),sendSticker:async(e,t={})=>(be(),tt(e,"sticker")?Xe("messages.sendSticker",async()=>$e((await r.sendExpression({...x,asset:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendSticker")):et("IM_SDK_EXPRESSION_ASSET_INVALID","validation","messages.sendSticker")),sendGifAsset:async(e,t={})=>(be(),tt(e,"gif")?Xe("messages.sendGifAsset",async()=>$e((await r.sendExpression({...x,asset:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGifAsset")):et("IM_SDK_EXPRESSION_ASSET_INVALID","validation","messages.sendGifAsset")),sendGame:async(e,t={})=>(be(),"rock-paper-scissors"!==e&&"dice"!==e?et("IM_SDK_GAME_TYPE_INVALID","validation","messages.sendGame"):Xe("messages.sendGame",async()=>$e((await r.sendGame({...x,gameType:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGame"))),sendMiniProgram:async(e,t={})=>(be(),I(e)?Xe("messages.sendMiniProgram",async()=>$e((await r.sendMiniProgram({...x,miniProgram:e,encrypted:"direct"!==x.conversationType&&"robot"!==x.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendMiniProgram")):et("IM_SDK_MINI_PROGRAM_BODY_INVALID","validation","messages.sendMiniProgram")),sendTransfer:async(e,t={})=>(be(),"channel"===x.conversationType||"robot"===x.conversationType?et("IM_SDK_TRANSFER_CHANNEL_UNSUPPORTED","unsupported","messages.sendTransfer"):u(e)?Xe("messages.sendTransfer",async()=>$e((await r.sendTransfer({...x,transfer:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendTransfer")):et("IM_SDK_TRANSFER_BODY_INVALID","validation","messages.sendTransfer")),sendGift:async(e,t={})=>(be(),"channel"===x.conversationType||"robot"===x.conversationType?et("IM_SDK_GIFT_CHANNEL_UNSUPPORTED","unsupported","messages.sendGift"):f(e)?Xe("messages.sendGift",async()=>$e((await r.sendGift({...x,gift:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGift")):et("IM_SDK_GIFT_BODY_INVALID","validation","messages.sendGift")),sendLiveRoom:async(e,t={})=>(be(),y(e)?Xe("messages.sendLiveRoom",async()=>$e((await r.sendLiveRoom({...x,liveRoom:e,encrypted:"direct"!==x.conversationType&&"robot"!==x.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendLiveRoom")):et("IM_SDK_LIVE_ROOM_BODY_INVALID","validation","messages.sendLiveRoom")),toggleReaction:async(e,t)=>{be(),ot("messages.toggleReaction"),st(e,"messages.toggleReaction");const o=await r.setReaction({conversation:x,parentMessageId:e,emoji:t,action:"toggle"});if(be(),!o.ok)throw it("messages.toggleReaction",A[o.reason]);return Object.freeze({messageId:e,eventId:o.event.id,emoji:o.event.emoji,action:0===o.event.action?"add":"remove"})},setReaction:async(e,t,o)=>{be(),ot("messages.setReaction"),st(e,"messages.setReaction");const n=await r.setReaction({conversation:x,parentMessageId:e,emoji:t,action:o});if(be(),!n.ok)throw it("messages.setReaction",A[n.reason]);return Object.freeze({messageId:e,eventId:n.event.id,emoji:n.event.emoji,action:0===n.event.action?"add":"remove"})},replaceInterruptedFile:async(e,t,o={})=>{if(be(),ot("messages.replaceInterruptedFile"),t.size>C)return et("IM_SDK_FILE_TOO_LARGE","validation","messages.replaceInterruptedFile");if(void 0!==o.caption&&""!==o.caption)return et("IM_SDK_FILE_CAPTION_UNSUPPORTED","unsupported","messages.replaceInterruptedFile");const n=o.fileName??("name"in t?t.name:void 0);return"string"!=typeof n||""===n.trim()?et("IM_SDK_FILE_NAME_REQUIRED","validation","messages.replaceInterruptedFile"):vt("messages.replaceInterruptedFile",e,"file",t,{...o,fileName:n},r.replaceFile)},editText:async(e,t,o={})=>{be(),ot("messages.editText"),st(e,"messages.editText"),N(r.domainState,x,e,"messages.editText");const n=D(x,e,t,o);if("code"in n)throw rt(n);let i;try{i=await r.editMessage(n)}catch(e){throw rt(a(e,"messages.editText",x))}if(be(),!i.ok)throw it("messages.editText",h[i.reason]);return s(st(e,"messages.editText"))},recall:async e=>{let t;be(),ot("messages.recall"),st(e,"messages.recall"),N(r.domainState,x,e,"messages.recall");try{t=await r.recallMessage({...x,messageId:e})}catch(e){throw rt(a(e,"messages.recall",x))}if(be(),!t.ok)throw it("messages.recall",T[t.reason])},deleteLocal:async e=>{be(),ot("messages.deleteLocal"),N(r.domainState,x,e,"messages.deleteLocal");const t=r.domainState.getConversationMessage(x,e);if(r.isOutboxOwned(e))throw dt("IM_SDK_LOCAL_DELETE_OUTBOX_OWNED");if(void 0!==t&&t.conversationType===x.conversationType&&t.conversationId===x.conversationId&&("pending"===t.status||"uploading"===t.status||"sending"===t.status))throw dt("IM_SDK_LOCAL_DELETE_MESSAGE_IN_FLIGHT");try{r.invalidateHistory?.(x);const t=await r.domainState.deleteLocalMessage(x,e);return be(),Object.freeze({scope:"local-only",messageId:e,deleted:t,remoteHistory:"remote-history-may-restore"})}catch(e){if(e instanceof Error&&"code"in e&&"IM_MESSAGE_PINNED"===e.code)throw dt("IM_SDK_MESSAGE_PINNED",e);if(e instanceof Error&&"ImLocalMessageDeletionError"===e.name)throw e;throw dt("IM_SDK_LOCAL_DELETE_FAILED",e)}},forward:async(e,t)=>{if(be(),ot("messages.forward"),0===e.length||0===t.length)throw rt(n({code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",operation:"messages.forward",retryable:!1,conversation:x}));return at("messages.forward",e.map(e=>({id:e,...x})),t)},forwardMediaAlbumItem:async(e,t,o)=>{be(),ot("messages.forwardMediaAlbumItem");const r="messages.forwardMediaAlbumItem";if(""===e.trim()||0===o.length)throw rt(n({code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",operation:r,retryable:!1,conversation:x}));if(!Number.isInteger(t)||t<0)throw rt(n({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:r,retryable:!1,conversation:x,details:{itemIndex:t}}));return at(r,[{id:e,...x,itemIndex:t}],o)},fetchByIds:async e=>{be();const t=r.fetchMessagesByIdBatch;if(void 0===t)throw rt(n({code:"IM_SDK_MESSAGE_LOOKUP_UNSUPPORTED",category:"unsupported",operation:"messages.fetchByIds",retryable:!1,conversation:x}));const o=r.beginReceiving?.();try{const o=await l({messageIds:e,fetchBatch:t,isCurrent:()=>!q,projectMessage:Ne});return Object.freeze({messages:Object.freeze([...o.messages]),missingMessageIds:Object.freeze([...o.missingMessageIds]),unresolvedMessageIds:Object.freeze([...o.unresolvedMessageIds]),...void 0===o.failure?{}:{failure:Object.freeze(o.failure)}})}finally{o?.()}}},draft:{get:async()=>(be(),"customerService"===x.conversationType?null:r.drafts.get(x)),save:async e=>{if(be(),"customerService"===x.conversationType)throw new Error("客服会话不支持草稿");return r.drafts.save(x,e)},clear:async()=>{be(),"customerService"!==x.conversationType&&await r.drafts.clear(x)},subscribe:e=>(be(),W.add(e),()=>W.delete(e))},markRead:async e=>{be();const t=F.window.list();if(void 0!==e&&!t.some(t=>t.id===e))throw new Error(`待标记已读消息不存在或不属于当前 handle 窗口:${e}`);const o=void 0===b.resolveReadMessageId?e??t.at(-1)?.id:b.resolveReadMessageId(t,e);void 0!==o&&await r.markRead({...x,readCursor:o})},markConversationRead:async()=>{if(be(),void 0===r.markConversationRead)throw new Error("当前会话未装配整会话已读能力");const e=Me,t=await async function(){if(Se){const e=/* @__PURE__ */new Map,t=r.domainState.getLoadedMessagesByConversation(x);for(const o of[pe,...t])void 0!==o&&e.set(o.id,r.domainState.getConversationMessage(x,o.id)??o);return Ve([...e.values()].sort((e,t)=>e.sortKey.localeCompare(t.sortKey))),pe?.id}const e=Me,t=r.domainState.createMessageWindow(j);try{const o=await t.window.open(x,{limit:G});if(be(),o.stale)throw new Error("无法确认会话最新已读边界");if(Ge(t.window)){const e=await t.window.loadOlder({limit:G,establishLatestOnly:!0});if(be(),e.stale)throw new Error("无法确认会话远端最新已读边界")}if(e!==Me)throw new DOMException("会话已读确认已失效","AbortError");Ve(t.window.list()),Se=!0;const r=t.window.list();return void 0===b.resolveReadMessageId?r.at(-1)?.id:b.resolveReadMessageId(r)}finally{t.dispose()}}();if(be(),e!==Me)throw new DOMException("会话已读确认已失效","AbortError");if("channel"===x.conversationType&&void 0===t&&F.window.list().length>0)throw new Error("当前频道缺少可信的最新已读消息");if(void 0!==t&&void 0===r.domainState.getConversationMessage(x,t)){const o=pe?.id===t?pe:void 0;if(void 0===o)throw new Error("缺少会话最新已读边界的消息证明");Ee??(Ee=r.domainState.createMessageWindow({retention:{maxMessages:G}}));const n=await Ee.window.openAt(x,{anchorSortKey:o.sortKey,limit:G,seedMessages:[o],seedHasNewer:!1});if(be(),n.stale||e!==Me)throw new DOMException("会话已读确认已失效","AbortError")}await r.markConversationRead(x,t)},markVisibleMessages:async e=>{if(be(),void 0===r.markVisibleMessages)throw new Error("当前会话未装配可见消息回执能力");const t=[...new Set(e)];if(t.some(e=>!F.window.list().some(t=>t.id===e)))throw new Error("可见回执包含当前连续窗口之外的消息");t.length>0&&await r.markVisibleMessages(x,t)},setMuted:async e=>(be(),r.setMuted(x,e)),close(){q||(q=!0,De.abort(),Ie(),He(),H.clear(),W.clear(),Ae.clear(),Ee?.dispose(),F.dispose())}};return S.set(yt,{getMessages:()=>(be(),F.window.list()),resolveMessage:async e=>(be(),F.window.list().find(t=>t.id===e)??r.domainState.resolveConversationMessage(x,e))}),yt}async function G(e,t,o={}){let r,a,s=!1;function i(){const o=Date.now();if(void 0!==r&&o-r.checkedAt<5e3)return Promise.resolve(r.value);if(void 0!==a)return a;const n=t.getRelationship(e.conversationId).then(e=>(r={value:e,checkedAt:Date.now()},e)).catch(e=>(s=!0,t.emitter.emit({type:"error",error:{scope:"http",message:"direct 发送前关系查询失败,已降级为服务端 ACK 裁决",cause:e}}),r={value:"unknown",checkedAt:Date.now()},"unknown")).finally(()=>{a===n&&(a=void 0)});return a=n,n}t.shouldCheckRelationship()&&i();const d=await x(e,t,(e,t,o)=>void 0!==o.mentions&&o.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.sendText",retryable:!1,conversation:e}):{...e,text:t,encrypted:!0,...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}},(e,t,o,r)=>void 0!==r.mentions&&r.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.editText",retryable:!1,conversation:e}):{...e,messageId:t,text:o},{getSendPermissionError:async function(o){if(!t.shouldCheckRelationship())return;const r=await i();if("friend"!==r){if("unknown"!==r)return n({code:"IM_SDK_DIRECT_CONTACT_REQUIRED",category:"permission",operation:o,retryable:!1,conversation:e,details:Object.freeze({relationship:r})});s||(s=!0,t.emitter.emit({type:"error",error:{scope:"protocol",message:"direct 发送前关系状态未知,已降级为服务端 ACK 裁决",cause:{conversation:e,relationship:r}}}))}},appendTextPermissionFailure:t.appendContactRequiredTextFailure},o),c={...d,messages:{...d.messages,async markMediaConsumed(o){const r=t.domainState.getConversationMessage(e,o);if(void 0===r||r.senderId===t.getSelfId()||"voice"!==r.contentType&&"video"!==r.contentType){const t=n({code:"IM_SDK_MEDIA_CONSUMPTION_MESSAGE_INVALID",category:"validation",operation:"messages.markMediaConsumed",retryable:!1,conversation:e});throw Object.assign(new Error(t.code),t)}await t.markDirectMediaConsumed(e.conversationId,o)}}};return D(c,d),c}async function j(e,t,o={}){return x(e,t,(e,t,o)=>{const n=r(o.mentions);return{...e,text:t,encrypted:!0,...void 0===n?{}:{mention:n},...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}}},(e,t,o,n)=>{const a=r(n.mentions);return{...e,messageId:t,text:o,...void 0===a?{}:{mention:a}}},{getSendPermissionError:t.getSendPermissionError,recheckSendPermissionError:t.getSendPermissionError,shouldEstablishRemoteLatestOnOpen:r=>("first-unread"===o.initialPosition||!0===o.captureEntryUnread)&&void 0!==t.domainState.getConversationContext(e)&&z(r,t.pageSize??30)},o)}async function F(e,t,o={}){return x(e,t,(e,t,o)=>void 0!==o.mentions&&o.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.sendText",retryable:!1,conversation:e}):{...e,text:t,encrypted:!1,...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}},(e,t,o,r)=>void 0!==r.mentions&&r.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.editText",retryable:!1,conversation:e}):{...e,messageId:t,text:o},{shouldEstablishRemoteLatestOnOpen:()=>!1},o)}const V=/* @__PURE__ */new Set(["pending","uploading","sending"]);function z(e,t){return e.length<t}function B(e){const t=e.extensions?.historyCursor;return"string"==typeof t&&""!==t.trim()}async function H(e,t,o={}){const n=await x(e,t,(e,t,o)=>{const n=r(o.mentions);return{...e,text:t,encrypted:!0,...void 0===n?{}:{mention:n},...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}}},(e,t,o,n)=>{const a=r(n.mentions);return{...e,messageId:t,text:o,...void 0===a?{}:{mention:a}}},{getSendPermissionError:t.getSendPermissionError,recheckSendPermissionError:t.getSendPermissionError,shouldEstablishRemoteLatestOnOpen:r=>("first-unread"===o.initialPosition||!0===o.captureEntryUnread)&&void 0!==t.domainState.getConversationContext(e)&&z(r,t.pageSize??30)||function(e,t){let o=!1;for(const r of e){const e=r.body.system;if("channel"===r.conversationType&&!0===e?.targetUserIds?.includes(t))if("channel_member_left"!==e.eventType&&"channel_member_removed"!==e.eventType){if(o&&("channel_member_joined"===e.eventType||"channel_member_invited"===e.eventType))return!0}else o=!0}return!1}(r,t.getSelfId()),reconcilePage:t.reconcilePage,resolveReadMessageId:(e,o)=>function(e,t,o){const r=void 0===o?e.length-1:e.findIndex(e=>e.id===o),n=e[r];if(void 0===n||B(n))return n?.id;const a=e.slice(0,r).findLast(e=>B(e));return void 0!==a?a.id:n.senderId===t&&V.has(n.status)?void 0:n.id}(e,t.getSelfId(),o)},o),s={...n,messages:{...n.messages,deleteForEveryone:async o=>{if(void 0===t.domainState.getConversationMessage(e,o))throw O(e,b["not-found"]);let r;N(t.domainState,e,o,"messages.deleteForEveryone");try{r=await t.deleteMessageForEveryone({...e,messageId:o})}catch(t){const o=a(t,"messages.deleteForEveryone",e);throw Object.assign(new Error(o.code,{cause:t}),o)}if(!r.ok)throw O(e,b[r.reason])}}};return D(s,n),s}async function W(e,t,o={}){const r=t=>n({code:"IM_SDK_CUSTOMER_SERVICE_READ_ONLY",category:"permission",operation:t,retryable:!1,conversation:e});return x(e,t,()=>r("messages.sendText"),()=>r("messages.edit"),{getSendPermissionError:r,recheckSendPermissionError:r},o)}export{H as createChannelConversationHandle,W as createCustomerServiceConversationHandle,G as createDirectConversationHandle,j as createGroupConversationHandle,F as createRobotConversationHandle,D as linkConversationHandleDomainAccess};
1
+ import{GroupHistoryPageBoundaryError as e}from"../runtime/group-history-page-boundary.js";import{resolveConversationEntryUnread as t}from"./conversation-entry-unread.js";import{isSupportedImageFile as o}from"./image-format.js";import{toMessageMention as r}from"./mention.js";import{createImSdkError as n,unknownOperationErrorToImSdkError as a,toProductMessage as s,toMessageView as i,areMessageViewsEqual as d,mediaFailureToImSdkError as c}from"./message.js";import{fetchMessagesByIdInBatches as l}from"./messages-by-id.js";import{throwIfAborted as g,abortWithReason as m,getAbortReason as v}from"../../../im-core/src/abort.js";import{isConversationUnreadMessage as y}from"../../../im-core/src/mapping/unread-divider.js";import{LocalMessageWindowReadError as f}from"../../../im-core/src/state/local-message-window-read-error.js";import{isValidLiveRoomBody as u}from"../../../im-core/src/mapping/live-room-body.js";import{isValidGiftBody as I}from"../../../im-core/src/mapping/gift-body.js";import{isValidTransferBody as _}from"../../../im-core/src/mapping/transfer-body.js";import{isValidMiniProgramBody as w}from"../../../im-core/src/mapping/mini-program-body.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as p,MEDIA_ALBUM_MAX_ITEMS as E}from"../../../im-core/src/mapping/media-album-body.js";import{isMessageVisibleInTimeline as M}from"../../../im-core/src/mapping/session-mapper.js";import{MEDIA_THUMBNAIL_MAX_BYTES as S}from"../../../im-core/src/media-thumbnail-policy.js";function D(t,o,r){return t instanceof e?n({code:t.code,category:t.category,retryable:t.retryable,operation:o,conversation:r,cause:t}):a(t,o,r)}function T(e,t){try{g(e)}catch(e){t(e)}}const h=/* @__PURE__ */new WeakMap;function A(e,t){const o=h.get(t);if(void 0===o)throw new Error("ConversationHandle advanced 访问能力尚未注册");h.set(e,o)}const O={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"not-own":{code:"IM_SDK_RECALL_NOT_OWN",category:"permission",retryable:!1},"not-sent":{code:"IM_SDK_RECALL_NOT_SENT",category:"state",retryable:!1},expired:{code:"IM_SDK_RECALL_EXPIRED",category:"state",retryable:!1},"server-expired":{code:"IM_SDK_RECALL_EXPIRED",category:"state",retryable:!1},unsupported:{code:"IM_SDK_RECALL_UNSUPPORTED",category:"unsupported",retryable:!1},timeout:{code:"IM_SDK_RECALL_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_RECALL_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_RECALL_DISCONNECTED",category:"network",retryable:!0}},b={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"not-own":{code:"IM_SDK_EDIT_NOT_OWN",category:"permission",retryable:!1},"not-sent":{code:"IM_SDK_EDIT_NOT_SENT",category:"state",retryable:!1},recalled:{code:"IM_SDK_EDIT_RECALLED",category:"state",retryable:!1},deleted:{code:"IM_SDK_EDIT_DELETED",category:"state",retryable:!1},expired:{code:"IM_SDK_EDIT_EXPIRED",category:"state",retryable:!1},unsupported:{code:"IM_SDK_EDIT_UNSUPPORTED",category:"unsupported",retryable:!1},empty:{code:"IM_SDK_EDIT_EMPTY",category:"validation",retryable:!1},restricted:{code:"IM_SDK_EDIT_RESTRICTED",category:"permission",retryable:!1},"unsupported-content":{code:"IM_SDK_EDIT_CONTENT_UNSUPPORTED",category:"unsupported",retryable:!1},"no-key":{code:"IM_SDK_EDIT_KEY_UNAVAILABLE",category:"state",retryable:!1},"encrypt-failed":{code:"IM_SDK_EDIT_ENCRYPT_FAILED",category:"state",retryable:!1},timeout:{code:"IM_SDK_EDIT_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_EDIT_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_EDIT_DISCONNECTED",category:"network",retryable:!0}},N={"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"unsupported-message":{code:"IM_SDK_REACTION_MESSAGE_UNSUPPORTED",category:"unsupported",retryable:!1},"invalid-emoji":{code:"IM_SDK_REACTION_EMOJI_INVALID",category:"validation",retryable:!1},restricted:{code:"IM_SDK_REACTION_FORBIDDEN",category:"permission",retryable:!1},disconnected:{code:"IM_SDK_REACTION_DISCONNECTED",category:"network",retryable:!0},timeout:{code:"IM_SDK_REACTION_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_REACTION_FAILED",category:"state",retryable:!1}},P={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},unsupported:{code:"IM_SDK_CHANNEL_DELETE_UNSUPPORTED",category:"unsupported",retryable:!1},"not-sent":{code:"IM_SDK_CHANNEL_DELETE_NOT_SENT",category:"state",retryable:!1},unavailable:{code:"IM_SDK_CHANNEL_DELETE_UNAVAILABLE",category:"state",retryable:!1},forbidden:{code:"IM_SDK_CHANNEL_DELETE_FORBIDDEN",category:"permission",retryable:!1},timeout:{code:"IM_SDK_CHANNEL_DELETE_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_CHANNEL_DELETE_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_CHANNEL_DELETE_DISCONNECTED",category:"network",retryable:!0}};function R(e,t,o){const r=n({...t,operation:"messages.deleteForEveryone",conversation:e});return Object.assign(new Error(r.code,void 0),r)}function C(e,t,o,r){if(("group"===t.conversationType||"channel"===t.conversationType)&&e.getPinnedMessage(t)?.messageId===o){const e=n({code:"IM_SDK_MESSAGE_PINNED",category:"state",operation:r,retryable:!1,conversation:t,details:{messageId:o}});throw Object.assign(new Error(e.code),e)}}function L(e,t){const o=n({code:"IM_SDK_MESSAGE_ANCHOR_UNAVAILABLE",category:"state",operation:"history.loadAround",retryable:!0,conversation:e,details:{messageId:t}});return Object.assign(new Error(o.code),o)}const K=209715200,U=2147483648,k=31457280,x=4294967295,G=S;const F={"empty-input":{code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",retryable:!1},"too-many-targets":{code:"IM_SDK_FORWARD_TOO_MANY_TARGETS",category:"validation",retryable:!1},"unsupported-target-type":{code:"IM_SDK_FORWARD_TARGET_UNSUPPORTED",category:"unsupported",retryable:!1},"type-not-allowed":{code:"IM_SDK_FORWARD_CONTENT_UNSUPPORTED",category:"unsupported",retryable:!1},"media-not-ready":{code:"IM_SDK_FORWARD_MEDIA_NOT_READY",category:"state",retryable:!0},"album-item-not-found":{code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",retryable:!1},"conversation-blocked":{code:"IM_SDK_FORWARD_TARGET_BLOCKED",category:"permission",retryable:!1},"send-failed":{code:"IM_SDK_FORWARD_SEND_FAILED",category:"state",retryable:!1}};async function j(e,r,S,A,P={},R={}){g(R.signal);const j=Object.freeze({...e}),V=r.pageSize??30,z={historySource:"group"===j.conversationType||"channel"===j.conversationType?"remote":"local",retention:{maxMessages:6*V},...void 0===P.shouldEstablishRemoteLatestOnOpen?{}:{shouldEstablishRemoteLatest:(e,t)=>!0===P.shouldEstablishRemoteLatestOnOpen?.(t)}};let B=r.domainState.createMessageWindow({...z});const H=/* @__PURE__ */new WeakSet,W=/* @__PURE__ */new WeakSet,$=/* @__PURE__ */new Set,X=/* @__PURE__ */new Set,Q=/* @__PURE__ */new Map;let q,J,Z=!1,ee=!1,te=!1,oe=!0,re=0,ne=Object.freeze({state:"none"});const ae=!0===R.captureEntryUnread&&"robot"!==j.conversationType,se=ae?r.domainState.getSession(j):void 0,ie=Math.max(0,!0===se?.manuallyUnread?0:se?.unreadCount??0),de=ae?r.domainState.getReadState(j):void 0,ce=r.getSelfId(),le=/* @__PURE__ */new Map,ge=/* @__PURE__ */new Set;let me,ve,ye,fe,ue,Ie=de?.readCursorSortKey,_e=ae?Object.freeze(ie>0?{state:"pending",count:ie}:{state:"none"}):void 0,we=0;function pe(e=new DOMException("历史导航已被新的操作取代","AbortError")){const t=ye;ye=void 0;const o=++we;return void 0!==t&&m(t.controller,e),o}function Ee(){const e={version:pe(),controller:new AbortController};return ye=e,e}function Me(e){ye===e&&(ye=void 0)}let Se,De,Te=0,he=!1;if(ae)for(const e of r.domainState.getLoadedMessagesByConversation(j))le.set(e.id,y(e,ce)),de?.readCursor===("channel"===j.conversationType?e.extensions?.historyCursor:e.id)&&(Ie=e.sortKey);const Ae=new AbortController,Oe=/* @__PURE__ */new WeakMap;let be,Ne=/* @__PURE__ */new Map;function Pe(){if(ee)throw new Error("ConversationHandle 已关闭")}function Re(){const e=B.window.info();return{messages:B.window.list(),context:r.domainState.getConversationContext(j),draft:r.domainState.getDraft(j),loading:Q.size>0,stale:Z,hasOlder:e.hasMore,hasNewer:e.hasNewer,error:J,entryUnread:ne,entryUnreadNavigation:_e}}function Ce(e){const t=Oe.get(e);if(void 0!==t)return t;const o=i(e),r=Ne.get(e.id),n=void 0!==r&&d(r,o)?r:o;return Oe.set(e,n),n}function Le(e){const t=e.context,o=Object.freeze(e.messages.map(Ce));return Ne=new Map(o.map(e=>[e.id,e])),{ref:j,...void 0===t?{}:{display:Object.freeze({title:t.title,...void 0===t.avatar?{}:{avatar:t.avatar}})},messages:o,entryUnread:e.entryUnread,...void 0===e.entryUnreadNavigation?{}:{entryUnreadNavigation:e.entryUnreadNavigation},draft:e.draft,loading:e.loading,stale:e.stale,hasOlder:e.hasOlder,hasNewer:e.hasNewer,...void 0===e.error?{}:{error:e.error}}}function Ke(){Ye();const e=Re();if(void 0!==be&&(o=e,function(e,t){return e.length===t.length&&e.every((e,o)=>e===t[o])}((t=be).messages,o.messages)&&(t.context?.title??"")===(o.context?.title??"")&&(t.context?.avatar??"")===(o.context?.avatar??"")&&t.draft===o.draft&&t.loading===o.loading&&t.stale===o.stale&&t.hasOlder===o.hasOlder&&t.hasNewer===o.hasNewer&&t.error===o.error&&t.entryUnread===o.entryUnread&&t.entryUnreadNavigation===o.entryUnreadNavigation))return;var t,o;be=e;const n=Le(e);for(const e of $)try{e(n)}catch(e){r.emitter.emit({type:"error",error:{scope:"unknown",message:"ConversationHandle 订阅者回调异常",cause:e}})}}async function Ue(e){const t=B.window.list().find(t=>t.id===e)??r.domainState.getConversationMessage(j,e);if(void 0!==t)return{anchor:t,fallbackSeed:t};const o=await r.domainState.resolveConversationMessage(j,e,{throwOnStorageError:!0});return void 0===o?void 0:{anchor:o,fallbackSeed:o}}async function ke(e,t,o,r=!1){o();const{anchor:n}=t;if(void 0!==t.remoteSeed)return xe(e,t.remoteSeed,o,r);const a=await e.openAt(j,{anchorSortKey:n.sortKey,limit:V});o();const s=e.list().find(e=>e.id===n.id);if(!0===e.info().remotePagination&&void 0!==s)return xe(e,s,o,r);if(e.list().some(e=>e.id===n.id))return a;if(void 0===t.fallbackSeed)throw L(j,n.id);if("local"===z.historySource){const o=e.info();return e.openAt(j,{anchorSortKey:n.sortKey,limit:V,seedMessages:[...a.messages,t.fallbackSeed],seedHasOlder:o.hasMore,seedHasNewer:o.hasNewer})}return xe(e,t.fallbackSeed,o,r)}async function xe(e,t,o,r){const n=await e.openAt(j,{anchorSortKey:t.sortKey,limit:V,seedMessages:[t],seedHasNewer:!0,seedRemotePagination:{}});return o(),r?(await Ge(e,t,o),{...n,messages:e.list()}):n}async function Ge(e,t,o){for(const r of["older","newer"])if(!e.list().some(e=>M(e)&&("older"===r?e.sortKey<t.sortKey:e.sortKey>t.sortKey)))for(let t=0;t<4;t+=1){o();const t=e.info();if(!("older"===r?t.hasMore:t.hasNewer))break;const n="older"===r?await e.loadOlder({limit:V}):await e.loadNewer({limit:V});if(o(),n.stale)throw new DOMException("消息定位窗口已失效","AbortError");if(n.messages.length>0)break}}function Fe(e,t,o){Pe();const n=B,a=o?.window??n.window,s=o?.isCurrent??(()=>!ee&&B===n),i=()=>{if(Pe(),!s())throw new DOMException("历史操作已被新的导航取代","AbortError")};if(void 0!==q)return Promise.reject(new Error("清空本机会话历史期间拒绝启动新的历史加载"));const d=Q.get(e);if(void 0!==d)return d;const c=r.beginReceiving?.();J=void 0;const l=Promise.resolve().then(()=>(i(),t())).then(e=>(i(),void 0===P.reconcilePage?e:P.reconcilePage(e,a))).then(e=>{i(),Z=!0===e.stale}),g=(void 0===o?.cancelled?l:Promise.race([l,o.cancelled])).catch(t=>{const o=t instanceof f?t.cause:t;throw s()&&(J=D(o,`history.${e}`,j)),oe?t:o}).finally(()=>{c?.(),Q.delete(e),ee||Ke()});return Q.set(e,g),Ke(),g}function je(){B.window.applyIncoming(r.domainState.getMessagesByConversation(j).slice(-V))}function Ve(e){return!0===P.shouldEstablishRemoteLatestOnOpen?.(e.list())||!0===e.info().remotePagination&&(ie>0||"first-unread"===R.initialPosition&&(r.domainState.getSession(j)?.unreadCount??0)>0)}async function ze(){he=!1,te?te=!1:await Fe("latest",()=>B.window.open(j,{limit:V})),je(),Ve(B.window)&&(await Fe("latest:remote",()=>B.window.loadOlder({limit:V,establishLatestOnly:!0})),je()),he=!Z,He(B.window.list())}function Be(){if(Pe(),ue?.version===we)return ue.promise;const e=Ee(),{version:t}=e,o=async function({version:e,controller:t}){const o=B,n=r.domainState.createMessageWindow(z),a=()=>!ee&&!t.signal.aborted&&we===e&&B===o,s=()=>{if(!a())throw new DOMException("回最新已被新的导航取代","AbortError")};let i,d=!1;const c=new Promise((e,t)=>{i=t}),l=()=>{d||n.dispose(),T(t.signal,i)};t.signal.addEventListener("abort",l,{once:!0});const g={window:n.window,isCurrent:a,cancelled:c},m=(e,t)=>Fe(e,async()=>{const e=await t();if(e.stale)throw new DOMException("最新历史窗口已失效","AbortError");return e},g),v=(async()=>{await m(`latest:${e}`,()=>n.window.open(j,{limit:V})),s(),n.window.applyIncoming(r.domainState.getMessagesByConversation(j).slice(-V)),Ve(n.window)&&(await m(`latest:remote:${e}`,()=>n.window.loadOlder({limit:V,establishLatestOnly:!0})),s(),n.window.applyIncoming(r.domainState.getMessagesByConversation(j).slice(-V))),B=n,d=!0,o.dispose(),he=!0,Z=!1,He(n.window.list()),Ke()})();try{await Promise.race([v,c])}finally{t.signal.removeEventListener("abort",l),d||n.dispose()}}(e).finally(()=>{Me(e),ue?.version===t&&(ue=void 0)});return ue={version:t,promise:o},o}function He(e){const t=P.resolveReadMessageId?.(e);Se=void 0===P.resolveReadMessageId?e.at(-1):e.find(e=>e.id===t)}function We(e){return!(ge.has(e.id)||void 0===me||e.sortKey>me||void 0!==Ie&&e.sortKey<=Ie)&&(le.get(e.id)??y(e,ce))}function Ye(){if(!ae||ie<=0||void 0!==ve||void 0===me||"none"===_e?.state)return;const e=B.window.list();if(!e.some(e=>e.sortKey===me))return;const t=e.filter(e=>We(e)&&M(e)&&void 0===e.recalled&&void 0===e.deletedForEveryone);if(t.length<ie)return;const o=t.slice(-ie);if(o.every(e=>"system"===e.contentType))return void(_e=Object.freeze({state:"none"}));const r=o[0];ve=r.id,ne=Object.freeze({state:"located",firstMessageId:r.id,count:ie}),_e=Object.freeze({state:"located",firstMessageId:r.id,count:ie})}const $e=r.emitter.subscribe(e=>{if(!ee&&"conversation"in e&&void 0!==e.conversation&&e.conversation.conversationType===j.conversationType&&e.conversation.conversationId===j.conversationId){if("conversation-history:cleared"!==e.type&&"session:removed"!==e.type||(Ae.abort(),pe(),ne=Object.freeze({state:"none"}),ae&&(_e=Object.freeze({state:"none"})),Te+=1,De?.dispose(),De=void 0,he=!1,Se=void 0),"message:received"===e.type&&"live"===e.source&&(ae&&ge.add(e.message.id),he&&(void 0===Se||e.message.sortKey>Se.sortKey)&&(void 0===P.resolveReadMessageId||P.resolveReadMessageId([e.message])===e.message.id)&&(Se=e.message)),"draft:updated"===e.type||"draft:cleared"===e.type){const t="draft:updated"===e.type?e.draft:null;for(const e of X)try{e(t)}catch(e){r.emitter.emit({type:"error",error:{scope:"unknown",message:"ConversationHandle 草稿订阅者回调异常",cause:e}})}}Ke()}});function Xe(){return"first-unread"===R.initialPosition?async function(){const e=r.domainState.getSession(j),o=Math.max(0,!0===e?.manuallyUnread?0:e?.unreadCount??0),n=r.domainState.getReadState(j),a=n?.readCursor,s=void 0===a||""===a?void 0:"channel"===j.conversationType?r.domainState.getLoadedMessagesByConversation(j).find(e=>e.extensions?.historyCursor===a):r.domainState.getConversationMessage(j,a),i=s?.sortKey??n?.readCursorSortKey;if(ne=await t({conversation:j,pageSize:V,unreadCount:o,...void 0===i?{}:{readCursorSortKey:i},signal:Ae.signal,..."channel"!==j.conversationType||void 0===a||""===a||void 0===r.loadEntryUnreadPage?{}:{loadReadCursorPage:async e=>{const t=B.window.getRevision(),o=()=>!ee&&!Ae.signal.aborted&&B.window.getRevision()===t,n=await r.loadEntryUnreadPage({readCursor:a,...void 0===e?{}:{cursor:e},signal:Ae.signal,isCurrent:o});if(g(Ae.signal),!o())throw new DOMException("首未读定位已被新的窗口操作作废","AbortError");return n}},selfId:r.getSelfId(),list:()=>B.window.list(),hasOlder:()=>B.window.info().hasMore,hasNewer:()=>B.window.info().hasNewer,openLatest:ze,openAt:(e,t)=>{if(void 0===t&&"channel"===j.conversationType&&void 0!==a&&""!==a&&void 0!==r.loadEntryUnreadPage)return Promise.resolve();te=!1;const o=t?.messages.map(e=>r.domainState.getConversationMessage(j,e.id)??e),n=t?.messages.find(t=>t.sortKey===e)?.id,s=void 0===n?e:o?.find(e=>e.id===n)?.sortKey??e;return Fe(`entry-unread:${e}`,()=>B.window.openAt(j,{anchorSortKey:s,limit:V,...void 0===t?{}:{seedMessages:o,seedHasNewer:t.hasNewer,seedRemotePagination:void 0===t.nextCursor?{}:{newerCursor:t.nextCursor}}}))},loadOlder:()=>Fe("entry-unread:older",()=>B.window.loadOlder({limit:V})),loadNewer:()=>Fe("entry-unread:newer",()=>B.window.loadNewer({limit:V}))}),"located"===ne.state&&!0===B.window.info().remotePagination){const e=ne.firstMessageId,t=B.window.list().find(t=>t.id===e);void 0!==t&&await Fe("entry-unread:context",async()=>(await Ge(B.window,t,()=>{g(Ae.signal),Pe()}),{conversationId:j.conversationId,messages:B.window.list(),stale:!1}));const o=B.window.list().find(t=>t.id===e);void 0!==o&&M(o)&&void 0===o.recalled&&void 0===o.deletedForEveryone||(ne=Object.freeze({state:"unavailable"}))}}():ze()}const Qe=()=>{m(Ae,v(R.signal)),B.dispose()};R.signal?.addEventListener("abort",Qe,{once:!0});try{if(g(R.signal),"local-first"===R.initialLoad){await Fe("initial:local",()=>B.window.open(j,{limit:V})),g(R.signal),je(),te=!0;try{await Xe()}catch(e){if(g(R.signal),e instanceof f)throw e;J=D(e,"history.initial",j),"first-unread"===R.initialPosition&&(ne=Object.freeze({state:"unavailable"}))}finally{te=!1}}else await Xe();g(R.signal)}catch(e){throw ee=!0,Ae.abort(),$e(),$.clear(),B.dispose(),e instanceof f?e.cause:e}finally{R.signal?.removeEventListener("abort",Qe)}function qe(e,t){const o=r.domainState.getConversationMessage(j,e);return void 0!==o&&o.conversationType===j.conversationType&&o.conversationId===j.conversationId?{ok:!0,message:s(o)}:{ok:!1,error:n({code:void 0===o?"IM_SDK_MESSAGE_STATE_MISSING":"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:j})}}async function Je(e,t,o){const r=await(P.getSendPermissionError?.(e));if(Pe(),void 0!==r){if(void 0===o||"customerService"===j.conversationType)return{ok:!1,error:r};const e=await o(r);return Pe(),e}try{const e=await t();return Pe(),e}catch(t){if(ee)throw t;return{ok:!1,error:a(t,e,j)}}}async function Ze(e,t={}){const o="name"in e?e.name:void 0,r=t.fileName??("string"==typeof o&&""!==o?o:void 0);return{...j,data:e,...""===e.type?{}:{mimeType:e.type},...void 0===r?{}:{filename:r},..."robot"===j.conversationType?{encrypted:!1}:{},...void 0===t.localPreviewUrl?{}:{localPreviewUrl:t.localPreviewUrl},...void 0===t.localPreviewMetadata?{}:{localPreviewMetadata:t.localPreviewMetadata},...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}}}function et(e){return void 0===e||Number.isFinite(e.width)&&e.width>0&&Number.isFinite(e.height)&&e.height>0}function tt(e){return et(e)&&(void 0===e?.duration||Number.isFinite(e.duration)&&e.duration>0)&&(void 0===e?.posterData||e.posterData instanceof Uint8Array&&e.posterData.length>0&&e.posterData.length<=G)}function ot(e){return void 0!==e&&"duration"in e&&void 0!==e.duration&&Number.isFinite(e.duration)&&e.duration>0}function rt(e,t,o){return{ok:!1,error:n({code:e,category:t,operation:o,retryable:!1,conversation:j})}}function nt(e,t){if(null===e||"object"!=typeof e||e.kind!==t)return!1;if(!Number.isSafeInteger(e.width)||e.width<=0||e.width>x||!Number.isSafeInteger(e.height)||e.height<=0||e.height>x)return!1;let o;try{o=new URL(e.url)}catch{return!1}if("http:"!==o.protocol&&"https:"!==o.protocol||""!==o.username||""!==o.password)return!1;const r=e.resourceId;if(void 0!==r&&("string"!=typeof r||""===r.trim()))return!1;if("gif"===t)return!Object.prototype.hasOwnProperty.call(e,"packageId");const n=e.packageId;return"string"==typeof r&&""!==r.trim()&&"string"==typeof n&&""!==n.trim()}function at(e){if("customerService"===j.conversationType)throw st(n({code:"IM_SDK_CUSTOMER_SERVICE_READ_ONLY",category:"permission",operation:e,retryable:!1,conversation:j}))}function st(e){return Object.assign(new Error(e.code),e,{name:"ImMessageActionError"})}function it(e,t,o){if("direct"===e||"group"===e||"channel"===e||"robot"===e)return Object.freeze({conversationType:e,conversationId:t});throw st(n({code:"IM_SDK_FORWARD_RESULT_INVALID",category:"contract",operation:o,retryable:!1,conversation:j,details:{targetConversationType:e,targetConversationId:t}}))}async function dt(e,t,o){let s;try{s=await r.forwardMessages({messages:t,targets:o.map(e=>{if("customerService"===e.conversationType)throw new Error("客服会话不能作为转发目标");return{conversationType:e.conversationType,conversationId:e.conversationId}})})}catch(t){throw st(a(t,e,j))}return Pe(),Object.freeze({sent:Object.freeze(s.results.flatMap(t=>t.ok?[{conversation:it(t.targetConversationType,t.targetConversationId,e),messageId:t.newMessageId}]:[])),failed:Object.freeze(s.results.flatMap(t=>t.ok?[]:[{sourceMessageId:t.sourceMessageId,conversation:Object.freeze({conversationType:t.targetConversationType,conversationId:t.targetConversationId}),error:n({...F[t.reason],operation:e,conversation:{conversationType:t.targetConversationType,conversationId:t.targetConversationId}})}])),skippedSourceMessageIds:Object.freeze([...s.skippedSourceIds])})}function ct(e,t){const o=r.domainState.getConversationMessage(j,e);if(void 0===o){const o=r.domainState.getMessagesById(e)[0];throw st(n({code:void 0===o?"IM_SDK_MESSAGE_NOT_FOUND":"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:j}))}if(o.conversationType!==j.conversationType||o.conversationId!==j.conversationId)throw st(n({code:"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:j}));return o}function lt(e,t){return st(n({...t,operation:e,conversation:j}))}function gt(e,t){const o=n({code:e,category:"state",operation:"messages.deleteLocal",retryable:!1,conversation:j,...void 0===t?{}:{cause:t}});return Object.assign(new Error(e),o,{name:"ImLocalMessageDeletionError"})}function mt(e,t){const o=n({code:e,category:"state",operation:"history.clearLocal",retryable:!1,conversation:j,...void 0===t?{}:{cause:t}});return Object.assign(new Error(e),o,{name:"ImLocalConversationHistoryClearError"})}async function vt(e,t){if(void 0!==e)try{await r.domainState.clearDraftIfUnchanged(j,e)}catch(e){r.emitter.emit({type:"error",error:{scope:"storage",message:`消息已被本地发送流程接受,但清理草稿失败(${t})`,cause:e}})}}async function yt(e,t,n,a,s){return Je(e,async()=>{if("image"===t){const t=await o(n);if(Pe(),!t)return rt("IM_SDK_IMAGE_FORMAT_UNSUPPORTED","unsupported",e)}const i=await Ze(n,a);if(Pe(),void 0!==t&&void 0===i.localPreviewMetadata&&void 0!==r.prepareMediaPreview){const o=new AbortController,a=await r.prepareMediaPreview({operationId:`${j.conversationType}:${j.conversationId}:${e}:${++re}`,kind:t,file:n,signal:o.signal});if(Pe(),void 0===a||("image"===t?!et(a):!tt(a)))return rt("image"===t?"IM_SDK_IMAGE_PREVIEW_METADATA_INVALID":"IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",e);i.localPreviewMetadata=a}if("video"===t&&(void 0!==r.prepareMediaPreview||void 0!==i.localPreviewMetadata)&&!ot(i.localPreviewMetadata))return rt("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",e);const d=P.recheckSendPermissionError?.(e);if(void 0!==d)return{ok:!1,error:d};const l=await s({...i,...void 0===a.filesAlbum?{}:{filesAlbum:a.filesAlbum},...void 0===a.caption||""===a.caption?{}:{caption:a.caption}});return l.ok?(Pe(),qe(l.messageId,e)):{ok:!1,error:c(l.reason,e,j)}})}function ft(e,t,o){const a=ct(e,o);if(!(a.contentType===t||"file"===t&&"filesAlbum"===a.contentType&&1===a.body.filesAlbum?.items.length)||"failed"!==a.status||"media.uploadInterrupted"!==a.failure?.displayCode&&"media.cancelled"!==a.failure?.displayCode&&("media.uploadTimeout"!==a.failure?.displayCode||!1!==a.failure.retryable)||r.isOutboxOwned(e))throw st(n({code:"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:o,retryable:!1,conversation:j}));return a}async function ut(e,t,o,n,a,s){return ft(t,o,e),Je(e,async()=>{const i=await Ze(n,a);if("video"===o&&void 0===i.localPreviewMetadata&&void 0!==r.prepareMediaPreview){const t=new AbortController,o=await r.prepareMediaPreview({operationId:`${j.conversationType}:${j.conversationId}:${e}:${++re}`,kind:"video",file:n,signal:t.signal});if(Pe(),void 0===o||!tt(o))return rt("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",e);i.localPreviewMetadata=o}if("video"===o&&(void 0!==r.prepareMediaPreview||void 0!==i.localPreviewMetadata)&&!ot(i.localPreviewMetadata))return rt("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",e);const d=P.recheckSendPermissionError?.(e);if(void 0!==d)return{ok:!1,error:d};ft(t,o,e);const l=await s(t,{...i,...void 0===a.caption||""===a.caption?{}:{caption:a.caption}});return l.ok?(Pe(),qe(l.messageId,e)):{ok:!1,error:c(l.reason,e,j)}})}oe=!1,function(){if(!ae||ie<=0)return;if(!0===B.window.info().remotePagination&&!he&&"located"!==ne.state)return;W.add(B.window);const e=B.window.list().filter(e=>!ge.has(e.id));me=e.at(-1)?.sortKey;for(const t of e)le.has(t.id)||le.set(t.id,y(t,ce));if("first-unread"===R.initialPosition&&"located"===ne.state)return ve=ne.firstMessageId,void(_e=Object.freeze({state:"located",count:ie,firstMessageId:ne.firstMessageId}));Ye()}();const It={ref:j,getSnapshot:function(){return Pe(),Le(Re())},subscribe:e=>(Pe(),$.add(e),()=>$.delete(e)),resolveMessage:async e=>{Pe();const t=B.window.list().find(t=>t.id===e)??await r.domainState.resolveConversationMessage(j,e);return void 0===t?null:Ce(t)},history:{loadEntryUnread:e=>function(e={}){if(Pe(),e.signal?.aborted)return new Promise((t,o)=>T(e.signal,o));if(void 0!==fe){if(!fe.controller.signal.aborted&&fe.version===we&&fe.callerSignal===e.signal)return fe.promise;fe.controller.abort()}if(void 0===_e||"none"===_e.state)return Promise.resolve(!1);const o=Ee(),{version:n,controller:a}=o,s=B.window.list(),i=s.find(e=>e.id===ve),d=B.window.info();if(void 0===q&&0===Q.size&&!Z&&!Ae.signal.aborted&&W.has(B.window)&&void 0!==i&&M(i)&&void 0===i.recalled&&void 0===i.deletedForEveryone&&(!d.hasMore||s.some(e=>M(e)&&e.sortKey<i.sortKey))&&(!d.hasNewer||s.some(e=>M(e)&&e.sortKey>i.sortKey)))return ne=Object.freeze({state:"located",firstMessageId:i.id,count:ie}),_e=Object.freeze({state:"located",firstMessageId:i.id,count:ie}),Ke(),Me(o),Promise.resolve(!0);const c=r.domainState.createMessageWindow(z),l=()=>!ee&&!a.signal.aborted&&we===n,g=()=>{if(!l())throw new DOMException("进入未读定位已被新的导航取代","AbortError")},y=async e=>{g();let t=await e();if(g(),void 0!==P.reconcilePage&&(t=await P.reconcilePage(t,c.window)),g(),t.stale)throw new DOMException("进入未读窗口已失效","AbortError");c.window.applyIncoming(c.window.list().map(e=>r.domainState.getConversationMessage(j,e.id)??e))};let u,I=!1;const _=new Promise((e,t)=>{u=t}),w=()=>{I||c.dispose(),T(a.signal,u)},p=()=>m(a,v(e.signal)),E=()=>m(a,v(Ae.signal));a.signal.addEventListener("abort",w,{once:!0}),e.signal?.addEventListener("abort",p,{once:!0}),Ae.signal.addEventListener("abort",E,{once:!0}),Ae.signal.aborted&&E();const S=r.beginReceiving?.(),h=(async()=>{try{let e=!1;void 0===me&&(await y(()=>c.window.open(j,{limit:V})),Ve(c.window)&&await y(()=>c.window.loadOlder({limit:V,establishLatestOnly:!0})),me=c.window.list().filter(e=>!ge.has(e.id)).at(-1)?.sortKey,e=!0);const o=ve,n=void 0===o?void 0:await Ue(o);if(g(),void 0!==o&&void 0===n)return _e=Object.freeze({state:"unavailable",count:ie}),!1;const s=void 0===n?await t({conversation:j,pageSize:V,maxExtraPages:Number.POSITIVE_INFINITY,preserveLocatedWindow:!0===c.window.info().remotePagination,...void 0===me?{}:{entryUpperSortKey:me},unreadCount:ie,...void 0===Ie?{}:{readCursorSortKey:Ie},signal:a.signal,selfId:ce,isEntryUnread:We,..."channel"===j.conversationType&&de?.readCursor&&void 0!==r.loadEntryUnreadPage?{loadReadCursorPage:async e=>{const t=await r.loadEntryUnreadPage({readCursor:de.readCursor,...void 0===e?{}:{cursor:e},signal:a.signal,isCurrent:l});return g(),t}}:{},paginationKey:()=>c.window.getPaginationKey(),list:()=>c.window.list(),hasOlder:()=>c.window.info().hasMore,hasNewer:()=>c.window.info().hasNewer,openLatest:async()=>{e?e=!1:(await y(()=>c.window.open(j,{limit:V})),Ve(c.window)&&await y(()=>c.window.loadOlder({limit:V,establishLatestOnly:!0})))},openAt:(t,o)=>(e=!1,y(()=>c.window.openAt(j,{anchorSortKey:t,limit:V,...void 0===o?{}:{seedMessages:o.messages.map(e=>r.domainState.getConversationMessage(j,e.id)??e),seedHasNewer:o.hasNewer,seedRemotePagination:void 0===o.nextCursor?{}:{newerCursor:o.nextCursor}}}))),loadOlder:()=>y(()=>c.window.loadOlder({limit:V})),loadNewer:()=>y(()=>c.window.loadNewer({limit:V}))}):await(async()=>(await y(()=>ke(c.window,n,g)),{state:"located",firstMessageId:n.anchor.id,count:ie}))();if(g(),"located"!==s.state)return _e=Object.freeze("none"===s.state?{state:"none"}:{state:"unavailable",count:ie}),!1;const i=c.window.list().find(e=>e.id===s.firstMessageId);if(void 0===i||!M(i)||void 0!==i.recalled||void 0!==i.deletedForEveryone)return _e=Object.freeze({state:"unavailable",count:ie}),!1;!0===c.window.info().remotePagination&&await y(async()=>(await Ge(c.window,i,g),{conversationId:j.conversationId,messages:c.window.list(),stale:!1})),g();const d=c.window.list().find(e=>e.id===s.firstMessageId);if(void 0===d||!M(d)||void 0!==d.recalled||void 0!==d.deletedForEveryone)return _e=Object.freeze({state:"unavailable",count:ie}),!1;const m=B;return B=c,I=!0,m.dispose(),W.add(c.window),ve=s.firstMessageId,ne=s,_e=Object.freeze({state:"located",count:ie,firstMessageId:s.firstMessageId}),J=void 0,!0}catch(e){const t=e instanceof f?e.cause:e;if(l()){const e=D(t,"history.loadEntryUnread",j);_e=Object.freeze({state:"failed",count:ie,error:e})}throw t}})(),A=Promise.race([h,_]).finally(()=>{a.signal.removeEventListener("abort",w),Me(o),e.signal?.removeEventListener("abort",p),Ae.signal.removeEventListener("abort",E),I||c.dispose(),S?.(),fe?.controller===a&&(fe=void 0),ee||Ke()});return fe={version:n,callerSignal:e.signal,controller:a,promise:A},A}(e),loadLatest:async()=>Be(),loadOlder:async()=>(Pe(),pe(),Fe("older",()=>B.window.loadOlder({limit:V}))),loadNewer:async()=>{Pe(),pe(),await Fe("newer",()=>B.window.loadNewer({limit:V})),Pe(),B.window.info().hasNewer||(je(),Ke())},loadAround:async(e,t={})=>{if(Pe(),!0===t.signal?.aborted)throw new DOMException("消息定位已取消","AbortError");const o=Ee(),{version:a,controller:s}=o;if(void 0===q&&"channel"===j.conversationType&&H.has(B.window)&&r.domainState.getPinnedMessage(j)?.messageId===e&&B.window.list().some(t=>t.id===e&&Y(t)))return void Me(o);const i=B,d=()=>!ee&&!s.signal.aborted&&we===a&&B===i,c=()=>{if(Pe(),!d())throw new DOMException("消息定位已被新的导航取代","AbortError")};let l,g,y=!1;const f=new Promise((e,t)=>{g=t}),u=()=>{y||l?.dispose(),T(s.signal,g)},I=()=>m(s,v(t.signal));s.signal.addEventListener("abort",u,{once:!0}),t.signal?.addEventListener("abort",I,{once:!0});const _=(async()=>{const t=await async function(e,t){if(t(),void 0!==q)throw new Error("清空本机会话历史期间拒绝启动新的历史加载");const o=await Ue(e);t();const n=o?.fallbackSeed;if(void 0!==o&&("channel"!==j.conversationType||void 0!==n&&Y(n)))return"channel"===j.conversationType&&!0===B.window.info().remotePagination?{...o,remoteSeed:n}:o;if(void 0===r.fetchMessagesByIdBatch)throw L(j,e);if(void 0!==q)throw new Error("清空本机会话历史期间拒绝启动新的历史加载");const a=await r.fetchMessagesByIdBatch([e]);t();const s=a.messages.find(t=>t.id===e&&t.conversationType===j.conversationType&&t.conversationId===j.conversationId);if(void 0!==s){if("channel"===j.conversationType){if(!Y(s))throw L(j,e);return{anchor:s,remoteSeed:s}}return{anchor:s,fallbackSeed:s}}if(!a.missingMessageIds.includes(e))throw L(j,e)}(e,c);if(c(),void 0===t)throw function(e,t){const o=n({code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",operation:"history.loadAround",retryable:!1,conversation:e,details:{messageId:t}});return Object.assign(new Error(o.code),o)}(j,e);if(t.anchor.conversationType!==j.conversationType||t.anchor.conversationId!==j.conversationId)throw L(j,e);l=r.domainState.createMessageWindow(z);const o=l.window;await Fe(`around:${e}:${a}`,async()=>(c(),ke(o,t,c,!0)),{window:o,isCurrent:d,cancelled:f}),c(),B=l,void 0!==t.remoteSeed&&H.add(o),y=!0,i.dispose(),Ke()})();try{await Promise.race([_,f])}finally{t.signal?.removeEventListener("abort",I),s.signal.removeEventListener("abort",u),Me(o),y||l?.dispose()}},clearLocal:async()=>(Pe(),at("history.clearLocal"),function(){if(ee)return Promise.reject(new Error("ConversationHandle 已关闭"));if(void 0!==q)return q;const e=new DOMException("本次清历史已取消旧窗口导航","AbortError");pe(e),r.invalidateHistory?.(j,e);const t=[...Q.values()],o=Promise.all(t.map(t=>t.catch(t=>{if(t!==e)throw t}))).then(async()=>{Pe();const e=[...r.domainState.getMessagesByConversation(j),...B.window.list()];if(r.hasOutboxForConversation(j)||e.some(e=>r.isOutboxOwned(e.id)))throw mt("IM_SDK_LOCAL_HISTORY_CLEAR_OUTBOX_OWNED");if(e.some(e=>"pending"===e.status||"uploading"===e.status||"sending"===e.status))throw mt("IM_SDK_LOCAL_HISTORY_CLEAR_MESSAGE_IN_FLIGHT");return await r.domainState.clearLocalConversationHistory(j),Pe(),Object.freeze({scope:"local-only",remoteHistory:"remote-history-may-restore"})}).catch(e=>{if(e instanceof Error&&"ImLocalConversationHistoryClearError"===e.name)throw e;throw mt("IM_SDK_LOCAL_HISTORY_CLEAR_FAILED",e)}).finally(()=>{q===o&&(q=void 0)});return q=o,o}())},messages:{sendText:async(e,t={})=>{Pe();const o=S(j,e,t);if("code"in o)return{ok:!1,error:o};const n=r.domainState.getDraft(j)?.updatedAt;return Je("messages.sendText",async()=>{const e=await r.sendText(o);return Pe(),await vt(n,"messages.sendText"),qe(e.id,"messages.sendText")},async e=>{const t=P.appendTextPermissionFailure?.(o);return void 0===t?{ok:!1,error:e}:(await vt(n,"messages.sendText"),{ok:!0,message:s(t)})})},sendContact:async(e,t={})=>{Pe();const o=e.targetId.trim(),a=e.displayName.trim();if(""===o||""===a)return{ok:!1,error:n({code:""===o?"IM_SDK_CONTACT_CARD_TARGET_REQUIRED":"IM_SDK_CONTACT_CARD_NAME_REQUIRED",category:"validation",operation:"messages.sendContact",retryable:!1,conversation:j})};const s={...j,contact:{...e,targetId:o,displayName:a},encrypted:"direct"!==j.conversationType&&"robot"!==j.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}};return Je("messages.sendContact",async()=>qe((await r.sendContact(s)).id,"messages.sendContact"))},sendImage:async(e,t={})=>(Pe(),e.size>k?rt("IM_SDK_IMAGE_TOO_LARGE","validation","messages.sendImage"):void 0!==t.caption&&""!==t.caption?rt("IM_SDK_IMAGE_CAPTION_UNSUPPORTED","unsupported","messages.sendImage"):et(t.localPreviewMetadata)?yt("messages.sendImage","image",e,t,r.sendImage):rt("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation","messages.sendImage")),sendMediaAlbum:async(e,t={})=>(Pe(),async function(e,t){const n="messages.sendMediaAlbum";if(0===e.length)return rt("IM_SDK_MEDIA_ALBUM_EMPTY","validation",n);if(e.length>E)return rt("IM_SDK_MEDIA_ALBUM_TOO_MANY","validation",n);if(void 0!==t.caption&&Array.from(t.caption).length>p)return rt("IM_SDK_MEDIA_ALBUM_CAPTION_TOO_LONG","validation",n);for(const t of e){if("image/gif"===t.file.type)return rt("IM_SDK_MEDIA_ALBUM_GIF_UNSUPPORTED","unsupported",n);if("image"===t.kind){if(t.file.size>k)return rt("IM_SDK_IMAGE_TOO_LARGE","validation",n);if(!et(t.localPreviewMetadata))return rt("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation",n)}else{if(t.file.size>K)return rt("IM_SDK_VIDEO_TOO_LARGE","validation",n);if(!tt(t.localPreviewMetadata))return rt("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",n)}}return Je(n,async()=>{for(const t of e){if("image"!==t.kind)continue;const e=await o(t.file);if(Pe(),!e)return rt("IM_SDK_IMAGE_FORMAT_UNSUPPORTED","unsupported",n)}const a=await Promise.all(e.map(async e=>{if(void 0!==e.localPreviewMetadata||void 0===r.prepareMediaPreview)return e.localPreviewMetadata;const t=new AbortController;return r.prepareMediaPreview({operationId:`${j.conversationType}:${j.conversationId}:${n}:${++re}`,kind:e.kind,file:e.file,signal:t.signal})}));Pe();const s=[];for(const[t,o]of e.entries()){const e=a[t];if("image"===o.kind&&!et(e))return rt("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation",n);if("video"===o.kind){if(!tt(e))return rt("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",n);if(void 0!==r.prepareMediaPreview&&!ot(e))return rt("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",n)}const i="name"in o.file?o.file.name:void 0;s.push({kind:o.kind,data:o.file,...""===o.file.type?{}:{mimeType:o.file.type},..."string"==typeof i&&""!==i?{filename:i}:{},...void 0===o.localPreviewUrl?{}:{localPreviewUrl:o.localPreviewUrl},...void 0===e?{}:{localPreviewMetadata:e}})}const i=P.recheckSendPermissionError?.(n);if(void 0!==i)return{ok:!1,error:i};const d=await r.sendMediaAlbum({...j,items:s,...void 0===t.caption||""===t.caption.trim()?{}:{caption:t.caption},...void 0===t.hd?{}:{hd:t.hd},...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}});return d.ok?(Pe(),qe(d.messageId,n)):{ok:!1,error:c(d.reason,n,j)}})}(e,t)),sendVideo:async(e,t={})=>(Pe(),e.size>K?rt("IM_SDK_VIDEO_TOO_LARGE","validation","messages.sendVideo"):tt(t.localPreviewMetadata)?yt("messages.sendVideo","video",e,t,r.sendVideo):rt("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation","messages.sendVideo")),replaceInterruptedVideo:async(e,t,o={})=>(Pe(),t.size>K?rt("IM_SDK_VIDEO_TOO_LARGE","validation","messages.replaceInterruptedVideo"):tt(o.localPreviewMetadata)?ut("messages.replaceInterruptedVideo",e,"video",t,o,r.replaceVideo):rt("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation","messages.replaceInterruptedVideo")),sendVoice:async(e,t)=>(Pe(),Je("messages.sendVoice",async()=>{const o=await Ze(e,t),n=P.recheckSendPermissionError?.("messages.sendVoice");if(void 0!==n)return{ok:!1,error:n};const a=await r.sendVoice({...o,durationMs:t.durationMs,...void 0===t.waveform?{}:{waveform:[...t.waveform]}});return a.ok?(Pe(),qe(a.messageId,"messages.sendVoice")):{ok:!1,error:c(a.reason,"messages.sendVoice",j)}})),sendFile:async(e,t={})=>{if(Pe(),e.size>U)return rt("IM_SDK_FILE_TOO_LARGE","validation","messages.sendFile");if(void 0!==t.caption&&Array.from(t.caption).length>p)return rt("IM_SDK_MEDIA_ALBUM_CAPTION_TOO_LONG","validation","messages.sendFile");const o=t.fileName??("name"in e?e.name:void 0);return"string"!=typeof o||""===o.trim()?rt("IM_SDK_FILE_NAME_REQUIRED","validation","messages.sendFile"):yt("messages.sendFile",void 0,e,t,r.sendFile)},sendGif:async(e,t={})=>(Pe(),e.size>3145728?rt("IM_SDK_GIF_TOO_LARGE","validation","messages.sendGif"):await async function(e){const t=e.type.trim().toLowerCase();if(""!==t&&"image/gif"!==t)return!1;const o=new Uint8Array(await e.slice(0,6).arrayBuffer());if(6!==o.length)return!1;const r=String.fromCharCode(...o);return"GIF87a"===r||"GIF89a"===r}(e)?yt("messages.sendGif",void 0,e,t,e=>r.sendGif(e)):rt("IM_SDK_GIF_INVALID","validation","messages.sendGif")),sendSticker:async(e,t={})=>(Pe(),nt(e,"sticker")?Je("messages.sendSticker",async()=>qe((await r.sendExpression({...j,asset:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendSticker")):rt("IM_SDK_EXPRESSION_ASSET_INVALID","validation","messages.sendSticker")),sendGifAsset:async(e,t={})=>(Pe(),nt(e,"gif")?Je("messages.sendGifAsset",async()=>qe((await r.sendExpression({...j,asset:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGifAsset")):rt("IM_SDK_EXPRESSION_ASSET_INVALID","validation","messages.sendGifAsset")),sendGame:async(e,t={})=>(Pe(),"rock-paper-scissors"!==e&&"dice"!==e?rt("IM_SDK_GAME_TYPE_INVALID","validation","messages.sendGame"):Je("messages.sendGame",async()=>qe((await r.sendGame({...j,gameType:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGame"))),sendMiniProgram:async(e,t={})=>(Pe(),w(e)?Je("messages.sendMiniProgram",async()=>qe((await r.sendMiniProgram({...j,miniProgram:e,encrypted:"direct"!==j.conversationType&&"robot"!==j.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendMiniProgram")):rt("IM_SDK_MINI_PROGRAM_BODY_INVALID","validation","messages.sendMiniProgram")),sendTransfer:async(e,t={})=>(Pe(),"channel"===j.conversationType||"robot"===j.conversationType?rt("IM_SDK_TRANSFER_CHANNEL_UNSUPPORTED","unsupported","messages.sendTransfer"):_(e)?Je("messages.sendTransfer",async()=>qe((await r.sendTransfer({...j,transfer:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendTransfer")):rt("IM_SDK_TRANSFER_BODY_INVALID","validation","messages.sendTransfer")),sendGift:async(e,t={})=>(Pe(),"channel"===j.conversationType||"robot"===j.conversationType?rt("IM_SDK_GIFT_CHANNEL_UNSUPPORTED","unsupported","messages.sendGift"):I(e)?Je("messages.sendGift",async()=>qe((await r.sendGift({...j,gift:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGift")):rt("IM_SDK_GIFT_BODY_INVALID","validation","messages.sendGift")),sendLiveRoom:async(e,t={})=>(Pe(),u(e)?Je("messages.sendLiveRoom",async()=>qe((await r.sendLiveRoom({...j,liveRoom:e,encrypted:"direct"!==j.conversationType&&"robot"!==j.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendLiveRoom")):rt("IM_SDK_LIVE_ROOM_BODY_INVALID","validation","messages.sendLiveRoom")),toggleReaction:async(e,t)=>{Pe(),at("messages.toggleReaction"),ct(e,"messages.toggleReaction");const o=await r.setReaction({conversation:j,parentMessageId:e,emoji:t,action:"toggle"});if(Pe(),!o.ok)throw lt("messages.toggleReaction",N[o.reason]);return Object.freeze({messageId:e,eventId:o.event.id,emoji:o.event.emoji,action:0===o.event.action?"add":"remove"})},setReaction:async(e,t,o)=>{Pe(),at("messages.setReaction"),ct(e,"messages.setReaction");const n=await r.setReaction({conversation:j,parentMessageId:e,emoji:t,action:o});if(Pe(),!n.ok)throw lt("messages.setReaction",N[n.reason]);return Object.freeze({messageId:e,eventId:n.event.id,emoji:n.event.emoji,action:0===n.event.action?"add":"remove"})},replaceInterruptedFile:async(e,t,o={})=>{if(Pe(),at("messages.replaceInterruptedFile"),t.size>U)return rt("IM_SDK_FILE_TOO_LARGE","validation","messages.replaceInterruptedFile");if(void 0!==o.caption&&""!==o.caption)return rt("IM_SDK_FILE_CAPTION_UNSUPPORTED","unsupported","messages.replaceInterruptedFile");const n=o.fileName??("name"in t?t.name:void 0);return"string"!=typeof n||""===n.trim()?rt("IM_SDK_FILE_NAME_REQUIRED","validation","messages.replaceInterruptedFile"):ut("messages.replaceInterruptedFile",e,"file",t,{...o,fileName:n},r.replaceFile)},editText:async(e,t,o={})=>{Pe(),at("messages.editText"),ct(e,"messages.editText"),C(r.domainState,j,e,"messages.editText");const n=A(j,e,t,o);if("code"in n)throw st(n);let i;try{i=await r.editMessage(n)}catch(e){throw st(a(e,"messages.editText",j))}if(Pe(),!i.ok)throw lt("messages.editText",b[i.reason]);return s(ct(e,"messages.editText"))},recall:async e=>{let t;Pe(),at("messages.recall"),ct(e,"messages.recall"),C(r.domainState,j,e,"messages.recall");try{t=await r.recallMessage({...j,messageId:e})}catch(e){throw st(a(e,"messages.recall",j))}if(Pe(),!t.ok)throw lt("messages.recall",O[t.reason])},deleteLocal:async e=>{Pe(),at("messages.deleteLocal"),C(r.domainState,j,e,"messages.deleteLocal");const t=r.domainState.getConversationMessage(j,e);if(r.isOutboxOwned(e))throw gt("IM_SDK_LOCAL_DELETE_OUTBOX_OWNED");if(void 0!==t&&t.conversationType===j.conversationType&&t.conversationId===j.conversationId&&("pending"===t.status||"uploading"===t.status||"sending"===t.status))throw gt("IM_SDK_LOCAL_DELETE_MESSAGE_IN_FLIGHT");try{r.invalidateHistory?.(j);const t=await r.domainState.deleteLocalMessage(j,e);return Pe(),Object.freeze({scope:"local-only",messageId:e,deleted:t,remoteHistory:"remote-history-may-restore"})}catch(e){if(e instanceof Error&&"code"in e&&"IM_MESSAGE_PINNED"===e.code)throw gt("IM_SDK_MESSAGE_PINNED",e);if(e instanceof Error&&"ImLocalMessageDeletionError"===e.name)throw e;throw gt("IM_SDK_LOCAL_DELETE_FAILED",e)}},forward:async(e,t)=>{if(Pe(),at("messages.forward"),0===e.length||0===t.length)throw st(n({code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",operation:"messages.forward",retryable:!1,conversation:j}));return dt("messages.forward",e.map(e=>({id:e,...j})),t)},forwardMediaAlbumItem:async(e,t,o)=>{Pe(),at("messages.forwardMediaAlbumItem");const r="messages.forwardMediaAlbumItem";if(""===e.trim()||0===o.length)throw st(n({code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",operation:r,retryable:!1,conversation:j}));if(!Number.isInteger(t)||t<0)throw st(n({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:r,retryable:!1,conversation:j,details:{itemIndex:t}}));return dt(r,[{id:e,...j,itemIndex:t}],o)},fetchByIds:async e=>{Pe();const t=r.fetchMessagesByIdBatch;if(void 0===t)throw st(n({code:"IM_SDK_MESSAGE_LOOKUP_UNSUPPORTED",category:"unsupported",operation:"messages.fetchByIds",retryable:!1,conversation:j}));const o=r.beginReceiving?.();try{const o=await l({messageIds:e,fetchBatch:t,isCurrent:()=>!ee,projectMessage:Ce});return Object.freeze({messages:Object.freeze([...o.messages]),missingMessageIds:Object.freeze([...o.missingMessageIds]),unresolvedMessageIds:Object.freeze([...o.unresolvedMessageIds]),...void 0===o.failure?{}:{failure:Object.freeze(o.failure)}})}finally{o?.()}}},draft:{get:async()=>(Pe(),"customerService"===j.conversationType?null:r.drafts.get(j)),save:async e=>{if(Pe(),"customerService"===j.conversationType)throw new Error("客服会话不支持草稿");return r.drafts.save(j,e)},clear:async()=>{Pe(),"customerService"!==j.conversationType&&await r.drafts.clear(j)},subscribe:e=>(Pe(),X.add(e),()=>X.delete(e))},markRead:async e=>{Pe();const t=B.window.list();if(void 0!==e&&!t.some(t=>t.id===e))throw new Error(`待标记已读消息不存在或不属于当前 handle 窗口:${e}`);const o=void 0===P.resolveReadMessageId?e??t.at(-1)?.id:P.resolveReadMessageId(t,e);void 0!==o&&await r.markRead({...j,readCursor:o})},markConversationRead:async()=>{if(Pe(),void 0===r.markConversationRead)throw new Error("当前会话未装配整会话已读能力");const e=Te,t=await async function(){if(he){const e=/* @__PURE__ */new Map,t=r.domainState.getLoadedMessagesByConversation(j);for(const o of[Se,...t])void 0!==o&&e.set(o.id,r.domainState.getConversationMessage(j,o.id)??o);return He([...e.values()].sort((e,t)=>e.sortKey.localeCompare(t.sortKey))),Se?.id}const e=Te,t=r.domainState.createMessageWindow(z);try{const o=await t.window.open(j,{limit:V});if(Pe(),o.stale)throw new Error("无法确认会话最新已读边界");if(Ve(t.window)){const e=await t.window.loadOlder({limit:V,establishLatestOnly:!0});if(Pe(),e.stale)throw new Error("无法确认会话远端最新已读边界")}if(e!==Te)throw new DOMException("会话已读确认已失效","AbortError");He(t.window.list()),he=!0;const r=t.window.list();return void 0===P.resolveReadMessageId?r.at(-1)?.id:P.resolveReadMessageId(r)}finally{t.dispose()}}();if(Pe(),e!==Te)throw new DOMException("会话已读确认已失效","AbortError");if("channel"===j.conversationType&&void 0===t&&B.window.list().length>0)throw new Error("当前频道缺少可信的最新已读消息");if(void 0!==t&&void 0===r.domainState.getConversationMessage(j,t)){const o=Se?.id===t?Se:void 0;if(void 0===o)throw new Error("缺少会话最新已读边界的消息证明");De??(De=r.domainState.createMessageWindow({retention:{maxMessages:V}}));const n=await De.window.openAt(j,{anchorSortKey:o.sortKey,limit:V,seedMessages:[o],seedHasNewer:!1});if(Pe(),n.stale||e!==Te)throw new DOMException("会话已读确认已失效","AbortError")}await r.markConversationRead(j,t)},markVisibleMessages:async e=>{if(Pe(),void 0===r.markVisibleMessages)throw new Error("当前会话未装配可见消息回执能力");const t=[...new Set(e)];if(t.some(e=>!B.window.list().some(t=>t.id===e)))throw new Error("可见回执包含当前连续窗口之外的消息");t.length>0&&await r.markVisibleMessages(j,t)},setMuted:async e=>(Pe(),r.setMuted(j,e)),close(){ee||(ee=!0,Ae.abort(),pe(),$e(),$.clear(),X.clear(),Ne.clear(),De?.dispose(),B.dispose())}};return h.set(It,{getMessages:()=>(Pe(),B.window.list()),resolveMessage:async e=>(Pe(),B.window.list().find(t=>t.id===e)??r.domainState.resolveConversationMessage(j,e))}),It}async function V(e,t,o={}){let r,a,s=!1;function i(){const o=Date.now();if(void 0!==r&&o-r.checkedAt<5e3)return Promise.resolve(r.value);if(void 0!==a)return a;const n=t.getRelationship(e.conversationId).then(e=>(r={value:e,checkedAt:Date.now()},e)).catch(e=>(s=!0,t.emitter.emit({type:"error",error:{scope:"http",message:"direct 发送前关系查询失败,已降级为服务端 ACK 裁决",cause:e}}),r={value:"unknown",checkedAt:Date.now()},"unknown")).finally(()=>{a===n&&(a=void 0)});return a=n,n}t.shouldCheckRelationship()&&i();const d=await j(e,t,(e,t,o)=>void 0!==o.mentions&&o.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.sendText",retryable:!1,conversation:e}):{...e,text:t,encrypted:!0,...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}},(e,t,o,r)=>void 0!==r.mentions&&r.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.editText",retryable:!1,conversation:e}):{...e,messageId:t,text:o},{getSendPermissionError:async function(o){if(!t.shouldCheckRelationship())return;const r=await i();if("friend"!==r){if("unknown"!==r)return n({code:"IM_SDK_DIRECT_CONTACT_REQUIRED",category:"permission",operation:o,retryable:!1,conversation:e,details:Object.freeze({relationship:r})});s||(s=!0,t.emitter.emit({type:"error",error:{scope:"protocol",message:"direct 发送前关系状态未知,已降级为服务端 ACK 裁决",cause:{conversation:e,relationship:r}}}))}},appendTextPermissionFailure:t.appendContactRequiredTextFailure},o),c={...d,messages:{...d.messages,async markMediaConsumed(o){const r=t.domainState.getConversationMessage(e,o);if(void 0===r||r.senderId===t.getSelfId()||"voice"!==r.contentType&&"video"!==r.contentType){const t=n({code:"IM_SDK_MEDIA_CONSUMPTION_MESSAGE_INVALID",category:"validation",operation:"messages.markMediaConsumed",retryable:!1,conversation:e});throw Object.assign(new Error(t.code),t)}await t.markDirectMediaConsumed(e.conversationId,o)}}};return A(c,d),c}async function z(e,t,o={}){return j(e,t,(e,t,o)=>{const n=r(o.mentions);return{...e,text:t,encrypted:!0,...void 0===n?{}:{mention:n},...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}}},(e,t,o,n)=>{const a=r(n.mentions);return{...e,messageId:t,text:o,...void 0===a?{}:{mention:a}}},{getSendPermissionError:t.getSendPermissionError,recheckSendPermissionError:t.getSendPermissionError,shouldEstablishRemoteLatestOnOpen:r=>("first-unread"===o.initialPosition||!0===o.captureEntryUnread)&&void 0!==t.domainState.getConversationContext(e)&&W(r,t.pageSize??30)},o)}async function B(e,t,o={}){return j(e,t,(e,t,o)=>void 0!==o.mentions&&o.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.sendText",retryable:!1,conversation:e}):{...e,text:t,encrypted:!1,...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}},(e,t,o,r)=>void 0!==r.mentions&&r.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.editText",retryable:!1,conversation:e}):{...e,messageId:t,text:o},{shouldEstablishRemoteLatestOnOpen:()=>!1},o)}const H=/* @__PURE__ */new Set(["pending","uploading","sending"]);function W(e,t){return e.length<t}function Y(e){const t=e.extensions?.historyCursor;return"string"==typeof t&&""!==t.trim()}async function $(e,t,o={}){const n=await j(e,t,(e,t,o)=>{const n=r(o.mentions);return{...e,text:t,encrypted:!0,...void 0===n?{}:{mention:n},...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}}},(e,t,o,n)=>{const a=r(n.mentions);return{...e,messageId:t,text:o,...void 0===a?{}:{mention:a}}},{getSendPermissionError:t.getSendPermissionError,recheckSendPermissionError:t.getSendPermissionError,shouldEstablishRemoteLatestOnOpen:r=>("first-unread"===o.initialPosition||!0===o.captureEntryUnread)&&void 0!==t.domainState.getConversationContext(e)&&W(r,t.pageSize??30)||function(e,t){let o=!1;for(const r of e){const e=r.body.system;if("channel"===r.conversationType&&!0===e?.targetUserIds?.includes(t))if("channel_member_left"!==e.eventType&&"channel_member_removed"!==e.eventType){if(o&&("channel_member_joined"===e.eventType||"channel_member_invited"===e.eventType))return!0}else o=!0}return!1}(r,t.getSelfId()),reconcilePage:t.reconcilePage,resolveReadMessageId:(e,o)=>function(e,t,o){const r=void 0===o?e.length-1:e.findIndex(e=>e.id===o),n=e[r];if(void 0===n||Y(n))return n?.id;let a;for(let t=r-1;t>=0;t-=1){const o=e[t];if(Y(o)){a=o;break}}return void 0!==a?a.id:n.senderId===t&&H.has(n.status)?void 0:n.id}(e,t.getSelfId(),o)},o),s={...n,messages:{...n.messages,deleteForEveryone:async o=>{if(void 0===t.domainState.getConversationMessage(e,o))throw R(e,P["not-found"]);let r;C(t.domainState,e,o,"messages.deleteForEveryone");try{r=await t.deleteMessageForEveryone({...e,messageId:o})}catch(t){const o=a(t,"messages.deleteForEveryone",e);throw Object.assign(new Error(o.code,{cause:t}),o)}if(!r.ok)throw R(e,P[r.reason])}}};return A(s,n),s}async function X(e,t,o={}){const r=t=>n({code:"IM_SDK_CUSTOMER_SERVICE_READ_ONLY",category:"permission",operation:t,retryable:!1,conversation:e});return j(e,t,()=>r("messages.sendText"),()=>r("messages.edit"),{getSendPermissionError:r,recheckSendPermissionError:r},o)}export{$ as createChannelConversationHandle,X as createCustomerServiceConversationHandle,V as createDirectConversationHandle,z as createGroupConversationHandle,B as createRobotConversationHandle,A as linkConversationHandleDomainAccess};