k2-im 0.2.16 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat-kit-pinia.d.ts +55 -11
- package/dist/chat-kit-vue.d.ts +5 -5
- package/dist/chat-kit.d.ts +101 -11
- package/dist/index.d.ts +104 -13
- package/dist/modules/im-browser/src/http/cm-http-adapter.js +1 -1
- package/dist/modules/im-browser/src/http/request-timeout.js +1 -0
- package/dist/modules/im-browser/src/http/requests/core-json-request.js +1 -1
- package/dist/modules/im-browser/src/http/requests/get-conversation-background-presets.js +1 -1
- package/dist/modules/im-browser/src/http/requests/pull-offline-channel.js +1 -1
- package/dist/modules/im-browser/src/media/media-download-request.js +1 -0
- package/dist/modules/im-browser/src/media/media-downloader.js +1 -1
- package/dist/modules/im-browser/src/media/media-preview-preparation-executor.js +1 -1
- package/dist/modules/im-browser/src/media/media-transfer-policy.js +1 -1
- package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -1
- package/dist/modules/im-chat-kit/src/runtime/chat-runtime.js +1 -1
- package/dist/modules/im-chat-kit/src/runtime/media-object-url-registry.js +1 -1
- package/dist/modules/im-chat-kit/src/services/media.service.js +1 -1
- package/dist/modules/im-chat-kit/src/utils/media-transfer-presentation.js +1 -1
- package/dist/modules/im-core/src/mapping/group-offline-mapper.js +1 -1
- package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -1
- package/dist/modules/im-sdk/src/create-im-client.js +1 -1
- package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -1
- package/dist/modules/im-sdk/src/product/media.js +1 -1
- package/dist/modules/im-sdk/src/runtime/history-page-size.js +1 -0
- package/dist/modules/im-sdk/src/runtime/local-media-preview.js +1 -1
- package/dist/modules/im-sdk/src/runtime/recent-history-fetcher.js +1 -1
- package/dist/modules/im-sdk/src/runtime/session-runtime.js +1 -1
- package/dist/sdk.d.ts +49 -10
- package/package.json +1 -1
|
@@ -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,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};
|
|
1
|
+
import{GroupHistoryPageBoundaryError as e}from"../runtime/group-history-page-boundary.js";import{DEFAULT_HISTORY_PAGE_SIZE as t}from"../runtime/history-page-size.js";import{resolveConversationEntryUnread as o}from"./conversation-entry-unread.js";import{isSupportedImageFile as r}from"./image-format.js";import{toMessageMention as n}from"./mention.js";import{createImSdkError as a,unknownOperationErrorToImSdkError as s,toProductMessage as i,toMessageView as d,areMessageViewsEqual as c,mediaFailureToImSdkError as l}from"./message.js";import{fetchMessagesByIdInBatches as g}from"./messages-by-id.js";import{throwIfAborted as m,abortWithReason as v,getAbortReason as y}from"../../../im-core/src/abort.js";import{isConversationUnreadMessage as f}from"../../../im-core/src/mapping/unread-divider.js";import{LocalMessageWindowReadError as u}from"../../../im-core/src/state/local-message-window-read-error.js";import{isValidLiveRoomBody as I}from"../../../im-core/src/mapping/live-room-body.js";import{isValidGiftBody as _}from"../../../im-core/src/mapping/gift-body.js";import{isValidTransferBody as w}from"../../../im-core/src/mapping/transfer-body.js";import{isValidMiniProgramBody as p}from"../../../im-core/src/mapping/mini-program-body.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as E,MEDIA_ALBUM_MAX_ITEMS as M}from"../../../im-core/src/mapping/media-album-body.js";import{isMessageVisibleInTimeline as S}from"../../../im-core/src/mapping/session-mapper.js";import{MEDIA_THUMBNAIL_MAX_BYTES as D}from"../../../im-core/src/media-thumbnail-policy.js";function T(t,o,r){return t instanceof e?a({code:t.code,category:t.category,retryable:t.retryable,operation:o,conversation:r,cause:t}):s(t,o,r)}function h(e,t){try{m(e)}catch(e){t(e)}}const A=/* @__PURE__ */new WeakMap;function O(e,t){const o=A.get(t);if(void 0===o)throw new Error("ConversationHandle advanced 访问能力尚未注册");A.set(e,o)}const 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_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}},N={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}},P={"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}},R={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 C(e,t,o){const r=a({...t,operation:"messages.deleteForEveryone",conversation:e});return Object.assign(new Error(r.code,void 0),r)}function L(e,t,o,r){if(("group"===t.conversationType||"channel"===t.conversationType)&&e.getPinnedMessage(t)?.messageId===o){const e=a({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 K(e,t){const o=a({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 U=209715200,k=2147483648,x=31457280,G=4294967295,j=D;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 V(e,n,D,O,R={},C={}){m(C.signal);const V=Object.freeze({...e}),z=n.pageSize??t,B={historySource:"group"===V.conversationType||"channel"===V.conversationType?"remote":"local",retention:{maxMessages:6*z},...void 0===R.shouldEstablishRemoteLatestOnOpen?{}:{shouldEstablishRemoteLatest:(e,t)=>!0===R.shouldEstablishRemoteLatestOnOpen?.(t)}};let H=n.domainState.createMessageWindow({...B});const W=/* @__PURE__ */new WeakSet,Y=/* @__PURE__ */new WeakSet,X=/* @__PURE__ */new Set,Q=/* @__PURE__ */new Set,q=/* @__PURE__ */new Map;let J,Z,ee=!1,te=!1,oe=!1,re=!0,ne=0,ae=Object.freeze({state:"none"});const se=!0===C.captureEntryUnread&&"robot"!==V.conversationType,ie=se?n.domainState.getSession(V):void 0,de=Math.max(0,!0===ie?.manuallyUnread?0:ie?.unreadCount??0),ce=se?n.domainState.getReadState(V):void 0,le=n.getSelfId(),ge=/* @__PURE__ */new Map,me=/* @__PURE__ */new Set;let ve,ye,fe,ue,Ie,_e=ce?.readCursorSortKey,we=se?Object.freeze(de>0?{state:"pending",count:de}:{state:"none"}):void 0,pe=0;function Ee(e=new DOMException("历史导航已被新的操作取代","AbortError")){const t=fe;fe=void 0;const o=++pe;return void 0!==t&&v(t.controller,e),o}function Me(){const e={version:Ee(),controller:new AbortController};return fe=e,e}function Se(e){fe===e&&(fe=void 0)}let De,Te,he=0,Ae=!1;if(se)for(const e of n.domainState.getLoadedMessagesByConversation(V))ge.set(e.id,f(e,le)),ce?.readCursor===("channel"===V.conversationType?e.extensions?.historyCursor:e.id)&&(_e=e.sortKey);const Oe=new AbortController,be=/* @__PURE__ */new WeakMap;let Ne,Pe=/* @__PURE__ */new Map;function Re(){if(te)throw new Error("ConversationHandle 已关闭")}function Ce(){const e=H.window.info();return{messages:H.window.list(),context:n.domainState.getConversationContext(V),draft:n.domainState.getDraft(V),loading:q.size>0,stale:ee,hasOlder:e.hasMore,hasNewer:e.hasNewer,error:Z,entryUnread:ae,entryUnreadNavigation:we}}function Le(e){const t=be.get(e);if(void 0!==t)return t;const o=d(e),r=Pe.get(e.id),n=void 0!==r&&c(r,o)?r:o;return be.set(e,n),n}function Ke(e){const t=e.context,o=Object.freeze(e.messages.map(Le));return Pe=new Map(o.map(e=>[e.id,e])),{ref:V,...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 Ue(){$e();const e=Ce();if(void 0!==Ne&&(o=e,function(e,t){return e.length===t.length&&e.every((e,o)=>e===t[o])}((t=Ne).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;Ne=e;const r=Ke(e);for(const e of X)try{e(r)}catch(e){n.emitter.emit({type:"error",error:{scope:"unknown",message:"ConversationHandle 订阅者回调异常",cause:e}})}}async function ke(e){const t=H.window.list().find(t=>t.id===e)??n.domainState.getConversationMessage(V,e);if(void 0!==t)return{anchor:t,fallbackSeed:t};const o=await n.domainState.resolveConversationMessage(V,e,{throwOnStorageError:!0});return void 0===o?void 0:{anchor:o,fallbackSeed:o}}async function xe(e,t,o,r=!1){o();const{anchor:n}=t;if(void 0!==t.remoteSeed)return Ge(e,t.remoteSeed,o,r);const a=await e.openAt(V,{anchorSortKey:n.sortKey,limit:z});o();const s=e.list().find(e=>e.id===n.id);if(!0===e.info().remotePagination&&void 0!==s)return Ge(e,s,o,r);if(e.list().some(e=>e.id===n.id))return a;if(void 0===t.fallbackSeed)throw K(V,n.id);if("local"===B.historySource){const o=e.info();return e.openAt(V,{anchorSortKey:n.sortKey,limit:z,seedMessages:[...a.messages,t.fallbackSeed],seedHasOlder:o.hasMore,seedHasNewer:o.hasNewer})}return Ge(e,t.fallbackSeed,o,r)}async function Ge(e,t,o,r){const n=await e.openAt(V,{anchorSortKey:t.sortKey,limit:z,seedMessages:[t],seedHasNewer:!0,seedRemotePagination:{}});return o(),r?(await je(e,t,o),{...n,messages:e.list()}):n}async function je(e,t,o){for(const r of["older","newer"])if(!e.list().some(e=>S(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:z}):await e.loadNewer({limit:z});if(o(),n.stale)throw new DOMException("消息定位窗口已失效","AbortError");if(n.messages.length>0)break}}function Fe(e,t,o){Re();const r=H,a=o?.window??r.window,s=o?.isCurrent??(()=>!te&&H===r),i=()=>{if(Re(),!s())throw new DOMException("历史操作已被新的导航取代","AbortError")};if(void 0!==J)return Promise.reject(new Error("清空本机会话历史期间拒绝启动新的历史加载"));const d=q.get(e);if(void 0!==d)return d;const c=n.beginReceiving?.();Z=void 0;const l=Promise.resolve().then(()=>(i(),t())).then(e=>(i(),void 0===R.reconcilePage?e:R.reconcilePage(e,a))).then(e=>{i(),ee=!0===e.stale}),g=(void 0===o?.cancelled?l:Promise.race([l,o.cancelled])).catch(t=>{const o=t instanceof u?t.cause:t;throw s()&&(Z=T(o,`history.${e}`,V)),re?t:o}).finally(()=>{c?.(),q.delete(e),te||Ue()});return q.set(e,g),Ue(),g}function Ve(){H.window.applyIncoming(n.domainState.getMessagesByConversation(V).slice(-z))}function ze(e){return!0===R.shouldEstablishRemoteLatestOnOpen?.(e.list())||!0===e.info().remotePagination&&(de>0||"first-unread"===C.initialPosition&&(n.domainState.getSession(V)?.unreadCount??0)>0)}async function Be(){Ae=!1,oe?oe=!1:await Fe("latest",()=>H.window.open(V,{limit:z})),Ve(),ze(H.window)&&(await Fe("latest:remote",()=>H.window.loadOlder({limit:z,establishLatestOnly:!0})),Ve()),Ae=!ee,We(H.window.list())}function He(){if(Re(),Ie?.version===pe)return Ie.promise;const e=Me(),{version:t}=e,o=async function({version:e,controller:t}){const o=H,r=n.domainState.createMessageWindow(B),a=()=>!te&&!t.signal.aborted&&pe===e&&H===o,s=()=>{if(!a())throw new DOMException("回最新已被新的导航取代","AbortError")};let i,d=!1;const c=new Promise((e,t)=>{i=t}),l=()=>{d||r.dispose(),h(t.signal,i)};t.signal.addEventListener("abort",l,{once:!0});const g={window:r.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}`,()=>r.window.open(V,{limit:z})),s(),r.window.applyIncoming(n.domainState.getMessagesByConversation(V).slice(-z)),ze(r.window)&&(await m(`latest:remote:${e}`,()=>r.window.loadOlder({limit:z,establishLatestOnly:!0})),s(),r.window.applyIncoming(n.domainState.getMessagesByConversation(V).slice(-z))),H=r,d=!0,o.dispose(),Ae=!0,ee=!1,We(r.window.list()),Ue()})();try{await Promise.race([v,c])}finally{t.signal.removeEventListener("abort",l),d||r.dispose()}}(e).finally(()=>{Se(e),Ie?.version===t&&(Ie=void 0)});return Ie={version:t,promise:o},o}function We(e){const t=R.resolveReadMessageId?.(e);De=void 0===R.resolveReadMessageId?e.at(-1):e.find(e=>e.id===t)}function Ye(e){return!(me.has(e.id)||void 0===ve||e.sortKey>ve||void 0!==_e&&e.sortKey<=_e)&&(ge.get(e.id)??f(e,le))}function $e(){if(!se||de<=0||void 0!==ye||void 0===ve||"none"===we?.state)return;const e=H.window.list();if(!e.some(e=>e.sortKey===ve))return;const t=e.filter(e=>Ye(e)&&S(e)&&void 0===e.recalled&&void 0===e.deletedForEveryone);if(t.length<de)return;const o=t.slice(-de);if(o.every(e=>"system"===e.contentType))return void(we=Object.freeze({state:"none"}));const r=o[0];ye=r.id,ae=Object.freeze({state:"located",firstMessageId:r.id,count:de}),we=Object.freeze({state:"located",firstMessageId:r.id,count:de})}const Xe=n.emitter.subscribe(e=>{if(!te&&"conversation"in e&&void 0!==e.conversation&&e.conversation.conversationType===V.conversationType&&e.conversation.conversationId===V.conversationId){if("conversation-history:cleared"!==e.type&&"session:removed"!==e.type||(Oe.abort(),Ee(),ae=Object.freeze({state:"none"}),se&&(we=Object.freeze({state:"none"})),he+=1,Te?.dispose(),Te=void 0,Ae=!1,De=void 0),"message:received"===e.type&&"live"===e.source&&(se&&me.add(e.message.id),Ae&&(void 0===De||e.message.sortKey>De.sortKey)&&(void 0===R.resolveReadMessageId||R.resolveReadMessageId([e.message])===e.message.id)&&(De=e.message)),"draft:updated"===e.type||"draft:cleared"===e.type){const t="draft:updated"===e.type?e.draft:null;for(const e of Q)try{e(t)}catch(e){n.emitter.emit({type:"error",error:{scope:"unknown",message:"ConversationHandle 草稿订阅者回调异常",cause:e}})}}Ue()}});function Qe(){return"first-unread"===C.initialPosition?async function(){const e=n.domainState.getSession(V),t=Math.max(0,!0===e?.manuallyUnread?0:e?.unreadCount??0),r=n.domainState.getReadState(V),a=r?.readCursor,s=void 0===a||""===a?void 0:"channel"===V.conversationType?n.domainState.getLoadedMessagesByConversation(V).find(e=>e.extensions?.historyCursor===a):n.domainState.getConversationMessage(V,a),i=s?.sortKey??r?.readCursorSortKey;if(ae=await o({conversation:V,pageSize:z,unreadCount:t,...void 0===i?{}:{readCursorSortKey:i},signal:Oe.signal,..."channel"!==V.conversationType||void 0===a||""===a||void 0===n.loadEntryUnreadPage?{}:{loadReadCursorPage:async e=>{const t=H.window.getRevision(),o=()=>!te&&!Oe.signal.aborted&&H.window.getRevision()===t,r=await n.loadEntryUnreadPage({readCursor:a,...void 0===e?{}:{cursor:e},signal:Oe.signal,isCurrent:o});if(m(Oe.signal),!o())throw new DOMException("首未读定位已被新的窗口操作作废","AbortError");return r}},selfId:n.getSelfId(),list:()=>H.window.list(),hasOlder:()=>H.window.info().hasMore,hasNewer:()=>H.window.info().hasNewer,openLatest:Be,openAt:(e,t)=>{if(void 0===t&&"channel"===V.conversationType&&void 0!==a&&""!==a&&void 0!==n.loadEntryUnreadPage)return Promise.resolve();oe=!1;const o=t?.messages.map(e=>n.domainState.getConversationMessage(V,e.id)??e),r=t?.messages.find(t=>t.sortKey===e)?.id,s=void 0===r?e:o?.find(e=>e.id===r)?.sortKey??e;return Fe(`entry-unread:${e}`,()=>H.window.openAt(V,{anchorSortKey:s,limit:z,...void 0===t?{}:{seedMessages:o,seedHasNewer:t.hasNewer,seedRemotePagination:void 0===t.nextCursor?{}:{newerCursor:t.nextCursor}}}))},loadOlder:()=>Fe("entry-unread:older",()=>H.window.loadOlder({limit:z})),loadNewer:()=>Fe("entry-unread:newer",()=>H.window.loadNewer({limit:z}))}),"located"===ae.state&&!0===H.window.info().remotePagination){const e=ae.firstMessageId,t=H.window.list().find(t=>t.id===e);void 0!==t&&await Fe("entry-unread:context",async()=>(await je(H.window,t,()=>{m(Oe.signal),Re()}),{conversationId:V.conversationId,messages:H.window.list(),stale:!1}));const o=H.window.list().find(t=>t.id===e);void 0!==o&&S(o)&&void 0===o.recalled&&void 0===o.deletedForEveryone||(ae=Object.freeze({state:"unavailable"}))}}():Be()}const qe=()=>{v(Oe,y(C.signal)),H.dispose()};C.signal?.addEventListener("abort",qe,{once:!0});try{if(m(C.signal),"local-first"===C.initialLoad){await Fe("initial:local",()=>H.window.open(V,{limit:z})),m(C.signal),Ve(),oe=!0;try{await Qe()}catch(e){if(m(C.signal),e instanceof u)throw e;Z=T(e,"history.initial",V),"first-unread"===C.initialPosition&&(ae=Object.freeze({state:"unavailable"}))}finally{oe=!1}}else await Qe();m(C.signal)}catch(e){throw te=!0,Oe.abort(),Xe(),X.clear(),H.dispose(),e instanceof u?e.cause:e}finally{C.signal?.removeEventListener("abort",qe)}function Je(e,t){const o=n.domainState.getConversationMessage(V,e);return void 0!==o&&o.conversationType===V.conversationType&&o.conversationId===V.conversationId?{ok:!0,message:i(o)}:{ok:!1,error:a({code:void 0===o?"IM_SDK_MESSAGE_STATE_MISSING":"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:V})}}async function Ze(e,t,o){const r=await(R.getSendPermissionError?.(e));if(Re(),void 0!==r){if(void 0===o||"customerService"===V.conversationType)return{ok:!1,error:r};const e=await o(r);return Re(),e}try{const e=await t();return Re(),e}catch(t){if(te)throw t;return{ok:!1,error:s(t,e,V)}}}async function et(e,t={}){const o="name"in e?e.name:void 0,r=t.fileName??("string"==typeof o&&""!==o?o:void 0);return{...V,data:e,...""===e.type?{}:{mimeType:e.type},...void 0===r?{}:{filename:r},..."robot"===V.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 tt(e){return void 0===e||Number.isFinite(e.width)&&e.width>0&&Number.isFinite(e.height)&&e.height>0}function ot(e){return tt(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<=j)}function rt(e){return void 0!==e&&"duration"in e&&void 0!==e.duration&&Number.isFinite(e.duration)&&e.duration>0}function nt(e,t,o){return{ok:!1,error:a({code:e,category:t,operation:o,retryable:!1,conversation:V})}}function at(e,t){if(null===e||"object"!=typeof e||e.kind!==t)return!1;if(!Number.isSafeInteger(e.width)||e.width<=0||e.width>G||!Number.isSafeInteger(e.height)||e.height<=0||e.height>G)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 st(e){if("customerService"===V.conversationType)throw it(a({code:"IM_SDK_CUSTOMER_SERVICE_READ_ONLY",category:"permission",operation:e,retryable:!1,conversation:V}))}function it(e){return Object.assign(new Error(e.code),e,{name:"ImMessageActionError"})}function dt(e,t,o){if("direct"===e||"group"===e||"channel"===e||"robot"===e)return Object.freeze({conversationType:e,conversationId:t});throw it(a({code:"IM_SDK_FORWARD_RESULT_INVALID",category:"contract",operation:o,retryable:!1,conversation:V,details:{targetConversationType:e,targetConversationId:t}}))}async function ct(e,t,o){let r;try{r=await n.forwardMessages({messages:t,targets:o.map(e=>{if("customerService"===e.conversationType)throw new Error("客服会话不能作为转发目标");return{conversationType:e.conversationType,conversationId:e.conversationId}})})}catch(t){throw it(s(t,e,V))}return Re(),Object.freeze({sent:Object.freeze(r.results.flatMap(t=>t.ok?[{conversation:dt(t.targetConversationType,t.targetConversationId,e),messageId:t.newMessageId}]:[])),failed:Object.freeze(r.results.flatMap(t=>t.ok?[]:[{sourceMessageId:t.sourceMessageId,conversation:Object.freeze({conversationType:t.targetConversationType,conversationId:t.targetConversationId}),error:a({...F[t.reason],operation:e,conversation:{conversationType:t.targetConversationType,conversationId:t.targetConversationId}})}])),skippedSourceMessageIds:Object.freeze([...r.skippedSourceIds])})}function lt(e,t){const o=n.domainState.getConversationMessage(V,e);if(void 0===o){const o=n.domainState.getMessagesById(e)[0];throw it(a({code:void 0===o?"IM_SDK_MESSAGE_NOT_FOUND":"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:V}))}if(o.conversationType!==V.conversationType||o.conversationId!==V.conversationId)throw it(a({code:"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:V}));return o}function gt(e,t){return it(a({...t,operation:e,conversation:V}))}function mt(e,t){const o=a({code:e,category:"state",operation:"messages.deleteLocal",retryable:!1,conversation:V,...void 0===t?{}:{cause:t}});return Object.assign(new Error(e),o,{name:"ImLocalMessageDeletionError"})}function vt(e,t){const o=a({code:e,category:"state",operation:"history.clearLocal",retryable:!1,conversation:V,...void 0===t?{}:{cause:t}});return Object.assign(new Error(e),o,{name:"ImLocalConversationHistoryClearError"})}async function yt(e,t){if(void 0!==e)try{await n.domainState.clearDraftIfUnchanged(V,e)}catch(e){n.emitter.emit({type:"error",error:{scope:"storage",message:`消息已被本地发送流程接受,但清理草稿失败(${t})`,cause:e}})}}async function ft(e,t,o,a,s){return Ze(e,async()=>{if("image"===t){const t=await r(o);if(Re(),!t)return nt("IM_SDK_IMAGE_FORMAT_UNSUPPORTED","unsupported",e)}const i=await et(o,a);if(Re(),void 0!==t&&void 0===i.localPreviewMetadata&&void 0!==n.prepareMediaPreview){const r=new AbortController,a=await n.prepareMediaPreview({operationId:`${V.conversationType}:${V.conversationId}:${e}:${++ne}`,kind:t,file:o,signal:r.signal});if(Re(),void 0===a||("image"===t?!tt(a):!ot(a)))return nt("image"===t?"IM_SDK_IMAGE_PREVIEW_METADATA_INVALID":"IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",e);i.localPreviewMetadata=a}if("video"===t&&(void 0!==n.prepareMediaPreview||void 0!==i.localPreviewMetadata)&&!rt(i.localPreviewMetadata))return nt("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",e);const d=R.recheckSendPermissionError?.(e);if(void 0!==d)return{ok:!1,error:d};const c=await s({...i,...void 0===a.filesAlbum?{}:{filesAlbum:a.filesAlbum},...void 0===a.caption||""===a.caption?{}:{caption:a.caption}});return c.ok?(Re(),Je(c.messageId,e)):{ok:!1,error:l(c.reason,e,V)}})}function ut(e,t,o){const r=lt(e,o);if(!(r.contentType===t||"file"===t&&"filesAlbum"===r.contentType&&1===r.body.filesAlbum?.items.length)||"failed"!==r.status||"media.uploadInterrupted"!==r.failure?.displayCode&&"media.cancelled"!==r.failure?.displayCode&&("media.uploadTimeout"!==r.failure?.displayCode||!1!==r.failure.retryable)||n.isOutboxOwned(e))throw it(a({code:"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:o,retryable:!1,conversation:V}));return r}async function It(e,t,o,r,a,s){return ut(t,o,e),Ze(e,async()=>{const i=await et(r,a);if("video"===o&&void 0===i.localPreviewMetadata&&void 0!==n.prepareMediaPreview){const t=new AbortController,o=await n.prepareMediaPreview({operationId:`${V.conversationType}:${V.conversationId}:${e}:${++ne}`,kind:"video",file:r,signal:t.signal});if(Re(),void 0===o||!ot(o))return nt("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",e);i.localPreviewMetadata=o}if("video"===o&&(void 0!==n.prepareMediaPreview||void 0!==i.localPreviewMetadata)&&!rt(i.localPreviewMetadata))return nt("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",e);const d=R.recheckSendPermissionError?.(e);if(void 0!==d)return{ok:!1,error:d};ut(t,o,e);const c=await s(t,{...i,...void 0===a.caption||""===a.caption?{}:{caption:a.caption}});return c.ok?(Re(),Je(c.messageId,e)):{ok:!1,error:l(c.reason,e,V)}})}re=!1,function(){if(!se||de<=0)return;if(!0===H.window.info().remotePagination&&!Ae&&"located"!==ae.state)return;Y.add(H.window);const e=H.window.list().filter(e=>!me.has(e.id));ve=e.at(-1)?.sortKey;for(const t of e)ge.has(t.id)||ge.set(t.id,f(t,le));if("first-unread"===C.initialPosition&&"located"===ae.state)return ye=ae.firstMessageId,void(we=Object.freeze({state:"located",count:de,firstMessageId:ae.firstMessageId}));$e()}();const _t={ref:V,getSnapshot:function(){return Re(),Ke(Ce())},subscribe:e=>(Re(),X.add(e),()=>X.delete(e)),resolveMessage:async e=>{Re();const t=H.window.list().find(t=>t.id===e)??await n.domainState.resolveConversationMessage(V,e);return void 0===t?null:Le(t)},history:{loadEntryUnread:e=>function(e={}){if(Re(),e.signal?.aborted)return new Promise((t,o)=>h(e.signal,o));if(void 0!==ue){if(!ue.controller.signal.aborted&&ue.version===pe&&ue.callerSignal===e.signal)return ue.promise;ue.controller.abort()}if(void 0===we||"none"===we.state)return Promise.resolve(!1);const t=Me(),{version:r,controller:a}=t,s=H.window.list(),i=s.find(e=>e.id===ye),d=H.window.info();if(void 0===J&&0===q.size&&!ee&&!Oe.signal.aborted&&Y.has(H.window)&&void 0!==i&&S(i)&&void 0===i.recalled&&void 0===i.deletedForEveryone&&(!d.hasMore||s.some(e=>S(e)&&e.sortKey<i.sortKey))&&(!d.hasNewer||s.some(e=>S(e)&&e.sortKey>i.sortKey)))return ae=Object.freeze({state:"located",firstMessageId:i.id,count:de}),we=Object.freeze({state:"located",firstMessageId:i.id,count:de}),Ue(),Se(t),Promise.resolve(!0);const c=n.domainState.createMessageWindow(B),l=()=>!te&&!a.signal.aborted&&pe===r,g=()=>{if(!l())throw new DOMException("进入未读定位已被新的导航取代","AbortError")},m=async e=>{g();let t=await e();if(g(),void 0!==R.reconcilePage&&(t=await R.reconcilePage(t,c.window)),g(),t.stale)throw new DOMException("进入未读窗口已失效","AbortError");c.window.applyIncoming(c.window.list().map(e=>n.domainState.getConversationMessage(V,e.id)??e))};let f,I=!1;const _=new Promise((e,t)=>{f=t}),w=()=>{I||c.dispose(),h(a.signal,f)},p=()=>v(a,y(e.signal)),E=()=>v(a,y(Oe.signal));a.signal.addEventListener("abort",w,{once:!0}),e.signal?.addEventListener("abort",p,{once:!0}),Oe.signal.addEventListener("abort",E,{once:!0}),Oe.signal.aborted&&E();const M=n.beginReceiving?.(),D=(async()=>{try{let e=!1;void 0===ve&&(await m(()=>c.window.open(V,{limit:z})),ze(c.window)&&await m(()=>c.window.loadOlder({limit:z,establishLatestOnly:!0})),ve=c.window.list().filter(e=>!me.has(e.id)).at(-1)?.sortKey,e=!0);const t=ye,r=void 0===t?void 0:await ke(t);if(g(),void 0!==t&&void 0===r)return we=Object.freeze({state:"unavailable",count:de}),!1;const s=void 0===r?await o({conversation:V,pageSize:z,maxExtraPages:Number.POSITIVE_INFINITY,preserveLocatedWindow:!0===c.window.info().remotePagination,...void 0===ve?{}:{entryUpperSortKey:ve},unreadCount:de,...void 0===_e?{}:{readCursorSortKey:_e},signal:a.signal,selfId:le,isEntryUnread:Ye,..."channel"===V.conversationType&&ce?.readCursor&&void 0!==n.loadEntryUnreadPage?{loadReadCursorPage:async e=>{const t=await n.loadEntryUnreadPage({readCursor:ce.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(V,{limit:z})),ze(c.window)&&await m(()=>c.window.loadOlder({limit:z,establishLatestOnly:!0})))},openAt:(t,o)=>(e=!1,m(()=>c.window.openAt(V,{anchorSortKey:t,limit:z,...void 0===o?{}:{seedMessages:o.messages.map(e=>n.domainState.getConversationMessage(V,e.id)??e),seedHasNewer:o.hasNewer,seedRemotePagination:void 0===o.nextCursor?{}:{newerCursor:o.nextCursor}}}))),loadOlder:()=>m(()=>c.window.loadOlder({limit:z})),loadNewer:()=>m(()=>c.window.loadNewer({limit:z}))}):await(async()=>(await m(()=>xe(c.window,r,g)),{state:"located",firstMessageId:r.anchor.id,count:de}))();if(g(),"located"!==s.state)return we=Object.freeze("none"===s.state?{state:"none"}:{state:"unavailable",count:de}),!1;const i=c.window.list().find(e=>e.id===s.firstMessageId);if(void 0===i||!S(i)||void 0!==i.recalled||void 0!==i.deletedForEveryone)return we=Object.freeze({state:"unavailable",count:de}),!1;!0===c.window.info().remotePagination&&await m(async()=>(await je(c.window,i,g),{conversationId:V.conversationId,messages:c.window.list(),stale:!1})),g();const d=c.window.list().find(e=>e.id===s.firstMessageId);if(void 0===d||!S(d)||void 0!==d.recalled||void 0!==d.deletedForEveryone)return we=Object.freeze({state:"unavailable",count:de}),!1;const v=H;return H=c,I=!0,v.dispose(),Y.add(c.window),ye=s.firstMessageId,ae=s,we=Object.freeze({state:"located",count:de,firstMessageId:s.firstMessageId}),Z=void 0,!0}catch(e){const t=e instanceof u?e.cause:e;if(l()){const e=T(t,"history.loadEntryUnread",V);we=Object.freeze({state:"failed",count:de,error:e})}throw t}})(),A=Promise.race([D,_]).finally(()=>{a.signal.removeEventListener("abort",w),Se(t),e.signal?.removeEventListener("abort",p),Oe.signal.removeEventListener("abort",E),I||c.dispose(),M?.(),ue?.controller===a&&(ue=void 0),te||Ue()});return ue={version:r,callerSignal:e.signal,controller:a,promise:A},A}(e),loadLatest:async()=>He(),loadOlder:async()=>(Re(),Ee(),Fe("older",()=>H.window.loadOlder({limit:z}))),loadNewer:async()=>{Re(),Ee(),await Fe("newer",()=>H.window.loadNewer({limit:z})),Re(),H.window.info().hasNewer||(Ve(),Ue())},loadAround:async(e,t={})=>{if(Re(),!0===t.signal?.aborted)throw new DOMException("消息定位已取消","AbortError");const o=Me(),{version:r,controller:s}=o;if(void 0===J&&"channel"===V.conversationType&&W.has(H.window)&&n.domainState.getPinnedMessage(V)?.messageId===e&&H.window.list().some(t=>t.id===e&&$(t)))return void Se(o);const i=H,d=()=>!te&&!s.signal.aborted&&pe===r&&H===i,c=()=>{if(Re(),!d())throw new DOMException("消息定位已被新的导航取代","AbortError")};let l,g,m=!1;const f=new Promise((e,t)=>{g=t}),u=()=>{m||l?.dispose(),h(s.signal,g)},I=()=>v(s,y(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!==J)throw new Error("清空本机会话历史期间拒绝启动新的历史加载");const o=await ke(e);t();const r=o?.fallbackSeed;if(void 0!==o&&("channel"!==V.conversationType||void 0!==r&&$(r)))return"channel"===V.conversationType&&!0===H.window.info().remotePagination?{...o,remoteSeed:r}:o;if(void 0===n.fetchMessagesByIdBatch)throw K(V,e);if(void 0!==J)throw new Error("清空本机会话历史期间拒绝启动新的历史加载");const a=await n.fetchMessagesByIdBatch([e]);t();const s=a.messages.find(t=>t.id===e&&t.conversationType===V.conversationType&&t.conversationId===V.conversationId);if(void 0!==s){if("channel"===V.conversationType){if(!$(s))throw K(V,e);return{anchor:s,remoteSeed:s}}return{anchor:s,fallbackSeed:s}}if(!a.missingMessageIds.includes(e))throw K(V,e)}(e,c);if(c(),void 0===t)throw function(e,t){const o=a({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)}(V,e);if(t.anchor.conversationType!==V.conversationType||t.anchor.conversationId!==V.conversationId)throw K(V,e);l=n.domainState.createMessageWindow(B);const o=l.window;await Fe(`around:${e}:${r}`,async()=>(c(),xe(o,t,c,!0)),{window:o,isCurrent:d,cancelled:f}),c(),H=l,void 0!==t.remoteSeed&&W.add(o),m=!0,i.dispose(),Ue()})();try{await Promise.race([_,f])}finally{t.signal?.removeEventListener("abort",I),s.signal.removeEventListener("abort",u),Se(o),m||l?.dispose()}},clearLocal:async()=>(Re(),st("history.clearLocal"),function(){if(te)return Promise.reject(new Error("ConversationHandle 已关闭"));if(void 0!==J)return J;const e=new DOMException("本次清历史已取消旧窗口导航","AbortError");Ee(e),n.invalidateHistory?.(V,e);const t=[...q.values()],o=Promise.all(t.map(t=>t.catch(t=>{if(t!==e)throw t}))).then(async()=>{Re();const e=[...n.domainState.getMessagesByConversation(V),...H.window.list()];if(n.hasOutboxForConversation(V)||e.some(e=>n.isOutboxOwned(e.id)))throw vt("IM_SDK_LOCAL_HISTORY_CLEAR_OUTBOX_OWNED");if(e.some(e=>"pending"===e.status||"uploading"===e.status||"sending"===e.status))throw vt("IM_SDK_LOCAL_HISTORY_CLEAR_MESSAGE_IN_FLIGHT");return await n.domainState.clearLocalConversationHistory(V),Re(),Object.freeze({scope:"local-only",remoteHistory:"remote-history-may-restore"})}).catch(e=>{if(e instanceof Error&&"ImLocalConversationHistoryClearError"===e.name)throw e;throw vt("IM_SDK_LOCAL_HISTORY_CLEAR_FAILED",e)}).finally(()=>{J===o&&(J=void 0)});return J=o,o}())},messages:{sendText:async(e,t={})=>{Re();const o=D(V,e,t);if("code"in o)return{ok:!1,error:o};const r=n.domainState.getDraft(V)?.updatedAt;return Ze("messages.sendText",async()=>{const e=await n.sendText(o);return Re(),await yt(r,"messages.sendText"),Je(e.id,"messages.sendText")},async e=>{const t=R.appendTextPermissionFailure?.(o);return void 0===t?{ok:!1,error:e}:(await yt(r,"messages.sendText"),{ok:!0,message:i(t)})})},sendContact:async(e,t={})=>{Re();const o=e.targetId.trim(),r=e.displayName.trim();if(""===o||""===r)return{ok:!1,error:a({code:""===o?"IM_SDK_CONTACT_CARD_TARGET_REQUIRED":"IM_SDK_CONTACT_CARD_NAME_REQUIRED",category:"validation",operation:"messages.sendContact",retryable:!1,conversation:V})};const s={...V,contact:{...e,targetId:o,displayName:r},encrypted:"direct"!==V.conversationType&&"robot"!==V.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}};return Ze("messages.sendContact",async()=>Je((await n.sendContact(s)).id,"messages.sendContact"))},sendImage:async(e,t={})=>(Re(),e.size>x?nt("IM_SDK_IMAGE_TOO_LARGE","validation","messages.sendImage"):void 0!==t.caption&&""!==t.caption?nt("IM_SDK_IMAGE_CAPTION_UNSUPPORTED","unsupported","messages.sendImage"):tt(t.localPreviewMetadata)?ft("messages.sendImage","image",e,t,n.sendImage):nt("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation","messages.sendImage")),sendMediaAlbum:async(e,t={})=>(Re(),async function(e,t){const o="messages.sendMediaAlbum";if(0===e.length)return nt("IM_SDK_MEDIA_ALBUM_EMPTY","validation",o);if(e.length>M)return nt("IM_SDK_MEDIA_ALBUM_TOO_MANY","validation",o);if(void 0!==t.caption&&Array.from(t.caption).length>E)return nt("IM_SDK_MEDIA_ALBUM_CAPTION_TOO_LONG","validation",o);for(const t of e){if("image/gif"===t.file.type)return nt("IM_SDK_MEDIA_ALBUM_GIF_UNSUPPORTED","unsupported",o);if("image"===t.kind){if(t.file.size>x)return nt("IM_SDK_IMAGE_TOO_LARGE","validation",o);if(!tt(t.localPreviewMetadata))return nt("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation",o)}else{if(t.file.size>U)return nt("IM_SDK_VIDEO_TOO_LARGE","validation",o);if(!ot(t.localPreviewMetadata))return nt("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",o)}}return Ze(o,async()=>{for(const t of e){if("image"!==t.kind)continue;const e=await r(t.file);if(Re(),!e)return nt("IM_SDK_IMAGE_FORMAT_UNSUPPORTED","unsupported",o)}const a=await Promise.all(e.map(async e=>{if(void 0!==e.localPreviewMetadata||void 0===n.prepareMediaPreview)return e.localPreviewMetadata;const t=new AbortController;return n.prepareMediaPreview({operationId:`${V.conversationType}:${V.conversationId}:${o}:${++ne}`,kind:e.kind,file:e.file,signal:t.signal})}));Re();const s=[];for(const[t,r]of e.entries()){const e=a[t];if("image"===r.kind&&!tt(e))return nt("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation",o);if("video"===r.kind){if(!ot(e))return nt("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",o);if(void 0!==n.prepareMediaPreview&&!rt(e))return nt("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",o)}const i="name"in r.file?r.file.name:void 0;s.push({kind:r.kind,data:r.file,...""===r.file.type?{}:{mimeType:r.file.type},..."string"==typeof i&&""!==i?{filename:i}:{},...void 0===r.localPreviewUrl?{}:{localPreviewUrl:r.localPreviewUrl},...void 0===e?{}:{localPreviewMetadata:e}})}const i=R.recheckSendPermissionError?.(o);if(void 0!==i)return{ok:!1,error:i};const d=await n.sendMediaAlbum({...V,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?(Re(),Je(d.messageId,o)):{ok:!1,error:l(d.reason,o,V)}})}(e,t)),sendVideo:async(e,t={})=>(Re(),e.size>U?nt("IM_SDK_VIDEO_TOO_LARGE","validation","messages.sendVideo"):ot(t.localPreviewMetadata)?ft("messages.sendVideo","video",e,t,n.sendVideo):nt("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation","messages.sendVideo")),replaceInterruptedVideo:async(e,t,o={})=>(Re(),t.size>U?nt("IM_SDK_VIDEO_TOO_LARGE","validation","messages.replaceInterruptedVideo"):ot(o.localPreviewMetadata)?It("messages.replaceInterruptedVideo",e,"video",t,o,n.replaceVideo):nt("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation","messages.replaceInterruptedVideo")),sendVoice:async(e,t)=>(Re(),Ze("messages.sendVoice",async()=>{const o=await et(e,t),r=R.recheckSendPermissionError?.("messages.sendVoice");if(void 0!==r)return{ok:!1,error:r};const a=await n.sendVoice({...o,durationMs:t.durationMs,...void 0===t.waveform?{}:{waveform:[...t.waveform]}});return a.ok?(Re(),Je(a.messageId,"messages.sendVoice")):{ok:!1,error:l(a.reason,"messages.sendVoice",V)}})),sendFile:async(e,t={})=>{if(Re(),e.size>k)return nt("IM_SDK_FILE_TOO_LARGE","validation","messages.sendFile");if(void 0!==t.caption&&Array.from(t.caption).length>E)return nt("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()?nt("IM_SDK_FILE_NAME_REQUIRED","validation","messages.sendFile"):ft("messages.sendFile",void 0,e,t,n.sendFile)},sendGif:async(e,t={})=>(Re(),e.size>3145728?nt("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)?ft("messages.sendGif",void 0,e,t,e=>n.sendGif(e)):nt("IM_SDK_GIF_INVALID","validation","messages.sendGif")),sendSticker:async(e,t={})=>(Re(),at(e,"sticker")?Ze("messages.sendSticker",async()=>Je((await n.sendExpression({...V,asset:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendSticker")):nt("IM_SDK_EXPRESSION_ASSET_INVALID","validation","messages.sendSticker")),sendGifAsset:async(e,t={})=>(Re(),at(e,"gif")?Ze("messages.sendGifAsset",async()=>Je((await n.sendExpression({...V,asset:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGifAsset")):nt("IM_SDK_EXPRESSION_ASSET_INVALID","validation","messages.sendGifAsset")),sendGame:async(e,t={})=>(Re(),"rock-paper-scissors"!==e&&"dice"!==e?nt("IM_SDK_GAME_TYPE_INVALID","validation","messages.sendGame"):Ze("messages.sendGame",async()=>Je((await n.sendGame({...V,gameType:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGame"))),sendMiniProgram:async(e,t={})=>(Re(),p(e)?Ze("messages.sendMiniProgram",async()=>Je((await n.sendMiniProgram({...V,miniProgram:e,encrypted:"direct"!==V.conversationType&&"robot"!==V.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendMiniProgram")):nt("IM_SDK_MINI_PROGRAM_BODY_INVALID","validation","messages.sendMiniProgram")),sendTransfer:async(e,t={})=>(Re(),"channel"===V.conversationType||"robot"===V.conversationType?nt("IM_SDK_TRANSFER_CHANNEL_UNSUPPORTED","unsupported","messages.sendTransfer"):w(e)?Ze("messages.sendTransfer",async()=>Je((await n.sendTransfer({...V,transfer:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendTransfer")):nt("IM_SDK_TRANSFER_BODY_INVALID","validation","messages.sendTransfer")),sendGift:async(e,t={})=>(Re(),"channel"===V.conversationType||"robot"===V.conversationType?nt("IM_SDK_GIFT_CHANNEL_UNSUPPORTED","unsupported","messages.sendGift"):_(e)?Ze("messages.sendGift",async()=>Je((await n.sendGift({...V,gift:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGift")):nt("IM_SDK_GIFT_BODY_INVALID","validation","messages.sendGift")),sendLiveRoom:async(e,t={})=>(Re(),I(e)?Ze("messages.sendLiveRoom",async()=>Je((await n.sendLiveRoom({...V,liveRoom:e,encrypted:"direct"!==V.conversationType&&"robot"!==V.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendLiveRoom")):nt("IM_SDK_LIVE_ROOM_BODY_INVALID","validation","messages.sendLiveRoom")),toggleReaction:async(e,t)=>{Re(),st("messages.toggleReaction"),lt(e,"messages.toggleReaction");const o=await n.setReaction({conversation:V,parentMessageId:e,emoji:t,action:"toggle"});if(Re(),!o.ok)throw gt("messages.toggleReaction",P[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)=>{Re(),st("messages.setReaction"),lt(e,"messages.setReaction");const r=await n.setReaction({conversation:V,parentMessageId:e,emoji:t,action:o});if(Re(),!r.ok)throw gt("messages.setReaction",P[r.reason]);return Object.freeze({messageId:e,eventId:r.event.id,emoji:r.event.emoji,action:0===r.event.action?"add":"remove"})},replaceInterruptedFile:async(e,t,o={})=>{if(Re(),st("messages.replaceInterruptedFile"),t.size>k)return nt("IM_SDK_FILE_TOO_LARGE","validation","messages.replaceInterruptedFile");if(void 0!==o.caption&&""!==o.caption)return nt("IM_SDK_FILE_CAPTION_UNSUPPORTED","unsupported","messages.replaceInterruptedFile");const r=o.fileName??("name"in t?t.name:void 0);return"string"!=typeof r||""===r.trim()?nt("IM_SDK_FILE_NAME_REQUIRED","validation","messages.replaceInterruptedFile"):It("messages.replaceInterruptedFile",e,"file",t,{...o,fileName:r},n.replaceFile)},editText:async(e,t,o={})=>{Re(),st("messages.editText"),lt(e,"messages.editText"),L(n.domainState,V,e,"messages.editText");const r=O(V,e,t,o);if("code"in r)throw it(r);let a;try{a=await n.editMessage(r)}catch(e){throw it(s(e,"messages.editText",V))}if(Re(),!a.ok)throw gt("messages.editText",N[a.reason]);return i(lt(e,"messages.editText"))},recall:async e=>{let t;Re(),st("messages.recall"),lt(e,"messages.recall"),L(n.domainState,V,e,"messages.recall");try{t=await n.recallMessage({...V,messageId:e})}catch(e){throw it(s(e,"messages.recall",V))}if(Re(),!t.ok)throw gt("messages.recall",b[t.reason])},deleteLocal:async e=>{Re(),st("messages.deleteLocal"),L(n.domainState,V,e,"messages.deleteLocal");const t=n.domainState.getConversationMessage(V,e);if(n.isOutboxOwned(e))throw mt("IM_SDK_LOCAL_DELETE_OUTBOX_OWNED");if(void 0!==t&&t.conversationType===V.conversationType&&t.conversationId===V.conversationId&&("pending"===t.status||"uploading"===t.status||"sending"===t.status))throw mt("IM_SDK_LOCAL_DELETE_MESSAGE_IN_FLIGHT");try{n.invalidateHistory?.(V);const t=await n.domainState.deleteLocalMessage(V,e);return Re(),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 mt("IM_SDK_MESSAGE_PINNED",e);if(e instanceof Error&&"ImLocalMessageDeletionError"===e.name)throw e;throw mt("IM_SDK_LOCAL_DELETE_FAILED",e)}},forward:async(e,t)=>{if(Re(),st("messages.forward"),0===e.length||0===t.length)throw it(a({code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",operation:"messages.forward",retryable:!1,conversation:V}));return ct("messages.forward",e.map(e=>({id:e,...V})),t)},forwardMediaAlbumItem:async(e,t,o)=>{Re(),st("messages.forwardMediaAlbumItem");const r="messages.forwardMediaAlbumItem";if(""===e.trim()||0===o.length)throw it(a({code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",operation:r,retryable:!1,conversation:V}));if(!Number.isInteger(t)||t<0)throw it(a({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:r,retryable:!1,conversation:V,details:{itemIndex:t}}));return ct(r,[{id:e,...V,itemIndex:t}],o)},fetchByIds:async e=>{Re();const t=n.fetchMessagesByIdBatch;if(void 0===t)throw it(a({code:"IM_SDK_MESSAGE_LOOKUP_UNSUPPORTED",category:"unsupported",operation:"messages.fetchByIds",retryable:!1,conversation:V}));const o=n.beginReceiving?.();try{const o=await g({messageIds:e,fetchBatch:t,isCurrent:()=>!te,projectMessage:Le});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()=>(Re(),"customerService"===V.conversationType?null:n.drafts.get(V)),save:async e=>{if(Re(),"customerService"===V.conversationType)throw new Error("客服会话不支持草稿");return n.drafts.save(V,e)},clear:async()=>{Re(),"customerService"!==V.conversationType&&await n.drafts.clear(V)},subscribe:e=>(Re(),Q.add(e),()=>Q.delete(e))},markRead:async e=>{Re();const t=H.window.list();if(void 0!==e&&!t.some(t=>t.id===e))throw new Error(`待标记已读消息不存在或不属于当前 handle 窗口:${e}`);const o=void 0===R.resolveReadMessageId?e??t.at(-1)?.id:R.resolveReadMessageId(t,e);void 0!==o&&await n.markRead({...V,readCursor:o})},markConversationRead:async()=>{if(Re(),void 0===n.markConversationRead)throw new Error("当前会话未装配整会话已读能力");const e=he,t=await async function(){if(Ae){const e=/* @__PURE__ */new Map,t=n.domainState.getLoadedMessagesByConversation(V);for(const o of[De,...t])void 0!==o&&e.set(o.id,n.domainState.getConversationMessage(V,o.id)??o);return We([...e.values()].sort((e,t)=>e.sortKey.localeCompare(t.sortKey))),De?.id}const e=he,t=n.domainState.createMessageWindow(B);try{const o=await t.window.open(V,{limit:z});if(Re(),o.stale)throw new Error("无法确认会话最新已读边界");if(ze(t.window)){const e=await t.window.loadOlder({limit:z,establishLatestOnly:!0});if(Re(),e.stale)throw new Error("无法确认会话远端最新已读边界")}if(e!==he)throw new DOMException("会话已读确认已失效","AbortError");We(t.window.list()),Ae=!0;const r=t.window.list();return void 0===R.resolveReadMessageId?r.at(-1)?.id:R.resolveReadMessageId(r)}finally{t.dispose()}}();if(Re(),e!==he)throw new DOMException("会话已读确认已失效","AbortError");if("channel"===V.conversationType&&void 0===t&&H.window.list().length>0)throw new Error("当前频道缺少可信的最新已读消息");if(void 0!==t&&void 0===n.domainState.getConversationMessage(V,t)){const o=De?.id===t?De:void 0;if(void 0===o)throw new Error("缺少会话最新已读边界的消息证明");Te??(Te=n.domainState.createMessageWindow({retention:{maxMessages:z}}));const r=await Te.window.openAt(V,{anchorSortKey:o.sortKey,limit:z,seedMessages:[o],seedHasNewer:!1});if(Re(),r.stale||e!==he)throw new DOMException("会话已读确认已失效","AbortError")}await n.markConversationRead(V,t)},markVisibleMessages:async e=>{if(Re(),void 0===n.markVisibleMessages)throw new Error("当前会话未装配可见消息回执能力");const t=[...new Set(e)];if(t.some(e=>!H.window.list().some(t=>t.id===e)))throw new Error("可见回执包含当前连续窗口之外的消息");t.length>0&&await n.markVisibleMessages(V,t)},setMuted:async e=>(Re(),n.setMuted(V,e)),close(){te||(te=!0,Oe.abort(),Ee(),Xe(),X.clear(),Q.clear(),Pe.clear(),Te?.dispose(),H.dispose())}};return A.set(_t,{getMessages:()=>(Re(),H.window.list()),resolveMessage:async e=>(Re(),H.window.list().find(t=>t.id===e)??n.domainState.resolveConversationMessage(V,e))}),_t}async function z(e,t,o={}){let r,n,s=!1;function i(){const o=Date.now();if(void 0!==r&&o-r.checkedAt<5e3)return Promise.resolve(r.value);if(void 0!==n)return n;const a=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(()=>{n===a&&(n=void 0)});return n=a,a}t.shouldCheckRelationship()&&i();const d=await V(e,t,(e,t,o)=>void 0!==o.mentions&&o.mentions.length>0?a({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?a({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 a({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=a({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 O(c,d),c}async function B(e,o,r={}){return V(e,o,(e,t,o)=>{const r=n(o.mentions);return{...e,text:t,encrypted:!0,...void 0===r?{}:{mention:r},...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}}},(e,t,o,r)=>{const a=n(r.mentions);return{...e,messageId:t,text:o,...void 0===a?{}:{mention:a}}},{getSendPermissionError:o.getSendPermissionError,recheckSendPermissionError:o.getSendPermissionError,shouldEstablishRemoteLatestOnOpen:n=>("first-unread"===r.initialPosition||!0===r.captureEntryUnread)&&void 0!==o.domainState.getConversationContext(e)&&Y(n,o.pageSize??t)},r)}async function H(e,t,o={}){return V(e,t,(e,t,o)=>void 0!==o.mentions&&o.mentions.length>0?a({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?a({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.editText",retryable:!1,conversation:e}):{...e,messageId:t,text:o},{shouldEstablishRemoteLatestOnOpen:()=>!1},o)}const W=/* @__PURE__ */new Set(["pending","uploading","sending"]);function Y(e,t){return e.length<t}function $(e){const t=e.extensions?.historyCursor;return"string"==typeof t&&""!==t.trim()}async function X(e,o,r={}){const a=await V(e,o,(e,t,o)=>{const r=n(o.mentions);return{...e,text:t,encrypted:!0,...void 0===r?{}:{mention:r},...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}}},(e,t,o,r)=>{const a=n(r.mentions);return{...e,messageId:t,text:o,...void 0===a?{}:{mention:a}}},{getSendPermissionError:o.getSendPermissionError,recheckSendPermissionError:o.getSendPermissionError,shouldEstablishRemoteLatestOnOpen:n=>("first-unread"===r.initialPosition||!0===r.captureEntryUnread)&&void 0!==o.domainState.getConversationContext(e)&&Y(n,o.pageSize??t)||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}(n,o.getSelfId()),reconcilePage:o.reconcilePage,resolveReadMessageId:(e,t)=>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||$(n))return n?.id;let a;for(let t=r-1;t>=0;t-=1){const o=e[t];if($(o)){a=o;break}}return void 0!==a?a.id:n.senderId===t&&W.has(n.status)?void 0:n.id}(e,o.getSelfId(),t)},r),i={...a,messages:{...a.messages,deleteForEveryone:async t=>{if(void 0===o.domainState.getConversationMessage(e,t))throw C(e,R["not-found"]);let r;L(o.domainState,e,t,"messages.deleteForEveryone");try{r=await o.deleteMessageForEveryone({...e,messageId:t})}catch(t){const o=s(t,"messages.deleteForEveryone",e);throw Object.assign(new Error(o.code,{cause:t}),o)}if(!r.ok)throw C(e,R[r.reason])}}};return O(i,a),i}async function Q(e,t,o={}){const r=t=>a({code:"IM_SDK_CUSTOMER_SERVICE_READ_ONLY",category:"permission",operation:t,retryable:!1,conversation:e});return V(e,t,()=>r("messages.sendText"),()=>r("messages.edit"),{getSendPermissionError:r,recheckSendPermissionError:r},o)}export{X as createChannelConversationHandle,Q as createCustomerServiceConversationHandle,z as createDirectConversationHandle,B as createGroupConversationHandle,H as createRobotConversationHandle,O as linkConversationHandleDomainAccess};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createImSdkError as e}from"./message.js";import{createMediaAssetCacheStrategyRegistry as t,mediaAssetResourceVersion as o}from"../../../im-core/src/ports/media-asset-cache-port.js";import{throwIfAborted as r}from"../../../im-core/src/abort.js";import{resolveMediaThumbnailMimeType as a}from"../../../im-core/src/media-thumbnail.js";import{isCryptoExecutionError as i}from"../../../im-core/src/ports/crypto-task-executor.js";const n=6048e5,s=1048576;function c(e){let t=0,o=!1;const r=[];function a(){if(!o)for(;t<e&&r.length>0;){r.sort((e,t)=>t.getPriority()-e.getPriority());const e=r.shift();if(e.signal.removeEventListener("abort",e.onAbort),e.signal.aborted){e.reject(new DOMException("媒体下载已取消","AbortError"));continue}t+=1;let o=!1;e.resolve(()=>{o||(o=!0,t=Math.max(0,t-1),a())})}}return{acquire:(e,t)=>o?Promise.reject(new Error("媒体下载并发控制器已释放")):new Promise((o,i)=>{const n={resolve:o,reject:i,signal:e,getPriority:t,onAbort:()=>{const e=r.indexOf(n);e>=0&&r.splice(e,1),i(new DOMException("媒体下载已取消","AbortError"))}};e.addEventListener("abort",n.onAbort,{once:!0}),r.push(n),a()}),dispose(){o=!0;for(const e of r.splice(0))e.signal.removeEventListener("abort",e.onAbort),e.reject(new Error("媒体下载并发控制器已释放"))}}}function d(){return t([{kind:"image",softMaxBytes:512*s,maxEntries:512,maxEntryBytes:30*s,maxIdleMs:n},{kind:"video",softMaxBytes:1792*s,maxEntries:64,maxEntryBytes:200*s,maxIdleMs:n},{kind:"file",softMaxBytes:512*s,maxEntries:128,maxEntryBytes:200*s,maxIdleMs:n}])}function l(e){return Number.isFinite(e)?Math.max(0,Math.min(100,Math.round(e))):0}function m(e){return Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function u(e,t,o,r){const a=`${e}:${encodeURIComponent(t.conversationType)}:${encodeURIComponent(t.conversationId)}:${encodeURIComponent(o)}`;return void 0===r?a:`${a}:${r}`}function p(e){const t=e.ref.conversationType,o=e.ref.conversationId;if("direct"!==t&&"group"!==t&&"channel"!==t||""===o.trim())throw f({code:"supergroup"===t?"IM_SDK_SUPERGROUP_UNSUPPORTED":"IM_SDK_MEDIA_TASK_REF_INVALID",category:"supergroup"===t?"unsupported":"contract",operation:"media.tasks.project",retryable:!1});const r=m({conversationType:t,conversationId:o});return v({id:u(e.direction,r,e.messageId),messageId:e.messageId,ref:r,direction:e.direction,state:e.state,percent:l(e.percent),...void 0===e.items?{}:{items:e.items},...void 0===e.attempt?{}:{attempt:e.attempt},...void 0===e.maxAttempts?{}:{maxAttempts:e.maxAttempts},...void 0===e.bytesTransferred?{}:{bytesTransferred:e.bytesTransferred},...void 0===e.bytesTotal?{}:{bytesTotal:e.bytesTotal},...void 0===e.recovery?{}:{recovery:e.recovery},...void 0===e.recoveryReason?{}:{recoveryReason:e.recoveryReason},...void 0===e.phase?{}:{phase:e.phase},...void 0===e.failure?{}:{error:g(e.failure,r)}})}function f(t){const o=e(t);return Object.assign(new Error(o.code),o,{name:"ImMediaTaskOperationError"})}function y(e){return!(void 0!==e.recalled||void 0!==e.deletedForEveryone||"failed"!==e.status&&"uploading"!==e.status||"media.cancelled"===e.failure?.displayCode&&!0!==e.failure.retryable||"media.uploadTimeout"===e.failure?.displayCode&&!1===e.failure.retryable)}function g(t,o){if(void 0===t)return;const r=t.displayCode,a=void 0===r?void 0:{"media.empty":{code:"IM_SDK_MEDIA_EMPTY",category:"validation",retryable:!1},"media.noCrypto":{code:"IM_SDK_MEDIA_CRYPTO_UNAVAILABLE",category:"contract",retryable:!1},"media.previewFailed":{code:"IM_SDK_MEDIA_PREVIEW_FAILED",category:"state",retryable:!1},"media.encryptFailed":{code:"IM_SDK_MEDIA_ENCRYPT_FAILED",category:"state",retryable:!1},"media.uploadFailed":{code:"IM_SDK_MEDIA_UPLOAD_FAILED",category:"network",retryable:!0},"media.uploadTimeout":{code:"IM_SDK_MEDIA_UPLOAD_TIMEOUT",category:"network",retryable:!0},"media.resumeUnavailable":{code:"IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED",category:"state",retryable:!0},"media.cleanupUnconfirmed":{code:"IM_SDK_MEDIA_UPLOAD_CLEANUP_UNCONFIRMED",category:"state",retryable:!0},"media.cancelled":{code:"IM_SDK_MEDIA_UPLOAD_CANCELED",category:"state",retryable:!0},"media.invalidDuration":{code:"IM_SDK_VOICE_DURATION_INVALID",category:"validation",retryable:!1},"media.uploadInterrupted":{code:"IM_SDK_MEDIA_UPLOAD_INTERRUPTED",category:"network",retryable:!0}}[r];return Object.freeze(e({...a??{code:"IM_SDK_MEDIA_UPLOAD_FAILED",category:"state",retryable:t.retryable??!1},...!1===t.retryable?{retryable:!1}:{},operation:"media.upload",conversation:o}))}function v(e){return Object.freeze({...e,ref:m(e.ref),...void 0===e.items?{}:{items:Object.freeze(e.items.map(e=>Object.freeze({...e})))},...void 0===e.error?{}:{error:Object.freeze({...e.error})}})}function I(e){const t=e?.conversation,o=t?.conversationType,r=t?.conversationId;if("supergroup"===o)throw f({code:"IM_SDK_SUPERGROUP_UNSUPPORTED",category:"unsupported",operation:"media.download",retryable:!1});if("direct"!==o&&"group"!==o&&"channel"!==o||"string"!=typeof r||""===r.trim()||"string"!=typeof e?.messageId||""===e.messageId.trim())throw f({code:"IM_SDK_MEDIA_MESSAGE_REF_INVALID",category:"validation",operation:"media.download",retryable:!1});return m({conversationType:o,conversationId:r})}function _(e){let t=!0;const s=e.now??Date.now;let d=0,g=0;const _=/* @__PURE__ */new Map,E=/* @__PURE__ */new Set,h=/* @__PURE__ */new Map,b=/* @__PURE__ */new Map,D=/* @__PURE__ */new Map,A=/* @__PURE__ */new Map,w=/* @__PURE__ */new Map,M=/* @__PURE__ */new Set;let T=!1;const L=/* @__PURE__ */new Map,S=/* @__PURE__ */new Set,C=e.maxDownloadCheckpointBytes??536870912;function K(e){return f({code:"IM_SDK_MEDIA_DOWNLOAD_RESTART_REQUIRED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function O(e,t){L.delete(e),S.add(e);const o=_.get(e);if(void 0!==o){const e={...o,recoveryReason:t,..."failed"===o.state||"canceled"===o.state?{error:K(o.ref)}:{}};"running"===o.state?H(e):$(e)}}const R=c(3);let U;const P=e.maxCachedBlobs??8,N=e.maxCachedBlobBytes??67108864;let k=0;function x(){if(!t||!e.isActive())throw f({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.tasks",retryable:!1})}function V(){return Object.freeze([..._.values()])}function F(){const t=V();for(const o of[...E])try{o(t)}catch(t){e.emitter.emit({type:"error",error:{scope:"unknown",message:"媒体任务订阅者回调异常",cause:t}})}}function z(){!T&&t&&e.isActive()&&(T=!0,queueMicrotask(()=>{if(T=!1,t&&e.isActive())for(const t of[...M])try{t()}catch(t){e.emitter.emit({type:"error",error:{scope:"unknown",message:"媒体缓存订阅者回调异常",cause:t}})}}))}function B(e){const t=D.get(e);void 0!==t&&(k-=t.size,D.delete(e),A.delete(e),w.delete(e),z())}function j(){if(!t||!e.isActive())return;const o=s();for(const[e,t]of L)!b.has(e)&&void 0!==t.idleSince&&o-t.idleSince>=864e5&&O(e,"download-checkpoint-expired");for(const[e,t]of A)!b.has(e)&&o-t>=n&&B(e);z()}function W(e,t){const o=D.get(e);if(void 0!==o){if(!(w.get(e)!==t||s()-A.get(e)>=n))return D.delete(e),D.set(e,o),A.set(e,s()),o;B(e)}}function Y(){d+=1,D.clear(),A.clear(),w.clear(),z(),k=0;for(const e of[...L.keys()])O(e,"download-checkpoint-cleared")}function q(e){_.delete(e),h.delete(e),L.delete(e),S.delete(e),B(e)}function H(e){_.set(e.id,v(e)),function(){for(;_.size>128;){const e=[..._.values()].find(e=>"completed"===e.state||"failed"===e.state||"canceled"===e.state);if(void 0===e)return;q(e.id)}}()}function $(o){if(!t||!e.isActive())return;H(o);const r=_.get(o.id);if(F(),!t||!e.isActive()||void 0===r||_.get(o.id)!==r)return;const a={id:r.id,messageId:r.messageId,ref:r.ref,direction:"download",state:r.state,percent:r.percent};e.emitter.emit({type:"media-task:updated",conversation:r.ref,task:a})}function J(e,t,o){if(B(e),!(t.size>N))for(D.set(e,t),w.set(e,o),z(),A.set(e,s()),k+=t.size;D.size>P||k>N;){const e=D.keys().next().value;if(void 0===e)break;B(e)}}function G(t,r=!0){const a=I(t),i=e.domainState.getConversationMessage(a,t.messageId);if(void 0===i)throw f({code:"IM_SDK_MEDIA_MESSAGE_NOT_FOUND",category:"state",operation:"media.download",retryable:!1,conversation:a});let n,s,c,d;if("image"===i.contentType)n=i.body.image,s=e.loaders?.loadImage,d="image";else if("video"===i.contentType)n=i.body.video,s=e.loaders?.loadVideo,d="video";else if("voice"===i.contentType)n=i.body.voice,s=e.loaders?.loadVoice;else if("file"===i.contentType)n=i.body.file,s=e.loaders?.loadFile,c=i.body.file?.mimeType,d="file";else if("filesAlbum"===i.contentType){const o=t.itemIndex;if(n=void 0===o?void 0:i.body.filesAlbum?.items[o],void 0===n)throw f({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});s=e.loaders?.loadFile,d="file"}else if("mediaAlbum"===i.contentType){const o=i.body.mediaAlbum?.items,r=t.itemIndex,c=void 0===r||void 0===o?void 0:o[r];if(void 0===c)throw f({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});n=c,s="video"===c.kind?e.loaders?.loadVideo:e.loaders?.loadImage,d=c.kind}if("mediaAlbum"!==i.contentType&&"filesAlbum"!==i.contentType&&void 0!==t.itemIndex)throw f({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});if(void 0===n)throw f({code:"IM_SDK_MEDIA_MESSAGE_UNSUPPORTED",category:"unsupported",operation:"media.download",retryable:!1,conversation:a});if(r&&void 0===s)throw f({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:a});if(""===n.url.trim()||n.url.startsWith("blob:"))throw f({code:"IM_SDK_MEDIA_REMOTE_URL_UNAVAILABLE",category:"state",operation:"media.download",retryable:!1,conversation:a});return{ref:a,messageId:i.id,...void 0===t.itemIndex?{}:{itemIndex:t.itemIndex},...void 0===c?{}:{mimeType:c},...void 0===d?{}:{cacheKind:d,resourceVersion:o(n.url,{conversation:a,itemIndex:t.itemIndex})},...void 0===s?{}:{load:s},input:{url:n.url,...void 0===n.size?{}:{expectedBytes:n.size},...void 0===n.teaKey?{}:{teaKey:n.teaKey},...void 0===n.fileEncryptType?{}:{fileEncryptType:n.fileEncryptType}}}}function Q(e){return f({code:"IM_SDK_MEDIA_DOWNLOAD_CANCELED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function X(){return f({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.download",retryable:!1})}async function Z(t,o,r=d){if(x(),r!==d)return null;const a=u("download",t.ref,t.messageId,t.itemIndex),i=W(a,t.resourceVersion);if(void 0!==i)return i;if(void 0===e.assetCache||void 0===t.cacheKind||void 0===t.resourceVersion)return null;let n;try{n=await e.assetCache.get({kind:t.cacheKind,messageId:t.messageId,resourceVersion:t.resourceVersion}),e.onAssetCacheEvent?.({operation:"get",outcome:null===n?"miss":"hit",kind:t.cacheKind,messageId:t.messageId,...null===n?{}:{byteLength:n.blob.size}})}catch(r){if(e.onAssetCacheEvent?.({operation:"get",outcome:"failed",kind:t.cacheKind,messageId:t.messageId,cause:r}),o)throw f({code:"IM_SDK_MEDIA_CACHE_READ_FAILED",category:"state",operation:"media.getCached",retryable:!0,conversation:t.ref});return null}if(null===n)return null;if(x(),r!==d)return null;const s=n.blob,c=n.mimeType??t.mimeType??"",l=s.type===c?s:s.slice(0,s.size,c);return J(a,l,t.resourceVersion),l}function ee(e,t){j();const o=L.get(e);if(void 0!==o&&o.url!==t.input.url&&O(e,"download-object-changed"),S.has(e)){const o=K(t.ref),r=_.get(e);throw void 0===r||"failed"!==r.state&&"canceled"!==r.state||$({...r,error:o}),o}return o?.state}function te(e,t){if(U===e)return 1;if("interactive"===t.retainedPriority)return 0;for(const e of t.consumers)if("interactive"===e.priority)return 0;return-1}function oe(e,t){if(t.controller.signal.aborted||t.settled)return;t.controller.abort();const o=_.get(e);if(b.get(e)!==t||void 0===o||"queued"!==o.state&&"running"!==o.state)return;const r=S.has(e)?K(o.ref):Q(o.ref);$({...o,state:"canceled",error:r})}function re(o,r,a,i,n){return new Promise((s,c)=>{let d=!1;const l=e=>{d||(d=!0,a.removeEventListener("abort",m),n?.removeEventListener("abort",m),i?.(),e())};function m(){l(()=>c(t&&e.isActive()?Q(r):X()))}a.addEventListener("abort",m,{once:!0}),n?.addEventListener("abort",m,{once:!0}),o.then(o=>{!t||!e.isActive()||a.aborted||n?.aborted?m():l(()=>s(o))},e=>l(()=>c(e))),(a.aborted||n?.aborted)&&m()})}function ae(e,t,o,r){const a=r?.priority??"interactive";if(void 0===r?.signal)return"interactive"!==t.retainedPriority&&(t.retainedPriority=a),t.promise;const i={priority:a};return t.consumers.add(i),re(t.promise,o,r.signal,()=>{t.consumers.delete(i),0===t.consumers.size&&void 0===t.retainedPriority&&oe(e,t)},t.controller.signal)}function ie(o,r=!1,a){const n=d,c=u("download",o.ref,o.messageId,o.itemIndex),p=b.get(c);if(void 0!==p&&!p.controller.signal.aborted)return ae(c,p,o.ref,a);if(!r){const e=W(c,o.resourceVersion);if(void 0!==e){$({id:c,ref:m(o.ref),messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex},direction:"download",state:"completed",percent:100});const t=Promise.resolve(e);return void 0===a?.signal?t:re(t,o.ref,a.signal)}}B(c);const y=(()=>{const e=ee(c,o);return void 0===e?{percent:0}:{percent:Math.min(99,Math.round(e.bytesDownloaded/e.bytesTotal*100)),bytesTransferred:e.bytesDownloaded,bytesTotal:e.bytesTotal}})(),g=m(o.ref);h.set(c,Object.freeze({conversation:g,messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}}));const v={id:c,messageId:o.messageId,ref:g,direction:"download",...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}},I=new AbortController;let E;const D=Promise.resolve().then(async()=>{let a;try{if(!t||!e.isActive())throw X();if(I.signal.aborted)throw Q(g);if(a=await R.acquire(I.signal,()=>te(c,E)),!t||!e.isActive())throw X();if(I.signal.aborted)throw Q(g);if($({...v,...y,state:"running"}),!t||!e.isActive())throw X();if(I.signal.aborted)throw Q(g);if(!r&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const e=await Z(o,!1,n);if(I.signal.aborted)throw Q(g);if(null!==e)return L.delete(c),S.delete(c),$({..._.get(c),...v,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),e}const i=o.load;if(void 0===i)throw f({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:g});const s=ee(c,o);if(void 0!==y.bytesTransferred&&(void 0===s||n!==d))throw O(c,"download-checkpoint-cleared"),K(g);const m=await i({...o.input,getPriority:()=>te(c,E),...void 0===s?{}:{resume:s},onResumable:r=>{t&&e.isActive()&&n===d&&b.get(c)?.controller===I&&function(e,t,o){L.delete(e),L.set(e,{url:t,state:o}),S.delete(e);let r=[...L.values()].reduce((e,t)=>e+t.state.bytesDownloaded,0);for(;L.size>8||r>C;){const e=L.entries().next().value;if(void 0===e)break;r-=e[1].state.bytesDownloaded,O(e[0],"download-checkpoint-limit")}}(c,o.input.url,r)},onResumeInvalidated:()=>{t&&e.isActive()&&n===d&&b.get(c)?.controller===I&&O(c,"download-checkpoint-invalid")},signal:I.signal,onTransferProgress:o=>{const r=_.get(c);t&&e.isActive()&&!I.signal.aborted&&b.get(c)?.controller===I&&"running"===r?.state&&$({...r,state:"running",percent:Math.min(99,l(o.percent)),bytesTransferred:o.bytesTransferred,bytesTotal:o.bytesTotal,phase:o.bytesTotal>0&&o.bytesTransferred>=o.bytesTotal?"finalizing":"transferring"})},onProgress:o=>{const r=_.get(c);if(!t||!e.isActive()||I.signal.aborted||b.get(c)?.controller!==I||"running"!==r?.state)return;const a=Math.min(99,l(o));a<=r.percent||$({...r,state:"running",percent:a})}});if(!t||!e.isActive())throw X();if(I.signal.aborted)throw Q(g);const u=m instanceof Blob?void 0:m;let p=void 0===u?m:new Blob([u],void 0===o.mimeType?void 0:{type:o.mimeType});if(void 0!==o.mimeType&&p.type!==o.mimeType&&(p=p.slice(0,p.size,o.mimeType)),n===d&&J(c,p,o.resourceVersion),n===d&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const t=p.size;e.assetCache.put({kind:o.cacheKind,messageId:o.messageId,resourceVersion:o.resourceVersion,blob:p,...void 0===o.mimeType?{}:{mimeType:o.mimeType}}).then(r=>{z(),e.onAssetCacheEvent?.({operation:"put",outcome:r,kind:o.cacheKind,messageId:o.messageId,byteLength:t})}).catch(r=>{e.onAssetCacheEvent?.({operation:"put",outcome:"failed",kind:o.cacheKind,messageId:o.messageId,byteLength:t,cause:r})})}if(L.delete(c),S.delete(c),$({..._.get(c),...v,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),!t||!e.isActive())throw X();return p}catch(o){if(!t||!e.isActive())throw X();if(I.signal.aborted||"object"==typeof o&&null!==o&&"code"in o&&"IM_SDK_MEDIA_DOWNLOAD_CANCELED"===o.code){const e=Q(g);throw b.get(c)?.controller===I&&"canceled"!==_.get(c)?.state&&$({..._.get(c),...v,state:"canceled",percent:_.get(c)?.percent??0,error:S.has(c)?K(g):e}),e}const r=S.has(c)?K(g):i(o)?f({code:"IM_SDK_CRYPTO_EXECUTION_FAILED",category:"state",operation:"crypto.execute",retryable:"queue-full"===o.reason,conversation:g,details:{reason:o.reason}}):o instanceof Error&&"ImMediaTaskOperationError"===o.name?o:f({code:"IM_SDK_MEDIA_DOWNLOAD_FAILED",category:"network",operation:"media.download",retryable:!0,conversation:g});throw b.get(c)?.controller===I&&$({..._.get(c),...v,state:"failed",percent:_.get(c)?.percent??0,error:r}),r}finally{if(E.settled=!0,a?.(),b.get(c)?.controller===I){b.delete(c);const e=L.get(c);void 0!==e&&(e.idleSince=s())}}});E={controller:I,promise:D,consumers:/* @__PURE__ */new Set,settled:!1},b.set(c,E);const A=ae(c,E,g,a);return $({...v,...y,state:"queued"}),A}function ne(e,t){x();const o=_.get(e);if(void 0===o)throw f({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:t,retryable:!1});return o}function se(e,t){return f({code:"IM_SDK_MEDIA_TASK_INVALID_STATE",category:"state",operation:t,retryable:!1,conversation:e.ref,details:Object.freeze({state:e.state,direction:e.direction})})}const ce=e.emitter.subscribe(e=>{var o,r;t&&"media-task:updated"===e.type&&"upload"===e.task.direction&&(o=e.conversation,r=e.task.ref,o.conversationType===r.conversationType&&o.conversationId===r.conversationId&&(H(p(e.task)),F()))});return{api:{async clearCache(){x(),e.connection.invalidateMediaAssetCacheWrites?.(),Y();try{await(e.assetCache?.clear())}catch(t){throw x(),e.emitter.emit({type:"error",error:{scope:"storage",message:"媒体缓存清理失败",cause:t}}),f({code:"IM_SDK_MEDIA_CACHE_CLEAR_FAILED",category:"state",operation:"media.clearCache",retryable:!0})}x(),z()},getSnapshot:()=>(x(),V()),subscribe:e=>(x(),E.add(e),()=>E.delete(e)),async cancel(t,o){const r=ne(t,"media.cancel");if("queued"!==r.state&&"running"!==r.state&&("upload"!==r.direction||"paused"!==r.state))throw se(r,"media.cancel");if("upload"===r.direction){if(!(void 0===o?e.connection.cancelMediaUpload(r.messageId):e.connection.cancelMediaUpload(r.messageId,o)))throw f({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.cancel",retryable:!1,conversation:r.ref});return}const a=b.get(t);if(void 0===a)throw se(r,"media.cancel");oe(t,a)},async pause(t){const o=ne(t,"media.pause");if("upload"!==o.direction||"queued"!==o.state&&"running"!==o.state)throw se(o,"media.pause");if(!await(e.connection.pauseMediaUpload?.(o.messageId)))throw f({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.pause",retryable:!1,conversation:o.ref});x()},async resume(t){const o=ne(t,"media.resume");if("upload"!==o.direction||"paused"!==o.state)throw se(o,"media.resume");if(!e.connection.resumeMediaUpload?.(o.messageId))throw f({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.resume",retryable:!1,conversation:o.ref})},async retry(t,o){const r=ne(t,"media.retry");if("failed"!==r.state&&"canceled"!==r.state)throw se(r,"media.retry");if("upload"===r.direction){if(void 0!==o?.restartDownload)throw se(r,"media.retry");if(("IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED"===r.error?.code||"IM_SDK_MEDIA_UPLOAD_CLEANUP_UNCONFIRMED"===r.error?.code)&&!0!==o?.restartUpload)throw f({code:"IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED",category:"state",operation:"media.retry",retryable:!0,conversation:r.ref});if(!(void 0===o?e.connection.retryMediaUpload(r.messageId):e.connection.retryMediaUpload(r.messageId,o)))throw f({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.retry",retryable:!1,conversation:r.ref});return}if(void 0!==o?.restartUpload)throw se(r,"media.retry");if(b.has(t)&&!b.get(t).controller.signal.aborted)throw f({code:"IM_SDK_MEDIA_TASK_IN_FLIGHT",category:"state",operation:"media.retry",retryable:!0,conversation:r.ref});const a=h.get(t);if(void 0===a)throw f({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:"media.retry",retryable:!1});!0===o?.restartDownload&&(L.delete(t),S.delete(t)),await ie(G(a),!0)},async getUploadRecovery(t){x();const o=I(t);if(void 0!==t.itemIndex)return{available:!1,reason:"unsupported"};const r=t.messageId;if(void 0===e.recoveryPort)return{available:!1,reason:"unavailable"};const a=e.domainState.getConversationMessage(o,r);if(void 0===a)return{available:!1,reason:"not-found"};if(!y(a))return{available:!1,reason:"invalid-state"};try{const t=await e.recoveryPort.get(o,r);x();const a=e.domainState.getConversationMessage(o,r);return void 0===a?{available:!1,reason:"not-found"}:y(a)?void 0===t?{available:!1,reason:"not-found"}:{available:!0,expiresAt:t.savedAt+864e5}:{available:!1,reason:"invalid-state"}}catch(e){x();return{available:!1,reason:"object"==typeof e&&null!==e&&"reason"in e?String(e.reason):"storage"}}},async resumeUpload(t,o){x();const r=I(t);if(void 0!==t.itemIndex||void 0===e.connection.recoverMediaUpload)throw f({code:"IM_SDK_MEDIA_RECOVERY_UNAVAILABLE",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});try{const a=await e.connection.recoverMediaUpload(r,t.messageId,o.file);if(x(),!a.ok&&"paused"===a.reason)throw f({code:"IM_SDK_MEDIA_PAUSED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});if(!a.ok&&"cancelled"===a.reason)throw f({code:"IM_SDK_MEDIA_CANCELLED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});if(!a.ok)throw f({code:"IM_SDK_MEDIA_RECOVERY_UPLOAD_FAILED",category:"state",operation:"media.resumeUpload",retryable:!0,conversation:r})}catch(e){if(x(),"object"==typeof e&&null!==e&&"code"in e&&"string"==typeof e.code&&e.code.startsWith("IM_SDK_"))throw e;throw f({code:e instanceof Error&&"IM_MEDIA_RECOVERY_FILE_MISMATCH"===e.message?"IM_SDK_MEDIA_RECOVERY_FILE_MISMATCH":"IM_SDK_MEDIA_RECOVERY_FAILED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r})}},download:function(e,t){try{if(x(),t?.signal?.aborted)throw Q(I(e));return ie(G(e),!1,t)}catch(e){return Promise.reject(e)}},prioritizeDownload:function(e){x();const t=I(e);U=u("download",t,e.messageId,e.itemIndex)},probeCached:async function(t){x();const o=d,r=t.map(e=>G(e,!1)),a=/* @__PURE__ */new Map,i=s(),c=r.map(e=>{const t=u("download",e.ref,e.messageId,e.itemIndex);return D.has(t)&&w.get(t)===e.resourceVersion&&i-(A.get(t)??0)<n});r.forEach((e,t)=>{if(c[t]||void 0===e.cacheKind||void 0===e.resourceVersion)return;const o={kind:e.cacheKind,messageId:e.messageId,resourceVersion:e.resourceVersion};a.set(JSON.stringify(o),o)});const l=[...a.values()];let m=l.map(()=>!1);if(l.length>0&&void 0!==e.assetCache){if(void 0===e.assetCache.hasMany)throw f({code:"IM_SDK_MEDIA_CACHE_PROBE_UNAVAILABLE",category:"contract",operation:"media.probeCached",retryable:!1});try{if(m=await e.assetCache.hasMany(l),m.length!==l.length||m.some(e=>"boolean"!=typeof e))throw new Error("媒体缓存查询结果数量或类型不符")}catch(t){throw x(),e.onAssetCacheEvent?.({operation:"get",outcome:"failed",kind:l[0].kind,messageId:l[0].messageId,cause:t}),f({code:"IM_SDK_MEDIA_CACHE_READ_FAILED",category:"state",operation:"media.probeCached",retryable:!0})}}if(x(),o!==d)throw f({code:"IM_SDK_MEDIA_CACHE_QUERY_STALE",category:"state",operation:"media.probeCached",retryable:!0});const p=new Map(l.map((e,t)=>[JSON.stringify(e),m[t]]));return Object.freeze(r.map((e,t)=>c[t]||!0===p.get(JSON.stringify({kind:e.cacheKind,messageId:e.messageId,resourceVersion:e.resourceVersion}))))},subscribeCacheChanges:e=>(x(),M.add(e),()=>M.delete(e)),getCached:async function(e){const t=G(e,!1);return void 0===t.cacheKind?null:await Z(t,!0)},prepareLocalPreview:async function(t){if(x(),r(t.signal),void 0===e.preparePreview)throw f({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalPreview",retryable:!1});let o;try{o=await e.preparePreview({operationId:"media.prepareLocalPreview:"+ ++g,kind:t.kind,file:t.file,..."video"===t.kind&&t.includeDisplayPoster?{includeDisplayPoster:!0}:{},...void 0===t.signal?{}:{signal:t.signal}})}catch(o){if(!0===t.signal?.aborted||o instanceof Error&&"AbortError"===o.name)throw o;return e.onLocalPreviewError?.({kind:t.kind,byteLength:t.file.size,cause:o}),null}return x(),r(t.signal),!Number.isFinite(o.width)||!Number.isFinite(o.height)||o.width<=0||o.height<=0?(e.onLocalPreviewError?.({kind:t.kind,byteLength:t.file.size,cause:new Error(`预览端口返回了不可用的尺寸 ${o.width}×${o.height}`)}),null):"video"===t.kind?{width:o.width,height:o.height,...void 0===o.duration?{}:{duration:o.duration},...void 0===o.posterData?{}:{posterData:o.posterData},...t.includeDisplayPoster&&o.displayPosterData?.byteLength?{displayPoster:new Blob([o.displayPosterData],{type:a(o.displayPosterData)})}:{}}:{width:o.width,height:o.height}},prepareLocalVideoPoster:async function(t){if(x(),r(t.signal),void 0===e.prepareVideoPoster)throw f({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalVideoPoster",retryable:!1});let o;try{o=await e.prepareVideoPoster({operationId:"media.prepareLocalVideoPoster:"+ ++g,kind:"video",file:t.file,...void 0===t.signal?{}:{signal:t.signal}})}catch(o){if(r(t.signal),o instanceof Error&&"AbortError"===o.name)throw o;return x(),e.onLocalPreviewError?.({kind:"video",byteLength:t.file.size,cause:o}),null}return r(t.signal),x(),!Number.isFinite(o.width)||!Number.isFinite(o.height)||o.width<=0||o.height<=0||!o.posterData?.byteLength?(e.onLocalPreviewError?.({kind:"video",byteLength:t.file.size,cause:new Error("视频封面解码没有返回有效尺寸和图片字节")}),null):new Blob([o.posterData],{type:a(o.posterData)})},prepareLocalImageThumbnail:async function(t){if(x(),r(t.signal),void 0===e.prepareImageThumbnail)throw f({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalImageThumbnail",retryable:!1});try{const o=new Uint8Array(await t.file.slice(0,3).arrayBuffer());if(r(t.signal),x(),255!==o[0]||216!==o[1]||255!==o[2])return t.file;const i="image/jpeg"===t.file.type?t.file:t.file.slice(0,t.file.size,"image/jpeg"),n=await e.prepareImageThumbnail({operationId:"media.prepareLocalImageThumbnail:"+ ++g,kind:"image",file:i,...void 0===t.signal?{}:{signal:t.signal}});if(r(t.signal),x(),!Number.isFinite(n.width)||!Number.isFinite(n.height)||n.width<=0||n.height<=0||!n.posterData?.byteLength)throw new Error("图片缩略图解码没有返回有效尺寸和图片字节");return new Blob([n.posterData],{type:a(n.posterData)})}catch(o){if(r(t.signal),o instanceof Error&&"AbortError"===o.name)throw o;return x(),e.onLocalPreviewError?.({kind:"image",byteLength:t.file.size,cause:o}),null}}},clearCache:Y,prune:j,dispose(){if(t){t=!1,d+=1,ce();for(const e of b.values())e.controller.abort();R.dispose(),U=void 0,b.clear(),E.clear(),M.clear(),w.clear(),_.clear(),h.clear(),D.clear(),A.clear(),L.clear(),S.clear(),k=0}}}}export{d as createDefaultMediaAssetCacheStrategyRegistry,_ as createMediaTasksRuntime,p as toProductMediaTaskUpdate};
|
|
1
|
+
import{createImSdkError as e}from"./message.js";import{createMediaAssetCacheStrategyRegistry as t,mediaAssetResourceVersion as o}from"../../../im-core/src/ports/media-asset-cache-port.js";import{throwIfAborted as r}from"../../../im-core/src/abort.js";import{resolveMediaThumbnailMimeType as a}from"../../../im-core/src/media-thumbnail.js";import{isCryptoExecutionError as i}from"../../../im-core/src/ports/crypto-task-executor.js";const n=6048e5,s=1048576;function d(e){let t=0,o=!1;const r=[];function a(){if(!o)for(;t<e&&r.length>0;){r.sort((e,t)=>t.getPriority()-e.getPriority());const e=r.shift();if(e.signal.removeEventListener("abort",e.onAbort),e.signal.aborted){e.reject(new DOMException("媒体下载已取消","AbortError"));continue}t+=1;let o=!1;e.resolve(()=>{o||(o=!0,t=Math.max(0,t-1),a())})}}return{acquire:(e,t)=>o?Promise.reject(new Error("媒体下载并发控制器已释放")):new Promise((o,i)=>{const n={resolve:o,reject:i,signal:e,getPriority:t,onAbort:()=>{const e=r.indexOf(n);e>=0&&r.splice(e,1),i(new DOMException("媒体下载已取消","AbortError"))}};e.addEventListener("abort",n.onAbort,{once:!0}),r.push(n),a()}),dispose(){o=!0;for(const e of r.splice(0))e.signal.removeEventListener("abort",e.onAbort),e.reject(new Error("媒体下载并发控制器已释放"))}}}function c(){return t([{kind:"image",softMaxBytes:512*s,maxEntries:512,maxEntryBytes:30*s,maxIdleMs:n},{kind:"video-poster",softMaxBytes:64*s,maxEntries:256,maxEntryBytes:524288,maxIdleMs:n},{kind:"image-display",softMaxBytes:128*s,maxEntries:512,maxEntryBytes:524288,maxIdleMs:n},{kind:"video",softMaxBytes:1792*s,maxEntries:64,maxEntryBytes:200*s,maxIdleMs:n},{kind:"file",softMaxBytes:512*s,maxEntries:128,maxEntryBytes:200*s,maxIdleMs:n}])}function l(e){return Number.isFinite(e)?Math.max(0,Math.min(100,Math.round(e))):0}function u(e){return Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function m(e,t,o,r){const a=`${e}:${encodeURIComponent(t.conversationType)}:${encodeURIComponent(t.conversationId)}:${encodeURIComponent(o)}`;return void 0===r?a:`${a}:${r}`}function p(e){const t=e.ref.conversationType,o=e.ref.conversationId;if("direct"!==t&&"group"!==t&&"channel"!==t||""===o.trim())throw y({code:"supergroup"===t?"IM_SDK_SUPERGROUP_UNSUPPORTED":"IM_SDK_MEDIA_TASK_REF_INVALID",category:"supergroup"===t?"unsupported":"contract",operation:"media.tasks.project",retryable:!1});const r=u({conversationType:t,conversationId:o});return v({id:m(e.direction,r,e.messageId),messageId:e.messageId,ref:r,direction:e.direction,state:e.state,percent:l(e.percent),...void 0===e.items?{}:{items:e.items},...void 0===e.attempt?{}:{attempt:e.attempt},...void 0===e.maxAttempts?{}:{maxAttempts:e.maxAttempts},...void 0===e.bytesTransferred?{}:{bytesTransferred:e.bytesTransferred},...void 0===e.bytesTotal?{}:{bytesTotal:e.bytesTotal},...void 0===e.recovery?{}:{recovery:e.recovery},...void 0===e.recoveryReason?{}:{recoveryReason:e.recoveryReason},...void 0===e.phase?{}:{phase:e.phase},...void 0===e.failure?{}:{error:g(e.failure,r)}})}function y(t){const o=e(t);return Object.assign(new Error(o.code),o,{name:"ImMediaTaskOperationError"})}function f(e){return!(void 0!==e.recalled||void 0!==e.deletedForEveryone||"failed"!==e.status&&"uploading"!==e.status||"media.cancelled"===e.failure?.displayCode&&!0!==e.failure.retryable||"media.uploadTimeout"===e.failure?.displayCode&&!1===e.failure.retryable)}function g(t,o){if(void 0===t)return;const r=t.displayCode,a=void 0===r?void 0:{"media.empty":{code:"IM_SDK_MEDIA_EMPTY",category:"validation",retryable:!1},"media.noCrypto":{code:"IM_SDK_MEDIA_CRYPTO_UNAVAILABLE",category:"contract",retryable:!1},"media.previewFailed":{code:"IM_SDK_MEDIA_PREVIEW_FAILED",category:"state",retryable:!1},"media.encryptFailed":{code:"IM_SDK_MEDIA_ENCRYPT_FAILED",category:"state",retryable:!1},"media.uploadFailed":{code:"IM_SDK_MEDIA_UPLOAD_FAILED",category:"network",retryable:!0},"media.uploadTimeout":{code:"IM_SDK_MEDIA_UPLOAD_TIMEOUT",category:"network",retryable:!0},"media.resumeUnavailable":{code:"IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED",category:"state",retryable:!0},"media.cleanupUnconfirmed":{code:"IM_SDK_MEDIA_UPLOAD_CLEANUP_UNCONFIRMED",category:"state",retryable:!0},"media.cancelled":{code:"IM_SDK_MEDIA_UPLOAD_CANCELED",category:"state",retryable:!0},"media.invalidDuration":{code:"IM_SDK_VOICE_DURATION_INVALID",category:"validation",retryable:!1},"media.uploadInterrupted":{code:"IM_SDK_MEDIA_UPLOAD_INTERRUPTED",category:"network",retryable:!0}}[r];return Object.freeze(e({...a??{code:"IM_SDK_MEDIA_UPLOAD_FAILED",category:"state",retryable:t.retryable??!1},...!1===t.retryable?{retryable:!1}:{},operation:"media.upload",conversation:o}))}function v(e){return Object.freeze({...e,ref:u(e.ref),...void 0===e.items?{}:{items:Object.freeze(e.items.map(e=>Object.freeze({...e})))},...void 0===e.error?{}:{error:Object.freeze({...e.error})}})}function I(e){const t=e?.conversation,o=t?.conversationType,r=t?.conversationId;if("supergroup"===o)throw y({code:"IM_SDK_SUPERGROUP_UNSUPPORTED",category:"unsupported",operation:"media.download",retryable:!1});if("direct"!==o&&"group"!==o&&"channel"!==o||"string"!=typeof r||""===r.trim()||"string"!=typeof e?.messageId||""===e.messageId.trim())throw y({code:"IM_SDK_MEDIA_MESSAGE_REF_INVALID",category:"validation",operation:"media.download",retryable:!1});return u({conversationType:o,conversationId:r})}function _(e){let t=!0;const s=e.now??Date.now;let c=0,g=0;const _=/* @__PURE__ */new Map,E=/* @__PURE__ */new Map,h=/* @__PURE__ */new Set,D=/* @__PURE__ */new Map,b=/* @__PURE__ */new Map,A=/* @__PURE__ */new Map,M=/* @__PURE__ */new Map,w=/* @__PURE__ */new Map,S=/* @__PURE__ */new Set;let T=!1;const L=/* @__PURE__ */new Map,C=/* @__PURE__ */new Set,K=e.maxDownloadCheckpointBytes??536870912;function R(e){return y({code:"IM_SDK_MEDIA_DOWNLOAD_RESTART_REQUIRED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function U(e,t){L.delete(e),C.add(e);const o=E.get(e);if(void 0!==o){const e={...o,recoveryReason:t,..."failed"===o.state||"canceled"===o.state?{error:R(o.ref)}:{}};"running"===o.state?q(e):J(e)}}const P=d(3);let O;const x=e.maxCachedBlobs??8,k=e.maxCachedBlobBytes??67108864;let N=0;function V(){if(!t||!e.isActive())throw y({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.tasks",retryable:!1})}function z(){return Object.freeze([...E.values()])}function F(){const t=z();for(const o of[...h])try{o(t)}catch(t){e.emitter.emit({type:"error",error:{scope:"unknown",message:"媒体任务订阅者回调异常",cause:t}})}}function B(){!T&&t&&e.isActive()&&(T=!0,queueMicrotask(()=>{if(T=!1,t&&e.isActive())for(const t of[...S])try{t()}catch(t){e.emitter.emit({type:"error",error:{scope:"unknown",message:"媒体缓存订阅者回调异常",cause:t}})}}))}function j(e){const t=A.get(e);void 0!==t&&(N-=t.size,A.delete(e),M.delete(e),w.delete(e),B())}function W(){if(!t||!e.isActive())return;const o=s();for(const[e,t]of L)!b.has(e)&&void 0!==t.idleSince&&o-t.idleSince>=864e5&&U(e,"download-checkpoint-expired");for(const[e,t]of M)!b.has(e)&&o-t>=n&&j(e);B()}function Y(e,t){const o=A.get(e);if(void 0!==o){if(!(w.get(e)!==t||s()-M.get(e)>=n))return A.delete(e),A.set(e,o),M.set(e,s()),o;j(e)}}function $(){c+=1,A.clear(),M.clear(),w.clear(),B(),N=0;for(const e of[...L.keys()])U(e,"download-checkpoint-cleared")}function H(e){E.delete(e),D.delete(e),L.delete(e),C.delete(e),j(e)}function q(e){E.set(e.id,v(e)),function(){for(;E.size>128;){const e=[...E.values()].find(e=>"completed"===e.state||"failed"===e.state||"canceled"===e.state);if(void 0===e)return;H(e.id)}}()}function J(o){if(!t||!e.isActive())return;q(o);const r=E.get(o.id);if(F(),!t||!e.isActive()||void 0===r||E.get(o.id)!==r)return;const a={id:r.id,messageId:r.messageId,ref:r.ref,direction:"download",state:r.state,percent:r.percent};e.emitter.emit({type:"media-task:updated",conversation:r.ref,task:a})}function G(e,t,o){if(j(e),!(t.size>k))for(A.set(e,t),w.set(e,o),B(),M.set(e,s()),N+=t.size;A.size>x||N>k;){const e=A.keys().next().value;if(void 0===e)break;j(e)}}function Q(t,r=!0,a=!1){const i=I(t),n=e.domainState.getConversationMessage(i,t.messageId);if(void 0===n)throw y({code:"IM_SDK_MEDIA_MESSAGE_NOT_FOUND",category:"state",operation:"media.download",retryable:!1,conversation:i});let s,d,c,l;if("image"===n.contentType)s=n.body.image,d=e.loaders?.loadImage,l="image";else if("video"===n.contentType)s=n.body.video,d=e.loaders?.loadVideo,l="video";else if("voice"===n.contentType)s=n.body.voice,d=e.loaders?.loadVoice;else if("file"===n.contentType)s=n.body.file,d=e.loaders?.loadFile,c=n.body.file?.mimeType,l="file";else if("filesAlbum"===n.contentType){const o=t.itemIndex;if(s=void 0===o?void 0:n.body.filesAlbum?.items[o],void 0===s)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:i});d=e.loaders?.loadFile,l="file"}else if("mediaAlbum"===n.contentType){const o=n.body.mediaAlbum?.items,r=t.itemIndex,a=void 0===r||void 0===o?void 0:o[r];if(void 0===a)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:i});s=a,d="video"===a.kind?e.loaders?.loadVideo:e.loaders?.loadImage,l=a.kind}if("mediaAlbum"!==n.contentType&&"filesAlbum"!==n.contentType&&void 0!==t.itemIndex)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:i});if(void 0===s)throw y({code:"IM_SDK_MEDIA_MESSAGE_UNSUPPORTED",category:"unsupported",operation:"media.download",retryable:!1,conversation:i});if(r&&void 0===d)throw y({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:i});if(!a&&(""===s.url.trim()||s.url.startsWith("blob:")))throw y({code:"IM_SDK_MEDIA_REMOTE_URL_UNAVAILABLE",category:"state",operation:"media.download",retryable:!1,conversation:i});return{ref:i,messageId:n.id,...void 0===t.itemIndex?{}:{itemIndex:t.itemIndex},...void 0===c?{}:{mimeType:c},...void 0===l?{}:{cacheKind:l,resourceVersion:o(s.url,{conversation:i,itemIndex:t.itemIndex})},...void 0===d?{}:{load:d},input:{url:s.url,...void 0===s.size?{}:{expectedBytes:s.size},...void 0===s.teaKey?{}:{teaKey:s.teaKey},...void 0===s.fileEncryptType?{}:{fileEncryptType:s.fileEncryptType}}}}function X(e){return y({code:"IM_SDK_MEDIA_DOWNLOAD_CANCELED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function Z(){return y({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.download",retryable:!1})}async function ee(t,o,r=c){if(V(),r!==c)return null;const a=m("download",t.ref,t.messageId,t.itemIndex),i=Y(a,t.resourceVersion);if(void 0!==i)return i;if(void 0===e.assetCache||void 0===t.cacheKind||void 0===t.resourceVersion)return null;let n;try{n=await e.assetCache.get({kind:t.cacheKind,messageId:t.messageId,resourceVersion:t.resourceVersion}),e.onAssetCacheEvent?.({operation:"get",outcome:null===n?"miss":"hit",kind:t.cacheKind,messageId:t.messageId,...null===n?{}:{byteLength:n.blob.size}})}catch(r){if(e.onAssetCacheEvent?.({operation:"get",outcome:"failed",kind:t.cacheKind,messageId:t.messageId,cause:r}),o)throw y({code:"IM_SDK_MEDIA_CACHE_READ_FAILED",category:"state",operation:"media.getCached",retryable:!0,conversation:t.ref});return null}if(null===n)return null;if(V(),r!==c)return null;const s=n.blob,d=n.mimeType??t.mimeType??"",l=s.type===d?s:s.slice(0,s.size,d);return G(a,l,t.resourceVersion),l}function te(e,t){W();const o=L.get(e);if(void 0!==o&&o.url!==t.input.url&&U(e,"download-object-changed"),C.has(e)){const o=R(t.ref),r=E.get(e);throw void 0===r||"failed"!==r.state&&"canceled"!==r.state||J({...r,error:o}),o}return o?.state}function oe(e,t){if(O===e)return 1;if("interactive"===t.retainedPriority)return 0;for(const e of t.consumers)if("interactive"===e.priority)return 0;return-1}function re(e,t){if(t.controller.signal.aborted||t.settled)return;t.controller.abort();const o=E.get(e);if(b.get(e)!==t||void 0===o||"queued"!==o.state&&"running"!==o.state)return;const r=C.has(e)?R(o.ref):X(o.ref);J({...o,state:"canceled",error:r})}function ae(o,r,a,i,n){return new Promise((s,d)=>{let c=!1;const l=e=>{c||(c=!0,a.removeEventListener("abort",u),n?.removeEventListener("abort",u),i?.(),e())};function u(){l(()=>d(t&&e.isActive()?X(r):Z()))}a.addEventListener("abort",u,{once:!0}),n?.addEventListener("abort",u,{once:!0}),o.then(o=>{!t||!e.isActive()||a.aborted||n?.aborted?u():l(()=>s(o))},e=>l(()=>d(e))),(a.aborted||n?.aborted)&&u()})}function ie(e,t,o,r){const a=r?.priority??"interactive";if(void 0===r?.signal)return"interactive"!==t.retainedPriority&&(t.retainedPriority=a),t.promise;const i={priority:a};return t.consumers.add(i),ae(t.promise,o,r.signal,()=>{t.consumers.delete(i),0===t.consumers.size&&void 0===t.retainedPriority&&re(e,t)},t.controller.signal)}function ne(o,r=!1,a){const n=c,d=m("download",o.ref,o.messageId,o.itemIndex),p=b.get(d);if(void 0!==p&&!p.controller.signal.aborted)return ie(d,p,o.ref,a);if(!r){const e=Y(d,o.resourceVersion);if(void 0!==e){J({id:d,ref:u(o.ref),messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex},direction:"download",state:"completed",percent:100});const t=Promise.resolve(e);return void 0===a?.signal?t:ae(t,o.ref,a.signal)}}j(d);const f=(()=>{const e=te(d,o);return void 0===e?{percent:0}:{percent:Math.min(99,Math.round(e.bytesDownloaded/e.bytesTotal*100)),bytesTransferred:e.bytesDownloaded,bytesTotal:e.bytesTotal}})(),g=u(o.ref);D.set(d,Object.freeze({conversation:g,messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}}));const v={id:d,messageId:o.messageId,ref:g,direction:"download",...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}},I=new AbortController;let _;const h=Promise.resolve().then(async()=>{let a;try{if(!t||!e.isActive())throw Z();if(I.signal.aborted)throw X(g);if(a=await P.acquire(I.signal,()=>oe(d,_)),!t||!e.isActive())throw Z();if(I.signal.aborted)throw X(g);if(J({...v,...f,state:"running"}),!t||!e.isActive())throw Z();if(I.signal.aborted)throw X(g);if(!r&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const e=await ee(o,!1,n);if(I.signal.aborted)throw X(g);if(null!==e)return L.delete(d),C.delete(d),J({...E.get(d),...v,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),e}const i=o.load;if(void 0===i)throw y({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:g});const s=te(d,o);if(void 0!==f.bytesTransferred&&(void 0===s||n!==c))throw U(d,"download-checkpoint-cleared"),R(g);const u=await i({...o.input,getPriority:()=>oe(d,_),...void 0===s?{}:{resume:s},onResumable:r=>{t&&e.isActive()&&n===c&&b.get(d)?.controller===I&&function(e,t,o){L.delete(e),L.set(e,{url:t,state:o}),C.delete(e);let r=[...L.values()].reduce((e,t)=>e+t.state.bytesDownloaded,0);for(;L.size>8||r>K;){const e=L.entries().next().value;if(void 0===e)break;r-=e[1].state.bytesDownloaded,U(e[0],"download-checkpoint-limit")}}(d,o.input.url,r)},onResumeInvalidated:()=>{t&&e.isActive()&&n===c&&b.get(d)?.controller===I&&U(d,"download-checkpoint-invalid")},signal:I.signal,onTransferProgress:o=>{const r=E.get(d);t&&e.isActive()&&!I.signal.aborted&&b.get(d)?.controller===I&&"running"===r?.state&&J({...r,state:"running",percent:Math.min(99,l(o.percent)),bytesTransferred:o.bytesTransferred,bytesTotal:o.bytesTotal,phase:o.bytesTotal>0&&o.bytesTransferred>=o.bytesTotal?"finalizing":"transferring"})},onProgress:o=>{const r=E.get(d);if(!t||!e.isActive()||I.signal.aborted||b.get(d)?.controller!==I||"running"!==r?.state)return;const a=Math.min(99,l(o));a<=r.percent||J({...r,state:"running",percent:a})}});if(!t||!e.isActive())throw Z();if(I.signal.aborted)throw X(g);const m=u instanceof Blob?void 0:u;let p=void 0===m?u:new Blob([m],void 0===o.mimeType?void 0:{type:o.mimeType});if(void 0!==o.mimeType&&p.type!==o.mimeType&&(p=p.slice(0,p.size,o.mimeType)),n===c&&G(d,p,o.resourceVersion),n===c&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const t=p.size;e.assetCache.put({kind:o.cacheKind,messageId:o.messageId,resourceVersion:o.resourceVersion,blob:p,...void 0===o.mimeType?{}:{mimeType:o.mimeType}}).then(r=>{B(),e.onAssetCacheEvent?.({operation:"put",outcome:r,kind:o.cacheKind,messageId:o.messageId,byteLength:t})}).catch(r=>{e.onAssetCacheEvent?.({operation:"put",outcome:"failed",kind:o.cacheKind,messageId:o.messageId,byteLength:t,cause:r})})}if(L.delete(d),C.delete(d),J({...E.get(d),...v,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),!t||!e.isActive())throw Z();return p}catch(o){if(!t||!e.isActive())throw Z();if(I.signal.aborted||"object"==typeof o&&null!==o&&"code"in o&&"IM_SDK_MEDIA_DOWNLOAD_CANCELED"===o.code){const e=X(g);throw b.get(d)?.controller===I&&"canceled"!==E.get(d)?.state&&J({...E.get(d),...v,state:"canceled",percent:E.get(d)?.percent??0,error:C.has(d)?R(g):e}),e}const r=C.has(d)?R(g):i(o)?y({code:"IM_SDK_CRYPTO_EXECUTION_FAILED",category:"state",operation:"crypto.execute",retryable:"queue-full"===o.reason,conversation:g,details:{reason:o.reason}}):o instanceof Error&&"ImMediaTaskOperationError"===o.name?o:y({code:"IM_SDK_MEDIA_DOWNLOAD_FAILED",category:"network",operation:"media.download",retryable:!0,conversation:g});throw b.get(d)?.controller===I&&J({...E.get(d),...v,state:"failed",percent:E.get(d)?.percent??0,error:r}),r}finally{if(_.settled=!0,a?.(),b.get(d)?.controller===I){b.delete(d);const e=L.get(d);void 0!==e&&(e.idleSince=s())}}});_={controller:I,promise:h,consumers:/* @__PURE__ */new Set,settled:!1},b.set(d,_);const A=ie(d,_,g,a);return J({...v,...f,state:"queued"}),A}function se(e){if(!Number.isInteger(e)||e<1||e>2048)throw y({code:"IM_SDK_MEDIA_DISPLAY_SIZE_INVALID",category:"validation",operation:"media.prepareLocalImageDisplay",retryable:!1})}function de(t,o="image"){const r=Q(t,!1,!0),a=e.domainState.getConversationMessage(r.ref,r.messageId);if(r.cacheKind!==o||void 0===a||void 0!==a.recalled||void 0!==a.deletedForEveryone)throw y({code:"IM_SDK_MEDIA_MESSAGE_UNSUPPORTED",category:"unsupported",operation:"media.getCachedImageDisplay",retryable:!1,conversation:r.ref});return r}function ce(e,t){if(/^https?:\/\//i.test(e.input.url)&&void 0!==e.resourceVersion)return{kind:"video"===e.cacheKind?"video-poster":"image-display",messageId:e.messageId,resourceVersion:`${e.resourceVersion}:display-webp-v2:${t}`}}function le(e,t){try{return de(e,"video"===t.cacheKind?"video":"image").resourceVersion===t.resourceVersion}catch{return!1}}async function ue(t,o){if(void 0===e.assetCache)return null;try{const a=await e.assetCache.get(t);return r(o),V(),e.onAssetCacheEvent?.({operation:"get",outcome:null===a?"miss":"hit",kind:t.kind,messageId:t.messageId,...null===a?{}:{byteLength:a.blob.size}}),a?.blob??null}catch(a){throw r(o),V(),e.onAssetCacheEvent?.({operation:"get",outcome:"failed",kind:t.kind,messageId:t.messageId,cause:a}),y({code:"IM_SDK_MEDIA_CACHE_READ_FAILED",category:"state",operation:"media.getCachedImageDisplay",retryable:!0})}}async function me(e,t,o){V(),r(t.signal),se(t.maxSize);const a=c,i=de(e,o),n=ce(i,t.maxSize);if(void 0===n)return null;const s=await ue(n,t.signal);return r(t.signal),V(),a===c&&le(e,i)?s:null}async function pe(t,o){V(),r(t.signal),se(t.maxSize);const a=c,i=void 0===t.message?void 0:de(t.message,o),n=void 0===i?void 0:ce(i,t.maxSize);if(void 0===n||void 0===e.assetCache)return ye(t,o);const s=JSON.stringify([a,n.kind,n.messageId,n.resourceVersion]),d=_.get(s)??Promise.resolve();let l;const u=new Promise(e=>{l=e}),m=d.then(()=>u);let p;_.set(s,m),m.then(()=>{_.get(s)===m&&_.delete(s)});try{return void 0===t.signal?await d:await Promise.race([d,new Promise((e,o)=>{p=()=>{try{r(t.signal)}catch(e){o(e)}},t.signal.addEventListener("abort",p,{once:!0}),t.signal.aborted&&p()})]),r(t.signal),V(),a!==c?null:await ye(t,o)}finally{void 0!==p&&t.signal?.removeEventListener("abort",p),l()}}async function ye(o,i){const n="video"===i?"media.prepareLocalVideoPoster":"media.prepareLocalImageDisplay";V(),r(o.signal),se(o.maxSize);const s=c,d=void 0===o.message?void 0:de(o.message,i);if(void 0!==o.expectedResourceUrl&&d?.input.url!==o.expectedResourceUrl)return null;const l=void 0===d?void 0:ce(d,o.maxSize),u=()=>s===c&&(void 0===o.message||void 0!==d&&le(o.message,d));if(void 0!==l){let e=null;try{e=await ue(l,o.signal)}catch(e){if("object"!=typeof e||null===e||!("code"in e)||"IM_SDK_MEDIA_CACHE_READ_FAILED"!==e.code)throw e}if(r(o.signal),V(),!u())return null;if(null!==e)return e}const m=o.poster??o.file;if(void 0===m)throw y({code:"IM_SDK_MEDIA_DISPLAY_SOURCE_REQUIRED",category:"validation",operation:n,retryable:!1});const p="video"===i&&void 0===o.poster?e.prepareVideoPoster:e.prepareImageDisplay;if(void 0===p)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:n,retryable:!1});let f;try{const e=await p({operationId:`${n}:${++g}`,kind:"video"===i&&void 0===o.poster?"video":"image",file:m,maxSize:o.maxSize,...void 0===o.signal?{}:{signal:o.signal}});if(r(o.signal),V(),!Number.isFinite(e.width)||!Number.isFinite(e.height)||e.width<=0||e.height<=0||!e.posterData?.byteLength)throw new Error("图片显示图解码没有返回有效尺寸和图片字节");if(!u())return null;f=new Blob([e.posterData],{type:a(e.posterData)})}catch(t){if(r(o.signal),t instanceof Error&&"AbortError"===t.name)throw t;return V(),e.onLocalPreviewError?.({kind:i,byteLength:m.size,cause:t}),null}if(void 0!==l&&void 0!==e.assetCache){try{const r=await e.assetCache.put({...l,blob:f,mimeType:f.type},{isCurrent:()=>t&&e.isActive()&&!o.signal?.aborted&&u()});e.onAssetCacheEvent?.({operation:"put",outcome:r,kind:l.kind,messageId:l.messageId,byteLength:f.size})}catch(t){e.onAssetCacheEvent?.({operation:"put",outcome:"failed",kind:l.kind,messageId:l.messageId,byteLength:f.size,cause:t})}r(o.signal),V()}return u()?f:null}function fe(e,t){V();const o=E.get(e);if(void 0===o)throw y({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:t,retryable:!1});return o}function ge(e,t){return y({code:"IM_SDK_MEDIA_TASK_INVALID_STATE",category:"state",operation:t,retryable:!1,conversation:e.ref,details:Object.freeze({state:e.state,direction:e.direction})})}const ve=e.emitter.subscribe(e=>{var o,r;t&&"media-task:updated"===e.type&&"upload"===e.task.direction&&(o=e.conversation,r=e.task.ref,o.conversationType===r.conversationType&&o.conversationId===r.conversationId&&(q(p(e.task)),F()))});return{api:{async clearCache(){V(),e.connection.invalidateMediaAssetCacheWrites?.(),$();try{await(e.assetCache?.clear())}catch(t){throw V(),e.emitter.emit({type:"error",error:{scope:"storage",message:"媒体缓存清理失败",cause:t}}),y({code:"IM_SDK_MEDIA_CACHE_CLEAR_FAILED",category:"state",operation:"media.clearCache",retryable:!0})}V(),B()},getSnapshot:()=>(V(),z()),subscribe:e=>(V(),h.add(e),()=>h.delete(e)),async cancel(t,o){const r=fe(t,"media.cancel");if("queued"!==r.state&&"running"!==r.state&&("upload"!==r.direction||"paused"!==r.state))throw ge(r,"media.cancel");if("upload"===r.direction){if(!(void 0===o?e.connection.cancelMediaUpload(r.messageId):e.connection.cancelMediaUpload(r.messageId,o)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.cancel",retryable:!1,conversation:r.ref});return}const a=b.get(t);if(void 0===a)throw ge(r,"media.cancel");re(t,a)},async pause(t){const o=fe(t,"media.pause");if("upload"!==o.direction||"queued"!==o.state&&"running"!==o.state)throw ge(o,"media.pause");if(!await(e.connection.pauseMediaUpload?.(o.messageId)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.pause",retryable:!1,conversation:o.ref});V()},async resume(t){const o=fe(t,"media.resume");if("upload"!==o.direction||"paused"!==o.state)throw ge(o,"media.resume");if(!e.connection.resumeMediaUpload?.(o.messageId))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.resume",retryable:!1,conversation:o.ref})},async retry(t,o){const r=fe(t,"media.retry");if("failed"!==r.state&&"canceled"!==r.state)throw ge(r,"media.retry");if("upload"===r.direction){if(void 0!==o?.restartDownload)throw ge(r,"media.retry");if(("IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED"===r.error?.code||"IM_SDK_MEDIA_UPLOAD_CLEANUP_UNCONFIRMED"===r.error?.code)&&!0!==o?.restartUpload)throw y({code:"IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED",category:"state",operation:"media.retry",retryable:!0,conversation:r.ref});if(!(void 0===o?e.connection.retryMediaUpload(r.messageId):e.connection.retryMediaUpload(r.messageId,o)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.retry",retryable:!1,conversation:r.ref});return}if(void 0!==o?.restartUpload)throw ge(r,"media.retry");if(b.has(t)&&!b.get(t).controller.signal.aborted)throw y({code:"IM_SDK_MEDIA_TASK_IN_FLIGHT",category:"state",operation:"media.retry",retryable:!0,conversation:r.ref});const a=D.get(t);if(void 0===a)throw y({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:"media.retry",retryable:!1});!0===o?.restartDownload&&(L.delete(t),C.delete(t)),await ne(Q(a),!0)},async getUploadRecovery(t){V();const o=I(t);if(void 0!==t.itemIndex)return{available:!1,reason:"unsupported"};const r=t.messageId;if(void 0===e.recoveryPort)return{available:!1,reason:"unavailable"};const a=e.domainState.getConversationMessage(o,r);if(void 0===a)return{available:!1,reason:"not-found"};if(!f(a))return{available:!1,reason:"invalid-state"};try{const t=await e.recoveryPort.get(o,r);V();const a=e.domainState.getConversationMessage(o,r);return void 0===a?{available:!1,reason:"not-found"}:f(a)?void 0===t?{available:!1,reason:"not-found"}:{available:!0,expiresAt:t.savedAt+864e5}:{available:!1,reason:"invalid-state"}}catch(e){V();return{available:!1,reason:"object"==typeof e&&null!==e&&"reason"in e?String(e.reason):"storage"}}},async resumeUpload(t,o){V();const r=I(t);if(void 0!==t.itemIndex||void 0===e.connection.recoverMediaUpload)throw y({code:"IM_SDK_MEDIA_RECOVERY_UNAVAILABLE",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});try{const a=await e.connection.recoverMediaUpload(r,t.messageId,o.file);if(V(),!a.ok&&"paused"===a.reason)throw y({code:"IM_SDK_MEDIA_PAUSED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});if(!a.ok&&"cancelled"===a.reason)throw y({code:"IM_SDK_MEDIA_CANCELLED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});if(!a.ok)throw y({code:"IM_SDK_MEDIA_RECOVERY_UPLOAD_FAILED",category:"state",operation:"media.resumeUpload",retryable:!0,conversation:r})}catch(e){if(V(),"object"==typeof e&&null!==e&&"code"in e&&"string"==typeof e.code&&e.code.startsWith("IM_SDK_"))throw e;throw y({code:e instanceof Error&&"IM_MEDIA_RECOVERY_FILE_MISMATCH"===e.message?"IM_SDK_MEDIA_RECOVERY_FILE_MISMATCH":"IM_SDK_MEDIA_RECOVERY_FAILED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r})}},download:function(e,t){try{if(V(),t?.signal?.aborted)throw X(I(e));return ne(Q(e),!1,t)}catch(e){return Promise.reject(e)}},prioritizeDownload:function(e){V();const t=I(e);O=m("download",t,e.messageId,e.itemIndex)},probeCached:async function(t){V();const o=c,r=t.map(e=>Q(e,!1)),a=/* @__PURE__ */new Map,i=s(),d=r.map(e=>{const t=m("download",e.ref,e.messageId,e.itemIndex);return A.has(t)&&w.get(t)===e.resourceVersion&&i-(M.get(t)??0)<n});r.forEach((e,t)=>{if(d[t]||void 0===e.cacheKind||void 0===e.resourceVersion)return;const o={kind:e.cacheKind,messageId:e.messageId,resourceVersion:e.resourceVersion};a.set(JSON.stringify(o),o)});const l=[...a.values()];let u=l.map(()=>!1);if(l.length>0&&void 0!==e.assetCache){if(void 0===e.assetCache.hasMany)throw y({code:"IM_SDK_MEDIA_CACHE_PROBE_UNAVAILABLE",category:"contract",operation:"media.probeCached",retryable:!1});try{if(u=await e.assetCache.hasMany(l),u.length!==l.length||u.some(e=>"boolean"!=typeof e))throw new Error("媒体缓存查询结果数量或类型不符")}catch(t){throw V(),e.onAssetCacheEvent?.({operation:"get",outcome:"failed",kind:l[0].kind,messageId:l[0].messageId,cause:t}),y({code:"IM_SDK_MEDIA_CACHE_READ_FAILED",category:"state",operation:"media.probeCached",retryable:!0})}}if(V(),o!==c)throw y({code:"IM_SDK_MEDIA_CACHE_QUERY_STALE",category:"state",operation:"media.probeCached",retryable:!0});const p=new Map(l.map((e,t)=>[JSON.stringify(e),u[t]]));return Object.freeze(r.map((e,t)=>d[t]||!0===p.get(JSON.stringify({kind:e.cacheKind,messageId:e.messageId,resourceVersion:e.resourceVersion}))))},subscribeCacheChanges:e=>(V(),S.add(e),()=>S.delete(e)),getCached:async function(e){const t=Q(e,!1);return void 0===t.cacheKind?null:await ee(t,!0)},prepareLocalPreview:async function(t){if(V(),r(t.signal),void 0===e.preparePreview)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalPreview",retryable:!1});let o;try{o=await e.preparePreview({operationId:"media.prepareLocalPreview:"+ ++g,kind:t.kind,file:t.file,..."video"===t.kind&&t.includeDisplayPoster?{includeDisplayPoster:!0}:{},...void 0===t.signal?{}:{signal:t.signal}})}catch(o){if(!0===t.signal?.aborted||o instanceof Error&&"AbortError"===o.name)throw o;return e.onLocalPreviewError?.({kind:t.kind,byteLength:t.file.size,cause:o}),null}return V(),r(t.signal),!Number.isFinite(o.width)||!Number.isFinite(o.height)||o.width<=0||o.height<=0?(e.onLocalPreviewError?.({kind:t.kind,byteLength:t.file.size,cause:new Error(`预览端口返回了不可用的尺寸 ${o.width}×${o.height}`)}),null):"video"===t.kind?{width:o.width,height:o.height,...void 0===o.duration?{}:{duration:o.duration},...void 0===o.posterData?{}:{posterData:o.posterData},...t.includeDisplayPoster&&o.displayPosterData?.byteLength?{displayPoster:new Blob([o.displayPosterData],{type:a(o.displayPosterData)})}:{}}:{width:o.width,height:o.height}},prepareLocalVideoPoster:async function(e){return pe({...e,maxSize:960},"video")},prepareLocalImageThumbnail:async function(t){if(V(),r(t.signal),void 0===e.prepareImageThumbnail)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalImageThumbnail",retryable:!1});try{const o=new Uint8Array(await t.file.slice(0,3).arrayBuffer());if(r(t.signal),V(),255!==o[0]||216!==o[1]||255!==o[2])return t.file;const i="image/jpeg"===t.file.type?t.file:t.file.slice(0,t.file.size,"image/jpeg"),n=await e.prepareImageThumbnail({operationId:"media.prepareLocalImageThumbnail:"+ ++g,kind:"image",file:i,...void 0===t.signal?{}:{signal:t.signal}});if(r(t.signal),V(),!Number.isFinite(n.width)||!Number.isFinite(n.height)||n.width<=0||n.height<=0||!n.posterData?.byteLength)throw new Error("图片缩略图解码没有返回有效尺寸和图片字节");return new Blob([n.posterData],{type:a(n.posterData)})}catch(o){if(r(t.signal),o instanceof Error&&"AbortError"===o.name)throw o;return V(),e.onLocalPreviewError?.({kind:"image",byteLength:t.file.size,cause:o}),null}},prepareLocalImageDisplay:async function(e){return pe(e,"image")},getCachedImageDisplay:async function(e,t){return me(e,t,"image")},getCachedVideoPoster:async function(e,t={}){return me(e,{...t,maxSize:960},"video")}},clearCache:$,prune:W,dispose(){if(t){t=!1,c+=1,ve();for(const e of b.values())e.controller.abort();P.dispose(),O=void 0,b.clear(),h.clear(),S.clear(),w.clear(),E.clear(),D.clear(),A.clear(),M.clear(),L.clear(),C.clear(),N=0}}}}export{c as createDefaultMediaAssetCacheStrategyRegistry,_ as createMediaTasksRuntime,p as toProductMediaTaskUpdate};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const o=20;export{o as DEFAULT_HISTORY_PAGE_SIZE};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e,t){return{prepareLocalMediaPreview:async i=>{const a=await e.prepare({operationId:i.operationId,generation:t(),kind:i.kind,file:i.file,includePoster:"video"===i.kind,posterEncoding:"webp",..."video"===i.kind&&i.includeDisplayPoster?{includeDisplayPoster:!0}:{}},i.signal);return"video"===i.kind?{width:a.width,height:a.height,...void 0===a.duration?{}:{duration:a.duration},...void 0===a.posterData?{}:{posterData:new Uint8Array(a.posterData)},...void 0===a.displayPosterData?{}:{displayPosterData:new Uint8Array(a.displayPosterData)}}:{width:a.width,height:a.height}},prepareLocalVideoPoster:async i=>{const a=await e.prepare({operationId:i.operationId,generation:t(),kind:"video",file:i.file,includePoster:!0,maxSize:960,targetBytes:
|
|
1
|
+
function e(e,t){return{prepareLocalMediaPreview:async i=>{const a=await e.prepare({operationId:i.operationId,generation:t(),kind:i.kind,file:i.file,includePoster:"video"===i.kind,posterEncoding:"webp",..."video"===i.kind&&i.includeDisplayPoster?{includeDisplayPoster:!0}:{}},i.signal);return"video"===i.kind?{width:a.width,height:a.height,...void 0===a.duration?{}:{duration:a.duration},...void 0===a.posterData?{}:{posterData:new Uint8Array(a.posterData)},...void 0===a.displayPosterData?{}:{displayPosterData:new Uint8Array(a.displayPosterData)}}:{width:a.width,height:a.height}},prepareLocalVideoPoster:async i=>{const a=await e.prepare({operationId:i.operationId,generation:t(),kind:"video",file:i.file,includePoster:!0,posterEncoding:"webp",maxSize:960,targetBytes:131072,maxBytes:262144,quality:.85,minQuality:.82},i.signal);return{width:a.width,height:a.height,...void 0===a.posterData?{}:{posterData:new Uint8Array(a.posterData)}}},prepareLocalImageThumbnail:async i=>{const a=await e.prepare({operationId:i.operationId,generation:t(),kind:"image",file:i.file,includePoster:!0,maxSize:1440,targetBytes:524288,maxBytes:524288,quality:.9,minQuality:.9},i.signal);return{width:a.width,height:a.height,...void 0===a.posterData?{}:{posterData:new Uint8Array(a.posterData)}}},prepareLocalImageDisplay:async i=>{const a=i.maxSize;if(void 0===a||!Number.isInteger(a)||a<1||a>2048)throw new RangeError("图片显示图最长边必须是 1 到 2048 的整数");const r=await e.prepare({operationId:i.operationId,generation:t(),kind:"image",file:i.file,includePoster:!0,posterEncoding:"webp",preserveTransparency:!0,maxSize:a,targetBytes:262144,maxBytes:524288,quality:.85,minQuality:.82},i.signal);return{width:r.width,height:r.height,...void 0===r.posterData?{}:{posterData:new Uint8Array(r.posterData)}}}}}export{e as createLocalMediaPreviewPreparation};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveGroupHistoryPageBoundary as e}from"./group-history-page-boundary.js";import{
|
|
1
|
+
import{resolveGroupHistoryPageBoundary as e}from"./group-history-page-boundary.js";import{DEFAULT_HISTORY_PAGE_SIZE as r}from"./history-page-size.js";import{throwIfAborted as o}from"../../../im-core/src/abort.js";import{pullGroupHistory as t}from"../../../im-browser/src/http/requests/pull-offline-group.js";import{yieldToBrowser as s}from"../../../im-browser/src/scheduling/yield-to-browser.js";import{pullChannelLatestPage as n}from"../../../im-browser/src/http/requests/pull-offline-channel.js";function i(i){return async(p,a)=>{o(a);const c="group"===p.conversationType?i.groupAsyncDecrypt?.({conversationType:"group",conversationId:p.conversationId},a):void 0;c?.assertCurrent?.();const u=await i.authProvider.getLoginContext();if(o(a),null===u)throw new Error("最近历史请求缺少当前账号");i.assertLoginContext?.(u.userId),c?.assertCurrent?.();const y=[],d=[],l=e=>{d.push({...e,source:"history"})},m=e=>{y.push(e)};if("group"===p.conversationType){const n={...i.groupDecrypt(),onDecryptRecovery:l},g=Date.now(),h=await t({asyncDecrypt:c,http:i.http,userId:u.userId,clientType:i.clientType,groupId:p.conversationId,baseTime:g,direct:1,limit:r,decryptDeps:n,prepareKeys:e=>i.prepareGroupKeys(e,{signal:a,priority:i.keyPriority?.(p)??"foreground"}),onReaction:m,signal:a,keepRaw:!1,yieldToEventLoop:s});o(a),c?.assertCurrent?.();const v=e({conversationId:p.conversationId,direction:"older",baseTime:g,batchSize:h.batchSize,boundaryTime:h.oldestEntryTime,limit:r});return{messages:h.messages,reactions:y,recoveries:d,...v}}const g={...i.channelDecrypt(),onDecryptRecovery:l},h=await n({http:i.http,userId:u.userId,clientType:i.clientType,channelId:p.conversationId,count:r,decryptDeps:g,prepareKey:e=>i.prepareChannelKeys([e],{signal:a,priority:i.keyPriority?.(p)??"foreground"}),onReaction:m,signal:a,keepRaw:!1,yieldToEventLoop:s});return o(a),{messages:h.messages,reactions:y,recoveries:d,exhausted:!h.hasOlder,...void 0===h.nextCursor?{}:{nextCursor:h.nextCursor}}}}export{i as createRecentHistoryFetcher};
|