k2-im 0.2.4 → 0.2.6
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 +9 -9
- package/dist/chat-kit-vue.d.ts +1 -1
- package/dist/chat-kit.d.ts +23 -15
- package/dist/chat-kit.js +1 -1
- package/dist/i18n.d.ts +1 -1
- package/dist/index.d.ts +23 -15
- package/dist/index.js +1 -1
- package/dist/modules/im-browser/src/media/media-preview-adapter.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-upload-recovery-codec.js +1 -1
- package/dist/modules/im-browser/src/media/png-lossless-compression.js +1 -0
- package/dist/modules/im-browser/src/media/thumbnail-pixel-profile.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/mini-program-game-preview.js +1 -1
- package/dist/modules/im-core/src/media-thumbnail-policy.js +1 -0
- package/dist/modules/im-core/src/media-thumbnail.js +1 -0
- package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -1
- package/dist/modules/im-core/src/session-favorite-album.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/local-media-preview.js +1 -1
- package/dist/sdk.d.ts +18 -10
- package/dist/sdk.js +1 -1
- 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}from"../../../im-core/src/abort.js";import{isConversationUnreadMessage as m}from"../../../im-core/src/mapping/unread-divider.js";import{LocalMessageWindowReadError as v}from"../../../im-core/src/state/local-message-window-read-error.js";import{isValidLiveRoomBody as y}from"../../../im-core/src/mapping/live-room-body.js";import{isValidGiftBody as f}from"../../../im-core/src/mapping/gift-body.js";import{isValidTransferBody as u}from"../../../im-core/src/mapping/transfer-body.js";import{isValidMiniProgramBody as I}from"../../../im-core/src/mapping/mini-program-body.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as _,MEDIA_ALBUM_MAX_ITEMS as w}from"../../../im-core/src/mapping/media-album-body.js";import{isMessageVisibleInTimeline as p}from"../../../im-core/src/mapping/session-mapper.js";function E(t,o,r){return t instanceof e?n({code:t.code,category:t.category,retryable:t.retryable,operation:o,conversation:r,cause:t}):a(t,o,r)}const M=/* @__PURE__ */new WeakMap;function S(e,t){const o=M.get(t);if(void 0===o)throw new Error("ConversationHandle advanced 访问能力尚未注册");M.set(e,o)}const D={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}},T={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"not-own":{code:"IM_SDK_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}},h={"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}},A={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 b(e,t,o){const r=n({...t,operation:"messages.deleteForEveryone",conversation:e});return Object.assign(new Error(r.code,void 0),r)}function O(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 N(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 P=209715200,R=2147483648,C=31457280,L=4294967295;const K={"empty-input":{code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",retryable:!1},"too-many-targets":{code:"IM_SDK_FORWARD_TOO_MANY_TARGETS",category:"validation",retryable:!1},"unsupported-target-type":{code:"IM_SDK_FORWARD_TARGET_UNSUPPORTED",category:"unsupported",retryable:!1},"type-not-allowed":{code:"IM_SDK_FORWARD_CONTENT_UNSUPPORTED",category:"unsupported",retryable:!1},"media-not-ready":{code:"IM_SDK_FORWARD_MEDIA_NOT_READY",category:"state",retryable:!0},"album-item-not-found":{code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",retryable:!1},"conversation-blocked":{code:"IM_SDK_FORWARD_TARGET_BLOCKED",category:"permission",retryable:!1},"send-failed":{code:"IM_SDK_FORWARD_SEND_FAILED",category:"state",retryable:!1}};async function U(e,r,S,A,b={},U={}){g(U.signal);const k=Object.freeze({...e}),x=r.pageSize??30,G={historySource:"group"===k.conversationType||"channel"===k.conversationType?"remote":"local",retention:{maxMessages:6*x},...void 0===b.shouldEstablishRemoteLatestOnOpen?{}:{shouldEstablishRemoteLatest:(e,t)=>!0===b.shouldEstablishRemoteLatestOnOpen?.(t)}};let F=r.domainState.createMessageWindow({...G});const j=/* @__PURE__ */new WeakSet,z=/* @__PURE__ */new WeakSet,B=/* @__PURE__ */new Set,H=/* @__PURE__ */new Set,W=/* @__PURE__ */new Map;let Y,$,X=!1,Q=!1,q=!1,J=!0,Z=0,ee=Object.freeze({state:"none"});const te=!0===U.captureEntryUnread&&"robot"!==k.conversationType,oe=te?r.domainState.getSession(k):void 0,re=Math.max(0,!0===oe?.manuallyUnread?0:oe?.unreadCount??0),ne=te?r.domainState.getReadState(k):void 0,ae=r.getSelfId(),se=/* @__PURE__ */new Map,ie=/* @__PURE__ */new Set;let de,ce,le,ge,me,ve=ne?.readCursorSortKey,ye=te?Object.freeze(re>0?{state:"pending",count:re}:{state:"none"}):void 0,fe=0;function ue(e=new DOMException("历史导航已被新的操作取代","AbortError")){const t=le;le=void 0;const o=++fe;return t?.controller.abort(e),o}function Ie(){const e={version:ue(),controller:new AbortController};return le=e,e}function _e(e){le===e&&(le=void 0)}let we,pe,Ee=0,Me=!1;if(te)for(const e of r.domainState.getLoadedMessagesByConversation(k))se.set(e.id,m(e,ae)),ne?.readCursor===("channel"===k.conversationType?e.extensions?.historyCursor:e.id)&&(ve=e.sortKey);const Se=new AbortController,De=/* @__PURE__ */new WeakMap;let Te,he=/* @__PURE__ */new Map;function Ae(){if(Q)throw new Error("ConversationHandle 已关闭")}function be(){const e=F.window.info();return{messages:F.window.list(),context:r.domainState.getConversationContext(k),draft:r.domainState.getDraft(k),loading:W.size>0,stale:X,hasOlder:e.hasMore,hasNewer:e.hasNewer,error:$,entryUnread:ee,entryUnreadNavigation:ye}}function Oe(e){const t=De.get(e);if(void 0!==t)return t;const o=i(e),r=he.get(e.id),n=void 0!==r&&d(r,o)?r:o;return De.set(e,n),n}function Ne(e){const t=e.context,o=Object.freeze(e.messages.map(Oe));return he=new Map(o.map(e=>[e.id,e])),{ref:k,...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 Pe(){ze();const e=be();if(void 0!==Te&&(o=e,function(e,t){return e.length===t.length&&e.every((e,o)=>e===t[o])}((t=Te).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;Te=e;const n=Ne(e);for(const e of B)try{e(n)}catch(e){r.emitter.emit({type:"error",error:{scope:"unknown",message:"ConversationHandle 订阅者回调异常",cause:e}})}}async function Re(e){const t=F.window.list().find(t=>t.id===e)??r.domainState.getConversationMessage(k,e);if(void 0!==t)return{anchor:t,fallbackSeed:t};const o=await r.domainState.resolveConversationMessage(k,e,{throwOnStorageError:!0});return void 0===o?void 0:{anchor:o,fallbackSeed:o}}async function Ce(e,t,o,r=!1){o();const{anchor:n}=t;if(void 0!==t.remoteSeed)return Le(e,t.remoteSeed,o,r);const a=await e.openAt(k,{anchorSortKey:n.sortKey,limit:x});o();const s=e.list().find(e=>e.id===n.id);if(!0===e.info().remotePagination&&void 0!==s)return Le(e,s,o,r);if(e.list().some(e=>e.id===n.id))return a;if(void 0===t.fallbackSeed)throw N(k,n.id);if("local"===G.historySource){const o=e.info();return e.openAt(k,{anchorSortKey:n.sortKey,limit:x,seedMessages:[...a.messages,t.fallbackSeed],seedHasOlder:o.hasMore,seedHasNewer:o.hasNewer})}return Le(e,t.fallbackSeed,o,r)}async function Le(e,t,o,r){const n=await e.openAt(k,{anchorSortKey:t.sortKey,limit:x,seedMessages:[t],seedHasNewer:!0,seedRemotePagination:{}});return o(),r?(await Ke(e,t,o),{...n,messages:e.list()}):n}async function Ke(e,t,o){for(const r of["older","newer"])if(!e.list().some(e=>p(e)&&("older"===r?e.sortKey<t.sortKey:e.sortKey>t.sortKey)))for(let t=0;t<4;t+=1){o();const t=e.info();if(!("older"===r?t.hasMore:t.hasNewer))break;const n="older"===r?await e.loadOlder({limit:x}):await e.loadNewer({limit:x});if(o(),n.stale)throw new DOMException("消息定位窗口已失效","AbortError");if(n.messages.length>0)break}}function Ue(e,t,o){Ae();const n=F,a=o?.window??n.window,s=o?.isCurrent??(()=>!Q&&F===n),i=()=>{if(Ae(),!s())throw new DOMException("历史操作已被新的导航取代","AbortError")};if(void 0!==Y)return Promise.reject(new Error("清空本机会话历史期间拒绝启动新的历史加载"));const d=W.get(e);if(void 0!==d)return d;const c=r.beginReceiving?.();$=void 0;const l=Promise.resolve().then(()=>(i(),t())).then(e=>(i(),void 0===b.reconcilePage?e:b.reconcilePage(e,a))).then(e=>{i(),X=!0===e.stale}),g=(void 0===o?.cancelled?l:Promise.race([l,o.cancelled])).catch(t=>{const o=t instanceof v?t.cause:t;throw s()&&($=E(o,`history.${e}`,k)),J?t:o}).finally(()=>{c?.(),W.delete(e),Q||Pe()});return W.set(e,g),Pe(),g}function ke(){F.window.applyIncoming(r.domainState.getMessagesByConversation(k).slice(-x))}function xe(e){return!0===b.shouldEstablishRemoteLatestOnOpen?.(e.list())||!0===e.info().remotePagination&&(re>0||"first-unread"===U.initialPosition&&(r.domainState.getSession(k)?.unreadCount??0)>0)}async function Ge(){Me=!1,q?q=!1:await Ue("latest",()=>F.window.open(k,{limit:x})),ke(),xe(F.window)&&(await Ue("latest:remote",()=>F.window.loadOlder({limit:x,establishLatestOnly:!0})),ke()),Me=!X,je(F.window.list())}function Fe(){if(Ae(),me?.version===fe)return me.promise;const e=Ie(),{version:t}=e,o=async function({version:e,controller:t}){const o=F,n=r.domainState.createMessageWindow(G),a=()=>!Q&&!t.signal.aborted&&fe===e&&F===o,s=()=>{if(!a())throw new DOMException("回最新已被新的导航取代","AbortError")};let i,d=!1;const c=new Promise((e,t)=>{i=t}),l=()=>{d||n.dispose(),i(t.signal.reason)};t.signal.addEventListener("abort",l,{once:!0});const g={window:n.window,isCurrent:a,cancelled:c},m=(e,t)=>Ue(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(k,{limit:x})),s(),n.window.applyIncoming(r.domainState.getMessagesByConversation(k).slice(-x)),xe(n.window)&&(await m(`latest:remote:${e}`,()=>n.window.loadOlder({limit:x,establishLatestOnly:!0})),s(),n.window.applyIncoming(r.domainState.getMessagesByConversation(k).slice(-x))),F=n,d=!0,o.dispose(),Me=!0,X=!1,je(n.window.list()),Pe()})();try{await Promise.race([v,c])}finally{t.signal.removeEventListener("abort",l),d||n.dispose()}}(e).finally(()=>{_e(e),me?.version===t&&(me=void 0)});return me={version:t,promise:o},o}function je(e){const t=b.resolveReadMessageId?.(e);we=void 0===b.resolveReadMessageId?e.at(-1):e.find(e=>e.id===t)}function Ve(e){return!(ie.has(e.id)||void 0===de||e.sortKey>de||void 0!==ve&&e.sortKey<=ve)&&(se.get(e.id)??m(e,ae))}function ze(){if(!te||re<=0||void 0!==ce||void 0===de||"none"===ye?.state)return;const e=F.window.list();if(!e.some(e=>e.sortKey===de))return;const t=e.filter(e=>Ve(e)&&p(e)&&void 0===e.recalled&&void 0===e.deletedForEveryone);if(t.length<re)return;const o=t.slice(-re);if(o.every(e=>"system"===e.contentType))return void(ye=Object.freeze({state:"none"}));const r=o[0];ce=r.id,ee=Object.freeze({state:"located",firstMessageId:r.id,count:re}),ye=Object.freeze({state:"located",firstMessageId:r.id,count:re})}const Be=r.emitter.subscribe(e=>{if(!Q&&"conversation"in e&&void 0!==e.conversation&&e.conversation.conversationType===k.conversationType&&e.conversation.conversationId===k.conversationId){if("conversation-history:cleared"!==e.type&&"session:removed"!==e.type||(Se.abort(),ue(),ee=Object.freeze({state:"none"}),te&&(ye=Object.freeze({state:"none"})),Ee+=1,pe?.dispose(),pe=void 0,Me=!1,we=void 0),"message:received"===e.type&&"live"===e.source&&(te&&ie.add(e.message.id),Me&&(void 0===we||e.message.sortKey>we.sortKey)&&(void 0===b.resolveReadMessageId||b.resolveReadMessageId([e.message])===e.message.id)&&(we=e.message)),"draft:updated"===e.type||"draft:cleared"===e.type){const t="draft:updated"===e.type?e.draft:null;for(const e of H)try{e(t)}catch(e){r.emitter.emit({type:"error",error:{scope:"unknown",message:"ConversationHandle 草稿订阅者回调异常",cause:e}})}}Pe()}});function He(){return"first-unread"===U.initialPosition?async function(){const e=r.domainState.getSession(k),o=Math.max(0,!0===e?.manuallyUnread?0:e?.unreadCount??0),n=r.domainState.getReadState(k),a=n?.readCursor,s=void 0===a||""===a?void 0:"channel"===k.conversationType?r.domainState.getLoadedMessagesByConversation(k).find(e=>e.extensions?.historyCursor===a):r.domainState.getConversationMessage(k,a),i=s?.sortKey??n?.readCursorSortKey;if(ee=await t({conversation:k,pageSize:x,unreadCount:o,...void 0===i?{}:{readCursorSortKey:i},signal:Se.signal,..."channel"!==k.conversationType||void 0===a||""===a||void 0===r.loadEntryUnreadPage?{}:{loadReadCursorPage:async e=>{const t=F.window.getRevision(),o=()=>!Q&&!Se.signal.aborted&&F.window.getRevision()===t,n=await r.loadEntryUnreadPage({readCursor:a,...void 0===e?{}:{cursor:e},signal:Se.signal,isCurrent:o});if(g(Se.signal),!o())throw new DOMException("首未读定位已被新的窗口操作作废","AbortError");return n}},selfId:r.getSelfId(),list:()=>F.window.list(),hasOlder:()=>F.window.info().hasMore,hasNewer:()=>F.window.info().hasNewer,openLatest:Ge,openAt:(e,t)=>{if(void 0===t&&"channel"===k.conversationType&&void 0!==a&&""!==a&&void 0!==r.loadEntryUnreadPage)return Promise.resolve();q=!1;const o=t?.messages.map(e=>r.domainState.getConversationMessage(k,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 Ue(`entry-unread:${e}`,()=>F.window.openAt(k,{anchorSortKey:s,limit:x,...void 0===t?{}:{seedMessages:o,seedHasNewer:t.hasNewer,seedRemotePagination:void 0===t.nextCursor?{}:{newerCursor:t.nextCursor}}}))},loadOlder:()=>Ue("entry-unread:older",()=>F.window.loadOlder({limit:x})),loadNewer:()=>Ue("entry-unread:newer",()=>F.window.loadNewer({limit:x}))}),"located"===ee.state&&!0===F.window.info().remotePagination){const e=ee.firstMessageId,t=F.window.list().find(t=>t.id===e);void 0!==t&&await Ue("entry-unread:context",async()=>(await Ke(F.window,t,()=>{g(Se.signal),Ae()}),{conversationId:k.conversationId,messages:F.window.list(),stale:!1}));const o=F.window.list().find(t=>t.id===e);void 0!==o&&p(o)&&void 0===o.recalled&&void 0===o.deletedForEveryone||(ee=Object.freeze({state:"unavailable"}))}}():Ge()}const We=()=>{Se.abort(U.signal?.reason),F.dispose()};U.signal?.addEventListener("abort",We,{once:!0});try{if(g(U.signal),"local-first"===U.initialLoad){await Ue("initial:local",()=>F.window.open(k,{limit:x})),g(U.signal),ke(),q=!0;try{await He()}catch(e){if(g(U.signal),e instanceof v)throw e;$=E(e,"history.initial",k),"first-unread"===U.initialPosition&&(ee=Object.freeze({state:"unavailable"}))}finally{q=!1}}else await He();g(U.signal)}catch(e){throw Q=!0,Se.abort(),Be(),B.clear(),F.dispose(),e instanceof v?e.cause:e}finally{U.signal?.removeEventListener("abort",We)}function Ye(e,t){const o=r.domainState.getConversationMessage(k,e);return void 0!==o&&o.conversationType===k.conversationType&&o.conversationId===k.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:k})}}async function $e(e,t,o){const r=await(b.getSendPermissionError?.(e));if(Ae(),void 0!==r){if(void 0===o||"customerService"===k.conversationType)return{ok:!1,error:r};const e=await o(r);return Ae(),e}try{const e=await t();return Ae(),e}catch(t){if(Q)throw t;return{ok:!1,error:a(t,e,k)}}}async function Xe(e,t={}){const o="name"in e?e.name:void 0,r=t.fileName??("string"==typeof o&&""!==o?o:void 0);return{...k,data:e,...""===e.type?{}:{mimeType:e.type},...void 0===r?{}:{filename:r},..."robot"===k.conversationType?{encrypted:!1}:{},...void 0===t.localPreviewUrl?{}:{localPreviewUrl:t.localPreviewUrl},...void 0===t.localPreviewMetadata?{}:{localPreviewMetadata:t.localPreviewMetadata},...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}}}function Qe(e){return void 0===e||Number.isFinite(e.width)&&e.width>0&&Number.isFinite(e.height)&&e.height>0}function qe(e){return Qe(e)&&(void 0===e?.duration||Number.isFinite(e.duration)&&e.duration>0)&&(void 0===e?.posterData||e.posterData instanceof Uint8Array&&e.posterData.length>0&&e.posterData.length<=16384)}function Je(e){return void 0!==e&&"duration"in e&&void 0!==e.duration&&Number.isFinite(e.duration)&&e.duration>0}function Ze(e,t,o){return{ok:!1,error:n({code:e,category:t,operation:o,retryable:!1,conversation:k})}}function et(e,t){if(null===e||"object"!=typeof e||e.kind!==t)return!1;if(!Number.isSafeInteger(e.width)||e.width<=0||e.width>L||!Number.isSafeInteger(e.height)||e.height<=0||e.height>L)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 tt(e){if("customerService"===k.conversationType)throw ot(n({code:"IM_SDK_CUSTOMER_SERVICE_READ_ONLY",category:"permission",operation:e,retryable:!1,conversation:k}))}function ot(e){return Object.assign(new Error(e.code),e,{name:"ImMessageActionError"})}function rt(e,t,o){if("direct"===e||"group"===e||"channel"===e||"robot"===e)return Object.freeze({conversationType:e,conversationId:t});throw ot(n({code:"IM_SDK_FORWARD_RESULT_INVALID",category:"contract",operation:o,retryable:!1,conversation:k,details:{targetConversationType:e,targetConversationId:t}}))}async function nt(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 ot(a(t,e,k))}return Ae(),Object.freeze({sent:Object.freeze(s.results.flatMap(t=>t.ok?[{conversation:rt(t.targetConversationType,t.targetConversationId,e),messageId:t.newMessageId}]:[])),failed:Object.freeze(s.results.flatMap(t=>t.ok?[]:[{sourceMessageId:t.sourceMessageId,conversation:Object.freeze({conversationType:t.targetConversationType,conversationId:t.targetConversationId}),error:n({...K[t.reason],operation:e,conversation:{conversationType:t.targetConversationType,conversationId:t.targetConversationId}})}])),skippedSourceMessageIds:Object.freeze([...s.skippedSourceIds])})}function at(e,t){const o=r.domainState.getConversationMessage(k,e);if(void 0===o){const o=r.domainState.getMessagesById(e)[0];throw ot(n({code:void 0===o?"IM_SDK_MESSAGE_NOT_FOUND":"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:k}))}if(o.conversationType!==k.conversationType||o.conversationId!==k.conversationId)throw ot(n({code:"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:k}));return o}function st(e,t){return ot(n({...t,operation:e,conversation:k}))}function it(e,t){const o=n({code:e,category:"state",operation:"messages.deleteLocal",retryable:!1,conversation:k,...void 0===t?{}:{cause:t}});return Object.assign(new Error(e),o,{name:"ImLocalMessageDeletionError"})}function dt(e,t){const o=n({code:e,category:"state",operation:"history.clearLocal",retryable:!1,conversation:k,...void 0===t?{}:{cause:t}});return Object.assign(new Error(e),o,{name:"ImLocalConversationHistoryClearError"})}async function ct(e,t){if(void 0!==e)try{await r.domainState.clearDraftIfUnchanged(k,e)}catch(e){r.emitter.emit({type:"error",error:{scope:"storage",message:`消息已被本地发送流程接受,但清理草稿失败(${t})`,cause:e}})}}async function lt(e,t,n,a,s){return $e(e,async()=>{if("image"===t){const t=await o(n);if(Ae(),!t)return Ze("IM_SDK_IMAGE_FORMAT_UNSUPPORTED","unsupported",e)}const i=await Xe(n,a);if(Ae(),void 0!==t&&void 0===i.localPreviewMetadata&&void 0!==r.prepareMediaPreview){const o=new AbortController,a=await r.prepareMediaPreview({operationId:`${k.conversationType}:${k.conversationId}:${e}:${++Z}`,kind:t,file:n,signal:o.signal});if(Ae(),void 0===a||("image"===t?!Qe(a):!qe(a)))return Ze("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)&&!Je(i.localPreviewMetadata))return Ze("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",e);const d=b.recheckSendPermissionError?.(e);if(void 0!==d)return{ok:!1,error:d};const l=await s({...i,...void 0===a.filesAlbum?{}:{filesAlbum:a.filesAlbum},...void 0===a.caption||""===a.caption?{}:{caption:a.caption}});return l.ok?(Ae(),Ye(l.messageId,e)):{ok:!1,error:c(l.reason,e,k)}})}function gt(e,t,o){const a=at(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 ot(n({code:"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:o,retryable:!1,conversation:k}));return a}async function mt(e,t,o,n,a,s){return gt(t,o,e),$e(e,async()=>{const i=await Xe(n,a);if("video"===o&&void 0===i.localPreviewMetadata&&void 0!==r.prepareMediaPreview){const t=new AbortController,o=await r.prepareMediaPreview({operationId:`${k.conversationType}:${k.conversationId}:${e}:${++Z}`,kind:"video",file:n,signal:t.signal});if(Ae(),void 0===o||!qe(o))return Ze("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",e);i.localPreviewMetadata=o}if("video"===o&&(void 0!==r.prepareMediaPreview||void 0!==i.localPreviewMetadata)&&!Je(i.localPreviewMetadata))return Ze("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",e);const d=b.recheckSendPermissionError?.(e);if(void 0!==d)return{ok:!1,error:d};gt(t,o,e);const l=await s(t,{...i,...void 0===a.caption||""===a.caption?{}:{caption:a.caption}});return l.ok?(Ae(),Ye(l.messageId,e)):{ok:!1,error:c(l.reason,e,k)}})}J=!1,function(){if(!te||re<=0)return;if(!0===F.window.info().remotePagination&&!Me&&"located"!==ee.state)return;z.add(F.window);const e=F.window.list().filter(e=>!ie.has(e.id));de=e.at(-1)?.sortKey;for(const t of e)se.has(t.id)||se.set(t.id,m(t,ae));if("first-unread"===U.initialPosition&&"located"===ee.state)return ce=ee.firstMessageId,void(ye=Object.freeze({state:"located",count:re,firstMessageId:ee.firstMessageId}));ze()}();const vt={ref:k,getSnapshot:function(){return Ae(),Ne(be())},subscribe:e=>(Ae(),B.add(e),()=>B.delete(e)),resolveMessage:async e=>{Ae();const t=F.window.list().find(t=>t.id===e)??await r.domainState.resolveConversationMessage(k,e);return void 0===t?null:Oe(t)},history:{loadEntryUnread:e=>function(e={}){if(Ae(),e.signal?.aborted)return Promise.reject(e.signal.reason);if(void 0!==ge){if(!ge.controller.signal.aborted&&ge.version===fe&&ge.callerSignal===e.signal)return ge.promise;ge.controller.abort()}if(void 0===ye||"none"===ye.state)return Promise.resolve(!1);const o=Ie(),{version:n,controller:a}=o,s=F.window.list(),i=s.find(e=>e.id===ce),d=F.window.info();if(void 0===Y&&0===W.size&&!X&&!Se.signal.aborted&&z.has(F.window)&&void 0!==i&&p(i)&&void 0===i.recalled&&void 0===i.deletedForEveryone&&(!d.hasMore||s.some(e=>p(e)&&e.sortKey<i.sortKey))&&(!d.hasNewer||s.some(e=>p(e)&&e.sortKey>i.sortKey)))return ee=Object.freeze({state:"located",firstMessageId:i.id,count:re}),ye=Object.freeze({state:"located",firstMessageId:i.id,count:re}),Pe(),_e(o),Promise.resolve(!0);const c=r.domainState.createMessageWindow(G),l=()=>!Q&&!a.signal.aborted&&fe===n,g=()=>{if(!l())throw new DOMException("进入未读定位已被新的导航取代","AbortError")},m=async e=>{g();let t=await e();if(g(),void 0!==b.reconcilePage&&(t=await b.reconcilePage(t,c.window)),g(),t.stale)throw new DOMException("进入未读窗口已失效","AbortError");c.window.applyIncoming(c.window.list().map(e=>r.domainState.getConversationMessage(k,e.id)??e))};let y,f=!1;const u=new Promise((e,t)=>{y=t}),I=()=>{f||c.dispose(),y(a.signal.reason)},_=()=>a.abort(e.signal?.reason),w=()=>a.abort(Se.signal.reason);a.signal.addEventListener("abort",I,{once:!0}),e.signal?.addEventListener("abort",_,{once:!0}),Se.signal.addEventListener("abort",w,{once:!0}),Se.signal.aborted&&w();const M=r.beginReceiving?.(),S=(async()=>{try{let e=!1;void 0===de&&(await m(()=>c.window.open(k,{limit:x})),xe(c.window)&&await m(()=>c.window.loadOlder({limit:x,establishLatestOnly:!0})),de=c.window.list().filter(e=>!ie.has(e.id)).at(-1)?.sortKey,e=!0);const o=ce,n=void 0===o?void 0:await Re(o);if(g(),void 0!==o&&void 0===n)return ye=Object.freeze({state:"unavailable",count:re}),!1;const s=void 0===n?await t({conversation:k,pageSize:x,maxExtraPages:Number.POSITIVE_INFINITY,preserveLocatedWindow:!0===c.window.info().remotePagination,...void 0===de?{}:{entryUpperSortKey:de},unreadCount:re,...void 0===ve?{}:{readCursorSortKey:ve},signal:a.signal,selfId:ae,isEntryUnread:Ve,..."channel"===k.conversationType&&ne?.readCursor&&void 0!==r.loadEntryUnreadPage?{loadReadCursorPage:async e=>{const t=await r.loadEntryUnreadPage({readCursor:ne.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(k,{limit:x})),xe(c.window)&&await m(()=>c.window.loadOlder({limit:x,establishLatestOnly:!0})))},openAt:(t,o)=>(e=!1,m(()=>c.window.openAt(k,{anchorSortKey:t,limit:x,...void 0===o?{}:{seedMessages:o.messages.map(e=>r.domainState.getConversationMessage(k,e.id)??e),seedHasNewer:o.hasNewer,seedRemotePagination:void 0===o.nextCursor?{}:{newerCursor:o.nextCursor}}}))),loadOlder:()=>m(()=>c.window.loadOlder({limit:x})),loadNewer:()=>m(()=>c.window.loadNewer({limit:x}))}):await(async()=>(await m(()=>Ce(c.window,n,g)),{state:"located",firstMessageId:n.anchor.id,count:re}))();if(g(),"located"!==s.state)return ye=Object.freeze("none"===s.state?{state:"none"}:{state:"unavailable",count:re}),!1;const i=c.window.list().find(e=>e.id===s.firstMessageId);if(void 0===i||!p(i)||void 0!==i.recalled||void 0!==i.deletedForEveryone)return ye=Object.freeze({state:"unavailable",count:re}),!1;!0===c.window.info().remotePagination&&await m(async()=>(await Ke(c.window,i,g),{conversationId:k.conversationId,messages:c.window.list(),stale:!1})),g();const d=c.window.list().find(e=>e.id===s.firstMessageId);if(void 0===d||!p(d)||void 0!==d.recalled||void 0!==d.deletedForEveryone)return ye=Object.freeze({state:"unavailable",count:re}),!1;const v=F;return F=c,f=!0,v.dispose(),z.add(c.window),ce=s.firstMessageId,ee=s,ye=Object.freeze({state:"located",count:re,firstMessageId:s.firstMessageId}),$=void 0,!0}catch(e){const t=e instanceof v?e.cause:e;if(l()){const e=E(t,"history.loadEntryUnread",k);ye=Object.freeze({state:"failed",count:re,error:e})}throw t}})(),D=Promise.race([S,u]).finally(()=>{a.signal.removeEventListener("abort",I),_e(o),e.signal?.removeEventListener("abort",_),Se.signal.removeEventListener("abort",w),f||c.dispose(),M?.(),ge?.controller===a&&(ge=void 0),Q||Pe()});return ge={version:n,callerSignal:e.signal,controller:a,promise:D},D}(e),loadLatest:async()=>Fe(),loadOlder:async()=>(Ae(),ue(),Ue("older",()=>F.window.loadOlder({limit:x}))),loadNewer:async()=>{Ae(),ue(),await Ue("newer",()=>F.window.loadNewer({limit:x})),Ae(),F.window.info().hasNewer||(ke(),Pe())},loadAround:async(e,t={})=>{if(Ae(),!0===t.signal?.aborted)throw new DOMException("消息定位已取消","AbortError");const o=Ie(),{version:a,controller:s}=o;if(void 0===Y&&"channel"===k.conversationType&&j.has(F.window)&&r.domainState.getPinnedMessage(k)?.messageId===e&&F.window.list().some(t=>t.id===e&&V(t)))return void _e(o);const i=F,d=()=>!Q&&!s.signal.aborted&&fe===a&&F===i,c=()=>{if(Ae(),!d())throw new DOMException("消息定位已被新的导航取代","AbortError")};let l,g,m=!1;const v=new Promise((e,t)=>{g=t}),y=()=>{m||l?.dispose(),g(s.signal.reason)},f=()=>s.abort(t.signal?.reason);s.signal.addEventListener("abort",y,{once:!0}),t.signal?.addEventListener("abort",f,{once:!0});const u=(async()=>{const t=await async function(e,t){if(t(),void 0!==Y)throw new Error("清空本机会话历史期间拒绝启动新的历史加载");const o=await Re(e);t();const n=o?.fallbackSeed;if(void 0!==o&&("channel"!==k.conversationType||void 0!==n&&V(n)))return"channel"===k.conversationType&&!0===F.window.info().remotePagination?{...o,remoteSeed:n}:o;if(void 0===r.fetchMessagesByIdBatch)throw N(k,e);if(void 0!==Y)throw new Error("清空本机会话历史期间拒绝启动新的历史加载");const a=await r.fetchMessagesByIdBatch([e]);t();const s=a.messages.find(t=>t.id===e&&t.conversationType===k.conversationType&&t.conversationId===k.conversationId);if(void 0!==s){if("channel"===k.conversationType){if(!V(s))throw N(k,e);return{anchor:s,remoteSeed:s}}return{anchor:s,fallbackSeed:s}}if(!a.missingMessageIds.includes(e))throw N(k,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)}(k,e);if(t.anchor.conversationType!==k.conversationType||t.anchor.conversationId!==k.conversationId)throw N(k,e);l=r.domainState.createMessageWindow(G);const o=l.window;await Ue(`around:${e}:${a}`,async()=>(c(),Ce(o,t,c,!0)),{window:o,isCurrent:d,cancelled:v}),c(),F=l,void 0!==t.remoteSeed&&j.add(o),m=!0,i.dispose(),Pe()})();try{await Promise.race([u,v])}finally{t.signal?.removeEventListener("abort",f),s.signal.removeEventListener("abort",y),_e(o),m||l?.dispose()}},clearLocal:async()=>(Ae(),tt("history.clearLocal"),function(){if(Q)return Promise.reject(new Error("ConversationHandle 已关闭"));if(void 0!==Y)return Y;const e=new DOMException("本次清历史已取消旧窗口导航","AbortError");ue(e),r.invalidateHistory?.(k,e);const t=[...W.values()],o=Promise.all(t.map(t=>t.catch(t=>{if(t!==e)throw t}))).then(async()=>{Ae();const e=[...r.domainState.getMessagesByConversation(k),...F.window.list()];if(r.hasOutboxForConversation(k)||e.some(e=>r.isOutboxOwned(e.id)))throw dt("IM_SDK_LOCAL_HISTORY_CLEAR_OUTBOX_OWNED");if(e.some(e=>"pending"===e.status||"uploading"===e.status||"sending"===e.status))throw dt("IM_SDK_LOCAL_HISTORY_CLEAR_MESSAGE_IN_FLIGHT");return await r.domainState.clearLocalConversationHistory(k),Ae(),Object.freeze({scope:"local-only",remoteHistory:"remote-history-may-restore"})}).catch(e=>{if(e instanceof Error&&"ImLocalConversationHistoryClearError"===e.name)throw e;throw dt("IM_SDK_LOCAL_HISTORY_CLEAR_FAILED",e)}).finally(()=>{Y===o&&(Y=void 0)});return Y=o,o}())},messages:{sendText:async(e,t={})=>{Ae();const o=S(k,e,t);if("code"in o)return{ok:!1,error:o};const n=r.domainState.getDraft(k)?.updatedAt;return $e("messages.sendText",async()=>{const e=await r.sendText(o);return Ae(),await ct(n,"messages.sendText"),Ye(e.id,"messages.sendText")},async e=>{const t=b.appendTextPermissionFailure?.(o);return void 0===t?{ok:!1,error:e}:(await ct(n,"messages.sendText"),{ok:!0,message:s(t)})})},sendContact:async(e,t={})=>{Ae();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:k})};const s={...k,contact:{...e,targetId:o,displayName:a},encrypted:"direct"!==k.conversationType&&"robot"!==k.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}};return $e("messages.sendContact",async()=>Ye((await r.sendContact(s)).id,"messages.sendContact"))},sendImage:async(e,t={})=>(Ae(),e.size>C?Ze("IM_SDK_IMAGE_TOO_LARGE","validation","messages.sendImage"):void 0!==t.caption&&""!==t.caption?Ze("IM_SDK_IMAGE_CAPTION_UNSUPPORTED","unsupported","messages.sendImage"):Qe(t.localPreviewMetadata)?lt("messages.sendImage","image",e,t,r.sendImage):Ze("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation","messages.sendImage")),sendMediaAlbum:async(e,t={})=>(Ae(),async function(e,t){const n="messages.sendMediaAlbum";if(0===e.length)return Ze("IM_SDK_MEDIA_ALBUM_EMPTY","validation",n);if(e.length>w)return Ze("IM_SDK_MEDIA_ALBUM_TOO_MANY","validation",n);if(void 0!==t.caption&&Array.from(t.caption).length>_)return Ze("IM_SDK_MEDIA_ALBUM_CAPTION_TOO_LONG","validation",n);for(const t of e){if("image/gif"===t.file.type)return Ze("IM_SDK_MEDIA_ALBUM_GIF_UNSUPPORTED","unsupported",n);if("image"===t.kind){if(t.file.size>C)return Ze("IM_SDK_IMAGE_TOO_LARGE","validation",n);if(!Qe(t.localPreviewMetadata))return Ze("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation",n)}else{if(t.file.size>P)return Ze("IM_SDK_VIDEO_TOO_LARGE","validation",n);if(!qe(t.localPreviewMetadata))return Ze("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",n)}}return $e(n,async()=>{for(const t of e){if("image"!==t.kind)continue;const e=await o(t.file);if(Ae(),!e)return Ze("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:`${k.conversationType}:${k.conversationId}:${n}:${++Z}`,kind:e.kind,file:e.file,signal:t.signal})}));Ae();const s=[];for(const[t,o]of e.entries()){const e=a[t];if("image"===o.kind&&!Qe(e))return Ze("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation",n);if("video"===o.kind){if(!qe(e))return Ze("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",n);if(void 0!==r.prepareMediaPreview&&!Je(e))return Ze("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",n)}const i="name"in o.file?o.file.name:void 0;s.push({kind:o.kind,data:o.file,...""===o.file.type?{}:{mimeType:o.file.type},..."string"==typeof i&&""!==i?{filename:i}:{},...void 0===o.localPreviewUrl?{}:{localPreviewUrl:o.localPreviewUrl},...void 0===e?{}:{localPreviewMetadata:e}})}const i=b.recheckSendPermissionError?.(n);if(void 0!==i)return{ok:!1,error:i};const d=await r.sendMediaAlbum({...k,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?(Ae(),Ye(d.messageId,n)):{ok:!1,error:c(d.reason,n,k)}})}(e,t)),sendVideo:async(e,t={})=>(Ae(),e.size>P?Ze("IM_SDK_VIDEO_TOO_LARGE","validation","messages.sendVideo"):qe(t.localPreviewMetadata)?lt("messages.sendVideo","video",e,t,r.sendVideo):Ze("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation","messages.sendVideo")),replaceInterruptedVideo:async(e,t,o={})=>(Ae(),t.size>P?Ze("IM_SDK_VIDEO_TOO_LARGE","validation","messages.replaceInterruptedVideo"):qe(o.localPreviewMetadata)?mt("messages.replaceInterruptedVideo",e,"video",t,o,r.replaceVideo):Ze("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation","messages.replaceInterruptedVideo")),sendVoice:async(e,t)=>(Ae(),$e("messages.sendVoice",async()=>{const o=await Xe(e,t),n=b.recheckSendPermissionError?.("messages.sendVoice");if(void 0!==n)return{ok:!1,error:n};const a=await r.sendVoice({...o,durationMs:t.durationMs,...void 0===t.waveform?{}:{waveform:[...t.waveform]}});return a.ok?(Ae(),Ye(a.messageId,"messages.sendVoice")):{ok:!1,error:c(a.reason,"messages.sendVoice",k)}})),sendFile:async(e,t={})=>{if(Ae(),e.size>R)return Ze("IM_SDK_FILE_TOO_LARGE","validation","messages.sendFile");if(void 0!==t.caption&&Array.from(t.caption).length>_)return Ze("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()?Ze("IM_SDK_FILE_NAME_REQUIRED","validation","messages.sendFile"):lt("messages.sendFile",void 0,e,t,r.sendFile)},sendGif:async(e,t={})=>(Ae(),e.size>3145728?Ze("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)?lt("messages.sendGif",void 0,e,t,e=>r.sendGif(e)):Ze("IM_SDK_GIF_INVALID","validation","messages.sendGif")),sendSticker:async(e,t={})=>(Ae(),et(e,"sticker")?$e("messages.sendSticker",async()=>Ye((await r.sendExpression({...k,asset:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendSticker")):Ze("IM_SDK_EXPRESSION_ASSET_INVALID","validation","messages.sendSticker")),sendGifAsset:async(e,t={})=>(Ae(),et(e,"gif")?$e("messages.sendGifAsset",async()=>Ye((await r.sendExpression({...k,asset:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGifAsset")):Ze("IM_SDK_EXPRESSION_ASSET_INVALID","validation","messages.sendGifAsset")),sendGame:async(e,t={})=>(Ae(),"rock-paper-scissors"!==e&&"dice"!==e?Ze("IM_SDK_GAME_TYPE_INVALID","validation","messages.sendGame"):$e("messages.sendGame",async()=>Ye((await r.sendGame({...k,gameType:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGame"))),sendMiniProgram:async(e,t={})=>(Ae(),I(e)?$e("messages.sendMiniProgram",async()=>Ye((await r.sendMiniProgram({...k,miniProgram:e,encrypted:"direct"!==k.conversationType&&"robot"!==k.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendMiniProgram")):Ze("IM_SDK_MINI_PROGRAM_BODY_INVALID","validation","messages.sendMiniProgram")),sendTransfer:async(e,t={})=>(Ae(),"channel"===k.conversationType||"robot"===k.conversationType?Ze("IM_SDK_TRANSFER_CHANNEL_UNSUPPORTED","unsupported","messages.sendTransfer"):u(e)?$e("messages.sendTransfer",async()=>Ye((await r.sendTransfer({...k,transfer:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendTransfer")):Ze("IM_SDK_TRANSFER_BODY_INVALID","validation","messages.sendTransfer")),sendGift:async(e,t={})=>(Ae(),"channel"===k.conversationType||"robot"===k.conversationType?Ze("IM_SDK_GIFT_CHANNEL_UNSUPPORTED","unsupported","messages.sendGift"):f(e)?$e("messages.sendGift",async()=>Ye((await r.sendGift({...k,gift:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGift")):Ze("IM_SDK_GIFT_BODY_INVALID","validation","messages.sendGift")),sendLiveRoom:async(e,t={})=>(Ae(),y(e)?$e("messages.sendLiveRoom",async()=>Ye((await r.sendLiveRoom({...k,liveRoom:e,encrypted:"direct"!==k.conversationType&&"robot"!==k.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendLiveRoom")):Ze("IM_SDK_LIVE_ROOM_BODY_INVALID","validation","messages.sendLiveRoom")),toggleReaction:async(e,t)=>{Ae(),tt("messages.toggleReaction"),at(e,"messages.toggleReaction");const o=await r.setReaction({conversation:k,parentMessageId:e,emoji:t,action:"toggle"});if(Ae(),!o.ok)throw st("messages.toggleReaction",h[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)=>{Ae(),tt("messages.setReaction"),at(e,"messages.setReaction");const n=await r.setReaction({conversation:k,parentMessageId:e,emoji:t,action:o});if(Ae(),!n.ok)throw st("messages.setReaction",h[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(Ae(),tt("messages.replaceInterruptedFile"),t.size>R)return Ze("IM_SDK_FILE_TOO_LARGE","validation","messages.replaceInterruptedFile");if(void 0!==o.caption&&""!==o.caption)return Ze("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()?Ze("IM_SDK_FILE_NAME_REQUIRED","validation","messages.replaceInterruptedFile"):mt("messages.replaceInterruptedFile",e,"file",t,{...o,fileName:n},r.replaceFile)},editText:async(e,t,o={})=>{Ae(),tt("messages.editText"),at(e,"messages.editText"),O(r.domainState,k,e,"messages.editText");const n=A(k,e,t,o);if("code"in n)throw ot(n);let i;try{i=await r.editMessage(n)}catch(e){throw ot(a(e,"messages.editText",k))}if(Ae(),!i.ok)throw st("messages.editText",T[i.reason]);return s(at(e,"messages.editText"))},recall:async e=>{let t;Ae(),tt("messages.recall"),at(e,"messages.recall"),O(r.domainState,k,e,"messages.recall");try{t=await r.recallMessage({...k,messageId:e})}catch(e){throw ot(a(e,"messages.recall",k))}if(Ae(),!t.ok)throw st("messages.recall",D[t.reason])},deleteLocal:async e=>{Ae(),tt("messages.deleteLocal"),O(r.domainState,k,e,"messages.deleteLocal");const t=r.domainState.getConversationMessage(k,e);if(r.isOutboxOwned(e))throw it("IM_SDK_LOCAL_DELETE_OUTBOX_OWNED");if(void 0!==t&&t.conversationType===k.conversationType&&t.conversationId===k.conversationId&&("pending"===t.status||"uploading"===t.status||"sending"===t.status))throw it("IM_SDK_LOCAL_DELETE_MESSAGE_IN_FLIGHT");try{r.invalidateHistory?.(k);const t=await r.domainState.deleteLocalMessage(k,e);return Ae(),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 it("IM_SDK_MESSAGE_PINNED",e);if(e instanceof Error&&"ImLocalMessageDeletionError"===e.name)throw e;throw it("IM_SDK_LOCAL_DELETE_FAILED",e)}},forward:async(e,t)=>{if(Ae(),tt("messages.forward"),0===e.length||0===t.length)throw ot(n({code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",operation:"messages.forward",retryable:!1,conversation:k}));return nt("messages.forward",e.map(e=>({id:e,...k})),t)},forwardMediaAlbumItem:async(e,t,o)=>{Ae(),tt("messages.forwardMediaAlbumItem");const r="messages.forwardMediaAlbumItem";if(""===e.trim()||0===o.length)throw ot(n({code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",operation:r,retryable:!1,conversation:k}));if(!Number.isInteger(t)||t<0)throw ot(n({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:r,retryable:!1,conversation:k,details:{itemIndex:t}}));return nt(r,[{id:e,...k,itemIndex:t}],o)},fetchByIds:async e=>{Ae();const t=r.fetchMessagesByIdBatch;if(void 0===t)throw ot(n({code:"IM_SDK_MESSAGE_LOOKUP_UNSUPPORTED",category:"unsupported",operation:"messages.fetchByIds",retryable:!1,conversation:k}));const o=r.beginReceiving?.();try{const o=await l({messageIds:e,fetchBatch:t,isCurrent:()=>!Q,projectMessage:Oe});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()=>(Ae(),"customerService"===k.conversationType?null:r.drafts.get(k)),save:async e=>{if(Ae(),"customerService"===k.conversationType)throw new Error("客服会话不支持草稿");return r.drafts.save(k,e)},clear:async()=>{Ae(),"customerService"!==k.conversationType&&await r.drafts.clear(k)},subscribe:e=>(Ae(),H.add(e),()=>H.delete(e))},markRead:async e=>{Ae();const t=F.window.list();if(void 0!==e&&!t.some(t=>t.id===e))throw new Error(`待标记已读消息不存在或不属于当前 handle 窗口:${e}`);const o=void 0===b.resolveReadMessageId?e??t.at(-1)?.id:b.resolveReadMessageId(t,e);void 0!==o&&await r.markRead({...k,readCursor:o})},markConversationRead:async()=>{if(Ae(),void 0===r.markConversationRead)throw new Error("当前会话未装配整会话已读能力");const e=Ee,t=await async function(){if(Me){const e=/* @__PURE__ */new Map,t=r.domainState.getLoadedMessagesByConversation(k);for(const o of[we,...t])void 0!==o&&e.set(o.id,r.domainState.getConversationMessage(k,o.id)??o);return je([...e.values()].sort((e,t)=>e.sortKey.localeCompare(t.sortKey))),we?.id}const e=Ee,t=r.domainState.createMessageWindow(G);try{const o=await t.window.open(k,{limit:x});if(Ae(),o.stale)throw new Error("无法确认会话最新已读边界");if(xe(t.window)){const e=await t.window.loadOlder({limit:x,establishLatestOnly:!0});if(Ae(),e.stale)throw new Error("无法确认会话远端最新已读边界")}if(e!==Ee)throw new DOMException("会话已读确认已失效","AbortError");je(t.window.list()),Me=!0;const r=t.window.list();return void 0===b.resolveReadMessageId?r.at(-1)?.id:b.resolveReadMessageId(r)}finally{t.dispose()}}();if(Ae(),e!==Ee)throw new DOMException("会话已读确认已失效","AbortError");if("channel"===k.conversationType&&void 0===t&&F.window.list().length>0)throw new Error("当前频道缺少可信的最新已读消息");if(void 0!==t&&void 0===r.domainState.getConversationMessage(k,t)){const o=we?.id===t?we:void 0;if(void 0===o)throw new Error("缺少会话最新已读边界的消息证明");pe??(pe=r.domainState.createMessageWindow({retention:{maxMessages:x}}));const n=await pe.window.openAt(k,{anchorSortKey:o.sortKey,limit:x,seedMessages:[o],seedHasNewer:!1});if(Ae(),n.stale||e!==Ee)throw new DOMException("会话已读确认已失效","AbortError")}await r.markConversationRead(k,t)},markVisibleMessages:async e=>{if(Ae(),void 0===r.markVisibleMessages)throw new Error("当前会话未装配可见消息回执能力");const t=[...new Set(e)];if(t.some(e=>!F.window.list().some(t=>t.id===e)))throw new Error("可见回执包含当前连续窗口之外的消息");t.length>0&&await r.markVisibleMessages(k,t)},setMuted:async e=>(Ae(),r.setMuted(k,e)),close(){Q||(Q=!0,Se.abort(),ue(),Be(),B.clear(),H.clear(),he.clear(),pe?.dispose(),F.dispose())}};return M.set(vt,{getMessages:()=>(Ae(),F.window.list()),resolveMessage:async e=>(Ae(),F.window.list().find(t=>t.id===e)??r.domainState.resolveConversationMessage(k,e))}),vt}async function k(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 U(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 S(c,d),c}async function x(e,t,o={}){return U(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)&&j(r,t.pageSize??30)},o)}async function G(e,t,o={}){return U(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 F=/* @__PURE__ */new Set(["pending","uploading","sending"]);function j(e,t){return e.length<t}function V(e){const t=e.extensions?.historyCursor;return"string"==typeof t&&""!==t.trim()}async function z(e,t,o={}){const n=await U(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)&&j(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||V(n))return n?.id;const a=e.slice(0,r).findLast(e=>V(e));return void 0!==a?a.id:n.senderId===t&&F.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 b(e,A["not-found"]);let r;O(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 b(e,A[r.reason])}}};return S(s,n),s}async function B(e,t,o={}){const r=t=>n({code:"IM_SDK_CUSTOMER_SERVICE_READ_ONLY",category:"permission",operation:t,retryable:!1,conversation:e});return U(e,t,()=>r("messages.sendText"),()=>r("messages.edit"),{getSendPermissionError:r,recheckSendPermissionError:r},o)}export{z as createChannelConversationHandle,B as createCustomerServiceConversationHandle,k as createDirectConversationHandle,x as createGroupConversationHandle,G as createRobotConversationHandle,S as linkConversationHandleDomainAccess};
|
|
1
|
+
import{GroupHistoryPageBoundaryError as e}from"../runtime/group-history-page-boundary.js";import{resolveConversationEntryUnread as t}from"./conversation-entry-unread.js";import{isSupportedImageFile as o}from"./image-format.js";import{toMessageMention as r}from"./mention.js";import{createImSdkError as n,unknownOperationErrorToImSdkError as a,toProductMessage as s,toMessageView as i,areMessageViewsEqual as d,mediaFailureToImSdkError as c}from"./message.js";import{fetchMessagesByIdInBatches as l}from"./messages-by-id.js";import{throwIfAborted as g}from"../../../im-core/src/abort.js";import{isConversationUnreadMessage as m}from"../../../im-core/src/mapping/unread-divider.js";import{LocalMessageWindowReadError as v}from"../../../im-core/src/state/local-message-window-read-error.js";import{isValidLiveRoomBody as y}from"../../../im-core/src/mapping/live-room-body.js";import{isValidGiftBody as f}from"../../../im-core/src/mapping/gift-body.js";import{isValidTransferBody as u}from"../../../im-core/src/mapping/transfer-body.js";import{isValidMiniProgramBody as I}from"../../../im-core/src/mapping/mini-program-body.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as _,MEDIA_ALBUM_MAX_ITEMS as w}from"../../../im-core/src/mapping/media-album-body.js";import{isMessageVisibleInTimeline as p}from"../../../im-core/src/mapping/session-mapper.js";import{MEDIA_THUMBNAIL_MAX_BYTES as E}from"../../../im-core/src/media-thumbnail-policy.js";function M(t,o,r){return t instanceof e?n({code:t.code,category:t.category,retryable:t.retryable,operation:o,conversation:r,cause:t}):a(t,o,r)}const S=/* @__PURE__ */new WeakMap;function D(e,t){const o=S.get(t);if(void 0===o)throw new Error("ConversationHandle advanced 访问能力尚未注册");S.set(e,o)}const T={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"not-own":{code:"IM_SDK_RECALL_NOT_OWN",category:"permission",retryable:!1},"not-sent":{code:"IM_SDK_RECALL_NOT_SENT",category:"state",retryable:!1},expired:{code:"IM_SDK_RECALL_EXPIRED",category:"state",retryable:!1},"server-expired":{code:"IM_SDK_RECALL_EXPIRED",category:"state",retryable:!1},unsupported:{code:"IM_SDK_RECALL_UNSUPPORTED",category:"unsupported",retryable:!1},timeout:{code:"IM_SDK_RECALL_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_RECALL_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_RECALL_DISCONNECTED",category:"network",retryable:!0}},h={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"not-own":{code:"IM_SDK_EDIT_NOT_OWN",category:"permission",retryable:!1},"not-sent":{code:"IM_SDK_EDIT_NOT_SENT",category:"state",retryable:!1},recalled:{code:"IM_SDK_EDIT_RECALLED",category:"state",retryable:!1},deleted:{code:"IM_SDK_EDIT_DELETED",category:"state",retryable:!1},expired:{code:"IM_SDK_EDIT_EXPIRED",category:"state",retryable:!1},unsupported:{code:"IM_SDK_EDIT_UNSUPPORTED",category:"unsupported",retryable:!1},empty:{code:"IM_SDK_EDIT_EMPTY",category:"validation",retryable:!1},restricted:{code:"IM_SDK_EDIT_RESTRICTED",category:"permission",retryable:!1},"unsupported-content":{code:"IM_SDK_EDIT_CONTENT_UNSUPPORTED",category:"unsupported",retryable:!1},"no-key":{code:"IM_SDK_EDIT_KEY_UNAVAILABLE",category:"state",retryable:!1},"encrypt-failed":{code:"IM_SDK_EDIT_ENCRYPT_FAILED",category:"state",retryable:!1},timeout:{code:"IM_SDK_EDIT_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_EDIT_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_EDIT_DISCONNECTED",category:"network",retryable:!0}},A={"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"unsupported-message":{code:"IM_SDK_REACTION_MESSAGE_UNSUPPORTED",category:"unsupported",retryable:!1},"invalid-emoji":{code:"IM_SDK_REACTION_EMOJI_INVALID",category:"validation",retryable:!1},restricted:{code:"IM_SDK_REACTION_FORBIDDEN",category:"permission",retryable:!1},disconnected:{code:"IM_SDK_REACTION_DISCONNECTED",category:"network",retryable:!0},timeout:{code:"IM_SDK_REACTION_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_REACTION_FAILED",category:"state",retryable:!1}},b={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},unsupported:{code:"IM_SDK_CHANNEL_DELETE_UNSUPPORTED",category:"unsupported",retryable:!1},"not-sent":{code:"IM_SDK_CHANNEL_DELETE_NOT_SENT",category:"state",retryable:!1},unavailable:{code:"IM_SDK_CHANNEL_DELETE_UNAVAILABLE",category:"state",retryable:!1},forbidden:{code:"IM_SDK_CHANNEL_DELETE_FORBIDDEN",category:"permission",retryable:!1},timeout:{code:"IM_SDK_CHANNEL_DELETE_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_CHANNEL_DELETE_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_CHANNEL_DELETE_DISCONNECTED",category:"network",retryable:!0}};function O(e,t,o){const r=n({...t,operation:"messages.deleteForEveryone",conversation:e});return Object.assign(new Error(r.code,void 0),r)}function N(e,t,o,r){if(("group"===t.conversationType||"channel"===t.conversationType)&&e.getPinnedMessage(t)?.messageId===o){const e=n({code:"IM_SDK_MESSAGE_PINNED",category:"state",operation:r,retryable:!1,conversation:t,details:{messageId:o}});throw Object.assign(new Error(e.code),e)}}function P(e,t){const o=n({code:"IM_SDK_MESSAGE_ANCHOR_UNAVAILABLE",category:"state",operation:"history.loadAround",retryable:!0,conversation:e,details:{messageId:t}});return Object.assign(new Error(o.code),o)}const R=209715200,C=2147483648,L=31457280,K=4294967295,U=E;const k={"empty-input":{code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",retryable:!1},"too-many-targets":{code:"IM_SDK_FORWARD_TOO_MANY_TARGETS",category:"validation",retryable:!1},"unsupported-target-type":{code:"IM_SDK_FORWARD_TARGET_UNSUPPORTED",category:"unsupported",retryable:!1},"type-not-allowed":{code:"IM_SDK_FORWARD_CONTENT_UNSUPPORTED",category:"unsupported",retryable:!1},"media-not-ready":{code:"IM_SDK_FORWARD_MEDIA_NOT_READY",category:"state",retryable:!0},"album-item-not-found":{code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",retryable:!1},"conversation-blocked":{code:"IM_SDK_FORWARD_TARGET_BLOCKED",category:"permission",retryable:!1},"send-failed":{code:"IM_SDK_FORWARD_SEND_FAILED",category:"state",retryable:!1}};async function x(e,r,E,D,b={},O={}){g(O.signal);const x=Object.freeze({...e}),G=r.pageSize??30,j={historySource:"group"===x.conversationType||"channel"===x.conversationType?"remote":"local",retention:{maxMessages:6*G},...void 0===b.shouldEstablishRemoteLatestOnOpen?{}:{shouldEstablishRemoteLatest:(e,t)=>!0===b.shouldEstablishRemoteLatestOnOpen?.(t)}};let F=r.domainState.createMessageWindow({...j});const V=/* @__PURE__ */new WeakSet,z=/* @__PURE__ */new WeakSet,H=/* @__PURE__ */new Set,W=/* @__PURE__ */new Set,Y=/* @__PURE__ */new Map;let $,X,Q=!1,q=!1,J=!1,Z=!0,ee=0,te=Object.freeze({state:"none"});const oe=!0===O.captureEntryUnread&&"robot"!==x.conversationType,re=oe?r.domainState.getSession(x):void 0,ne=Math.max(0,!0===re?.manuallyUnread?0:re?.unreadCount??0),ae=oe?r.domainState.getReadState(x):void 0,se=r.getSelfId(),ie=/* @__PURE__ */new Map,de=/* @__PURE__ */new Set;let ce,le,ge,me,ve,ye=ae?.readCursorSortKey,fe=oe?Object.freeze(ne>0?{state:"pending",count:ne}:{state:"none"}):void 0,ue=0;function Ie(e=new DOMException("历史导航已被新的操作取代","AbortError")){const t=ge;ge=void 0;const o=++ue;return t?.controller.abort(e),o}function _e(){const e={version:Ie(),controller:new AbortController};return ge=e,e}function we(e){ge===e&&(ge=void 0)}let pe,Ee,Me=0,Se=!1;if(oe)for(const e of r.domainState.getLoadedMessagesByConversation(x))ie.set(e.id,m(e,se)),ae?.readCursor===("channel"===x.conversationType?e.extensions?.historyCursor:e.id)&&(ye=e.sortKey);const De=new AbortController,Te=/* @__PURE__ */new WeakMap;let he,Ae=/* @__PURE__ */new Map;function be(){if(q)throw new Error("ConversationHandle 已关闭")}function Oe(){const e=F.window.info();return{messages:F.window.list(),context:r.domainState.getConversationContext(x),draft:r.domainState.getDraft(x),loading:Y.size>0,stale:Q,hasOlder:e.hasMore,hasNewer:e.hasNewer,error:X,entryUnread:te,entryUnreadNavigation:fe}}function Ne(e){const t=Te.get(e);if(void 0!==t)return t;const o=i(e),r=Ae.get(e.id),n=void 0!==r&&d(r,o)?r:o;return Te.set(e,n),n}function Pe(e){const t=e.context,o=Object.freeze(e.messages.map(Ne));return Ae=new Map(o.map(e=>[e.id,e])),{ref:x,...void 0===t?{}:{display:Object.freeze({title:t.title,...void 0===t.avatar?{}:{avatar:t.avatar}})},messages:o,entryUnread:e.entryUnread,...void 0===e.entryUnreadNavigation?{}:{entryUnreadNavigation:e.entryUnreadNavigation},draft:e.draft,loading:e.loading,stale:e.stale,hasOlder:e.hasOlder,hasNewer:e.hasNewer,...void 0===e.error?{}:{error:e.error}}}function Re(){Be();const e=Oe();if(void 0!==he&&(o=e,function(e,t){return e.length===t.length&&e.every((e,o)=>e===t[o])}((t=he).messages,o.messages)&&(t.context?.title??"")===(o.context?.title??"")&&(t.context?.avatar??"")===(o.context?.avatar??"")&&t.draft===o.draft&&t.loading===o.loading&&t.stale===o.stale&&t.hasOlder===o.hasOlder&&t.hasNewer===o.hasNewer&&t.error===o.error&&t.entryUnread===o.entryUnread&&t.entryUnreadNavigation===o.entryUnreadNavigation))return;var t,o;he=e;const n=Pe(e);for(const e of H)try{e(n)}catch(e){r.emitter.emit({type:"error",error:{scope:"unknown",message:"ConversationHandle 订阅者回调异常",cause:e}})}}async function Ce(e){const t=F.window.list().find(t=>t.id===e)??r.domainState.getConversationMessage(x,e);if(void 0!==t)return{anchor:t,fallbackSeed:t};const o=await r.domainState.resolveConversationMessage(x,e,{throwOnStorageError:!0});return void 0===o?void 0:{anchor:o,fallbackSeed:o}}async function Le(e,t,o,r=!1){o();const{anchor:n}=t;if(void 0!==t.remoteSeed)return Ke(e,t.remoteSeed,o,r);const a=await e.openAt(x,{anchorSortKey:n.sortKey,limit:G});o();const s=e.list().find(e=>e.id===n.id);if(!0===e.info().remotePagination&&void 0!==s)return Ke(e,s,o,r);if(e.list().some(e=>e.id===n.id))return a;if(void 0===t.fallbackSeed)throw P(x,n.id);if("local"===j.historySource){const o=e.info();return e.openAt(x,{anchorSortKey:n.sortKey,limit:G,seedMessages:[...a.messages,t.fallbackSeed],seedHasOlder:o.hasMore,seedHasNewer:o.hasNewer})}return Ke(e,t.fallbackSeed,o,r)}async function Ke(e,t,o,r){const n=await e.openAt(x,{anchorSortKey:t.sortKey,limit:G,seedMessages:[t],seedHasNewer:!0,seedRemotePagination:{}});return o(),r?(await Ue(e,t,o),{...n,messages:e.list()}):n}async function Ue(e,t,o){for(const r of["older","newer"])if(!e.list().some(e=>p(e)&&("older"===r?e.sortKey<t.sortKey:e.sortKey>t.sortKey)))for(let t=0;t<4;t+=1){o();const t=e.info();if(!("older"===r?t.hasMore:t.hasNewer))break;const n="older"===r?await e.loadOlder({limit:G}):await e.loadNewer({limit:G});if(o(),n.stale)throw new DOMException("消息定位窗口已失效","AbortError");if(n.messages.length>0)break}}function ke(e,t,o){be();const n=F,a=o?.window??n.window,s=o?.isCurrent??(()=>!q&&F===n),i=()=>{if(be(),!s())throw new DOMException("历史操作已被新的导航取代","AbortError")};if(void 0!==$)return Promise.reject(new Error("清空本机会话历史期间拒绝启动新的历史加载"));const d=Y.get(e);if(void 0!==d)return d;const c=r.beginReceiving?.();X=void 0;const l=Promise.resolve().then(()=>(i(),t())).then(e=>(i(),void 0===b.reconcilePage?e:b.reconcilePage(e,a))).then(e=>{i(),Q=!0===e.stale}),g=(void 0===o?.cancelled?l:Promise.race([l,o.cancelled])).catch(t=>{const o=t instanceof v?t.cause:t;throw s()&&(X=M(o,`history.${e}`,x)),Z?t:o}).finally(()=>{c?.(),Y.delete(e),q||Re()});return Y.set(e,g),Re(),g}function xe(){F.window.applyIncoming(r.domainState.getMessagesByConversation(x).slice(-G))}function Ge(e){return!0===b.shouldEstablishRemoteLatestOnOpen?.(e.list())||!0===e.info().remotePagination&&(ne>0||"first-unread"===O.initialPosition&&(r.domainState.getSession(x)?.unreadCount??0)>0)}async function je(){Se=!1,J?J=!1:await ke("latest",()=>F.window.open(x,{limit:G})),xe(),Ge(F.window)&&(await ke("latest:remote",()=>F.window.loadOlder({limit:G,establishLatestOnly:!0})),xe()),Se=!Q,Ve(F.window.list())}function Fe(){if(be(),ve?.version===ue)return ve.promise;const e=_e(),{version:t}=e,o=async function({version:e,controller:t}){const o=F,n=r.domainState.createMessageWindow(j),a=()=>!q&&!t.signal.aborted&&ue===e&&F===o,s=()=>{if(!a())throw new DOMException("回最新已被新的导航取代","AbortError")};let i,d=!1;const c=new Promise((e,t)=>{i=t}),l=()=>{d||n.dispose(),i(t.signal.reason)};t.signal.addEventListener("abort",l,{once:!0});const g={window:n.window,isCurrent:a,cancelled:c},m=(e,t)=>ke(e,async()=>{const e=await t();if(e.stale)throw new DOMException("最新历史窗口已失效","AbortError");return e},g),v=(async()=>{await m(`latest:${e}`,()=>n.window.open(x,{limit:G})),s(),n.window.applyIncoming(r.domainState.getMessagesByConversation(x).slice(-G)),Ge(n.window)&&(await m(`latest:remote:${e}`,()=>n.window.loadOlder({limit:G,establishLatestOnly:!0})),s(),n.window.applyIncoming(r.domainState.getMessagesByConversation(x).slice(-G))),F=n,d=!0,o.dispose(),Se=!0,Q=!1,Ve(n.window.list()),Re()})();try{await Promise.race([v,c])}finally{t.signal.removeEventListener("abort",l),d||n.dispose()}}(e).finally(()=>{we(e),ve?.version===t&&(ve=void 0)});return ve={version:t,promise:o},o}function Ve(e){const t=b.resolveReadMessageId?.(e);pe=void 0===b.resolveReadMessageId?e.at(-1):e.find(e=>e.id===t)}function ze(e){return!(de.has(e.id)||void 0===ce||e.sortKey>ce||void 0!==ye&&e.sortKey<=ye)&&(ie.get(e.id)??m(e,se))}function Be(){if(!oe||ne<=0||void 0!==le||void 0===ce||"none"===fe?.state)return;const e=F.window.list();if(!e.some(e=>e.sortKey===ce))return;const t=e.filter(e=>ze(e)&&p(e)&&void 0===e.recalled&&void 0===e.deletedForEveryone);if(t.length<ne)return;const o=t.slice(-ne);if(o.every(e=>"system"===e.contentType))return void(fe=Object.freeze({state:"none"}));const r=o[0];le=r.id,te=Object.freeze({state:"located",firstMessageId:r.id,count:ne}),fe=Object.freeze({state:"located",firstMessageId:r.id,count:ne})}const He=r.emitter.subscribe(e=>{if(!q&&"conversation"in e&&void 0!==e.conversation&&e.conversation.conversationType===x.conversationType&&e.conversation.conversationId===x.conversationId){if("conversation-history:cleared"!==e.type&&"session:removed"!==e.type||(De.abort(),Ie(),te=Object.freeze({state:"none"}),oe&&(fe=Object.freeze({state:"none"})),Me+=1,Ee?.dispose(),Ee=void 0,Se=!1,pe=void 0),"message:received"===e.type&&"live"===e.source&&(oe&&de.add(e.message.id),Se&&(void 0===pe||e.message.sortKey>pe.sortKey)&&(void 0===b.resolveReadMessageId||b.resolveReadMessageId([e.message])===e.message.id)&&(pe=e.message)),"draft:updated"===e.type||"draft:cleared"===e.type){const t="draft:updated"===e.type?e.draft:null;for(const e of W)try{e(t)}catch(e){r.emitter.emit({type:"error",error:{scope:"unknown",message:"ConversationHandle 草稿订阅者回调异常",cause:e}})}}Re()}});function We(){return"first-unread"===O.initialPosition?async function(){const e=r.domainState.getSession(x),o=Math.max(0,!0===e?.manuallyUnread?0:e?.unreadCount??0),n=r.domainState.getReadState(x),a=n?.readCursor,s=void 0===a||""===a?void 0:"channel"===x.conversationType?r.domainState.getLoadedMessagesByConversation(x).find(e=>e.extensions?.historyCursor===a):r.domainState.getConversationMessage(x,a),i=s?.sortKey??n?.readCursorSortKey;if(te=await t({conversation:x,pageSize:G,unreadCount:o,...void 0===i?{}:{readCursorSortKey:i},signal:De.signal,..."channel"!==x.conversationType||void 0===a||""===a||void 0===r.loadEntryUnreadPage?{}:{loadReadCursorPage:async e=>{const t=F.window.getRevision(),o=()=>!q&&!De.signal.aborted&&F.window.getRevision()===t,n=await r.loadEntryUnreadPage({readCursor:a,...void 0===e?{}:{cursor:e},signal:De.signal,isCurrent:o});if(g(De.signal),!o())throw new DOMException("首未读定位已被新的窗口操作作废","AbortError");return n}},selfId:r.getSelfId(),list:()=>F.window.list(),hasOlder:()=>F.window.info().hasMore,hasNewer:()=>F.window.info().hasNewer,openLatest:je,openAt:(e,t)=>{if(void 0===t&&"channel"===x.conversationType&&void 0!==a&&""!==a&&void 0!==r.loadEntryUnreadPage)return Promise.resolve();J=!1;const o=t?.messages.map(e=>r.domainState.getConversationMessage(x,e.id)??e),n=t?.messages.find(t=>t.sortKey===e)?.id,s=void 0===n?e:o?.find(e=>e.id===n)?.sortKey??e;return ke(`entry-unread:${e}`,()=>F.window.openAt(x,{anchorSortKey:s,limit:G,...void 0===t?{}:{seedMessages:o,seedHasNewer:t.hasNewer,seedRemotePagination:void 0===t.nextCursor?{}:{newerCursor:t.nextCursor}}}))},loadOlder:()=>ke("entry-unread:older",()=>F.window.loadOlder({limit:G})),loadNewer:()=>ke("entry-unread:newer",()=>F.window.loadNewer({limit:G}))}),"located"===te.state&&!0===F.window.info().remotePagination){const e=te.firstMessageId,t=F.window.list().find(t=>t.id===e);void 0!==t&&await ke("entry-unread:context",async()=>(await Ue(F.window,t,()=>{g(De.signal),be()}),{conversationId:x.conversationId,messages:F.window.list(),stale:!1}));const o=F.window.list().find(t=>t.id===e);void 0!==o&&p(o)&&void 0===o.recalled&&void 0===o.deletedForEveryone||(te=Object.freeze({state:"unavailable"}))}}():je()}const Ye=()=>{De.abort(O.signal?.reason),F.dispose()};O.signal?.addEventListener("abort",Ye,{once:!0});try{if(g(O.signal),"local-first"===O.initialLoad){await ke("initial:local",()=>F.window.open(x,{limit:G})),g(O.signal),xe(),J=!0;try{await We()}catch(e){if(g(O.signal),e instanceof v)throw e;X=M(e,"history.initial",x),"first-unread"===O.initialPosition&&(te=Object.freeze({state:"unavailable"}))}finally{J=!1}}else await We();g(O.signal)}catch(e){throw q=!0,De.abort(),He(),H.clear(),F.dispose(),e instanceof v?e.cause:e}finally{O.signal?.removeEventListener("abort",Ye)}function $e(e,t){const o=r.domainState.getConversationMessage(x,e);return void 0!==o&&o.conversationType===x.conversationType&&o.conversationId===x.conversationId?{ok:!0,message:s(o)}:{ok:!1,error:n({code:void 0===o?"IM_SDK_MESSAGE_STATE_MISSING":"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:x})}}async function Xe(e,t,o){const r=await(b.getSendPermissionError?.(e));if(be(),void 0!==r){if(void 0===o||"customerService"===x.conversationType)return{ok:!1,error:r};const e=await o(r);return be(),e}try{const e=await t();return be(),e}catch(t){if(q)throw t;return{ok:!1,error:a(t,e,x)}}}async function Qe(e,t={}){const o="name"in e?e.name:void 0,r=t.fileName??("string"==typeof o&&""!==o?o:void 0);return{...x,data:e,...""===e.type?{}:{mimeType:e.type},...void 0===r?{}:{filename:r},..."robot"===x.conversationType?{encrypted:!1}:{},...void 0===t.localPreviewUrl?{}:{localPreviewUrl:t.localPreviewUrl},...void 0===t.localPreviewMetadata?{}:{localPreviewMetadata:t.localPreviewMetadata},...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}}}function qe(e){return void 0===e||Number.isFinite(e.width)&&e.width>0&&Number.isFinite(e.height)&&e.height>0}function Je(e){return qe(e)&&(void 0===e?.duration||Number.isFinite(e.duration)&&e.duration>0)&&(void 0===e?.posterData||e.posterData instanceof Uint8Array&&e.posterData.length>0&&e.posterData.length<=U)}function Ze(e){return void 0!==e&&"duration"in e&&void 0!==e.duration&&Number.isFinite(e.duration)&&e.duration>0}function et(e,t,o){return{ok:!1,error:n({code:e,category:t,operation:o,retryable:!1,conversation:x})}}function tt(e,t){if(null===e||"object"!=typeof e||e.kind!==t)return!1;if(!Number.isSafeInteger(e.width)||e.width<=0||e.width>K||!Number.isSafeInteger(e.height)||e.height<=0||e.height>K)return!1;let o;try{o=new URL(e.url)}catch{return!1}if("http:"!==o.protocol&&"https:"!==o.protocol||""!==o.username||""!==o.password)return!1;const r=e.resourceId;if(void 0!==r&&("string"!=typeof r||""===r.trim()))return!1;if("gif"===t)return!Object.prototype.hasOwnProperty.call(e,"packageId");const n=e.packageId;return"string"==typeof r&&""!==r.trim()&&"string"==typeof n&&""!==n.trim()}function ot(e){if("customerService"===x.conversationType)throw rt(n({code:"IM_SDK_CUSTOMER_SERVICE_READ_ONLY",category:"permission",operation:e,retryable:!1,conversation:x}))}function rt(e){return Object.assign(new Error(e.code),e,{name:"ImMessageActionError"})}function nt(e,t,o){if("direct"===e||"group"===e||"channel"===e||"robot"===e)return Object.freeze({conversationType:e,conversationId:t});throw rt(n({code:"IM_SDK_FORWARD_RESULT_INVALID",category:"contract",operation:o,retryable:!1,conversation:x,details:{targetConversationType:e,targetConversationId:t}}))}async function at(e,t,o){let s;try{s=await r.forwardMessages({messages:t,targets:o.map(e=>{if("customerService"===e.conversationType)throw new Error("客服会话不能作为转发目标");return{conversationType:e.conversationType,conversationId:e.conversationId}})})}catch(t){throw rt(a(t,e,x))}return be(),Object.freeze({sent:Object.freeze(s.results.flatMap(t=>t.ok?[{conversation:nt(t.targetConversationType,t.targetConversationId,e),messageId:t.newMessageId}]:[])),failed:Object.freeze(s.results.flatMap(t=>t.ok?[]:[{sourceMessageId:t.sourceMessageId,conversation:Object.freeze({conversationType:t.targetConversationType,conversationId:t.targetConversationId}),error:n({...k[t.reason],operation:e,conversation:{conversationType:t.targetConversationType,conversationId:t.targetConversationId}})}])),skippedSourceMessageIds:Object.freeze([...s.skippedSourceIds])})}function st(e,t){const o=r.domainState.getConversationMessage(x,e);if(void 0===o){const o=r.domainState.getMessagesById(e)[0];throw rt(n({code:void 0===o?"IM_SDK_MESSAGE_NOT_FOUND":"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:x}))}if(o.conversationType!==x.conversationType||o.conversationId!==x.conversationId)throw rt(n({code:"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:x}));return o}function it(e,t){return rt(n({...t,operation:e,conversation:x}))}function dt(e,t){const o=n({code:e,category:"state",operation:"messages.deleteLocal",retryable:!1,conversation:x,...void 0===t?{}:{cause:t}});return Object.assign(new Error(e),o,{name:"ImLocalMessageDeletionError"})}function ct(e,t){const o=n({code:e,category:"state",operation:"history.clearLocal",retryable:!1,conversation:x,...void 0===t?{}:{cause:t}});return Object.assign(new Error(e),o,{name:"ImLocalConversationHistoryClearError"})}async function lt(e,t){if(void 0!==e)try{await r.domainState.clearDraftIfUnchanged(x,e)}catch(e){r.emitter.emit({type:"error",error:{scope:"storage",message:`消息已被本地发送流程接受,但清理草稿失败(${t})`,cause:e}})}}async function gt(e,t,n,a,s){return Xe(e,async()=>{if("image"===t){const t=await o(n);if(be(),!t)return et("IM_SDK_IMAGE_FORMAT_UNSUPPORTED","unsupported",e)}const i=await Qe(n,a);if(be(),void 0!==t&&void 0===i.localPreviewMetadata&&void 0!==r.prepareMediaPreview){const o=new AbortController,a=await r.prepareMediaPreview({operationId:`${x.conversationType}:${x.conversationId}:${e}:${++ee}`,kind:t,file:n,signal:o.signal});if(be(),void 0===a||("image"===t?!qe(a):!Je(a)))return et("image"===t?"IM_SDK_IMAGE_PREVIEW_METADATA_INVALID":"IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",e);i.localPreviewMetadata=a}if("video"===t&&(void 0!==r.prepareMediaPreview||void 0!==i.localPreviewMetadata)&&!Ze(i.localPreviewMetadata))return et("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",e);const d=b.recheckSendPermissionError?.(e);if(void 0!==d)return{ok:!1,error:d};const l=await s({...i,...void 0===a.filesAlbum?{}:{filesAlbum:a.filesAlbum},...void 0===a.caption||""===a.caption?{}:{caption:a.caption}});return l.ok?(be(),$e(l.messageId,e)):{ok:!1,error:c(l.reason,e,x)}})}function mt(e,t,o){const a=st(e,o);if(!(a.contentType===t||"file"===t&&"filesAlbum"===a.contentType&&1===a.body.filesAlbum?.items.length)||"failed"!==a.status||"media.uploadInterrupted"!==a.failure?.displayCode&&"media.cancelled"!==a.failure?.displayCode&&("media.uploadTimeout"!==a.failure?.displayCode||!1!==a.failure.retryable)||r.isOutboxOwned(e))throw rt(n({code:"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:o,retryable:!1,conversation:x}));return a}async function vt(e,t,o,n,a,s){return mt(t,o,e),Xe(e,async()=>{const i=await Qe(n,a);if("video"===o&&void 0===i.localPreviewMetadata&&void 0!==r.prepareMediaPreview){const t=new AbortController,o=await r.prepareMediaPreview({operationId:`${x.conversationType}:${x.conversationId}:${e}:${++ee}`,kind:"video",file:n,signal:t.signal});if(be(),void 0===o||!Je(o))return et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",e);i.localPreviewMetadata=o}if("video"===o&&(void 0!==r.prepareMediaPreview||void 0!==i.localPreviewMetadata)&&!Ze(i.localPreviewMetadata))return et("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",e);const d=b.recheckSendPermissionError?.(e);if(void 0!==d)return{ok:!1,error:d};mt(t,o,e);const l=await s(t,{...i,...void 0===a.caption||""===a.caption?{}:{caption:a.caption}});return l.ok?(be(),$e(l.messageId,e)):{ok:!1,error:c(l.reason,e,x)}})}Z=!1,function(){if(!oe||ne<=0)return;if(!0===F.window.info().remotePagination&&!Se&&"located"!==te.state)return;z.add(F.window);const e=F.window.list().filter(e=>!de.has(e.id));ce=e.at(-1)?.sortKey;for(const t of e)ie.has(t.id)||ie.set(t.id,m(t,se));if("first-unread"===O.initialPosition&&"located"===te.state)return le=te.firstMessageId,void(fe=Object.freeze({state:"located",count:ne,firstMessageId:te.firstMessageId}));Be()}();const yt={ref:x,getSnapshot:function(){return be(),Pe(Oe())},subscribe:e=>(be(),H.add(e),()=>H.delete(e)),resolveMessage:async e=>{be();const t=F.window.list().find(t=>t.id===e)??await r.domainState.resolveConversationMessage(x,e);return void 0===t?null:Ne(t)},history:{loadEntryUnread:e=>function(e={}){if(be(),e.signal?.aborted)return Promise.reject(e.signal.reason);if(void 0!==me){if(!me.controller.signal.aborted&&me.version===ue&&me.callerSignal===e.signal)return me.promise;me.controller.abort()}if(void 0===fe||"none"===fe.state)return Promise.resolve(!1);const o=_e(),{version:n,controller:a}=o,s=F.window.list(),i=s.find(e=>e.id===le),d=F.window.info();if(void 0===$&&0===Y.size&&!Q&&!De.signal.aborted&&z.has(F.window)&&void 0!==i&&p(i)&&void 0===i.recalled&&void 0===i.deletedForEveryone&&(!d.hasMore||s.some(e=>p(e)&&e.sortKey<i.sortKey))&&(!d.hasNewer||s.some(e=>p(e)&&e.sortKey>i.sortKey)))return te=Object.freeze({state:"located",firstMessageId:i.id,count:ne}),fe=Object.freeze({state:"located",firstMessageId:i.id,count:ne}),Re(),we(o),Promise.resolve(!0);const c=r.domainState.createMessageWindow(j),l=()=>!q&&!a.signal.aborted&&ue===n,g=()=>{if(!l())throw new DOMException("进入未读定位已被新的导航取代","AbortError")},m=async e=>{g();let t=await e();if(g(),void 0!==b.reconcilePage&&(t=await b.reconcilePage(t,c.window)),g(),t.stale)throw new DOMException("进入未读窗口已失效","AbortError");c.window.applyIncoming(c.window.list().map(e=>r.domainState.getConversationMessage(x,e.id)??e))};let y,f=!1;const u=new Promise((e,t)=>{y=t}),I=()=>{f||c.dispose(),y(a.signal.reason)},_=()=>a.abort(e.signal?.reason),w=()=>a.abort(De.signal.reason);a.signal.addEventListener("abort",I,{once:!0}),e.signal?.addEventListener("abort",_,{once:!0}),De.signal.addEventListener("abort",w,{once:!0}),De.signal.aborted&&w();const E=r.beginReceiving?.(),S=(async()=>{try{let e=!1;void 0===ce&&(await m(()=>c.window.open(x,{limit:G})),Ge(c.window)&&await m(()=>c.window.loadOlder({limit:G,establishLatestOnly:!0})),ce=c.window.list().filter(e=>!de.has(e.id)).at(-1)?.sortKey,e=!0);const o=le,n=void 0===o?void 0:await Ce(o);if(g(),void 0!==o&&void 0===n)return fe=Object.freeze({state:"unavailable",count:ne}),!1;const s=void 0===n?await t({conversation:x,pageSize:G,maxExtraPages:Number.POSITIVE_INFINITY,preserveLocatedWindow:!0===c.window.info().remotePagination,...void 0===ce?{}:{entryUpperSortKey:ce},unreadCount:ne,...void 0===ye?{}:{readCursorSortKey:ye},signal:a.signal,selfId:se,isEntryUnread:ze,..."channel"===x.conversationType&&ae?.readCursor&&void 0!==r.loadEntryUnreadPage?{loadReadCursorPage:async e=>{const t=await r.loadEntryUnreadPage({readCursor:ae.readCursor,...void 0===e?{}:{cursor:e},signal:a.signal,isCurrent:l});return g(),t}}:{},paginationKey:()=>c.window.getPaginationKey(),list:()=>c.window.list(),hasOlder:()=>c.window.info().hasMore,hasNewer:()=>c.window.info().hasNewer,openLatest:async()=>{e?e=!1:(await m(()=>c.window.open(x,{limit:G})),Ge(c.window)&&await m(()=>c.window.loadOlder({limit:G,establishLatestOnly:!0})))},openAt:(t,o)=>(e=!1,m(()=>c.window.openAt(x,{anchorSortKey:t,limit:G,...void 0===o?{}:{seedMessages:o.messages.map(e=>r.domainState.getConversationMessage(x,e.id)??e),seedHasNewer:o.hasNewer,seedRemotePagination:void 0===o.nextCursor?{}:{newerCursor:o.nextCursor}}}))),loadOlder:()=>m(()=>c.window.loadOlder({limit:G})),loadNewer:()=>m(()=>c.window.loadNewer({limit:G}))}):await(async()=>(await m(()=>Le(c.window,n,g)),{state:"located",firstMessageId:n.anchor.id,count:ne}))();if(g(),"located"!==s.state)return fe=Object.freeze("none"===s.state?{state:"none"}:{state:"unavailable",count:ne}),!1;const i=c.window.list().find(e=>e.id===s.firstMessageId);if(void 0===i||!p(i)||void 0!==i.recalled||void 0!==i.deletedForEveryone)return fe=Object.freeze({state:"unavailable",count:ne}),!1;!0===c.window.info().remotePagination&&await m(async()=>(await Ue(c.window,i,g),{conversationId:x.conversationId,messages:c.window.list(),stale:!1})),g();const d=c.window.list().find(e=>e.id===s.firstMessageId);if(void 0===d||!p(d)||void 0!==d.recalled||void 0!==d.deletedForEveryone)return fe=Object.freeze({state:"unavailable",count:ne}),!1;const v=F;return F=c,f=!0,v.dispose(),z.add(c.window),le=s.firstMessageId,te=s,fe=Object.freeze({state:"located",count:ne,firstMessageId:s.firstMessageId}),X=void 0,!0}catch(e){const t=e instanceof v?e.cause:e;if(l()){const e=M(t,"history.loadEntryUnread",x);fe=Object.freeze({state:"failed",count:ne,error:e})}throw t}})(),D=Promise.race([S,u]).finally(()=>{a.signal.removeEventListener("abort",I),we(o),e.signal?.removeEventListener("abort",_),De.signal.removeEventListener("abort",w),f||c.dispose(),E?.(),me?.controller===a&&(me=void 0),q||Re()});return me={version:n,callerSignal:e.signal,controller:a,promise:D},D}(e),loadLatest:async()=>Fe(),loadOlder:async()=>(be(),Ie(),ke("older",()=>F.window.loadOlder({limit:G}))),loadNewer:async()=>{be(),Ie(),await ke("newer",()=>F.window.loadNewer({limit:G})),be(),F.window.info().hasNewer||(xe(),Re())},loadAround:async(e,t={})=>{if(be(),!0===t.signal?.aborted)throw new DOMException("消息定位已取消","AbortError");const o=_e(),{version:a,controller:s}=o;if(void 0===$&&"channel"===x.conversationType&&V.has(F.window)&&r.domainState.getPinnedMessage(x)?.messageId===e&&F.window.list().some(t=>t.id===e&&B(t)))return void we(o);const i=F,d=()=>!q&&!s.signal.aborted&&ue===a&&F===i,c=()=>{if(be(),!d())throw new DOMException("消息定位已被新的导航取代","AbortError")};let l,g,m=!1;const v=new Promise((e,t)=>{g=t}),y=()=>{m||l?.dispose(),g(s.signal.reason)},f=()=>s.abort(t.signal?.reason);s.signal.addEventListener("abort",y,{once:!0}),t.signal?.addEventListener("abort",f,{once:!0});const u=(async()=>{const t=await async function(e,t){if(t(),void 0!==$)throw new Error("清空本机会话历史期间拒绝启动新的历史加载");const o=await Ce(e);t();const n=o?.fallbackSeed;if(void 0!==o&&("channel"!==x.conversationType||void 0!==n&&B(n)))return"channel"===x.conversationType&&!0===F.window.info().remotePagination?{...o,remoteSeed:n}:o;if(void 0===r.fetchMessagesByIdBatch)throw P(x,e);if(void 0!==$)throw new Error("清空本机会话历史期间拒绝启动新的历史加载");const a=await r.fetchMessagesByIdBatch([e]);t();const s=a.messages.find(t=>t.id===e&&t.conversationType===x.conversationType&&t.conversationId===x.conversationId);if(void 0!==s){if("channel"===x.conversationType){if(!B(s))throw P(x,e);return{anchor:s,remoteSeed:s}}return{anchor:s,fallbackSeed:s}}if(!a.missingMessageIds.includes(e))throw P(x,e)}(e,c);if(c(),void 0===t)throw function(e,t){const o=n({code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",operation:"history.loadAround",retryable:!1,conversation:e,details:{messageId:t}});return Object.assign(new Error(o.code),o)}(x,e);if(t.anchor.conversationType!==x.conversationType||t.anchor.conversationId!==x.conversationId)throw P(x,e);l=r.domainState.createMessageWindow(j);const o=l.window;await ke(`around:${e}:${a}`,async()=>(c(),Le(o,t,c,!0)),{window:o,isCurrent:d,cancelled:v}),c(),F=l,void 0!==t.remoteSeed&&V.add(o),m=!0,i.dispose(),Re()})();try{await Promise.race([u,v])}finally{t.signal?.removeEventListener("abort",f),s.signal.removeEventListener("abort",y),we(o),m||l?.dispose()}},clearLocal:async()=>(be(),ot("history.clearLocal"),function(){if(q)return Promise.reject(new Error("ConversationHandle 已关闭"));if(void 0!==$)return $;const e=new DOMException("本次清历史已取消旧窗口导航","AbortError");Ie(e),r.invalidateHistory?.(x,e);const t=[...Y.values()],o=Promise.all(t.map(t=>t.catch(t=>{if(t!==e)throw t}))).then(async()=>{be();const e=[...r.domainState.getMessagesByConversation(x),...F.window.list()];if(r.hasOutboxForConversation(x)||e.some(e=>r.isOutboxOwned(e.id)))throw ct("IM_SDK_LOCAL_HISTORY_CLEAR_OUTBOX_OWNED");if(e.some(e=>"pending"===e.status||"uploading"===e.status||"sending"===e.status))throw ct("IM_SDK_LOCAL_HISTORY_CLEAR_MESSAGE_IN_FLIGHT");return await r.domainState.clearLocalConversationHistory(x),be(),Object.freeze({scope:"local-only",remoteHistory:"remote-history-may-restore"})}).catch(e=>{if(e instanceof Error&&"ImLocalConversationHistoryClearError"===e.name)throw e;throw ct("IM_SDK_LOCAL_HISTORY_CLEAR_FAILED",e)}).finally(()=>{$===o&&($=void 0)});return $=o,o}())},messages:{sendText:async(e,t={})=>{be();const o=E(x,e,t);if("code"in o)return{ok:!1,error:o};const n=r.domainState.getDraft(x)?.updatedAt;return Xe("messages.sendText",async()=>{const e=await r.sendText(o);return be(),await lt(n,"messages.sendText"),$e(e.id,"messages.sendText")},async e=>{const t=b.appendTextPermissionFailure?.(o);return void 0===t?{ok:!1,error:e}:(await lt(n,"messages.sendText"),{ok:!0,message:s(t)})})},sendContact:async(e,t={})=>{be();const o=e.targetId.trim(),a=e.displayName.trim();if(""===o||""===a)return{ok:!1,error:n({code:""===o?"IM_SDK_CONTACT_CARD_TARGET_REQUIRED":"IM_SDK_CONTACT_CARD_NAME_REQUIRED",category:"validation",operation:"messages.sendContact",retryable:!1,conversation:x})};const s={...x,contact:{...e,targetId:o,displayName:a},encrypted:"direct"!==x.conversationType&&"robot"!==x.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}};return Xe("messages.sendContact",async()=>$e((await r.sendContact(s)).id,"messages.sendContact"))},sendImage:async(e,t={})=>(be(),e.size>L?et("IM_SDK_IMAGE_TOO_LARGE","validation","messages.sendImage"):void 0!==t.caption&&""!==t.caption?et("IM_SDK_IMAGE_CAPTION_UNSUPPORTED","unsupported","messages.sendImage"):qe(t.localPreviewMetadata)?gt("messages.sendImage","image",e,t,r.sendImage):et("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation","messages.sendImage")),sendMediaAlbum:async(e,t={})=>(be(),async function(e,t){const n="messages.sendMediaAlbum";if(0===e.length)return et("IM_SDK_MEDIA_ALBUM_EMPTY","validation",n);if(e.length>w)return et("IM_SDK_MEDIA_ALBUM_TOO_MANY","validation",n);if(void 0!==t.caption&&Array.from(t.caption).length>_)return et("IM_SDK_MEDIA_ALBUM_CAPTION_TOO_LONG","validation",n);for(const t of e){if("image/gif"===t.file.type)return et("IM_SDK_MEDIA_ALBUM_GIF_UNSUPPORTED","unsupported",n);if("image"===t.kind){if(t.file.size>L)return et("IM_SDK_IMAGE_TOO_LARGE","validation",n);if(!qe(t.localPreviewMetadata))return et("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation",n)}else{if(t.file.size>R)return et("IM_SDK_VIDEO_TOO_LARGE","validation",n);if(!Je(t.localPreviewMetadata))return et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",n)}}return Xe(n,async()=>{for(const t of e){if("image"!==t.kind)continue;const e=await o(t.file);if(be(),!e)return et("IM_SDK_IMAGE_FORMAT_UNSUPPORTED","unsupported",n)}const a=await Promise.all(e.map(async e=>{if(void 0!==e.localPreviewMetadata||void 0===r.prepareMediaPreview)return e.localPreviewMetadata;const t=new AbortController;return r.prepareMediaPreview({operationId:`${x.conversationType}:${x.conversationId}:${n}:${++ee}`,kind:e.kind,file:e.file,signal:t.signal})}));be();const s=[];for(const[t,o]of e.entries()){const e=a[t];if("image"===o.kind&&!qe(e))return et("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation",n);if("video"===o.kind){if(!Je(e))return et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",n);if(void 0!==r.prepareMediaPreview&&!Ze(e))return et("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",n)}const i="name"in o.file?o.file.name:void 0;s.push({kind:o.kind,data:o.file,...""===o.file.type?{}:{mimeType:o.file.type},..."string"==typeof i&&""!==i?{filename:i}:{},...void 0===o.localPreviewUrl?{}:{localPreviewUrl:o.localPreviewUrl},...void 0===e?{}:{localPreviewMetadata:e}})}const i=b.recheckSendPermissionError?.(n);if(void 0!==i)return{ok:!1,error:i};const d=await r.sendMediaAlbum({...x,items:s,...void 0===t.caption||""===t.caption.trim()?{}:{caption:t.caption},...void 0===t.hd?{}:{hd:t.hd},...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}});return d.ok?(be(),$e(d.messageId,n)):{ok:!1,error:c(d.reason,n,x)}})}(e,t)),sendVideo:async(e,t={})=>(be(),e.size>R?et("IM_SDK_VIDEO_TOO_LARGE","validation","messages.sendVideo"):Je(t.localPreviewMetadata)?gt("messages.sendVideo","video",e,t,r.sendVideo):et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation","messages.sendVideo")),replaceInterruptedVideo:async(e,t,o={})=>(be(),t.size>R?et("IM_SDK_VIDEO_TOO_LARGE","validation","messages.replaceInterruptedVideo"):Je(o.localPreviewMetadata)?vt("messages.replaceInterruptedVideo",e,"video",t,o,r.replaceVideo):et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation","messages.replaceInterruptedVideo")),sendVoice:async(e,t)=>(be(),Xe("messages.sendVoice",async()=>{const o=await Qe(e,t),n=b.recheckSendPermissionError?.("messages.sendVoice");if(void 0!==n)return{ok:!1,error:n};const a=await r.sendVoice({...o,durationMs:t.durationMs,...void 0===t.waveform?{}:{waveform:[...t.waveform]}});return a.ok?(be(),$e(a.messageId,"messages.sendVoice")):{ok:!1,error:c(a.reason,"messages.sendVoice",x)}})),sendFile:async(e,t={})=>{if(be(),e.size>C)return et("IM_SDK_FILE_TOO_LARGE","validation","messages.sendFile");if(void 0!==t.caption&&Array.from(t.caption).length>_)return et("IM_SDK_MEDIA_ALBUM_CAPTION_TOO_LONG","validation","messages.sendFile");const o=t.fileName??("name"in e?e.name:void 0);return"string"!=typeof o||""===o.trim()?et("IM_SDK_FILE_NAME_REQUIRED","validation","messages.sendFile"):gt("messages.sendFile",void 0,e,t,r.sendFile)},sendGif:async(e,t={})=>(be(),e.size>3145728?et("IM_SDK_GIF_TOO_LARGE","validation","messages.sendGif"):await async function(e){const t=e.type.trim().toLowerCase();if(""!==t&&"image/gif"!==t)return!1;const o=new Uint8Array(await e.slice(0,6).arrayBuffer());if(6!==o.length)return!1;const r=String.fromCharCode(...o);return"GIF87a"===r||"GIF89a"===r}(e)?gt("messages.sendGif",void 0,e,t,e=>r.sendGif(e)):et("IM_SDK_GIF_INVALID","validation","messages.sendGif")),sendSticker:async(e,t={})=>(be(),tt(e,"sticker")?Xe("messages.sendSticker",async()=>$e((await r.sendExpression({...x,asset:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendSticker")):et("IM_SDK_EXPRESSION_ASSET_INVALID","validation","messages.sendSticker")),sendGifAsset:async(e,t={})=>(be(),tt(e,"gif")?Xe("messages.sendGifAsset",async()=>$e((await r.sendExpression({...x,asset:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGifAsset")):et("IM_SDK_EXPRESSION_ASSET_INVALID","validation","messages.sendGifAsset")),sendGame:async(e,t={})=>(be(),"rock-paper-scissors"!==e&&"dice"!==e?et("IM_SDK_GAME_TYPE_INVALID","validation","messages.sendGame"):Xe("messages.sendGame",async()=>$e((await r.sendGame({...x,gameType:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGame"))),sendMiniProgram:async(e,t={})=>(be(),I(e)?Xe("messages.sendMiniProgram",async()=>$e((await r.sendMiniProgram({...x,miniProgram:e,encrypted:"direct"!==x.conversationType&&"robot"!==x.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendMiniProgram")):et("IM_SDK_MINI_PROGRAM_BODY_INVALID","validation","messages.sendMiniProgram")),sendTransfer:async(e,t={})=>(be(),"channel"===x.conversationType||"robot"===x.conversationType?et("IM_SDK_TRANSFER_CHANNEL_UNSUPPORTED","unsupported","messages.sendTransfer"):u(e)?Xe("messages.sendTransfer",async()=>$e((await r.sendTransfer({...x,transfer:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendTransfer")):et("IM_SDK_TRANSFER_BODY_INVALID","validation","messages.sendTransfer")),sendGift:async(e,t={})=>(be(),"channel"===x.conversationType||"robot"===x.conversationType?et("IM_SDK_GIFT_CHANNEL_UNSUPPORTED","unsupported","messages.sendGift"):f(e)?Xe("messages.sendGift",async()=>$e((await r.sendGift({...x,gift:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGift")):et("IM_SDK_GIFT_BODY_INVALID","validation","messages.sendGift")),sendLiveRoom:async(e,t={})=>(be(),y(e)?Xe("messages.sendLiveRoom",async()=>$e((await r.sendLiveRoom({...x,liveRoom:e,encrypted:"direct"!==x.conversationType&&"robot"!==x.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendLiveRoom")):et("IM_SDK_LIVE_ROOM_BODY_INVALID","validation","messages.sendLiveRoom")),toggleReaction:async(e,t)=>{be(),ot("messages.toggleReaction"),st(e,"messages.toggleReaction");const o=await r.setReaction({conversation:x,parentMessageId:e,emoji:t,action:"toggle"});if(be(),!o.ok)throw it("messages.toggleReaction",A[o.reason]);return Object.freeze({messageId:e,eventId:o.event.id,emoji:o.event.emoji,action:0===o.event.action?"add":"remove"})},setReaction:async(e,t,o)=>{be(),ot("messages.setReaction"),st(e,"messages.setReaction");const n=await r.setReaction({conversation:x,parentMessageId:e,emoji:t,action:o});if(be(),!n.ok)throw it("messages.setReaction",A[n.reason]);return Object.freeze({messageId:e,eventId:n.event.id,emoji:n.event.emoji,action:0===n.event.action?"add":"remove"})},replaceInterruptedFile:async(e,t,o={})=>{if(be(),ot("messages.replaceInterruptedFile"),t.size>C)return et("IM_SDK_FILE_TOO_LARGE","validation","messages.replaceInterruptedFile");if(void 0!==o.caption&&""!==o.caption)return et("IM_SDK_FILE_CAPTION_UNSUPPORTED","unsupported","messages.replaceInterruptedFile");const n=o.fileName??("name"in t?t.name:void 0);return"string"!=typeof n||""===n.trim()?et("IM_SDK_FILE_NAME_REQUIRED","validation","messages.replaceInterruptedFile"):vt("messages.replaceInterruptedFile",e,"file",t,{...o,fileName:n},r.replaceFile)},editText:async(e,t,o={})=>{be(),ot("messages.editText"),st(e,"messages.editText"),N(r.domainState,x,e,"messages.editText");const n=D(x,e,t,o);if("code"in n)throw rt(n);let i;try{i=await r.editMessage(n)}catch(e){throw rt(a(e,"messages.editText",x))}if(be(),!i.ok)throw it("messages.editText",h[i.reason]);return s(st(e,"messages.editText"))},recall:async e=>{let t;be(),ot("messages.recall"),st(e,"messages.recall"),N(r.domainState,x,e,"messages.recall");try{t=await r.recallMessage({...x,messageId:e})}catch(e){throw rt(a(e,"messages.recall",x))}if(be(),!t.ok)throw it("messages.recall",T[t.reason])},deleteLocal:async e=>{be(),ot("messages.deleteLocal"),N(r.domainState,x,e,"messages.deleteLocal");const t=r.domainState.getConversationMessage(x,e);if(r.isOutboxOwned(e))throw dt("IM_SDK_LOCAL_DELETE_OUTBOX_OWNED");if(void 0!==t&&t.conversationType===x.conversationType&&t.conversationId===x.conversationId&&("pending"===t.status||"uploading"===t.status||"sending"===t.status))throw dt("IM_SDK_LOCAL_DELETE_MESSAGE_IN_FLIGHT");try{r.invalidateHistory?.(x);const t=await r.domainState.deleteLocalMessage(x,e);return be(),Object.freeze({scope:"local-only",messageId:e,deleted:t,remoteHistory:"remote-history-may-restore"})}catch(e){if(e instanceof Error&&"code"in e&&"IM_MESSAGE_PINNED"===e.code)throw dt("IM_SDK_MESSAGE_PINNED",e);if(e instanceof Error&&"ImLocalMessageDeletionError"===e.name)throw e;throw dt("IM_SDK_LOCAL_DELETE_FAILED",e)}},forward:async(e,t)=>{if(be(),ot("messages.forward"),0===e.length||0===t.length)throw rt(n({code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",operation:"messages.forward",retryable:!1,conversation:x}));return at("messages.forward",e.map(e=>({id:e,...x})),t)},forwardMediaAlbumItem:async(e,t,o)=>{be(),ot("messages.forwardMediaAlbumItem");const r="messages.forwardMediaAlbumItem";if(""===e.trim()||0===o.length)throw rt(n({code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",operation:r,retryable:!1,conversation:x}));if(!Number.isInteger(t)||t<0)throw rt(n({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:r,retryable:!1,conversation:x,details:{itemIndex:t}}));return at(r,[{id:e,...x,itemIndex:t}],o)},fetchByIds:async e=>{be();const t=r.fetchMessagesByIdBatch;if(void 0===t)throw rt(n({code:"IM_SDK_MESSAGE_LOOKUP_UNSUPPORTED",category:"unsupported",operation:"messages.fetchByIds",retryable:!1,conversation:x}));const o=r.beginReceiving?.();try{const o=await l({messageIds:e,fetchBatch:t,isCurrent:()=>!q,projectMessage:Ne});return Object.freeze({messages:Object.freeze([...o.messages]),missingMessageIds:Object.freeze([...o.missingMessageIds]),unresolvedMessageIds:Object.freeze([...o.unresolvedMessageIds]),...void 0===o.failure?{}:{failure:Object.freeze(o.failure)}})}finally{o?.()}}},draft:{get:async()=>(be(),"customerService"===x.conversationType?null:r.drafts.get(x)),save:async e=>{if(be(),"customerService"===x.conversationType)throw new Error("客服会话不支持草稿");return r.drafts.save(x,e)},clear:async()=>{be(),"customerService"!==x.conversationType&&await r.drafts.clear(x)},subscribe:e=>(be(),W.add(e),()=>W.delete(e))},markRead:async e=>{be();const t=F.window.list();if(void 0!==e&&!t.some(t=>t.id===e))throw new Error(`待标记已读消息不存在或不属于当前 handle 窗口:${e}`);const o=void 0===b.resolveReadMessageId?e??t.at(-1)?.id:b.resolveReadMessageId(t,e);void 0!==o&&await r.markRead({...x,readCursor:o})},markConversationRead:async()=>{if(be(),void 0===r.markConversationRead)throw new Error("当前会话未装配整会话已读能力");const e=Me,t=await async function(){if(Se){const e=/* @__PURE__ */new Map,t=r.domainState.getLoadedMessagesByConversation(x);for(const o of[pe,...t])void 0!==o&&e.set(o.id,r.domainState.getConversationMessage(x,o.id)??o);return Ve([...e.values()].sort((e,t)=>e.sortKey.localeCompare(t.sortKey))),pe?.id}const e=Me,t=r.domainState.createMessageWindow(j);try{const o=await t.window.open(x,{limit:G});if(be(),o.stale)throw new Error("无法确认会话最新已读边界");if(Ge(t.window)){const e=await t.window.loadOlder({limit:G,establishLatestOnly:!0});if(be(),e.stale)throw new Error("无法确认会话远端最新已读边界")}if(e!==Me)throw new DOMException("会话已读确认已失效","AbortError");Ve(t.window.list()),Se=!0;const r=t.window.list();return void 0===b.resolveReadMessageId?r.at(-1)?.id:b.resolveReadMessageId(r)}finally{t.dispose()}}();if(be(),e!==Me)throw new DOMException("会话已读确认已失效","AbortError");if("channel"===x.conversationType&&void 0===t&&F.window.list().length>0)throw new Error("当前频道缺少可信的最新已读消息");if(void 0!==t&&void 0===r.domainState.getConversationMessage(x,t)){const o=pe?.id===t?pe:void 0;if(void 0===o)throw new Error("缺少会话最新已读边界的消息证明");Ee??(Ee=r.domainState.createMessageWindow({retention:{maxMessages:G}}));const n=await Ee.window.openAt(x,{anchorSortKey:o.sortKey,limit:G,seedMessages:[o],seedHasNewer:!1});if(be(),n.stale||e!==Me)throw new DOMException("会话已读确认已失效","AbortError")}await r.markConversationRead(x,t)},markVisibleMessages:async e=>{if(be(),void 0===r.markVisibleMessages)throw new Error("当前会话未装配可见消息回执能力");const t=[...new Set(e)];if(t.some(e=>!F.window.list().some(t=>t.id===e)))throw new Error("可见回执包含当前连续窗口之外的消息");t.length>0&&await r.markVisibleMessages(x,t)},setMuted:async e=>(be(),r.setMuted(x,e)),close(){q||(q=!0,De.abort(),Ie(),He(),H.clear(),W.clear(),Ae.clear(),Ee?.dispose(),F.dispose())}};return S.set(yt,{getMessages:()=>(be(),F.window.list()),resolveMessage:async e=>(be(),F.window.list().find(t=>t.id===e)??r.domainState.resolveConversationMessage(x,e))}),yt}async function G(e,t,o={}){let r,a,s=!1;function i(){const o=Date.now();if(void 0!==r&&o-r.checkedAt<5e3)return Promise.resolve(r.value);if(void 0!==a)return a;const n=t.getRelationship(e.conversationId).then(e=>(r={value:e,checkedAt:Date.now()},e)).catch(e=>(s=!0,t.emitter.emit({type:"error",error:{scope:"http",message:"direct 发送前关系查询失败,已降级为服务端 ACK 裁决",cause:e}}),r={value:"unknown",checkedAt:Date.now()},"unknown")).finally(()=>{a===n&&(a=void 0)});return a=n,n}t.shouldCheckRelationship()&&i();const d=await x(e,t,(e,t,o)=>void 0!==o.mentions&&o.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.sendText",retryable:!1,conversation:e}):{...e,text:t,encrypted:!0,...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}},(e,t,o,r)=>void 0!==r.mentions&&r.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.editText",retryable:!1,conversation:e}):{...e,messageId:t,text:o},{getSendPermissionError:async function(o){if(!t.shouldCheckRelationship())return;const r=await i();if("friend"!==r){if("unknown"!==r)return n({code:"IM_SDK_DIRECT_CONTACT_REQUIRED",category:"permission",operation:o,retryable:!1,conversation:e,details:Object.freeze({relationship:r})});s||(s=!0,t.emitter.emit({type:"error",error:{scope:"protocol",message:"direct 发送前关系状态未知,已降级为服务端 ACK 裁决",cause:{conversation:e,relationship:r}}}))}},appendTextPermissionFailure:t.appendContactRequiredTextFailure},o),c={...d,messages:{...d.messages,async markMediaConsumed(o){const r=t.domainState.getConversationMessage(e,o);if(void 0===r||r.senderId===t.getSelfId()||"voice"!==r.contentType&&"video"!==r.contentType){const t=n({code:"IM_SDK_MEDIA_CONSUMPTION_MESSAGE_INVALID",category:"validation",operation:"messages.markMediaConsumed",retryable:!1,conversation:e});throw Object.assign(new Error(t.code),t)}await t.markDirectMediaConsumed(e.conversationId,o)}}};return D(c,d),c}async function j(e,t,o={}){return x(e,t,(e,t,o)=>{const n=r(o.mentions);return{...e,text:t,encrypted:!0,...void 0===n?{}:{mention:n},...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}}},(e,t,o,n)=>{const a=r(n.mentions);return{...e,messageId:t,text:o,...void 0===a?{}:{mention:a}}},{getSendPermissionError:t.getSendPermissionError,recheckSendPermissionError:t.getSendPermissionError,shouldEstablishRemoteLatestOnOpen:r=>("first-unread"===o.initialPosition||!0===o.captureEntryUnread)&&void 0!==t.domainState.getConversationContext(e)&&z(r,t.pageSize??30)},o)}async function F(e,t,o={}){return x(e,t,(e,t,o)=>void 0!==o.mentions&&o.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.sendText",retryable:!1,conversation:e}):{...e,text:t,encrypted:!1,...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}},(e,t,o,r)=>void 0!==r.mentions&&r.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.editText",retryable:!1,conversation:e}):{...e,messageId:t,text:o},{shouldEstablishRemoteLatestOnOpen:()=>!1},o)}const V=/* @__PURE__ */new Set(["pending","uploading","sending"]);function z(e,t){return e.length<t}function B(e){const t=e.extensions?.historyCursor;return"string"==typeof t&&""!==t.trim()}async function H(e,t,o={}){const n=await x(e,t,(e,t,o)=>{const n=r(o.mentions);return{...e,text:t,encrypted:!0,...void 0===n?{}:{mention:n},...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}}},(e,t,o,n)=>{const a=r(n.mentions);return{...e,messageId:t,text:o,...void 0===a?{}:{mention:a}}},{getSendPermissionError:t.getSendPermissionError,recheckSendPermissionError:t.getSendPermissionError,shouldEstablishRemoteLatestOnOpen:r=>("first-unread"===o.initialPosition||!0===o.captureEntryUnread)&&void 0!==t.domainState.getConversationContext(e)&&z(r,t.pageSize??30)||function(e,t){let o=!1;for(const r of e){const e=r.body.system;if("channel"===r.conversationType&&!0===e?.targetUserIds?.includes(t))if("channel_member_left"!==e.eventType&&"channel_member_removed"!==e.eventType){if(o&&("channel_member_joined"===e.eventType||"channel_member_invited"===e.eventType))return!0}else o=!0}return!1}(r,t.getSelfId()),reconcilePage:t.reconcilePage,resolveReadMessageId:(e,o)=>function(e,t,o){const r=void 0===o?e.length-1:e.findIndex(e=>e.id===o),n=e[r];if(void 0===n||B(n))return n?.id;const a=e.slice(0,r).findLast(e=>B(e));return void 0!==a?a.id:n.senderId===t&&V.has(n.status)?void 0:n.id}(e,t.getSelfId(),o)},o),s={...n,messages:{...n.messages,deleteForEveryone:async o=>{if(void 0===t.domainState.getConversationMessage(e,o))throw O(e,b["not-found"]);let r;N(t.domainState,e,o,"messages.deleteForEveryone");try{r=await t.deleteMessageForEveryone({...e,messageId:o})}catch(t){const o=a(t,"messages.deleteForEveryone",e);throw Object.assign(new Error(o.code,{cause:t}),o)}if(!r.ok)throw O(e,b[r.reason])}}};return D(s,n),s}async function W(e,t,o={}){const r=t=>n({code:"IM_SDK_CUSTOMER_SERVICE_READ_ONLY",category:"permission",operation:t,retryable:!1,conversation:e});return x(e,t,()=>r("messages.sendText"),()=>r("messages.edit"),{getSendPermissionError:r,recheckSendPermissionError:r},o)}export{H as createChannelConversationHandle,W as createCustomerServiceConversationHandle,G as createDirectConversationHandle,j as createGroupConversationHandle,F as createRobotConversationHandle,D as linkConversationHandleDomainAccess};
|
|
@@ -1 +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{isCryptoExecutionError as a}from"../../../im-core/src/ports/crypto-task-executor.js";const i=6048e5,n=1048576;function s(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*n,maxEntries:512,maxEntryBytes:30*n,maxIdleMs:i},{kind:"video",softMaxBytes:1792*n,maxEntries:64,maxEntryBytes:200*n,maxIdleMs:i}])}function c(e){return Number.isFinite(e)?Math.max(0,Math.min(100,Math.round(e))):0}function l(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 u({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=l({conversationType:t,conversationId:o});return I({id:m(e.direction,r,e.messageId),messageId:e.messageId,ref:r,direction:e.direction,state:e.state,percent:c(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:f(e.failure,r)}})}function u(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 f(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 I(e){return Object.freeze({...e,ref:l(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 g(e){const t=e?.conversation,o=t?.conversationType,r=t?.conversationId;if("supergroup"===o)throw u({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 u({code:"IM_SDK_MEDIA_MESSAGE_REF_INVALID",category:"validation",operation:"media.download",retryable:!1});return l({conversationType:o,conversationId:r})}function v(e){let t=!0;const n=e.now??Date.now;let d=0,f=0;const v=/* @__PURE__ */new Map,_=/* @__PURE__ */new Set,E=/* @__PURE__ */new Map,h=/* @__PURE__ */new Map,A=/* @__PURE__ */new Map,D=/* @__PURE__ */new Map,b=/* @__PURE__ */new Map,M=/* @__PURE__ */new Set;let w=!1;const T=/* @__PURE__ */new Map,L=/* @__PURE__ */new Set,S=e.maxDownloadCheckpointBytes??536870912;function C(e){return u({code:"IM_SDK_MEDIA_DOWNLOAD_RESTART_REQUIRED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function K(e,t){T.delete(e),L.add(e);const o=v.get(e);if(void 0!==o){const e={...o,recoveryReason:t,..."failed"===o.state||"canceled"===o.state?{error:C(o.ref)}:{}};"running"===o.state?J(e):G(e)}}const O=s(3);let R;const U=e.maxCachedBlobs??8,P=e.maxCachedBlobBytes??67108864;let N=0;function k(){if(!t||!e.isActive())throw u({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.tasks",retryable:!1})}function V(){return Object.freeze([...v.values()])}function x(){const t=V();for(const o of[..._])try{o(t)}catch(t){e.emitter.emit({type:"error",error:{scope:"unknown",message:"媒体任务订阅者回调异常",cause:t}})}}function F(){!w&&t&&e.isActive()&&(w=!0,queueMicrotask(()=>{if(w=!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 j(e){const t=A.get(e);void 0!==t&&(N-=t.size,A.delete(e),D.delete(e),b.delete(e),F())}function z(){if(!t||!e.isActive())return;const o=n();for(const[e,t]of T)!h.has(e)&&void 0!==t.idleSince&&o-t.idleSince>=864e5&&K(e,"download-checkpoint-expired");for(const[e,t]of D)!h.has(e)&&o-t>=i&&j(e);F()}function B(e,t){const o=A.get(e);if(void 0!==o){if(!(b.get(e)!==t||n()-D.get(e)>=i))return A.delete(e),A.set(e,o),D.set(e,n()),o;j(e)}}function W(){d+=1,A.clear(),D.clear(),b.clear(),F(),N=0;for(const e of[...T.keys()])K(e,"download-checkpoint-cleared")}function Y(e){v.delete(e),E.delete(e),T.delete(e),L.delete(e),j(e)}function J(e){v.set(e.id,I(e)),function(){for(;v.size>128;){const e=[...v.values()].find(e=>"completed"===e.state||"failed"===e.state||"canceled"===e.state);if(void 0===e)return;Y(e.id)}}()}function G(o){if(!t||!e.isActive())return;J(o);const r=v.get(o.id);if(x(),!t||!e.isActive()||void 0===r||v.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 H(e,t,o){if(j(e),!(t.size>P))for(A.set(e,t),b.set(e,o),F(),D.set(e,n()),N+=t.size;A.size>U||N>P;){const e=A.keys().next().value;if(void 0===e)break;j(e)}}function $(t,r=!0){const a=g(t),i=e.domainState.getConversationMessage(a,t.messageId);if(void 0===i)throw u({code:"IM_SDK_MEDIA_MESSAGE_NOT_FOUND",category:"state",operation:"media.download",retryable:!1,conversation:a});let n,s,d,c;if("image"===i.contentType)n=i.body.image,s=e.loaders?.loadImage,c="image";else if("video"===i.contentType)n=i.body.video,s=e.loaders?.loadVideo,c="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,d=i.body.file?.mimeType;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 u({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});s=e.loaders?.loadFile}else if("mediaAlbum"===i.contentType){const o=i.body.mediaAlbum?.items,r=t.itemIndex,d=void 0===r||void 0===o?void 0:o[r];if(void 0===d)throw u({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});n=d,s="video"===d.kind?e.loaders?.loadVideo:e.loaders?.loadImage,c=d.kind}if("mediaAlbum"!==i.contentType&&"filesAlbum"!==i.contentType&&void 0!==t.itemIndex)throw u({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});if(void 0===n)throw u({code:"IM_SDK_MEDIA_MESSAGE_UNSUPPORTED",category:"unsupported",operation:"media.download",retryable:!1,conversation:a});if(r&&void 0===s)throw u({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:a});if(""===n.url.trim()||n.url.startsWith("blob:"))throw u({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===d?{}:{mimeType:d},...void 0===c?{}:{cacheKind:c,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 u({code:"IM_SDK_MEDIA_DOWNLOAD_CANCELED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function Q(){return u({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.download",retryable:!1})}async function X(t,o,r=d){if(k(),r!==d)return null;const a=m("download",t.ref,t.messageId,t.itemIndex),i=B(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 u({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(k(),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 H(a,l,t.resourceVersion),l}function Z(e,t){z();const o=T.get(e);if(void 0!==o&&o.url!==t.input.url&&K(e,"download-object-changed"),L.has(e)){const o=C(t.ref),r=v.get(e);throw void 0===r||"failed"!==r.state&&"canceled"!==r.state||G({...r,error:o}),o}return o?.state}function ee(o,r=!1){const i=d,s=m("download",o.ref,o.messageId,o.itemIndex),p=h.get(s);if(void 0!==p&&!p.controller.signal.aborted)return p.promise;if(!r){const e=B(s,o.resourceVersion);if(void 0!==e)return G({id:s,ref:l(o.ref),messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex},direction:"download",state:"completed",percent:100}),Promise.resolve(e)}j(s);const y=(()=>{const e=Z(s,o);return void 0===e?{percent:0}:{percent:Math.min(99,Math.round(e.bytesDownloaded/e.bytesTotal*100)),bytesTransferred:e.bytesDownloaded,bytesTotal:e.bytesTotal}})(),f=l(o.ref);E.set(s,Object.freeze({conversation:f,messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}}));const I={id:s,messageId:o.messageId,ref:f,direction:"download",...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}},g=new AbortController,_=Promise.resolve().then(async()=>{let l;try{if(!t||!e.isActive())throw Q();if(g.signal.aborted)throw q(f);if(l=await O.acquire(g.signal,()=>R===s?1:0),!t||!e.isActive())throw Q();if(g.signal.aborted)throw q(f);if(G({...I,...y,state:"running"}),!t||!e.isActive())throw Q();if(g.signal.aborted)throw q(f);if(!r&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const e=await X(o,!1,i);if(null!==e){if(g.signal.aborted)throw q(f);return T.delete(s),L.delete(s),G({...v.get(s),...I,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),e}}const a=o.load;if(void 0===a)throw u({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:f});const n=Z(s,o);if(void 0!==y.bytesTransferred&&(void 0===n||i!==d))throw K(s,"download-checkpoint-cleared"),C(f);const m=await a({...o.input,getPriority:()=>R===s?1:0,...void 0===n?{}:{resume:n},onResumable:r=>{t&&e.isActive()&&i===d&&h.get(s)?.controller===g&&function(e,t,o){T.delete(e),T.set(e,{url:t,state:o}),L.delete(e);let r=[...T.values()].reduce((e,t)=>e+t.state.bytesDownloaded,0);for(;T.size>8||r>S;){const e=T.entries().next().value;if(void 0===e)break;r-=e[1].state.bytesDownloaded,K(e[0],"download-checkpoint-limit")}}(s,o.input.url,r)},onResumeInvalidated:()=>{t&&e.isActive()&&i===d&&h.get(s)?.controller===g&&K(s,"download-checkpoint-invalid")},signal:g.signal,onTransferProgress:o=>{const r=v.get(s);t&&e.isActive()&&!g.signal.aborted&&h.get(s)?.controller===g&&"running"===r?.state&&G({...r,state:"running",percent:Math.min(99,c(o.percent)),bytesTransferred:o.bytesTransferred,bytesTotal:o.bytesTotal,phase:o.bytesTotal>0&&o.bytesTransferred>=o.bytesTotal?"finalizing":"transferring"})},onProgress:o=>{const r=v.get(s);if(!t||!e.isActive()||g.signal.aborted||h.get(s)?.controller!==g||"running"!==r?.state)return;const a=Math.min(99,c(o));a<=r.percent||G({...r,state:"running",percent:a})}});if(!t||!e.isActive())throw Q();if(g.signal.aborted)throw q(f);const p=m instanceof Blob?void 0:m;let _=void 0===p?m:new Blob([p],void 0===o.mimeType?void 0:{type:o.mimeType});if(void 0!==o.mimeType&&_.type!==o.mimeType&&(_=_.slice(0,_.size,o.mimeType)),i===d&&H(s,_,o.resourceVersion),i===d&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const t=_.size;e.assetCache.put({kind:o.cacheKind,messageId:o.messageId,resourceVersion:o.resourceVersion,blob:_,...void 0===o.mimeType?{}:{mimeType:o.mimeType}}).then(r=>{F(),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(T.delete(s),L.delete(s),G({...v.get(s),...I,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),!t||!e.isActive())throw Q();return _}catch(o){if(!t||!e.isActive())throw Q();if(g.signal.aborted||"object"==typeof o&&null!==o&&"code"in o&&"IM_SDK_MEDIA_DOWNLOAD_CANCELED"===o.code){const e=q(f);throw h.get(s)?.controller===g&&"canceled"!==v.get(s)?.state&&G({...v.get(s),...I,state:"canceled",percent:v.get(s)?.percent??0,error:L.has(s)?C(f):e}),e}const r=L.has(s)?C(f):a(o)?u({code:"IM_SDK_CRYPTO_EXECUTION_FAILED",category:"state",operation:"crypto.execute",retryable:"queue-full"===o.reason,conversation:f,details:{reason:o.reason}}):o instanceof Error&&"ImMediaTaskOperationError"===o.name?o:u({code:"IM_SDK_MEDIA_DOWNLOAD_FAILED",category:"network",operation:"media.download",retryable:!0,conversation:f});throw h.get(s)?.controller===g&&G({...v.get(s),...I,state:"failed",percent:v.get(s)?.percent??0,error:r}),r}finally{if(l?.(),h.get(s)?.controller===g){h.delete(s);const e=T.get(s);void 0!==e&&(e.idleSince=n())}}});return h.set(s,{controller:g,promise:_}),G({...I,...y,state:"queued"}),_}function te(e,t){k();const o=v.get(e);if(void 0===o)throw u({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:t,retryable:!1});return o}function oe(e,t){return u({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 re=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&&(J(p(e.task)),x()))});return{api:{async clearCache(){k(),e.connection.invalidateMediaAssetCacheWrites?.(),W();try{await(e.assetCache?.clear())}catch(t){throw k(),e.emitter.emit({type:"error",error:{scope:"storage",message:"媒体缓存清理失败",cause:t}}),u({code:"IM_SDK_MEDIA_CACHE_CLEAR_FAILED",category:"state",operation:"media.clearCache",retryable:!0})}k(),F()},getSnapshot:()=>(k(),V()),subscribe:e=>(k(),_.add(e),()=>_.delete(e)),async cancel(t,o){const r=te(t,"media.cancel");if("queued"!==r.state&&"running"!==r.state&&("upload"!==r.direction||"paused"!==r.state))throw oe(r,"media.cancel");if("upload"===r.direction){if(!(void 0===o?e.connection.cancelMediaUpload(r.messageId):e.connection.cancelMediaUpload(r.messageId,o)))throw u({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.cancel",retryable:!1,conversation:r.ref});return}const a=h.get(t);if(void 0===a)throw oe(r,"media.cancel");a.controller.abort();const i=L.has(t)?C(r.ref):q(r.ref);G({...r,state:"canceled",error:i})},async pause(t){const o=te(t,"media.pause");if("upload"!==o.direction||"queued"!==o.state&&"running"!==o.state)throw oe(o,"media.pause");if(!await(e.connection.pauseMediaUpload?.(o.messageId)))throw u({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.pause",retryable:!1,conversation:o.ref});k()},async resume(t){const o=te(t,"media.resume");if("upload"!==o.direction||"paused"!==o.state)throw oe(o,"media.resume");if(!e.connection.resumeMediaUpload?.(o.messageId))throw u({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.resume",retryable:!1,conversation:o.ref})},async retry(t,o){const r=te(t,"media.retry");if("failed"!==r.state&&"canceled"!==r.state)throw oe(r,"media.retry");if("upload"===r.direction){if(void 0!==o?.restartDownload)throw oe(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 u({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 u({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.retry",retryable:!1,conversation:r.ref});return}if(void 0!==o?.restartUpload)throw oe(r,"media.retry");if(h.has(t)&&!h.get(t).controller.signal.aborted)throw u({code:"IM_SDK_MEDIA_TASK_IN_FLIGHT",category:"state",operation:"media.retry",retryable:!0,conversation:r.ref});const a=E.get(t);if(void 0===a)throw u({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:"media.retry",retryable:!1});!0===o?.restartDownload&&(T.delete(t),L.delete(t)),await ee($(a),!0)},async getUploadRecovery(t){k();const o=g(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);k();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){k();return{available:!1,reason:"object"==typeof e&&null!==e&&"reason"in e?String(e.reason):"storage"}}},async resumeUpload(t,o){k();const r=g(t);if(void 0!==t.itemIndex||void 0===e.connection.recoverMediaUpload)throw u({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(k(),!a.ok&&"paused"===a.reason)throw u({code:"IM_SDK_MEDIA_PAUSED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});if(!a.ok&&"cancelled"===a.reason)throw u({code:"IM_SDK_MEDIA_CANCELLED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});if(!a.ok)throw u({code:"IM_SDK_MEDIA_RECOVERY_UPLOAD_FAILED",category:"state",operation:"media.resumeUpload",retryable:!0,conversation:r})}catch(e){if(k(),"object"==typeof e&&null!==e&&"code"in e&&"string"==typeof e.code&&e.code.startsWith("IM_SDK_"))throw e;throw u({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){try{return k(),ee($(e))}catch(e){return Promise.reject(e)}},prioritizeDownload:function(e){k();const t=g(e);R=m("download",t,e.messageId,e.itemIndex)},probeCached:async function(t){k();const o=d,r=t.map(e=>$(e,!1)),a=/* @__PURE__ */new Map,s=n(),c=r.map(e=>{const t=m("download",e.ref,e.messageId,e.itemIndex);return A.has(t)&&b.get(t)===e.resourceVersion&&s-(D.get(t)??0)<i});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 p=l.map(()=>!1);if(l.length>0&&void 0!==e.assetCache){if(void 0===e.assetCache.hasMany)throw u({code:"IM_SDK_MEDIA_CACHE_PROBE_UNAVAILABLE",category:"contract",operation:"media.probeCached",retryable:!1});try{if(p=await e.assetCache.hasMany(l),p.length!==l.length||p.some(e=>"boolean"!=typeof e))throw new Error("媒体缓存查询结果数量或类型不符")}catch(t){throw k(),e.onAssetCacheEvent?.({operation:"get",outcome:"failed",kind:l[0].kind,messageId:l[0].messageId,cause:t}),u({code:"IM_SDK_MEDIA_CACHE_READ_FAILED",category:"state",operation:"media.probeCached",retryable:!0})}}if(k(),o!==d)throw u({code:"IM_SDK_MEDIA_CACHE_QUERY_STALE",category:"state",operation:"media.probeCached",retryable:!0});const y=new Map(l.map((e,t)=>[JSON.stringify(e),p[t]]));return Object.freeze(r.map((e,t)=>c[t]||!0===y.get(JSON.stringify({kind:e.cacheKind,messageId:e.messageId,resourceVersion:e.resourceVersion}))))},subscribeCacheChanges:e=>(k(),M.add(e),()=>M.delete(e)),getCached:async function(e){const t=$(e,!1);return void 0===t.cacheKind?null:await X(t,!0)},prepareLocalPreview:async function(t){if(k(),r(t.signal),void 0===e.preparePreview)throw u({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalPreview",retryable:!1});let o;try{o=await e.preparePreview({operationId:"media.prepareLocalPreview:"+ ++f,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 k(),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:"image/jpeg"})}:{}}:{width:o.width,height:o.height}},prepareLocalVideoPoster:async function(t){if(k(),r(t.signal),void 0===e.prepareVideoPoster)throw u({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalVideoPoster",retryable:!1});let o;try{o=await e.prepareVideoPoster({operationId:"media.prepareLocalVideoPoster:"+ ++f,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 k(),e.onLocalPreviewError?.({kind:"video",byteLength:t.file.size,cause:o}),null}return r(t.signal),k(),!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("视频封面解码没有返回有效尺寸和 JPEG 字节")}),null):new Blob([o.posterData],{type:"image/jpeg"})},prepareLocalImageThumbnail:async function(t){if(k(),r(t.signal),void 0===e.prepareImageThumbnail)throw u({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),k(),255!==o[0]||216!==o[1]||255!==o[2])return t.file;const a="image/jpeg"===t.file.type?t.file:t.file.slice(0,t.file.size,"image/jpeg"),i=await e.prepareImageThumbnail({operationId:"media.prepareLocalImageThumbnail:"+ ++f,kind:"image",file:a,...void 0===t.signal?{}:{signal:t.signal}});if(r(t.signal),k(),!Number.isFinite(i.width)||!Number.isFinite(i.height)||i.width<=0||i.height<=0||!i.posterData?.byteLength)throw new Error("图片缩略图解码没有返回有效尺寸和 JPEG 字节");return new Blob([i.posterData],{type:"image/jpeg"})}catch(o){if(r(t.signal),o instanceof Error&&"AbortError"===o.name)throw o;return k(),e.onLocalPreviewError?.({kind:"image",byteLength:t.file.size,cause:o}),null}}},clearCache:W,prune:z,dispose(){if(t){t=!1,d+=1,re();for(const e of h.values())e.controller.abort();O.dispose(),R=void 0,h.clear(),_.clear(),M.clear(),b.clear(),v.clear(),E.clear(),A.clear(),D.clear(),T.clear(),L.clear(),N=0}}}}export{d as createDefaultMediaAssetCacheStrategyRegistry,v 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",softMaxBytes:1792*s,maxEntries:64,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 p(e,t,o,r){const a=`${e}:${encodeURIComponent(t.conversationType)}:${encodeURIComponent(t.conversationId)}:${encodeURIComponent(o)}`;return void 0===r?a:`${a}:${r}`}function u(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=m({conversationType:t,conversationId:o});return g({id:p(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:I(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 I(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 g(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 v(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 m({conversationType:o,conversationId:r})}function _(e){let t=!0;const s=e.now??Date.now;let c=0,I=0;const _=/* @__PURE__ */new Map,E=/* @__PURE__ */new Set,h=/* @__PURE__ */new Map,D=/* @__PURE__ */new Map,A=/* @__PURE__ */new Map,b=/* @__PURE__ */new Map,M=/* @__PURE__ */new Map,w=/* @__PURE__ */new Set;let T=!1;const L=/* @__PURE__ */new Map,S=/* @__PURE__ */new Set,C=e.maxDownloadCheckpointBytes??536870912;function K(e){return y({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?$(e):q(e)}}const R=d(3);let U;const P=e.maxCachedBlobs??8,N=e.maxCachedBlobBytes??67108864;let k=0;function V(){if(!t||!e.isActive())throw y({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.tasks",retryable:!1})}function x(){return Object.freeze([..._.values()])}function F(){const t=x();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[...w])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&&(k-=t.size,A.delete(e),b.delete(e),M.delete(e),z())}function B(){if(!t||!e.isActive())return;const o=s();for(const[e,t]of L)!D.has(e)&&void 0!==t.idleSince&&o-t.idleSince>=864e5&&O(e,"download-checkpoint-expired");for(const[e,t]of b)!D.has(e)&&o-t>=n&&j(e);z()}function W(e,t){const o=A.get(e);if(void 0!==o){if(!(M.get(e)!==t||s()-b.get(e)>=n))return A.delete(e),A.set(e,o),b.set(e,s()),o;j(e)}}function Y(){c+=1,A.clear(),b.clear(),M.clear(),z(),k=0;for(const e of[...L.keys()])O(e,"download-checkpoint-cleared")}function H(e){_.delete(e),h.delete(e),L.delete(e),S.delete(e),j(e)}function $(e){_.set(e.id,g(e)),function(){for(;_.size>128;){const e=[..._.values()].find(e=>"completed"===e.state||"failed"===e.state||"canceled"===e.state);if(void 0===e)return;H(e.id)}}()}function q(o){if(!t||!e.isActive())return;$(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(j(e),!(t.size>N))for(A.set(e,t),M.set(e,o),z(),b.set(e,s()),k+=t.size;A.size>P||k>N;){const e=A.keys().next().value;if(void 0===e)break;j(e)}}function G(t,r=!0){const a=v(t),i=e.domainState.getConversationMessage(a,t.messageId);if(void 0===i)throw y({code:"IM_SDK_MEDIA_MESSAGE_NOT_FOUND",category:"state",operation:"media.download",retryable:!1,conversation:a});let n,s,d,c;if("image"===i.contentType)n=i.body.image,s=e.loaders?.loadImage,c="image";else if("video"===i.contentType)n=i.body.video,s=e.loaders?.loadVideo,c="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,d=i.body.file?.mimeType;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 y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});s=e.loaders?.loadFile}else if("mediaAlbum"===i.contentType){const o=i.body.mediaAlbum?.items,r=t.itemIndex,d=void 0===r||void 0===o?void 0:o[r];if(void 0===d)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});n=d,s="video"===d.kind?e.loaders?.loadVideo:e.loaders?.loadImage,c=d.kind}if("mediaAlbum"!==i.contentType&&"filesAlbum"!==i.contentType&&void 0!==t.itemIndex)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});if(void 0===n)throw y({code:"IM_SDK_MEDIA_MESSAGE_UNSUPPORTED",category:"unsupported",operation:"media.download",retryable:!1,conversation:a});if(r&&void 0===s)throw y({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:a});if(""===n.url.trim()||n.url.startsWith("blob:"))throw y({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===d?{}:{mimeType:d},...void 0===c?{}:{cacheKind:c,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 y({code:"IM_SDK_MEDIA_DOWNLOAD_CANCELED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function X(){return y({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.download",retryable:!1})}async function Z(t,o,r=c){if(V(),r!==c)return null;const a=p("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 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 J(a,l,t.resourceVersion),l}function ee(e,t){B();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||q({...r,error:o}),o}return o?.state}function te(o,r=!1){const a=c,n=p("download",o.ref,o.messageId,o.itemIndex),d=D.get(n);if(void 0!==d&&!d.controller.signal.aborted)return d.promise;if(!r){const e=W(n,o.resourceVersion);if(void 0!==e)return q({id:n,ref:m(o.ref),messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex},direction:"download",state:"completed",percent:100}),Promise.resolve(e)}j(n);const u=(()=>{const e=ee(n,o);return void 0===e?{percent:0}:{percent:Math.min(99,Math.round(e.bytesDownloaded/e.bytesTotal*100)),bytesTransferred:e.bytesDownloaded,bytesTotal:e.bytesTotal}})(),f=m(o.ref);h.set(n,Object.freeze({conversation:f,messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}}));const I={id:n,messageId:o.messageId,ref:f,direction:"download",...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}},g=new AbortController,v=Promise.resolve().then(async()=>{let d;try{if(!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(d=await R.acquire(g.signal,()=>U===n?1:0),!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(q({...I,...u,state:"running"}),!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(!r&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const e=await Z(o,!1,a);if(null!==e){if(g.signal.aborted)throw Q(f);return L.delete(n),S.delete(n),q({..._.get(n),...I,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:f});const s=ee(n,o);if(void 0!==u.bytesTransferred&&(void 0===s||a!==c))throw O(n,"download-checkpoint-cleared"),K(f);const m=await i({...o.input,getPriority:()=>U===n?1:0,...void 0===s?{}:{resume:s},onResumable:r=>{t&&e.isActive()&&a===c&&D.get(n)?.controller===g&&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")}}(n,o.input.url,r)},onResumeInvalidated:()=>{t&&e.isActive()&&a===c&&D.get(n)?.controller===g&&O(n,"download-checkpoint-invalid")},signal:g.signal,onTransferProgress:o=>{const r=_.get(n);t&&e.isActive()&&!g.signal.aborted&&D.get(n)?.controller===g&&"running"===r?.state&&q({...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(n);if(!t||!e.isActive()||g.signal.aborted||D.get(n)?.controller!==g||"running"!==r?.state)return;const a=Math.min(99,l(o));a<=r.percent||q({...r,state:"running",percent:a})}});if(!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);const p=m instanceof Blob?void 0:m;let v=void 0===p?m:new Blob([p],void 0===o.mimeType?void 0:{type:o.mimeType});if(void 0!==o.mimeType&&v.type!==o.mimeType&&(v=v.slice(0,v.size,o.mimeType)),a===c&&J(n,v,o.resourceVersion),a===c&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const t=v.size;e.assetCache.put({kind:o.cacheKind,messageId:o.messageId,resourceVersion:o.resourceVersion,blob:v,...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(n),S.delete(n),q({..._.get(n),...I,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),!t||!e.isActive())throw X();return v}catch(o){if(!t||!e.isActive())throw X();if(g.signal.aborted||"object"==typeof o&&null!==o&&"code"in o&&"IM_SDK_MEDIA_DOWNLOAD_CANCELED"===o.code){const e=Q(f);throw D.get(n)?.controller===g&&"canceled"!==_.get(n)?.state&&q({..._.get(n),...I,state:"canceled",percent:_.get(n)?.percent??0,error:S.has(n)?K(f):e}),e}const r=S.has(n)?K(f):i(o)?y({code:"IM_SDK_CRYPTO_EXECUTION_FAILED",category:"state",operation:"crypto.execute",retryable:"queue-full"===o.reason,conversation:f,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:f});throw D.get(n)?.controller===g&&q({..._.get(n),...I,state:"failed",percent:_.get(n)?.percent??0,error:r}),r}finally{if(d?.(),D.get(n)?.controller===g){D.delete(n);const e=L.get(n);void 0!==e&&(e.idleSince=s())}}});return D.set(n,{controller:g,promise:v}),q({...I,...u,state:"queued"}),v}function oe(e,t){V();const o=_.get(e);if(void 0===o)throw y({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:t,retryable:!1});return o}function re(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 ae=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&&($(u(e.task)),F()))});return{api:{async clearCache(){V(),e.connection.invalidateMediaAssetCacheWrites?.(),Y();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(),z()},getSnapshot:()=>(V(),x()),subscribe:e=>(V(),E.add(e),()=>E.delete(e)),async cancel(t,o){const r=oe(t,"media.cancel");if("queued"!==r.state&&"running"!==r.state&&("upload"!==r.direction||"paused"!==r.state))throw re(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=D.get(t);if(void 0===a)throw re(r,"media.cancel");a.controller.abort();const i=S.has(t)?K(r.ref):Q(r.ref);q({...r,state:"canceled",error:i})},async pause(t){const o=oe(t,"media.pause");if("upload"!==o.direction||"queued"!==o.state&&"running"!==o.state)throw re(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=oe(t,"media.resume");if("upload"!==o.direction||"paused"!==o.state)throw re(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=oe(t,"media.retry");if("failed"!==r.state&&"canceled"!==r.state)throw re(r,"media.retry");if("upload"===r.direction){if(void 0!==o?.restartDownload)throw re(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 re(r,"media.retry");if(D.has(t)&&!D.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=h.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),S.delete(t)),await te(G(a),!0)},async getUploadRecovery(t){V();const o=v(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=v(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){try{return V(),te(G(e))}catch(e){return Promise.reject(e)}},prioritizeDownload:function(e){V();const t=v(e);U=p("download",t,e.messageId,e.itemIndex)},probeCached:async function(t){V();const o=c,r=t.map(e=>G(e,!1)),a=/* @__PURE__ */new Map,i=s(),d=r.map(e=>{const t=p("download",e.ref,e.messageId,e.itemIndex);return A.has(t)&&M.get(t)===e.resourceVersion&&i-(b.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 m=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(m=await e.assetCache.hasMany(l),m.length!==l.length||m.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 u=new Map(l.map((e,t)=>[JSON.stringify(e),m[t]]));return Object.freeze(r.map((e,t)=>d[t]||!0===u.get(JSON.stringify({kind:e.cacheKind,messageId:e.messageId,resourceVersion:e.resourceVersion}))))},subscribeCacheChanges:e=>(V(),w.add(e),()=>w.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(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:"+ ++I,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(t){if(V(),r(t.signal),void 0===e.prepareVideoPoster)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalVideoPoster",retryable:!1});let o;try{o=await e.prepareVideoPoster({operationId:"media.prepareLocalVideoPoster:"+ ++I,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 V(),e.onLocalPreviewError?.({kind:"video",byteLength:t.file.size,cause:o}),null}return r(t.signal),V(),!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(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:"+ ++I,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}}},clearCache:Y,prune:B,dispose(){if(t){t=!1,c+=1,ae();for(const e of D.values())e.controller.abort();R.dispose(),U=void 0,D.clear(),E.clear(),w.clear(),M.clear(),_.clear(),h.clear(),A.clear(),b.clear(),L.clear(),S.clear(),k=0}}}}export{c as createDefaultMediaAssetCacheStrategyRegistry,_ as createMediaTasksRuntime,u as toProductMediaTaskUpdate};
|
|
@@ -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,..."video"===i.kind&&i.includeDisplayPoster?{includeDisplayPoster:!0}:{}
|
|
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,..."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:163840,maxBytes:262144,quality:.9,minQuality:.8},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:256,targetBytes:262144,maxBytes:262144,quality:.9,minQuality:.9},i.signal);return{width:a.width,height:a.height,...void 0===a.posterData?{}:{posterData:new Uint8Array(a.posterData)}}}}}export{e as createLocalMediaPreviewPreparation};
|
package/dist/sdk.d.ts
CHANGED
|
@@ -594,7 +594,7 @@ interface ImMediaAlbumItem {
|
|
|
594
594
|
durationMs?: number;
|
|
595
595
|
/** 远端缩略图地址;可能缺省,此时只能用 `thumbData`。 */
|
|
596
596
|
thumbUrl?: string;
|
|
597
|
-
/** 内嵌缩略图/封面 JPEG 字节。加密消息服务端出不了封面,宫格首屏只能靠它。 */
|
|
597
|
+
/** 内嵌缩略图/封面 PNG 或 JPEG 字节。加密消息服务端出不了封面,宫格首屏只能靠它。 */
|
|
598
598
|
thumbData?: Uint8Array;
|
|
599
599
|
/** 原文件 MD5。 */
|
|
600
600
|
md5?: string;
|
|
@@ -2324,6 +2324,14 @@ interface ReactionParentMessage {
|
|
|
2324
2324
|
*/
|
|
2325
2325
|
declare function canReactToMessage(message: ReactionParentMessage): boolean;
|
|
2326
2326
|
|
|
2327
|
+
/**
|
|
2328
|
+
* 根据缩略图签名选择 PNG 或 JPEG 的显示类型,供 SDK 和 PC/H5 创建 Blob、data URL。
|
|
2329
|
+
* 输入是消息中的原始字节或纯 base64;旧消息没有独立 MIME 字段,非 PNG 沿用 JPEG 解码,
|
|
2330
|
+
* 损坏数据仍交给图片解码器报告失败。本函数不修改字节,也不将历史 JPEG 转码为 PNG。
|
|
2331
|
+
* @example resolveMediaThumbnailMimeType(new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10])) // 'image/png'
|
|
2332
|
+
*/
|
|
2333
|
+
declare function resolveMediaThumbnailMimeType(source: Uint8Array | string): 'image/png' | 'image/jpeg';
|
|
2334
|
+
|
|
2327
2335
|
/** 浏览器 PushSubscription.toJSON() 的可移植数据;不依赖 DOM 或浏览器全局。 */
|
|
2328
2336
|
interface ImWebPushSubscription {
|
|
2329
2337
|
endpoint?: string;
|
|
@@ -3020,13 +3028,13 @@ interface MediaAlbumMessageOptions {
|
|
|
3020
3028
|
* 本地视频的固有尺寸、时长与首帧封面。
|
|
3021
3029
|
*
|
|
3022
3030
|
* @remarks 宿主可从本地 object URL 解码首个可展示帧,使上传占位从首次渲染就使用真实比例和主图。
|
|
3023
|
-
* `posterData` 是等比缩放后的 JPEG
|
|
3024
|
-
* duration 存在时必须是有限正数,posterData
|
|
3031
|
+
* `posterData` 是等比缩放后的 JPEG(兼容已有 PNG);存在时会作为消息 `thumbData` 随正文发送。宽高必须是有限正数,
|
|
3032
|
+
* duration 存在时必须是有限正数,posterData 必须是非空且不超过共享单项消息容量的 Uint8Array;合集发送会按项数复核容量。
|
|
3025
3033
|
*/
|
|
3026
3034
|
interface VideoPreviewMetadata extends ImagePreviewMetadata {
|
|
3027
3035
|
/** 秒。 */
|
|
3028
3036
|
duration?: number;
|
|
3029
|
-
/** 本地首个可展示帧生成的 JPEG 字节。 */
|
|
3037
|
+
/** 本地首个可展示帧生成的 JPEG 或已有 PNG 字节。 */
|
|
3030
3038
|
posterData?: Uint8Array;
|
|
3031
3039
|
}
|
|
3032
3040
|
/**
|
|
@@ -5149,7 +5157,7 @@ interface ImMediaTask {
|
|
|
5149
5157
|
/** 可供产品按 code/category 决策的稳定错误;不含底层 URL、密钥或响应正文。 */
|
|
5150
5158
|
error?: ImSdkErrorShape;
|
|
5151
5159
|
}
|
|
5152
|
-
/**
|
|
5160
|
+
/** 本地视频预读结果:消息封面与仅供页面显示的独立封面分别持有。 */
|
|
5153
5161
|
interface LocalVideoPreviewMetadata extends VideoPreviewMetadata {
|
|
5154
5162
|
/** 按需生成的高清 JPEG;宿主负责 object URL 生命周期,不可替代 posterData 发送。 */
|
|
5155
5163
|
displayPoster?: Blob;
|
|
@@ -5259,9 +5267,9 @@ interface ImMediaTasksApi {
|
|
|
5259
5267
|
* 拿它当缩略图会得到一个空白格子(还会白占一路解码)。
|
|
5260
5268
|
*
|
|
5261
5269
|
* 返回的对象可以**原样**作为 `localPreviewMetadata` 交给 `sendImage` / `sendVideo` /
|
|
5262
|
-
* `sendMediaAlbum
|
|
5263
|
-
* posterData
|
|
5264
|
-
* 仅供页面显示的高清 displayPoster(长边最多 960
|
|
5270
|
+
* `sendMediaAlbum`:发送链路会复用可用元信息;合集项超出其可用消息空间时重新生成封面。
|
|
5271
|
+
* posterData 使用共享自适应发送规格(视频 JPEG,长边最多 960);includeDisplayPoster 可在同一次解码中额外生成
|
|
5272
|
+
* 仅供页面显示的高清 displayPoster(长边最多 960),不得绕过发送校验直接用它替换 posterData。
|
|
5265
5273
|
*
|
|
5266
5274
|
* @param input.kind 按文件类型选解码路径;`'video'` 才会抽首帧与读时长。
|
|
5267
5275
|
* @param input.file 本地文件;不会被上传,也不会进任何缓存。
|
|
@@ -5294,7 +5302,7 @@ interface ImMediaTasksApi {
|
|
|
5294
5302
|
}) => Promise<Blob | null>;
|
|
5295
5303
|
/**
|
|
5296
5304
|
* 为本地图片生成仅供胶片条/相册格显示的缩略图,不上传、不写缓存、不改变发送文件与元信息。
|
|
5297
|
-
* JPEG
|
|
5305
|
+
* JPEG 原文件按签名识别并生成 JPEG 显示缩略图,最长边最多 256px 且不放大,与发送预读共用账号的图片解码预算。
|
|
5298
5306
|
* 其它格式直接返回原 Blob,保留透明与动画;宿主负责返回 Blob 的 object URL 生命周期。
|
|
5299
5307
|
* 生成失败返回 null 并记录诊断;取消、账号失效和未装配能力保持明确错误。
|
|
5300
5308
|
* @param input.file 原始本地图片;返回的显示资源不得代替它传入发送命令。
|
|
@@ -6648,5 +6656,5 @@ interface ImResourceUploader {
|
|
|
6648
6656
|
*/
|
|
6649
6657
|
declare function createImResourceUploader(config: ImResourceUploaderConfig): ImResourceUploader;
|
|
6650
6658
|
|
|
6651
|
-
export { EDIT_WINDOW_MS, IMAGE_MESSAGE_ACCEPT, IM_CHAT_FONT_SCALES, IM_DIAGNOSTIC_CATEGORIES, IM_EMOJI_CATALOG, ImPinnedMessageOperationError, MEDIA_ALBUM_CAPTION_MAX_LENGTH, MEDIA_ALBUM_MAX_ITEMS, MediaTransferError, REACTION_SUPPORTED_CONTENT_TYPES, buildSessionFavoritePlainBody, canReactToMessage, canTransmit, canTransmitByType, canTransmitContent, classifyStickerImageType, createFaceToFaceGroupQrPayload, createImClient, createImConsoleDiagnosticSink, createImDiagnosticMemoryBuffer, createImResourceUploader, createImTextSearchMatcher, createSdkDiagnosticWriter, createVoicePlayer, createVoiceRecordingSession, detectVoiceCapabilities, extractSearchText, getImTextSearchInitial, isSupportedImageFile, mediaTransferErrorCodeOf, migrateImCachePrefix, normalizeMediaUploadCredentials, parseSessionFavoriteAlbumItems, parseSessionFavoriteFileItems, requiresForwardTypeConfirmation, resolveChannelAccess, resolveImEmojiToken, resolveMediaAlbumSendContentType, resolveSessionFavoriteAlbumCaption, resolveSessionFavoriteAlbumItemPreviewUrl, resolveSessionFavoriteKindFromMessage, resolveTextSegments, sortSessions, sumSessionsUnread, voiceErrorCodeOf };
|
|
6659
|
+
export { EDIT_WINDOW_MS, IMAGE_MESSAGE_ACCEPT, IM_CHAT_FONT_SCALES, IM_DIAGNOSTIC_CATEGORIES, IM_EMOJI_CATALOG, ImPinnedMessageOperationError, MEDIA_ALBUM_CAPTION_MAX_LENGTH, MEDIA_ALBUM_MAX_ITEMS, MediaTransferError, REACTION_SUPPORTED_CONTENT_TYPES, buildSessionFavoritePlainBody, canReactToMessage, canTransmit, canTransmitByType, canTransmitContent, classifyStickerImageType, createFaceToFaceGroupQrPayload, createImClient, createImConsoleDiagnosticSink, createImDiagnosticMemoryBuffer, createImResourceUploader, createImTextSearchMatcher, createSdkDiagnosticWriter, createVoicePlayer, createVoiceRecordingSession, detectVoiceCapabilities, extractSearchText, getImTextSearchInitial, isSupportedImageFile, mediaTransferErrorCodeOf, migrateImCachePrefix, normalizeMediaUploadCredentials, parseSessionFavoriteAlbumItems, parseSessionFavoriteFileItems, requiresForwardTypeConfirmation, resolveChannelAccess, resolveImEmojiToken, resolveMediaAlbumSendContentType, resolveMediaThumbnailMimeType, resolveSessionFavoriteAlbumCaption, resolveSessionFavoriteAlbumItemPreviewUrl, resolveSessionFavoriteKindFromMessage, resolveTextSegments, sortSessions, sumSessionsUnread, voiceErrorCodeOf };
|
|
6652
6660
|
export type { CapabilityAvailability, CapabilityDecision, CapabilityReason, ChannelAccessSnapshot, ChannelBaseSessionState, ChannelConversationCapabilities, ChannelConversationMessageApi, ChannelJoinApplication, ChannelJoinApplicationNotification, ChannelJoinApplicationPage, ChannelMember, ChannelMemberPage, ChannelMentionMember, ChannelMentionMemberPage, ChannelMiniProgramRel, ChannelMiniProgramRelConfigType, ChannelMuteReason, ChannelPermissionSet, ChannelProfile, ChannelRole, ChannelSessionState, ContactCardInput, ContactMessageOptions, ConversationBackgroundPreset, ConversationBackgroundSelection, ConversationCapabilitySnapshot, ConversationDraft, ConversationDraftApi, ConversationEntryUnreadNavigation, ConversationEntryUnreadSnapshot, ConversationHandle, ConversationHandleSnapshot, ConversationInitialPosition, ConversationLastMessageSummary, ConversationListItem, ConversationListMention, ConversationMessageApi, ConversationOpenOptions, ConversationPrefetchOptions, ConversationPrefetchResult, ConversationRef, ConversationSearchPage, ConversationSearchResult, ConversationSystemSummary, ConversationType, CustomerServiceConversationCapabilities, DirectConversationCapabilities, DirectConversationMessageApi, DraftInput, EditTextOptions, ExpressionMessageOptions, FileMessageOptions, ForwardFailReason, ForwardItemStatus, ForwardMessageFailure, ForwardMessagesInput, ForwardMessagesResult, ForwardTarget, ForwardedMessageRef, GameMessageOptions, GifMessageOptions, GiftMessageOptions, GroupConversationCapabilities, GroupConversationMessageApi, GroupMemberItem, GroupProfile, ImAppearanceSettingsApi, ImApplicationItem, ImApplicationRef, ImApplicationsApi, ImAuthIssue, ImAuthProvider, ImBlockedContact, ImCacheOptions, ImCachePrefixMigrationContext, ImCachePrefixMigrator, ImCallKind, ImCallOutcome, ImCallRecordBody, ImChannelConversationAccessSnapshot, ImChannelMentionApi, ImChannelMiniProgramRel, ImChannelPermissions, ImChannelPinnedMessage, ImChannelProfile, ImChannelRole, ImChannelState, ImChannelsApi, ImChatFontScale, ImClientActivityApi, ImClientActivitySnapshot, ImClientOptions, ImConnectionState, ImContactBody, ImContactKind, ImContactProfile, ImContactRelationship, ImContactRemarkPhone, ImContactSearchResult, ImContactsApi, ImConversationBackgroundApi, ImConversationCapabilitiesApi, ImConversationListApi, ImConversationListSnapshot, ImConversationListState, ImConversationSearchApi, ImCoreApiOptions, ImCreateChannelInput, ImCreateChannelResult, ImCreateFaceToFaceGroupResult, ImCreateGroupInput, ImCreateGroupResult, ImCreatedChannel, ImCreatedGroup, ImCustomerServiceApi, ImDebugOptions, ImDiagnosticCategory, ImDiagnosticError, ImDiagnosticLayer, ImDiagnosticLevel, ImDiagnosticMemoryBuffer, ImDiagnosticMemoryBufferFilter, ImDiagnosticMemoryBufferOptions, ImDiagnosticMemoryBufferSnapshot, ImDiagnosticMessage, ImDiagnosticRecord, ImDiagnosticSink, ImDiagnosticWriter, ImDirectCallAnswerResult, ImDirectCallFailReason, ImDirectCallHangupInput, ImDirectCallHangupReason, ImDirectCallInviteInput, ImDirectCallNotifyAudioInput, ImDirectCallTargetInput, ImDirectCallsApi, ImDirectReadReceiptSettings, ImDirectoryApi, ImDirectoryFieldMatch, ImDirectoryItem, ImDirectoryKind, ImDirectoryPage, ImDirectorySearchApi, ImDirectorySearchItem, ImDirectorySearchResult, ImDraftsApi, ImEmojiCatalogEntry, ImEndpointProvider, ImEventsApi, ImExpressionAsset, ImExpressionAssetInput, ImExpressionEmojiRecentInput, ImExpressionFavoriteKind, ImExpressionOptions, ImExpressionRecentInput, ImExpressionRecentItem, ImExpressionRecentItemKind, ImExpressionsApi, ImFaceToFaceGroup, ImFileBody, ImFilesAlbumBody, ImFriendshipRequestResult, ImGameBody, ImGameType, ImGifAssetInput, ImGiftBody, ImGiftSessionType, ImGiftStatus, ImGiftType, ImGiphyAsset, ImGiphyPage, ImGiphyPageOptions, ImGroupCallAnswerInput, ImGroupCallBusyInput, ImGroupCallCreateInput, ImGroupCallJoinInput, ImGroupCallMeetingSnapshot, ImGroupCallMember, ImGroupCallMemberStatus, ImGroupCallStatusInput, ImGroupCallTargetInput, ImGroupCallsApi, ImGroupConversationState, ImGroupMentionApi, ImGroupPinnedMessage, ImGroupProfile, ImGroupsApi, ImImageBody, ImLifecycleSnapshot, ImLiveRoomBody, ImLiveRoomStatus, ImLiveRoomType, ImLocalDataApi, ImLocalDataInfo, ImLogoutOptions, ImMediaAlbumBody, ImMediaAlbumItem, ImMediaConfig, ImMediaTask, ImMediaTasksApi, ImMembershipJoinResult, ImMessageMention, ImMessageReactionAggregate, ImMessageReactions, ImMessageRef, ImMessageSearchApi, ImMessageView, ImMessageViewBody, ImMessagesByIdResult, ImMiniProgramBody, ImMiniProgramShowType, ImOutboxApi, ImOutboxItem, ImPageToken, ImPinnedMessageErrorKind, ImPinnedMessageOperation, ImProductApplicationUpdate, ImProductAuthInvalidReason, ImProductClient, ImProductEvent, ImProductEventError, ImProductEventMap, ImProductMessage, ImPushApi, ImPushSnapshot, ImReactionChangeAction, ImReactionChangeResult, ImReadReceiptSettingsApi, ImRedPacketBody, ImRedPacketType, ImRequestError, ImRequestErrorHandler, ImResourceKind, ImResourceUploadInput, ImResourceUploadProgress, ImResourceUploadResult, ImResourceUploader, ImResourceUploaderConfig, ImRobotBody, ImRobotChatMenuItem, ImRobotCommand, ImRobotConversationBindInput, ImRobotDirectoryItem, ImRobotDirectoryPage, ImRobotDirectoryScope, ImRobotMenuReplyInput, ImRobotModule, ImRobotProfile, ImRobotProfileInput, ImRobotsApi, ImSdkErrorCategory, ImSdkErrorShape, ImSearchApi, ImSessionApi, ImSessionFavoriteAlbumItem, ImSessionFavoriteFileItem, ImSessionFavoriteItem, ImSessionFavoriteKind, ImSessionFavoritesApi, ImSessionLifecycleState, ImSettingsApi, ImStickerAssetInput, ImStickerBody, ImStickerPack, ImSupportedConversationRef, ImTextSearchMatch, ImTextSearchMatchOptions, ImTextSearchMatcher, ImTextSearchRange, ImTransferBody, ImTransferSessionType, ImTransferStatus, ImVideoBody, ImVoiceBody, ImWebPushSubscription, ImageMessageOptions, ImagePreviewMetadata, LiveRoomMessageOptions, LocalConversationHistoryClearResult, LocalMessageDeletionResult, LocalVideoPreviewMetadata, MediaAlbumItemInput, MediaAlbumMessageOptions, MediaTransferErrorCode, MediaUploadCredentials, MediaUploadCredentialsProvider, MediaUploadCredentialsRequest, MentionCandidate, MentionCandidatePage, MentionInput, MessageContentType, MessageWindowInfo, MessageWindowPage, MessagesByIdFailure, MigrateImCachePrefixInput, MiniProgramMessageOptions, ProductConversationListType, ProductHandleConversationType, ProductMessageSearchPage, ProductMessageSearchPreviewPart, ProductMessageSearchResult, ResolveTextOptions, ResolvedConversationBackground, RobotConversationCapabilities, SegmentMatch, SegmentMatcher, SendMessageResult, StickerAssetKind, TextMessageOptions, TextSegment, TransferMessageOptions, UnknownMessageBody, UserProfile, VideoMessageOptions, VideoPreviewMetadata, VoiceCapabilities, VoiceErrorCode, VoiceMessageMetadata, VoicePlayer, VoicePlayerOptions, VoicePlayerState, VoiceRecordingResult, VoiceRecordingSession, VoiceRecordingSessionOptions, VoiceRecordingState, VoiceToggleOptions };
|
package/dist/sdk.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EDIT_WINDOW_MS as r}from"./modules/im-core/src/message-flow/edit/edit-manager.js";import{IMAGE_MESSAGE_ACCEPT as o,isSupportedImageFile as s}from"./modules/im-sdk/src/product/image-format.js";import{IM_CHAT_FONT_SCALES as m}from"./modules/im-sdk/src/product/settings.js";import{IM_DIAGNOSTIC_CATEGORIES as e,createImConsoleDiagnosticSink as i,createSdkDiagnosticWriter as c}from"./modules/im-sdk/src/product/diagnostics.js";import{IM_EMOJI_CATALOG as t,resolveImEmojiToken as d}from"./modules/im-sdk/src/product/emoji-catalog.js";import{ImPinnedMessageOperationError as p}from"./modules/im-sdk/src/domains/pinned-message.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as a,MEDIA_ALBUM_MAX_ITEMS as
|
|
1
|
+
import{EDIT_WINDOW_MS as r}from"./modules/im-core/src/message-flow/edit/edit-manager.js";import{IMAGE_MESSAGE_ACCEPT as o,isSupportedImageFile as s}from"./modules/im-sdk/src/product/image-format.js";import{IM_CHAT_FONT_SCALES as m}from"./modules/im-sdk/src/product/settings.js";import{IM_DIAGNOSTIC_CATEGORIES as e,createImConsoleDiagnosticSink as i,createSdkDiagnosticWriter as c}from"./modules/im-sdk/src/product/diagnostics.js";import{IM_EMOJI_CATALOG as t,resolveImEmojiToken as d}from"./modules/im-sdk/src/product/emoji-catalog.js";import{ImPinnedMessageOperationError as p}from"./modules/im-sdk/src/domains/pinned-message.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as a,MEDIA_ALBUM_MAX_ITEMS as u,resolveMediaAlbumSendContentType as f}from"./modules/im-core/src/mapping/media-album-body.js";import{MediaTransferError as l,mediaTransferErrorCodeOf as j}from"./modules/im-browser/src/media/media-transfer-errors.js";import{REACTION_SUPPORTED_CONTENT_TYPES as n,canReactToMessage as g}from"./modules/im-core/src/message-flow/reaction/can-react.js";import{buildSessionFavoritePlainBody as b,resolveSessionFavoriteKindFromMessage as k}from"./modules/im-sdk/src/product/session-favorites.js";import{canTransmit as v,canTransmitByType as w,canTransmitContent as h,requiresForwardTypeConfirmation as x}from"./modules/im-core/src/message-flow/forward/can-transmit.js";import{classifyStickerImageType as y}from"./modules/im-core/src/mapping/sticker-body.js";import{createFaceToFaceGroupQrPayload as q}from"./modules/im-sdk/src/product/face-to-face-group.js";import{createImClient as z}from"./modules/im-sdk/src/create-im-client.js";import{createImDiagnosticMemoryBuffer as A}from"./modules/im-sdk/src/product/diagnostic-memory-buffer.js";import{createImResourceUploader as B}from"./modules/im-sdk/src/product/resource-uploader.js";import{createImTextSearchMatcher as C,extractSearchText as D,getImTextSearchInitial as E}from"./modules/im-core/src/mapping/search-text.js";import{createVoicePlayer as F}from"./modules/im-browser/src/voice/voice-player.js";import{createVoiceRecordingSession as G}from"./modules/im-browser/src/voice/voice-recorder.js";import{detectVoiceCapabilities as H}from"./modules/im-browser/src/voice/voice-capabilities.js";import{migrateImCachePrefix as I}from"./modules/im-sdk/src/cache-prefix-migration.js";import{normalizeMediaUploadCredentials as J}from"./modules/im-browser/src/media/media-upload-credentials.js";import{parseSessionFavoriteAlbumItems as K,resolveSessionFavoriteAlbumCaption as L,resolveSessionFavoriteAlbumItemPreviewUrl as M}from"./modules/im-core/src/session-favorite-album.js";import{parseSessionFavoriteFileItems as N}from"./modules/im-core/src/session-favorite-files.js";import{resolveChannelAccess as O}from"./modules/im-core/src/state/channel-permissions.js";import{resolveMediaThumbnailMimeType as P}from"./modules/im-core/src/media-thumbnail.js";import{resolveTextSegments as Q}from"./modules/im-core/src/mapping/text-segments.js";import{sortSessions as R}from"./modules/im-core/src/state/session-sort.js";import{sumSessionsUnread as S}from"./modules/im-core/src/state/domain-state.js";import{voiceErrorCodeOf as T}from"./modules/im-browser/src/voice/voice-errors.js";export{r as EDIT_WINDOW_MS,o as IMAGE_MESSAGE_ACCEPT,m as IM_CHAT_FONT_SCALES,e as IM_DIAGNOSTIC_CATEGORIES,t as IM_EMOJI_CATALOG,p as ImPinnedMessageOperationError,a as MEDIA_ALBUM_CAPTION_MAX_LENGTH,u as MEDIA_ALBUM_MAX_ITEMS,l as MediaTransferError,n as REACTION_SUPPORTED_CONTENT_TYPES,b as buildSessionFavoritePlainBody,g as canReactToMessage,v as canTransmit,w as canTransmitByType,h as canTransmitContent,y as classifyStickerImageType,q as createFaceToFaceGroupQrPayload,z as createImClient,i as createImConsoleDiagnosticSink,A as createImDiagnosticMemoryBuffer,B as createImResourceUploader,C as createImTextSearchMatcher,c as createSdkDiagnosticWriter,F as createVoicePlayer,G as createVoiceRecordingSession,H as detectVoiceCapabilities,D as extractSearchText,E as getImTextSearchInitial,s as isSupportedImageFile,j as mediaTransferErrorCodeOf,I as migrateImCachePrefix,J as normalizeMediaUploadCredentials,K as parseSessionFavoriteAlbumItems,N as parseSessionFavoriteFileItems,x as requiresForwardTypeConfirmation,O as resolveChannelAccess,d as resolveImEmojiToken,f as resolveMediaAlbumSendContentType,P as resolveMediaThumbnailMimeType,L as resolveSessionFavoriteAlbumCaption,M as resolveSessionFavoriteAlbumItemPreviewUrl,k as resolveSessionFavoriteKindFromMessage,Q as resolveTextSegments,R as sortSessions,S as sumSessionsUnread,T as voiceErrorCodeOf};
|