k2-im 0.2.15 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat-kit-pinia.d.ts +77 -18
- package/dist/chat-kit-vue.d.ts +7 -5
- package/dist/chat-kit.d.ts +138 -23
- package/dist/index.d.ts +142 -26
- package/dist/modules/api-protocol-client/src/client.js +1 -1
- package/dist/modules/api-protocol-client/src/nonce.js +1 -1
- package/dist/modules/crypto/browser.js +1 -1
- package/dist/modules/crypto/driver.js +1 -1
- package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -1
- package/dist/modules/im-browser/src/http/cm-http-adapter.js +1 -1
- package/dist/modules/im-browser/src/http/request-timeout.js +1 -0
- package/dist/modules/im-browser/src/http/requests/core-json-request.js +1 -1
- package/dist/modules/im-browser/src/http/requests/get-conversation-background-presets.js +1 -1
- package/dist/modules/im-browser/src/http/requests/pull-offline-channel.js +1 -1
- package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -1
- package/dist/modules/im-browser/src/media/media-download-request.js +1 -0
- package/dist/modules/im-browser/src/media/media-downloader.js +1 -1
- package/dist/modules/im-browser/src/media/media-preview-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-transfer-adapter.js +1 -1
- package/dist/modules/im-browser/src/media/media-transfer-policy.js +1 -1
- package/dist/modules/im-browser/src/media/webp-encoder.js +1 -0
- package/dist/modules/im-browser/src/media/webp-worker-factory.js +1 -0
- package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -1
- package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -1
- package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -1
- package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -1
- package/dist/modules/im-chat-kit/src/runtime/chat-runtime.js +1 -1
- package/dist/modules/im-chat-kit/src/runtime/media-object-url-registry.js +1 -1
- package/dist/modules/im-chat-kit/src/services/media.service.js +1 -1
- package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -1
- package/dist/modules/im-chat-kit/src/utils/media-transfer-presentation.js +1 -1
- package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-target-group.js +1 -1
- package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-targets.js +1 -1
- package/dist/modules/im-core/src/abort.js +1 -1
- package/dist/modules/im-core/src/mapping/group-offline-mapper.js +1 -1
- package/dist/modules/im-core/src/mapping/message-id.js +1 -1
- package/dist/modules/im-core/src/media-thumbnail-policy.js +1 -1
- package/dist/modules/im-core/src/media-thumbnail.js +1 -1
- package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -1
- package/dist/modules/im-core/src/state/domain-state.js +1 -1
- package/dist/modules/im-sdk/src/create-im-client.js +1 -1
- package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -1
- package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -1
- package/dist/modules/im-sdk/src/product/media.js +1 -1
- package/dist/modules/im-sdk/src/runtime/history-page-size.js +1 -0
- package/dist/modules/im-sdk/src/runtime/local-media-preview.js +1 -1
- package/dist/modules/im-sdk/src/runtime/recent-history-fetcher.js +1 -1
- package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -1
- package/dist/modules/im-sdk/src/runtime/session-runtime.js +1 -1
- package/dist/request-crypto.d.ts +3 -2
- package/dist/sdk.d.ts +75 -21
- package/dist/vendor/crypto/index_bg.wasm +0 -0
- package/dist/vendor/webp/LICENSE.jsquash +201 -0
- package/dist/vendor/webp/LICENSE.libwebp +29 -0
- package/dist/vendor/webp/NOTICE +3 -0
- package/dist/webp.worker.js +3 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createChannelPinnedRuntime as e,createChannelApi as t,createChannelLegacyMessageRepair as r,isChannelHistoryBlocked as o,createChannelOperationsRuntime as n}from"../domains/channel.js";import{createContactApi as s}from"../domains/contact.js";import{createConversationsApi as a,createConversationInputResolver as i}from"../domains/conversation.js";import{createGroupPinnedRuntime as c,createGroupApi as d}from"../domains/group.js";import{createMediaUploadComputation as p}from"../domains/media-byte-computation.js";import{createMessageOperationsRuntime as l}from"../domains/message.js";import{createConnectionApi as u}from"../domains/session.js";import{createApplicationsRuntime as m}from"../product/applications.js";import{createDirectCallsApi as v}from"../product/calls.js";import{createChannelMentionCandidatesRuntime as y}from"../product/channel-mention-candidates.js";import{createConversationBackgroundRuntime as g}from"../product/conversation-background.js";import{createRobotConversationHandle as h,createCustomerServiceConversationHandle as f,createChannelConversationHandle as I,createGroupConversationHandle as w,createDirectConversationHandle as C,linkConversationHandleDomainAccess as b}from"../product/conversation-handle.js";import{createCustomerServiceApi as S,createCustomerServiceError as T}from"../product/customer-service.js";import{createSdkDiagnosticWriter as E,toImDiagnosticMessage as R}from"../product/diagnostics.js";import{createDirectoryRuntime as M}from"../product/directory.js";import{createDraftsRuntime as k}from"../product/draft.js";import{isImReactionEmojiToken as D}from"../product/emoji-catalog.js";import{createExpressionsRuntime as x}from"../product/expressions.js";import{createGroupCallsApi as P}from"../product/group-calls.js";import{createLocalDataRuntime as A}from"../product/local-data.js";import{createDefaultMediaAssetCacheStrategyRegistry as j,createMediaTasksRuntime as O}from"../product/media.js";import{createImSdkError as _}from"../product/message.js";import{fetchMessagesByIdWithCaseVariants as N}from"../product/messages-by-id.js";import{createOutboxRuntime as L}from"../product/outbox.js";import{createRobotDirectoryRuntime as K}from"../product/robots.js";import{createSearchRuntime as F}from"../product/search.js";import{createSessionFavoritesRuntime as U}from"../product/session-favorites.js";import{createImSettingsRuntime as B}from"../product/settings.js";import{createChannelReadSummaryRefresh as G}from"./channel-read-summary-refresh.js";import{createCustomerServiceLegacyRecovery as H}from"./customer-service-legacy-recovery.js";import{recordDecryptFailedDiagnostic as V}from"./decrypt-diagnostics.js";import{createForegroundWorkCoordinator as $}from"./foreground-work-coordinator.js";import{resolveGroupHistoryPageBoundary as q}from"./group-history-page-boundary.js";import{createKeyPrefetchQueue as W}from"./key-prefetch.js";import{createLocalMediaPreviewPreparation as z}from"./local-media-preview.js";import{createMediaCacheMaintenance as J}from"./media-cache-maintenance.js";import{createAccountMediaUploadRecovery as Q,createMediaOnlineWaiter as Y}from"./media-upload-recovery.js";import{inspectProtobufWireShape as X}from"./protobuf-wire-shape.js";import{createReceivingActivity as Z}from"./receiving-activity.js";import{createRecentHistoryFetcher as ee}from"./recent-history-fetcher.js";import{createRecentHistoryPrefetch as te}from"./recent-history-prefetch.js";import{createSessionHttpClients as re}from"./session-http-clients.js";import{createSignalOfflinePoller as oe}from"./signal-offline-poller.js";import{createWsTransport as ne}from"../../../im-browser/src/transport/ws-transport.js";import{createIndexedDbStorageAdapter as se,deleteIndexedDbNamespace as ae}from"../../../im-browser/src/storage/indexed-db-storage-adapter.js";import{createProfileHttpAdapter as ie}from"../../../im-browser/src/http/profile-http-adapter.js";import{createChannelHttpAdapter as ce,ChannelHttpError as de,ChannelProfileMappingError as pe}from"../../../im-browser/src/http/channel-http-adapter.js";import{createChannelMemberHttpAdapter as le}from"../../../im-browser/src/http/channel-member-http-adapter.js";import{createChannelMentionMemberHttpAdapter as ue}from"../../../im-browser/src/http/channel-mention-member-http-adapter.js";import{createDirectoryHttpAdapter as me}from"../../../im-browser/src/http/directory-http-adapter.js";import{createExpressionHttpAdapter as ve}from"../../../im-browser/src/http/expression-http-adapter.js";import{createSessionFavoriteHttpAdapter as ye}from"../../../im-browser/src/http/session-favorite-http-adapter.js";import{createChannelJoinApplicationHttpAdapter as ge}from"../../../im-browser/src/http/channel-join-application-http-adapter.js";import{createContactApplicationHttpAdapter as he,createGroupApplicationHttpAdapter as fe}from"../../../im-browser/src/http/application-http-adapters.js";import{createDomainState as Ie}from"../../../im-core/src/state/domain-state.js";import{encodeConversationKey as we}from"../../../im-core/src/conversation-identity.js";import{createNetworkMonitor as Ce}from"../../../im-browser/src/network/network-monitor.js";import{createCryptoTaskExecutor as be}from"../../../im-browser/src/crypto/crypto-task-executor.js";import{createMediaTransferAdapter as Se}from"../../../im-browser/src/media/media-transfer-adapter.js";import{createMediaPreviewPreparationExecutor as Te}from"../../../im-browser/src/media/media-preview-preparation-executor.js";import{createChannelKeyService as Ee}from"../../../im-browser/src/crypto/channel-key-service.js";import{createSendStrategyRegistry as Re}from"../../../im-core/src/message-flow/send/send-strategy-registry.js";import{createDirectSendStrategy as Me}from"../../../im-core/src/message-flow/send/direct-send-strategy.js";import{createGroupSendStrategy as ke}from"../../../im-core/src/message-flow/send/group-send-strategy.js";import{createChannelSendStrategy as De}from"../../../im-core/src/message-flow/send/channel-send-strategy.js";import{createRobotSendStrategy as xe}from"../../../im-core/src/message-flow/send/robot-send-strategy.js";import{createRecallStrategyRegistry as Pe,createDirectRecallStrategy as Ae,createGroupRecallStrategy as je,createChannelRecallStrategy as Oe}from"../../../im-core/src/message-flow/recall/recall-strategy.js";import{createEditStrategyRegistry as _e,createDirectEditStrategy as Ne,createGroupEditStrategy as Le,createChannelEditStrategy as Ke}from"../../../im-core/src/message-flow/edit/edit-strategy.js";import{createReactionReceiveHandlers as Fe}from"../../../im-core/src/message-flow/reaction/reaction-receive-handlers.js";import{createGroupReceiveHandlers as Ue}from"../../../im-core/src/message-flow/receive/group-receive-handlers.js";import{createChannelReceiveHandlers as Be}from"../../../im-core/src/message-flow/receive/channel-receive-handlers.js";import{createRobotReceiveHandlers as Ge}from"../../../im-core/src/message-flow/receive/robot-receive-handlers.js";import{createChannelNotifyReceiveHandlers as He}from"../../../im-core/src/message-flow/receive/channel-notify-receive-handlers.js";import{createChannelApplicationReceiveHandlers as Ve}from"../../../im-core/src/message-flow/receive/channel-application-receive-handlers.js";import{createSessionFavoriteReceiveHandlers as $e}from"../../../im-core/src/message-flow/receive/session-favorite-receive-handlers.js";import{createFriendActionReceiveHandlers as qe}from"../../../im-core/src/message-flow/receive/friend-action-receive-handlers.js";import{createWalletNotifyReceiveHandlers as We}from"../../../im-core/src/message-flow/receive/wallet-notify-receive-handlers.js";import{createContactApplicationReceiveHandlers as ze}from"../../../im-core/src/message-flow/receive/contact-application-receive-handlers.js";import{createContactApplicationAnswerReceiveHandlers as Je}from"../../../im-core/src/message-flow/receive/contact-application-answer-receive-handlers.js";import{createDirectCallManager as Qe}from"../../../im-core/src/message-flow/call/direct-call-manager.js";import{createGroupCallManager as Ye}from"../../../im-core/src/message-flow/call/group-call-manager.js";import{createGroupEventReceiveHandlers as Xe}from"../../../im-core/src/message-flow/receive/group-event-receive-handlers.js";import{createChannelReadReceiveHandlers as Ze}from"../../../im-core/src/message-flow/read/channel-read-receive-handlers.js";import{createReadStrategyRegistry as et}from"../../../im-core/src/message-flow/read/read-strategy.js";import{createPushRegistration as tt}from"../../../im-core/src/push/push-registration.js";import{createClientActivity as rt}from"../../../im-core/src/connection/client-activity.js";import{createImConnection as ot}from"../../../im-core/src/connection/connection-manager.js";import{createBrowserConnectionOwnership as nt}from"../../../im-browser/src/network/browser-connection-ownership.js";import{CmdId as st}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{createGroupRestrictionCoordinator as at}from"../../../im-core/src/state/group-restriction-coordinator.js";import{createChannelRestrictionCoordinator as it}from"../../../im-core/src/state/channel-restriction-coordinator.js";import{resolveMediaUploadPlan as ct}from"../../../im-browser/src/media/media-transfer-policy.js";import{resolveChannelAccess as dt}from"../../../im-core/src/state/channel-permissions.js";import{createGroupReadStrategy as pt}from"../../../im-core/src/message-flow/read/group-read-strategy.js";import{createRobotReadStrategy as lt}from"../../../im-core/src/message-flow/read/robot-read-strategy.js";import{createCustomerServiceReadStrategy as ut}from"../../../im-core/src/message-flow/read/customer-service-read-strategy.js";import{createMediaPreviewAdapter as mt}from"../../../im-browser/src/media/media-preview-adapter.js";import{isCryptoExecutionError as vt,CryptoExecutionError as yt}from"../../../im-core/src/ports/crypto-task-executor.js";import{createRsaTeaCryptoAdapter as gt}from"../../../im-browser/src/crypto/rsa-tea-crypto-adapter.js";import{createImDiagnosticLogger as ht}from"../../../im-core/src/diagnostics.js";import{createPeerPublicKeyService as ft}from"../../../im-browser/src/crypto/peer-public-key-service.js";import{getChannelSecretKey as It}from"../../../im-browser/src/http/requests/get-channel-secret-key.js";import{createEncryptKeyService as wt}from"../../../im-browser/src/crypto/encrypt-key-service.js";import{pullOfflineInboundChat as Ct,pullOfflineOwnerChat as bt,pullOfflineInboundChatBatch as St,pullOfflineOwnerChatBatch as Tt}from"../../../im-browser/src/http/requests/pull-offline-chat.js";import{createReactionManager as Et}from"../../../im-core/src/message-flow/reaction/reaction-manager.js";import{throwIfAborted as Rt}from"../../../im-core/src/abort.js";import{pullChannelMessageContext as Mt}from"../../../im-browser/src/http/requests/channel-message-context.js";import{pullGroupMessagesById as kt,pullDirectMessagesById as Dt,pullChannelMessagesById as xt}from"../../../im-browser/src/http/requests/pull-messages-by-id.js";import{createChannelReadStrategy as Pt}from"../../../im-core/src/message-flow/read/channel-read-strategy.js";import{createGroupKeyService as At}from"../../../im-browser/src/crypto/group-key-service.js";import{pullOfflineGroupSession as jt,pullGroupHistory as Ot,pullOfflineGroupBatch as _t}from"../../../im-browser/src/http/requests/pull-offline-group.js";import{compareBySortKey as Nt}from"../../../im-core/src/mapping/sort.js";import{assertOfflineChatBatchComplete as Lt}from"../../../im-core/src/mapping/offline-mapper.js";import{createSyncManager as Kt}from"../../../im-core/src/sync/sync-manager.js";import{isMessageRecoveryBodyEqual as Ft}from"../../../im-core/src/mapping/merge.js";import{yieldToBrowser as Ut}from"../../../im-browser/src/scheduling/yield-to-browser.js";import{resolveGroupRestriction as Bt}from"../../../im-core/src/mapping/group-notify-mapper.js";import{bContentCodec as Gt,bMessageCodec as Ht}from"../../../im-protocol/src/protobuf/registry.js";import{mapIncomingChannelNotify as Vt}from"../../../im-core/src/mapping/channel-notify-mapper.js";import{recoverDecryptedMessage as $t}from"../../../im-core/src/mapping/decrypt-recovery.js";import{pullChannelSessions as qt,pullChannelLatestPage as Wt,pullChannelOfflineMessages as zt,pullChannelHistory as Jt}from"../../../im-browser/src/http/requests/pull-offline-channel.js";import{parseChannelSyncCheckpoint as Qt,channelSyncCheckpointKey as Yt}from"../../../im-core/src/sync/channel-sync-checkpoint.js";import{requestRobotMenuReply as Xt}from"../../../im-browser/src/http/requests/robot-menu-reply.js";import{mapIncomingRobotFixedChat as Zt}from"../../../im-core/src/mapping/robot-message-mapper.js";import{getRobotChatMenus as er,confirmRobotChat as tr,getRobotProfile as rr}from"../../../im-browser/src/http/requests/robot-profile.js";import{unbindRobotFromConversation as or,bindRobotToConversation as nr}from"../../../im-browser/src/http/requests/bind-robot-conversation.js";import{searchRobots as sr}from"../../../im-browser/src/http/requests/search-robots.js";import{getCustomerServiceProfile as ar,downloadCustomerServiceFile as ir}from"../../../im-browser/src/http/requests/customer-service-profile.js";import{pullOfflineSignal as cr}from"../../../im-browser/src/http/requests/pull-offline-signal.js";import{updateChannelReadIndexes as dr}from"../../../im-browser/src/http/requests/channel-read-index.js";import{markGroupReadAll as pr}from"../../../im-browser/src/http/requests/mark-group-read-all.js";const lr=30;function ur(e,t){const r=Number(e);if(!Number.isSafeInteger(r)||r<0)throw new Error(`GROUP history cursor 非法(groupId=${t})`);return r}function mr(mr,vr,yr,gr=0){const hr=mr.clientType??2,fr={...mr.authProvider,getLoginContext:async()=>{const e=await mr.authProvider.getLoginContext();return null===e?null:{...e,clientType:hr}}};let Ir="";const wr=E(mr.debug,()=>({generation:gr,...""===Ir?{}:{accountId:Ir}}));let Cr=!0;const br=mr.uploadRecovery?.enabled?Q(yr):void 0,Sr=Y(!1!==globalThis.navigator?.onLine),{coreClient:Tr,http:Er}=re({coreClient:mr.coreClient,http:mr.http,authProvider:fr,endpointProvider:mr.endpointProvider,clientType:hr,isActive:()=>Cr,onRequestError:mr.onRequestError,onHandlerError:e=>wr.record("error","sdk","session","request-error-handler-failed",()=>({error:{message:"宿主请求错误处理器失败",data:e}}))}),Rr=mr.transport??ne(),Mr=mr.adapters?.storage,kr=void 0!==Mr?Mr.create({namespaceFactory:yr}):"undefined"==typeof indexedDB?void 0:se({namespaceFactory:yr,mediaAssetCache:{strategies:j()}}),Dr=/* @__PURE__ */new Map,xr=/* @__PURE__ */new Map,Pr=/* @__PURE__ */new Map,Ar=/* @__PURE__ */new Map,jr=/* @__PURE__ */new Map,Or=/* @__PURE__ */new Map,_r=e=>`${we(e.conversation)}\0${e.messageId}`;function Nr(e,t){const r=we(e),o=(Or.get(r)??Promise.resolve()).then(t),n=o.then(()=>{},()=>{});return Or.set(r,n),n.then(()=>{Or.get(r)===n&&Or.delete(r)}),o}function Lr(e,t){return Nr(e.conversation,async()=>{t()&&(await(kr?.deleteDecryptRecovery?.(e.conversation,e.messageId)),t()&&(jr.delete(_r(e)),Ar.delete(_r(e)),Dr.delete(_r(e))))})}const Kr=e=>{const t=kr?.saveDecryptRecovery;if(void 0===t)return;const r=_r(e),o=(Pr.get(r)??0)+1;Pr.set(r,o),jr.delete(r),Ar.set(r,e);const n=we(e.conversation),s=xr.get(n)??0,a=()=>Cr&&s===(xr.get(n)??0)&&o===Pr.get(r),i=Nr(e.conversation,async()=>{a()&&await t(e)});Dr.set(r,i),i.then(()=>{if(Dr.get(r)===i&&Dr.delete(r),a())return ns(e)}).catch(t=>vr.emit({type:"error",error:{scope:"storage",message:`保存解密恢复记录失败(conversationType=${e.conversation.conversationType}, messageId=${e.messageId})`,cause:t}}))};let Fr=!1;const Ur="object"==typeof(Br=kr)&&null!==Br&&"get"in Br&&"function"==typeof Br.get&&"put"in Br&&"function"==typeof Br.put&&"clear"in Br&&"function"==typeof Br.clear?kr:void 0;var Br;const Gr=g({...void 0===kr?{}:{storage:kr},...void 0===Tr?{}:{coreClient:Tr}});let Hr,Vr;const $r=B({...void 0===kr?{}:{storage:kr},conversationBackgrounds:Gr.api,onDirectReadReceiptDisabled:e=>Hr?.(e)});let qr=0;function Wr(e){return qr+=1,`channel-${e}-${gr}-${qr}`}const zr=ht(wr),Jr=(e,t,r=Ir)=>{const o=t.fromId===r?t.toId:t.fromId;V(wr,{conversation:{conversationType:"direct",conversationId:o},source:e,messageId:t.msgId,senderId:t.fromId,receiverId:t.toId,messageType:t.msgType,encrypt:t.encrypt,encryptVersion:t.encryptVersion,reason:t.reason,resolverSource:"direct-private-key",...void 0===t.cmdId?{}:{commandId:t.cmdId},...void 0===t.cause?{}:{cause:t.cause}})},Qr=(e,t)=>{V(wr,{conversation:{conversationType:"group",conversationId:t.groupId},source:e,messageId:t.msgId,senderId:t.fromId,messageType:t.msgType,encrypt:t.encrypt,encryptVersion:t.encryptVersion,reason:t.reason,resolverSource:"group-private-key",...void 0===t.cmdId?{}:{commandId:t.cmdId},...void 0===t.cause?{}:{cause:t.cause}})},Yr=(e,t)=>{V(wr,{conversation:{conversationType:"channel",conversationId:t.channelId},source:e,messageId:t.messageId,encrypt:t.encrypt,reason:t.reason,resolverSource:"channel-symmetric-key",endpoint:t.endpoint,surface:t.surface,decryptStage:t.decryptStage,keySource:t.keySource,keyByteLength:t.keyByteLength,payloadByteLength:t.payloadByteLength,...void 0===t.cipherDataByteLength?{}:{cipherDataByteLength:t.cipherDataByteLength},...void 0===t.decryptedByteLength?{}:{decryptedByteLength:t.decryptedByteLength},...void 0===t.forceRefreshAttempted?{}:{forceRefreshAttempted:t.forceRefreshAttempted},...void 0===t.clientTypeHeader?{}:{clientTypeHeader:t.clientTypeHeader},...void 0===t.clientTypeBody?{}:{clientTypeBody:t.clientTypeBody},...void 0===t.operationId?{}:{operationId:t.operationId},...void 0===t.cause?{}:{cause:t.cause}})},Xr=e=>{wr.record("warn","sdk","protocol","channel-content-decode",()=>({conversation:{conversationType:"channel",conversationId:e.channelId},...void 0===e.operationId?{}:{operationId:e.operationId},data:{messageId:e.messageId,encrypt:e.encrypt,contentLength:e.contentLength,...void 0===e.endpoint?{}:{endpoint:e.endpoint},...void 0===e.surface?{}:{surface:e.surface},...void 0===e.clientTypeHeader?{}:{clientTypeHeader:e.clientTypeHeader},...void 0===e.clientTypeBody?{}:{clientTypeBody:e.clientTypeBody}},error:{message:"CHANNEL 消息正文解码失败",data:e.cause}}))};function Zr(e){return"left"===e||"removed"===e||"dismissed"===e}wr.record("debug","sdk","session","runtime-created");let eo="empty";const to=vr.subscribe(e=>{if(Cr)if("connection:changed"!==e.type)if("message:received"!==e.type&&"message:updated"!==e.type)if("auth:invalid"!==e.type){if("error"===e.type){const t="storage"===e.error.scope?"storage":"crypto"===e.error.scope?"crypto":"session";wr.record("error","sdk",t,"runtime-error",()=>({error:{message:e.error.message,data:e.error.cause}}))}}else wr.record("warn","sdk","session","auth-invalid",()=>({data:e.issue}));else wr.record("trace","sdk","message",e.type,()=>({conversation:e.conversation,message:R(e.message),data:{source:e.source,channelLifecycleEffects:e.channelLifecycleEffects}}));else wr.record("info","sdk","connection","connection-state-changed",()=>({data:{state:e.state}}))});function ro(e){return e.cmdId===st.MES_CHAT_EDIT_MSG_C2C||e.cmdId===st.MES_GRPCHAT_EDIT_MSG_C2C||e.cmdId===st.MES_RADIO_EDIT_MSG_C2C}const oo=/* @__PURE__ */new Set;let no,so,ao,io,co,po,lo="auto",uo=!1,mo=!1,vo=0,yo=!1,go=()=>{},ho=null,fo=null;const Io=$(),wo=new AbortController,Co=/* @__PURE__ */new Set;let bo=0,So=!1;const To=Z(e=>vr.emit({type:"receiving:changed",receiving:e})),Eo=Z(e=>vr.emit({type:"syncing:changed",syncing:e}));let Ro,Mo,ko=!1;const Do=/* @__PURE__ */new Map,xo=/* @__PURE__ */new Map,Po=/* @__PURE__ */new Map,Ao=e=>Po.get(we(e))?.version??0;function jo(e,t){Po.set(we(e),{version:Ao(e)+1,...void 0===t?{}:{reason:t}})}let Oo=0;const _o=e=>Do.get(e)??0,No=e=>{Do.set(e,_o(e)+1)};function Lo(e,t){jo(e,t),po?.invalidate(e,{reason:t}),"channel"===e.conversationType&&No(e.conversationId),"group"===e.conversationType&&xo.set(e.conversationId,(xo.get(e.conversationId)??0)+1)}const Ko=mr.profile??(void 0===Tr?void 0:ie({client:Tr,clientType:hr,...void 0===kr?{}:{storage:kr}})),Fo=mr.channelProfile??(void 0===Tr?void 0:ce({client:Tr,clientType:hr,getUserId:async()=>{if(""!==Ir)return Ir;const e=await fr.getLoginContext();return e?.userId??""},...void 0===kr?{}:{storage:kr}})),Uo=mr.channelMembers??(void 0===Tr?void 0:le({client:Tr,clientType:hr,isActive:()=>Cr,...void 0===kr?{}:{storage:kr}})),Bo=mr.channelMentionMembers??(void 0===Tr?void 0:ue({client:Tr,clientType:hr})),Go=y({...void 0===Bo?{}:{provider:Bo},...void 0===kr?{}:{storage:kr}}),Ho=mr.directory??(void 0===Tr?void 0:me({client:Tr,clientType:hr,getUserId:async()=>""!==Ir?Ir:(await fr.getLoginContext())?.userId??""})),Vo=M({...void 0===Ho?{}:{provider:Ho}});let $o;const qo=K({onProfileUpdated:function(e){Zo.updateConversationProfile({conversationType:"robot",conversationId:e.id},{title:e.displayName,avatar:e.avatarUrl??""})},...void 0===Tr?{}:{search:e=>sr(Tr,{...e,...void 0===hr?{}:{clientType:hr}}),bind:e=>nr(Tr,{...e,...void 0===hr?{}:{clientType:hr}}),unbind:e=>or(Tr,{...e,...void 0===hr?{}:{clientType:hr}}),getProfile:e=>rr(Tr,{...e,...void 0===hr?{}:{clientType:hr}}),confirmChat:e=>tr(Tr,{robotId:e,...void 0===hr?{}:{clientType:hr}}),listChatMenus:e=>er(Tr,{robotId:e,...void 0===hr?{}:{clientType:hr}}),requestMenuReply:async e=>{const t=""!==Ir?Ir:(await fr.getLoginContext())?.userId??"";if(""===t)throw new Error("机器人指令回复缺少当前用户");const r=await Xt(Er,{...e,userId:t});if(!Cr)return;const o=Zt({robotId:e.robotId,userId:t,msgId:r.msgId,msgTime:r.msgTime,content:r.content},{selfId:t,keepRaw:!0});if(void 0!==o){if(void 0===$o)throw new Error("机器人指令回复尚未接入消息存储");await $o(o)}}}}),Wo=mr.expressionProvider??ve({...void 0===Tr?{}:{coreClient:Tr},...void 0===mr.expressions?.giphy?.apiKey?{}:{giphyApiKey:mr.expressions.giphy.apiKey}}),zo=x({provider:Wo,isActive:()=>Cr}),Jo=mr.sessionFavoriteProvider??ye({...void 0===Tr?{}:{coreClient:Tr},getUserId:()=>Ir}),Qo=mr.channelJoinApplications??(void 0===Tr?void 0:ge({client:Tr,clientType:hr})),Yo=mr.contactApplications??(void 0===Tr?void 0:he({client:Tr,clientType:hr})),Xo=mr.groupApplications??(void 0===Tr?void 0:fe({client:Tr,clientType:hr})),Zo=Ie({emitter:vr,diagnostics:wr,profile:Ko,channelProfile:Fo,storage:kr,getSelfId:()=>Ir,loadOlderFromRemote:async e=>{const t=po?.enterForeground(e.conversation),r=Io.enterForeground(),o=To.begin();try{return void 0===co?{messages:[],exhausted:!0}:await co(e)}finally{o(),t?.(),r()}},loadNewerFromRemote:async e=>{const t=po?.enterForeground(e.conversation),r=Io.enterForeground(),o=To.begin();try{return void 0===Mo?{messages:[],exhausted:!0}:await Mo(e)}finally{o(),t?.(),r()}}}),en=S({download:async({messageId:e,itemIndex:t,signal:r})=>{const o=Zo.getConversationMessage({conversationType:"customerService",conversationId:"__customer_service__"},e),n=o?.body.customerService?.files[t];if(void 0===n)throw T({code:"IM_SDK_CUSTOMER_SERVICE_FILE_UNAVAILABLE",category:"state",operation:"customerService.downloadFile",retryable:!1});return await ir(n.url,r)},isActive:()=>Cr,load:e=>void 0===Tr?Promise.reject(T({code:"IM_SDK_CORE_API_UNAVAILABLE",category:"contract",operation:"customerService.getProfile",retryable:!1})):ar(Tr,e),update:e=>Zo.updateConversationProfile({conversationType:"customerService",conversationId:"__customer_service__"},{title:e.displayName,avatar:e.avatarUrl})}),tn=en.api;let rn=()=>{};const on=A({namespaceFactory:yr,...void 0===kr?{}:{storage:kr},emitter:vr,getAccountId:()=>Ir,isActive:()=>Cr,clearMemoryCaches:()=>{en.clearCache(),Ko?.clearCache?.(),Fo?.clearCache?.(),Uo?.clearCache?.(),Go.clear(),rn(),po?.clear().catch(e=>vr.emit({type:"error",error:{scope:"storage",message:"清理最近历史缓存失败",cause:e}}))}});$o=e=>Zo.commitReceivedMessages([e],"live");const nn=U({provider:Jo,isActive:()=>Cr,resolveMessage:async(e,t)=>Zo.getConversationMessage(e,t)??await(kr?.getMessage(e,t))??void 0}),sn=vr.subscribe(e=>{if("message:removed"===e.type||"conversation-history:cleared"===e.type||"session:removed"===e.type){const t=we(e.conversation);if(xr.set(t,(xr.get(t)??0)+1),"message:removed"===e.type)jr.delete(_r({conversation:e.conversation,messageId:e.messageId}));else for(const e of jr.keys())e.startsWith(`${t}\0`)&&jr.delete(e)}if(void 0!==kr?.deleteDecryptRecovery)if("message:received"!==e.type&&"message:updated"!==e.type||!0===e.message.encryption.decryptFailed){if("message:removed"===e.type)Ar.delete(_r({conversation:e.conversation,messageId:e.messageId})),Nr(e.conversation,()=>kr.deleteDecryptRecovery(e.conversation,e.messageId)).catch(t=>vr.emit({type:"error",error:{scope:"storage",message:`删除消息密文记录失败(messageId=${e.messageId})`,cause:t}}));else if("conversation-history:cleared"===e.type){for(const[t,r]of Ar)we(r.conversation)===we(e.conversation)&&Ar.delete(t);Nr(e.conversation,async()=>kr.deleteConversationDecryptRecoveries?.(e.conversation)).catch(t=>vr.emit({type:"error",error:{scope:"storage",message:`清理会话密文记录失败(conversationId=${e.conversation.conversationId})`,cause:t}}))}}else{const t=we(e.conversation),r=xr.get(t)??0,o=_r({conversation:e.conversation,messageId:e.message.id}),n=Pr.get(o)??0,s=()=>Cr&&r===(xr.get(t)??0)&&n===(Pr.get(o)??0);(async()=>{const t=(await(kr.getDecryptRecoveries?.(e.conversation))??[]).find(t=>t.messageId===e.message.id);void 0!==t&&!ro(t)&&s()&&(await Zo.commitReceivedMessages([e.message],"offline",{backfillOnly:!0}),await Lr(t,s))})().catch(t=>vr.emit({type:"error",error:{scope:"storage",message:`删除已恢复密文记录失败(messageId=${e.message.id})`,cause:t}}))}});const an=s({directory:Vo.contacts,getSelfId:()=>Ir,...void 0===Ko?{}:{profile:{getUserProfile:Zo.readDirectProfile,...void 0===Ko.peekUserProfile?{}:{peekUserProfile:Ko.peekUserProfile.bind(Ko)}}},...void 0===Tr?{}:{coreClient:Tr},domainState:Zo,emitter:vr,terminateConversationSending:(e,t)=>go(e,t),resetDirectReadReceiptPreference:e=>$r.api.readReceipts.resetConversation({conversationType:"direct",conversationId:e}),onRelationshipChanged:(e,t)=>{"friend"===t?Vr?.(e):"unknown"!==t&&Hr?.(e)}}),cn=m({...void 0===Yo?{}:{contact:Yo},...void 0===Xo?{}:{group:Xo},...void 0===Qo?{}:{channel:Qo},onContactAccepted:async(e,t)=>{an.updateRelationshipFromEvent(e,"friend"),await Zo.reconcileDirectContactEstablishedNotice(e,`contact-application:${t}`),Zo.refreshConversationProfile(e,"direct")},emitter:vr,isActive:()=>Cr&&"ready"===eo}),dn=k({domainState:Zo,emitter:vr,isActive:()=>Cr}),pn=F({domainState:Zo,isAvailable:()=>Cr&&"ready"===eo}),ln=i(()=>Zo.getSessions()),un=Ce({onHidden:()=>gn(!0),onVisible:()=>gn(!1),onPageHide:()=>gn(!0),onPageShow:()=>gn(!1)},mr.network),mn=mr.cryptoExecutorFactory?.(gr)??be({generation:gr,diagnostics:wr,lifecycleAware:un.supportsLifecycle}),vn=p({executor:mn,generation:gr,isActive:()=>Cr}),yn=mr.crypto??{...gt(),async encryptSymmetricChunked(e){try{return await vn(e)}catch(e){throw vt(e)&&Cr&&vr.emit({type:"error",error:{scope:"crypto",message:"媒体加密计算失败",cause:e}}),e}}};function gn(e){mn.setSuspended(e)}function hn(e){!Cr||e instanceof Error&&"AbortError"===e.name||vr.emit({type:"error",error:{scope:"crypto",message:"密钥计算失败",cause:e}})}const fn=void 0!==mr.media?Se(mr.media,wr):void 0,In=Te(),wn=mt(In),{prepareLocalMediaPreview:Cn,prepareLocalVideoPoster:bn,prepareLocalImageThumbnail:Sn}=z(In,()=>gr),Tn=void 0===Tr?void 0:wt({client:Tr,crypto:yn,cryptoExecutor:mn,generation:gr,clientType:hr,onError:(e,t)=>zr?.("crypto",{message:e,cause:t})}),En=void 0===Tr?void 0:ft({client:Tr,clientType:hr,onError:(e,t)=>zr?.("crypto",{scope:"send-key",message:e,cause:t})}),Rn=void 0===Tr?void 0:At({client:Tr,crypto:yn,cryptoExecutor:mn,generation:gr,clientType:hr,onError:(e,t)=>zr?.("crypto",{scope:"group-key",message:e,cause:t})}),Mn=mr.channelKeyService??(void 0===Tr?void 0:Ee({loadSecretKey:e=>It(Tr,{channelId:e,clientType:hr}),onError:(e,t)=>zr?.("crypto",{scope:"channel-key",message:e,cause:t})})),kn=async(e,t={})=>{if(void 0===Mn)return;const r=null===Mn.getCachedChannelKey(e);try{await Mn.getChannelKey(e)}catch{return}if(!1!==t.recoverExistingMessages&&r&&Cr)try{await as({conversationType:"channel",conversationId:e},{recoverLegacyWithoutSidecar:!1})}catch(t){vr.emit({type:"error",error:{scope:"storage",message:`CHANNEL key 就绪后读取解密恢复记录失败(channelId=${e})`,cause:t}})}},Dn=async e=>void 0===Mn?null:Mn.getChannelKey(e),xn=e=>{if(void 0===Mn)return null;const t=Mn.getCachedChannelKey(e);return null===t&&kn(e),t},Pn=()=>Tn?.getCachedPrivateKey(Ir)?.privateKey??null,An=async(e,t={})=>{const r=[];void 0!==Mn&&r.push(...[...new Set(e)].map(e=>kn(e,t))),void 0!==Tn&&""!==Ir&&r.push(Tn.getUserPrivateKey(Ir,{priority:t.priority??"background",signal:t.signal??wo.signal})),await Promise.all(r)},jn=e=>({crypto:yn,resolveChannelKey:e=>Mn?.getCachedChannelKey(e)??null,resolveUserPrivateKey:Pn,onDecryptError:t=>Yr(e,t),onDecryptRecovery:Kr}),On=W({fetch:async e=>{await(Rn?.getGroupKeys(e,{priority:"background"}))},onError:hn});function _n(e){Cr&&void 0!==Rn&&""!==e&&On.enqueue(e)}function Nn(){On.dispose(),un.stop(),Tn?.dispose(),Rn?.dispose(),mn.dispose()}const Ln=async e=>{if(void 0===Rn)return null;const t=await Rn.getGroupKeys(e);return null===t?null:{publicKey:t.publicKey,version:t.version}},Kn=e=>{if(void 0===Rn)return null;const t=Rn.getCachedGroupKeys(e);return null!==t?t.privateKey:(_n(e),null)},Fn=async(e,t={})=>{const r=t.signal??wo.signal;if(Rt(r),void 0===Rn)return;const o=[...new Set(e)];let n,s=0;const a=async()=>{for(;void 0===n&&s<o.length;){if(!Cr)return;const e=o[s++];try{await Rn.getGroupKeys(e,{priority:t.priority??"background",signal:r})}catch(e){throw n=e,e}}};await Promise.all([a(),a()]),Rt(r)},Un=e=>({crypto:yn,resolvePrivateKey:({groupId:e})=>Kn(e),onDecryptError:t=>Qr(e,t),onDecryptRecovery:Kr}),Bn=/* @__PURE__ */new Map,Gn=/* @__PURE__ */new Map,Hn=/* @__PURE__ */new Map,Vn=/* @__PURE__ */new Set,$n=/* @__PURE__ */new Set;function qn(e){return!0!==e.encryption.decryptFailed&&"unknown"!==e.contentType}function Wn(e){Hn.delete(we(e))}function zn(e,t){return e.length===t.length&&e.every((e,r)=>e===t[r])}function Jn(e){if("group"===e.conversation.conversationType)return Rn?.getCachedGroupKeyVersion(e.conversation.conversationId)??void 0}function Qn(e){return 2===e.wireEncrypt?"channel-base64-pad-tea":"group"===e.conversation.conversationType?"group-rsa-tea":"channel"===e.conversation.conversationType?"channel-web-rsa-tea":"direct-rsa-tea"}function Yn(e){return 101===e.contentType?Number.isInteger(e.type)&&e.type>0:27===e.contentType?0n===e.gameType?e.gameValue>=1n&&e.gameValue<=3n:1n===e.gameType&&e.gameValue>=1n&&e.gameValue<=6n:[1,2,3,4,5,7,8,11].includes(e.contentType)}function Xn(e,t){const r=new Map(Zo.getMessagesByConversation(e).filter(e=>void 0===t||e.id===t).map(e=>[e.id,e])),o=/* @__PURE__ */new Map;return{stop:vr.subscribe(n=>{if(!Cr||"message:received"!==n.type&&"message:updated"!==n.type||"live"!==n.source||n.conversation.conversationType!==e.conversationType||n.conversation.conversationId!==e.conversationId||void 0!==t&&n.message.id!==t||!0===n.message.encryption.decryptFailed)return;const s=r.get(n.message.id);if(void 0===s||!Ft(s,n.message)){const t=_r({conversation:e,messageId:n.message.id});o.set(t,Pr.get(t)??0)}}),hasChanged:e=>{const t=_r(e);return o.has(t)&&o.get(t)===(Pr.get(t)??0)}}}let Zn=0;const es=[],ts=/* @__PURE__ */new Map;let rs=0;function os(){for(;rs<2&&es.length>0;){const e=es.shift();rs+=1,Promise.resolve().then(async()=>{if(Rt(wo.signal),!e.isCurrent())throw new DOMException("端到端排队恢复所属账号、会话或消息已失效","AbortError");await ss(e.record,e.hasBodyChanged)}).then(e.resolve,e.reject).finally(()=>{rs-=1,os()})}}function ns(e,t){if("direct"!==e.conversation.conversationType&&"group"!==e.conversation.conversationType)return ss(e);const r=_r(e),o=Pr.get(r)??0,n=ts.get(r);if(n?.version===o&&n.isCurrent())return n.promise;const s=Ir,a=we(e.conversation),i=xr.get(a)??0,c=Ao(e.conversation),d=()=>Cr&&Ir===s&&i===(xr.get(a)??0)&&c===Ao(e.conversation)&&o===(Pr.get(r)??0),p=void 0===t?Xn(e.conversation,e.messageId):void 0,l=t??(()=>p.hasChanged(e)),u=new Promise((t,r)=>{es.push({record:e,isCurrent:d,hasBodyChanged:l,resolve:t,reject:r})}).finally(()=>{p?.stop(),ts.get(r)?.promise===u&&ts.delete(r)});return ts.set(r,{version:o,isCurrent:d,promise:u}),os(),u}async function ss(e,t){const r=_r(e);e=Ar.get(r)??e;const o=Pr.get(r)??0,n=we(e.conversation),s=xr.get(n)??0,a=Ao(e.conversation),i=()=>Cr&&a===Ao(e.conversation)&&s===(xr.get(n)??0)&&o===(Pr.get(r)??0),c=Bn.get(r);if(void 0!==c)return Gn.get(r)===o?c:(await c.catch(()=>{}),void(i()&&Ar.get(r)===e&&await ss(e,t)));const d=async()=>Zo.getConversationMessage(e.conversation,e.messageId)??await(kr?.getMessage(e.conversation,e.messageId))??void 0,p=(async()=>{const n=await d();if(!i()||void 0===n)return;const s=ro(e),a=()=>!("direct"!==e.conversation.conversationType&&"group"!==e.conversation.conversationType||!s)&&(t?.()&&jr.set(r,o),jr.get(r)===o);if(a())return await Zo.commitReceivedMessages([n],"offline",{backfillOnly:!0}),void await Lr(e,i);if(!0!==n.encryption.decryptFailed&&!s)return await Zo.commitReceivedMessages([n],"offline",{backfillOnly:!0}),void await Lr(e,i);let c,p;wr.record("debug","sdk","crypto","decrypt-recovery-context",()=>({conversation:e.conversation,data:{messageId:e.messageId,messageSenderId:n.senderId,messageCreatedAt:n.createdAt,selfMessage:n.senderId===Ir,source:e.source,wireEncrypt:e.wireEncrypt,sContentBytes:e.sContent.length,...void 0===e.cmdId?{}:{cmdId:e.cmdId},...void 0===e.encryptVersion?{}:{encryptVersion:e.encryptVersion}}}));let l="key-resolve",u=Qn(e);for(const t of[!1,!0]){const r=t?"force":"current";let o;try{l="bcontent";const n=Gt.decode(e.sContent);if(1===e.wireEncrypt){if(0===n.secretKey.length||0===n.cipherData.length)throw new Error("BContent.secretKey/cipherData 缺失");l="key-resolve";const s={priority:"background",signal:wo.signal,...t?{staleKey:"string"==typeof p?p:void 0}:{}},a="group"===e.conversation.conversationType?(await(Rn?.getGroupKeys(e.conversation.conversationId,s)))?.privateKey??null:(await(Tn?.getUserPrivateKey(Ir,s)))?.privateKey??null;if(!i())return;t&&void 0!==p&&(o="string"==typeof p&&null!==a&&p!==a),!0===o&&Wn(e.conversation),t||(p=a);const d=Jn(e);if(null===a){wr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"no-key",...void 0===d?{}:{resolvedKeyVersion:d},...void 0===o?{}:{keyChanged:o}}}));continue}const u=await mn.decryptBatch({operationId:"end-to-end-recovery:"+ ++Zn,generation:gr,items:[{itemIndex:0,input:{secretKey:n.secretKey,cipherData:n.cipherData,privateKey:a}}],priority:"background",signal:wo.signal});if(!i())return;if(1!==u.length||0!==u[0]?.itemIndex)throw new yt("protocol-mismatch");const m=u[0].result;if(!m.ok)throw l=m.stage,new Error(`End-to-end recovery ${m.stage} failed`);const v=m.plain;wr.record("debug","sdk","crypto","decrypt-recovery-byte-shape",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:Qn(e),rsaCipherBytes:n.secretKey.length,cipherDataBytes:n.cipherData.length,cipherDataBlockRemainder:n.cipherData.length%8,plainBytes:v.length,plainBlockRemainder:v.length%8,startsWithContentTypeField:8===v[0],startsWithMobileCardType:8===v[0]&&8===v[1],...X(v)}})),l="bmessage",c=Ht.decode(v)}else if("channel"===e.conversation.conversationType){if(0===n.cipherData.length)throw new Error("BContent.cipherData 缺失");l="key-resolve";const s=t?{...p instanceof Uint8Array?{staleKey:p}:{}}:void 0,a=void 0===Mn?.getChannelKeyCandidates?await(Mn?.getChannelKey(e.conversation.conversationId,s).then(e=>[{strategy:"canonical-base64-pad",key:e}]))??[]:await Mn.getChannelKeyCandidates(e.conversation.conversationId,s),i=Mn?.getCachedChannelKeyMetadata?.(e.conversation.conversationId);null!=i&&wr.record("info","sdk","crypto","decrypt-recovery-key-material",()=>({conversation:e.conversation,data:{messageId:e.messageId,attempt:r,...i}}));const d=a.find(e=>"canonical-base64-pad"===e.strategy)?.key??null;if(t&&p instanceof Uint8Array&&null!==d&&(o=!zn(p,d)),!0===o&&Wn(e.conversation),t||(p=d?.slice()??null),0===a.length){wr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"no-key",...void 0===o?{}:{keyChanged:o}}}));continue}for(const t of a)try{l="tea";const s=yn.decryptSymmetric({teaKey:t.key,cipherData:n.cipherData});l="bmessage";const a=Ht.decode(s);if("legacy-ascii16"===t.strategy&&!Yn(a))throw new Error("legacy ASCII candidate 未通过已知 BMessage 语义校验");c=a,u=t.strategy,wr.record("info","sdk","crypto","decrypt-recovery-candidate",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:t.strategy,finalStage:"recovered",reason:"recovered",...void 0===o?{}:{keyChanged:o}}}));break}catch(n){wr.record("warn","sdk","crypto","decrypt-recovery-candidate",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:t.strategy,finalStage:l,reason:"decrypt-failed",...void 0===o?{}:{keyChanged:o}},error:{message:"CHANNEL decrypt recovery candidate failed",data:n}}))}}if(void 0!==c){wr.record("info","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:u,finalStage:"recovered",reason:"recovered",...void 0===o?{}:{keyChanged:o}}}));break}}catch(t){if(vt(t)||t instanceof Error&&"AbortError"===t.name)throw t;const n=Jn(e);wr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Qn(e),finalStage:l,reason:"decrypt-failed",...void 0===n?{}:{resolvedKeyVersion:n},...void 0===o?{}:{keyChanged:o}},error:{message:"IM message decryption recovery failed",data:t}}))}}if(!i()||void 0===c)return void(void 0===c&&(!function(e,t){const r=we(e),o=Hn.get(r)??/* @__PURE__ */new Set;o.add(t),Hn.set(r,o)}(e.conversation,e.messageId),wr.record("warn","sdk","crypto","decrypt-recovery-exhausted",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,strategy:Qn(e),attempts:2,finalStage:l}}))));const m=await d();if(!i()||void 0===m||!0!==m.encryption.decryptFailed&&!s)return;if(("direct"===e.conversation.conversationType||"group"===e.conversation.conversationType)&&s&&(a()||!Ft(n,m)))return jr.set(r,o),await Zo.commitReceivedMessages([m],"offline",{backfillOnly:!0}),void await Lr(e,i);const v="channel"!==e.conversation.conversationType||e.cmdId!==st.RADIO_NOTIFY_DELIVER&&101!==c.contentType?{...$t(m,c,Ir),...s?{edited:!0}:{}}:Vt({channelId:BigInt(e.conversation.conversationId),messageId:e.messageId,occurredAt:BigInt(m.serverTime??m.createdAt),notifyType:c.type,operatorId:c.oprUserId,targetUserIds:c.mnpledUserId,content:c.content,..."string"==typeof m.extensions?.historyCursor?{historyCursor:m.extensions.historyCursor}:{},..."string"==typeof m.extensions?.channelSequence?{sequence:BigInt(m.extensions.channelSequence)}:{},encrypted:!0},{cmdId:e.cmdId,keepRaw:void 0!==m.raw});await Zo.commitReceivedMessages([v],"offline",{backfillOnly:!0,refreshSessionSummary:!0}),await Lr(e,i)})().finally(()=>{Bn.get(r)===p&&(Bn.delete(r),Gn.delete(r))});return Bn.set(r,p),Gn.set(r,o),p}async function as(e,t={}){const r="direct"===e.conversationType||"group"===e.conversationType?Xn(e):void 0;try{const o=we(e),n=Ir,s=xr.get(o)??0,a=Ao(e),i=()=>Cr&&n===Ir&&s===(xr.get(o)??0)&&a===Ao(e),c=await(kr?.getDecryptRecoveries?.(e))??[];if(!i())return;const d=Hn.get(o),p=void 0===d?c:c.filter(e=>!d.has(e.messageId));if("direct"===e.conversationType||"group"===e.conversationType){let e=0;const t=async()=>{for(;e<p.length;){if(!i())return;const t=p[e++];await ns(t,()=>r.hasChanged(t))}},o=(await Promise.allSettled([t(),t()])).find(e=>"rejected"===e.status);if("rejected"===o?.status)throw o.reason}else await Promise.all(p.map(e=>ns(e)));if(!Cr||!1===t.recoverLegacyWithoutSidecar)return;const l=Hn.get(o),u=new Set(c.filter(e=>void 0===l||!l.has(e.messageId)).map(e=>e.messageId)),m=Zo.getMessagesByConversation(e).filter(e=>!0===e.encryption.decryptFailed&&!u.has(e.id));if(0===m.length||Vn.has(o))return;if(Vn.add(o),wr.record("info","sdk","crypto","decrypt-repair-start",()=>({conversation:e,data:{stuckCount:m.length,withoutSidecar:m.filter(e=>!c.some(t=>t.messageId===e.id)).length}})),"channel"===e.conversationType){const t=await fr.getLoginContext();if(null===t||void 0===Ro)return;for(const r of m.slice(0,20)){const o=r.extensions?.historyCursor;if("string"!=typeof o||""===o.trim())continue;const n=await Ro(e.conversationId,o,t.userId);if(!Cr)return;n.length>0&&Zo.upsertMessages(n,"offline")}}else"group"===e.conversationType?await async function(e,t){if(void 0===co)return;const r=[...t].sort((e,t)=>e.sortKey.localeCompare(t.sortKey)),o=r[0],n=r.at(-1);if(void 0===o||void 0===n)return;const s=o.serverTime??o.createdAt;let a;for(let t=0;t<5;t++){const t=await co({conversation:e,oldestLoaded:n,...void 0===a?{}:{cursor:a},intent:"older",limit:50});if(!Cr||t.exhausted||void 0===t.nextCursor)return;const r=Number(t.nextCursor);if(Number.isFinite(r)&&r<=s)return;a=t.nextCursor}}({conversationType:"group",conversationId:e.conversationId},m):"direct"===e.conversationType&&await La()}catch(t){if(!Cr||t instanceof Error&&"AbortError"===t.name)return;vr.emit({type:"error",error:{scope:"crypto",message:`解密失败消息恢复失败(conversationType=${e.conversationType}, conversationId=${e.conversationId})`,cause:t}})}finally{r?.stop()}}let is=()=>{throw new Error("离线 Reaction 写入失败:Reaction manager 尚未就绪")};function cs(e,t=!0){const r=e.channelPermissions,o=e.channelAccessSnapshot;return JSON.stringify(["group"===e.type?e.groupState??"active":void 0,e.channelState,void 0===r?void 0:[r.sendMessages,r.mentionAll,r.editProfile,r.manageMembers,r.manageAdmins,r.moderateMessages,r.manageMute,r.dismissChannel,r.transferOwnership],t&&void 0!==o?[o.role,o.baseState,o.resolvedState,o.allMembersMuted,o.currentUserMuted,o.mutePeriod]:void 0])}const ds=/* @__PURE__ */new Map;function ps(e){const t=Zo.getConversationContext(e);if(!Cr||void 0===t||"group"===e.conversationType&&void 0!==t.groupState&&"active"!==t.groupState||"channel"===e.conversationType&&void 0!==t.channelState&&o(t.channelState))return;const r=Zo.getMessagesByConversation(e).at(-1);return JSON.stringify([Ir,void 0===r?t.timestamp:void 0,cs(t),r?.id,r?.sortKey])}const ls=/* @__PURE__ */new Map;po=te({...void 0===kr?.recentHistoryCache?{}:{cache:kr.recentHistoryCache},fingerprint:ps,canRunBackground:function(){return Cr&&"ready"===eo&&So&&0===bo&&"authenticated"===la.state},onForeground:e=>{if("group"===e.conversationType){Rn?.promote(e.conversationId);for(const[t,r]of ls)r.some(t=>t.conversationId===e.conversationId)&&mn.promote(t)}else"channel"!==e.conversationType&&"direct"!==e.conversationType||Tn?.promote(Ir)},fetchPage:async(e,t)=>{const r="group"===e.conversationType?Ia("group",{conversationType:"group",conversationId:e.conversationId}):void 0;try{const o=await ee({http:Er,authProvider:fr,clientType:hr,groupDecrypt:()=>Un("history"),groupAsyncDecrypt:(e,t)=>{const r=Ca(!0===po?.hasForeground(e)?"foreground":"background",t);return r.assertCurrent?.(e),r},assertLoginContext:e=>{if(!Cr||""!==Ir&&e!==Ir)throw new DOMException("最近历史请求的登录账号已改变","AbortError")},channelDecrypt:()=>jn("history"),prepareGroupKeys:Fn,prepareChannelKeys:(e,t)=>An(e,{...t,recoverExistingMessages:!1}),keyPriority:e=>!0===po?.hasForeground(e)?"foreground":"background"})(e,t);return void 0===r?o:{...o,messages:r.messages(o.messages),recoveries:o.recoveries?.filter(r.acceptsRecovery)}}finally{r?.stop()}},yieldToEventLoop:Ut,report:(e,t,r)=>wr.record(e.endsWith("failed")?"warn":"debug","sdk","history",e,()=>({conversation:t,data:r}))});const us=vr.subscribe(e=>{if("connection:changed"===e.type)return"authenticated"!==e.state&&(So=!1),void po?.notifySchedulingChanged();if("session:updated"===e.type){if("group"!==e.conversation.conversationType&&"channel"!==e.conversation.conversationType)return;const t=we(e.conversation),r=ds.get(t),o={timestamp:e.session.timestamp,access:cs(e.session),capabilities:cs(e.session,!1),state:"group"===e.session.type?e.session.groupState??"active":e.session.channelState,hasPermissions:void 0!==e.session.channelPermissions,hasSnapshot:void 0!==e.session.channelAccessSnapshot};if(ds.set(t,o),"group"===e.conversation.conversationType&&"active"!==o.state&&r?.state!==o.state&&jo(e.conversation),"ready"===eo&&void 0!==r&&(r.access!==o.access||!ko&&r.timestamp!==o.timestamp)){const t=!r.hasSnapshot&&o.hasSnapshot&&(r.capabilities===o.capabilities||!r.hasPermissions&&r.state===o.state);po?.invalidate(e.conversation,{preserveForeground:r.access===o.access||t})}return}return"session:removed"===e.type?(jo(e.conversation),ds.delete(we(e.conversation)),void("ready"===eo&&po?.invalidate(e.conversation))):"conversation-history:cleared"===e.type?(jo(e.conversation),void("ready"===eo&&po?.invalidate(e.conversation))):void("ready"===eo&&!ko&&"conversation"in e&&void 0!==e.conversation&&("message:received"!==e.type&&"message:updated"!==e.type&&"message:removed"!==e.type||po?.invalidate(e.conversation,{preserveForeground:"message:received"===e.type})))});function ms(e,t=!0){const r="group"===e.conversation.conversationType?Ca("foreground"):void 0;r?.assertCurrent?.({conversationType:"group",conversationId:e.conversation.conversationId}),ko=!0;try{if(void 0===r){e.messages.length>0&&Zo.upsertMessages(e.messages,"offline",{backfillOnly:!0,refreshSessionSummary:t});for(const t of e.reactions)is(t);for(const t of po.takeRecoveries(e))Kr(t)}else{const o=po.takeRecoveries(e);for(const o of e.messages)r.publish([o],()=>Zo.upsertMessages([o],"offline",{backfillOnly:!0,refreshSessionSummary:t}));for(const t of e.reactions)r.publish([],()=>is(t));for(const e of o)r.publish([],()=>Kr(e))}}finally{ko=!1}}co=async({conversation:e,oldestLoaded:t,cursor:r,intent:n,limit:s,signal:a})=>{Rt(a);const{conversationId:i}=e,c=Zo.getConversationContext(e);if(void 0===c)throw new Error(`加载远端历史失败:会话不存在(conversationId=${i})`);if("direct"===c.type||"robot"===c.type||"customerService"===c.type)return{messages:[],exhausted:!0};if("establish-latest"===n&&30===s&&("group"===c.type||"channel"===c.type)){const e={conversationType:c.type,conversationId:i};if(void 0===ps(e))return{messages:[],exhausted:!0};const t=await po.readCached(e,!0).catch(t=>(wr.record("warn","sdk","history","recent-history-cache-read-failed",()=>({conversation:e,error:{message:"读取最近历史缓存失败",data:t}})),null));null!==t&&po.isPageCurrent(t)&&Date.now()-t.fetchedAt>3e5&&ms(t,!1),Rt(a);const r=await po.latest(e,a).catch(t=>{if(!vt(t)&&Cr&&void 0===ps(e))return null;throw t});if(null===r)return{messages:[],exhausted:!0};if(Rt(a),!Cr||!po.isPageCurrent(r)||void 0===ps(e))throw new Error("最近历史请求已失效");if(ms(r),await po.confirmConsumed(r),Rt(a),!po.isPageCurrent(r))throw new Error("最近历史页在窗口提交前已失效");return{messages:r.messages,exhausted:r.exhausted,...void 0===r.nextCursor?{}:{nextCursor:r.nextCursor},replaceWindow:!0}}if("group"===c.type){if(void 0!==c.groupState&&"active"!==c.groupState)return{messages:[],exhausted:!0};const o={conversationType:"group",conversationId:i},d=Ir,p=Ca(!0===po?.hasForeground(e)?"foreground":"background",a);p.assertCurrent?.(o);const l=Ia("group",o);try{const o=await fr.getLoginContext();if(null===o)return{messages:[],exhausted:!0};if(p.assertCurrent?.(),o.userId!==d)throw new DOMException("GROUP 历史请求的登录账号已改变","AbortError");const c="establish-latest"===n?Date.now():void 0===r?t?.serverTime??t?.createdAt??Date.now():ur(r,i),u=[],m=[],v=await Ot({asyncDecrypt:p,signal:a,http:Er,userId:o.userId,clientType:hr,groupId:i,baseTime:c,direct:1,limit:s,decryptDeps:{...Un("history"),onDecryptRecovery:e=>m.push(e)},prepareKeys:t=>Fn(t,{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onReaction:e=>u.push(e)});p.assertCurrent?.();const y=l.messages(v.messages);for(const e of y)p.publish([e],()=>Zo.upsertMessages([e],"offline",{backfillOnly:!0,refreshSessionSummary:"establish-latest"===n}));for(const e of u)p.publish([],()=>is(e));for(const e of m)p.publish([],()=>{l.acceptsRecovery(e)&&Kr(e)});p.assertCurrent?.();return{messages:y,...q({conversationId:i,direction:"older",baseTime:c,batchSize:v.batchSize,boundaryTime:v.oldestEntryTime,limit:s}),..."establish-latest"===n?{replaceWindow:!0}:{}}}finally{l.stop()}}if("channel"===c.type){const s=Wr("history");if(void 0!==c.channelState&&o(c.channelState))return wr.record("info","sdk","history","channel-history-blocked",()=>({conversation:e,operationId:s,data:{state:c.channelState}})),{messages:[],exhausted:!0};const l=Oo,u=_o(i),m=await fr.getLoginContext();if(null===m)return{messages:[],exhausted:!0};if("establish-latest"===n){const t=await Wt({signal:a,http:Er,userId:m.userId,clientType:hr,channelId:i,count:lr,operationId:s,decryptDeps:jn("history"),prepareKey:void 0===Mn&&void 0===Tn?void 0:t=>An([t],{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onContentDecodeError:Xr,onReaction:is});Rt(a);const r=Zo.getConversationContext(e);return!Cr||l!==Oo||u!==_o(i)||"channel"!==r?.type||void 0!==r.channelState&&o(r.channelState)?{messages:[],exhausted:!0}:(Rt(a),t.messages.length>0&&Zo.upsertMessages(t.messages,"offline",{backfillOnly:!0,refreshSessionSummary:!0}),{messages:t.messages,exhausted:!t.hasOlder,...void 0===t.nextCursor?{}:{nextCursor:t.nextCursor},replaceWindow:!0})}let v,y=r??"";if(void 0===r&&void 0!==t){const e=t.extensions?.historyCursor;if("string"==typeof e&&""!==e.trim())y=e;else if(d=t,p=m.userId,void 0===d||d.senderId!==p||"pending"!==d.status&&"uploading"!==d.status&&"sending"!==d.status||"string"==typeof d.extensions?.historyCursor&&""!==d.extensions.historyCursor.trim())throw new Error(`CHANNEL historyCursor 缺失(channelId=${i}, messageId=${t.id})`)}wr.record("debug","sdk","history","channel-history-page-start",()=>({conversation:e,operationId:s,data:{baseIndexPresent:""!==y,direction:1,contain:0,count:lr,historyGeneration:l,historyEpoch:u,clientTypeHeader:hr,clientTypeBody:hr}}));try{v=await Jt({signal:a,http:Er,userId:m.userId,clientType:hr,channelId:i,baseIndex:y,count:lr,contain:0,operationId:s,decryptDeps:jn("history"),prepareKey:void 0===Mn&&void 0===Tn?void 0:t=>An([t],{signal:a,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onContentDecodeError:Xr,onReaction:is})}catch(t){throw wr.record("error","sdk","history","channel-history-page-failed",()=>({conversation:e,operationId:s,data:{baseIndexPresent:""!==y,direction:1,contain:0,count:lr},error:{message:"CHANNEL 历史页加载失败",data:t}})),t}Rt(a);const g=Zo.getConversationContext(e);return!Cr||l!==Oo||u!==_o(i)||"channel"!==g?.type||void 0!==g.channelState&&o(g.channelState)?{messages:[],exhausted:!0}:(Rt(a),v.messages.length>0&&Zo.upsertMessages(v.messages,"offline",{backfillOnly:!0}),wr.record("debug","sdk","history","channel-history-page-complete",()=>({conversation:e,operationId:s,data:{responseBatchSize:v.batchSize,messageCount:v.messages.length,exhausted:v.exhausted,nextBaseIndexPresent:void 0!==v.nextBaseIndex}})),{messages:v.messages,exhausted:v.exhausted,...void 0===v.nextBaseIndex?{}:{nextCursor:v.nextBaseIndex}})}var d,p;throw new Error(`远端历史未实现:${c.type}`)};const vs=e=>{e.length>0&&Zo.upsertMessages(e,"offline",{backfillOnly:!0})},ys=async()=>{const e=await fr.getLoginContext();if(null===e)throw new Error("按消息 ID 回源失败:当前没有登录态");return{userId:e.userId}},gs=async(e,t)=>{const r={conversationType:"group",conversationId:e},o=Ia("group",r,t);try{const n=Ir,s=Ao(r),a=()=>{if(!Cr||Ir!==n||s!==Ao(r))throw new DOMException("GROUP 消息查询所属账号或历史已失效","AbortError")},i=Ca("foreground",void 0,a);i.assertCurrent?.(r);const{userId:c}=await ys();if(a(),c!==n)throw new DOMException("GROUP 消息查询的登录账号已改变","AbortError");const d=[],p=[],l=Un("history"),u=await N(t,async t=>{a();const r=await kt({asyncDecrypt:i,http:Er,userId:c,clientType:hr,groupId:e,messageIds:t,decryptDeps:{...l,onDecryptRecovery:e=>p.push(e)},prepareKeys:e=>Fn(e,{priority:"foreground"}),onReaction:e=>d.push(e)});if(a(),200!==r.code)throw Object.assign(new Error("GROUP 按 ID 查询业务失败"),{code:r.code});return r});a(),i.assertCurrent?.();const m=o.messages(u.messages).filter(e=>e.conversationType===r.conversationType&&e.conversationId===r.conversationId);for(const e of m)i.assertCurrent?.(),vs([e]),i.assertCurrent?.();for(const e of d)i.assertCurrent?.(),e.conversation.conversationType===r.conversationType&&e.conversation.conversationId===r.conversationId&&is(e),i.assertCurrent?.();for(const e of p)i.assertCurrent?.(),o.acceptsRecovery(e)&&e.conversation.conversationType===r.conversationType&&e.conversation.conversationId===r.conversationId&&Kr(e),i.assertCurrent?.();return{messages:m.map(e=>{const t=Zo.getConversationMessage(r,e.id);if(void 0===t)throw new Error("GROUP 按 ID 查询在领域合并后缺少消息");return t}),missingMessageIds:u.missingMessageIds}}finally{o.stop()}},hs=async(e,t)=>{const r={conversationType:"channel",conversationId:e},n=Ir,s=Oo,a=_o(e),i=()=>{const t=Zo.getConversationContext(r);if(!Cr||Ir!==n||s!==Oo||a!==_o(e)||"channel"!==t?.type||void 0!==t.channelState&&o(t.channelState))throw new DOMException("CHANNEL 消息查询所属账号或历史已失效","AbortError")};i();const{userId:c}=await ys();if(i(),c!==n)throw new DOMException("CHANNEL 消息查询的登录账号已改变","AbortError");const d=[],p=[],l=await N(t,async t=>{i();const r=await xt({http:Er,userId:c,clientType:hr,channelId:e,messageIds:t,operationId:Wr("history"),decryptDeps:{...jn("history"),onDecryptRecovery:e=>p.push({...e,source:"history"})},prepareKey:void 0===Mn&&void 0===Tn?void 0:async e=>{await An([e],{recoverExistingMessages:!1,priority:"foreground"}),i()},onContentDecodeError:Xr,onReaction:e=>d.push(e)});if(i(),0!==r.code)throw Object.assign(new Error("CHANNEL 按 ID 查询业务失败"),{code:r.code});return r});i();for(const e of l.messages)i(),vs([e]);for(const e of d)i(),is(e);for(const e of p)i(),Kr(e);i();return{messages:l.messages.map(e=>{const t=Zo.getConversationMessage(r,e.id);if(void 0===t)throw new Error("CHANNEL 按 ID 查询在领域合并后缺少消息");return t}),missingMessageIds:l.missingMessageIds}},fs=Re([Me({includeOppositeEnd:!0,resolveOwnKey:async e=>{const t=await(Tn?.getUserPrivateKey(e));return t?.publicKey?{publicKey:t.publicKey,version:t.version}:null}}),ke({resolveGroupKey:Ln}),De({resolveChannelKey:Dn}),xe()]),Is=Pe([Ae(),je(),Oe()]),ws=_e([Ne(),Le(),Ke({resolveChannelKey:Dn,resolveProfile:e=>Fo?.getProfile(e)??Promise.resolve(null)})]);let Cs=()=>{throw new Error("群收包回 ACK 失败:connection.sendFrame 尚未就绪")},bs=()=>!1,Ss=()=>{throw new Error("群发送 ACK 回填失败:connection.onChatAck 尚未就绪")},Ts=()=>{},Es=()=>{};const Rs={...Zo,removeConversationForMembershipTermination:(e,t)=>{Ts(e,t),"group"===e.conversationType?(On.remove(e.conversationId),jo(e),Rn?.clearGroupKeys(e.conversationId)):Mn?.clearChannelKey(e.conversationId),Zo.removeConversationForMembershipTermination(e,t),Gr.api.resetBackground(e).catch(e=>vr.emit({type:"error",error:{scope:"storage",message:"终态删除后清理会话背景失败",cause:e}}))}},Ms=Et({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>Ir,isAuthenticated:()=>bs(),reportReaction:e=>Wo.reportReaction(e),isEmojiSupported:D,logger:zr});is=e=>{Ms.ingest(e,"offline")};const ks=Fe({manager:Ms,getSelfId:()=>Ir,logger:zr}),Ds=Ue({domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0,decrypt:{crypto:yn,resolvePrivateKey:({groupId:e})=>Kn(e),preparePrivateKey:async({groupId:e})=>{if(void 0===Rn)return null;const t=await Rn.getGroupKeys(e);return t?.privateKey??null},onDecryptError:e=>Qr("live",e),onDecryptRecovery:Kr},isActive:()=>Cr});let xs=0;const Ps=vr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&xs++}),As=Be({domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0,decrypt:{crypto:yn,resolveChannelKey:xn,resolveUserPrivateKey:Pn,onDecryptRecovery:Kr,onDecryptError:e=>{const t=void 0!==Mn&&void 0===kr?.saveDecryptRecovery&&2===e.encrypt&&"decrypt-failed"===e.reason;if(Yr("live",{...e,forceRefreshAttempted:t}),!t)return;const r=Mn.getCachedChannelKey(e.channelId)??void 0;Mn.getChannelKey(e.channelId,{staleKey:r}).catch(()=>{})}},isActive:()=>Cr&&bs(),getConnectionEpoch:()=>xs}),js=Ge({isActive:()=>Cr,domainState:Zo,outbox:{onChatAck:e=>Ss(e)},sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0}),Os=He({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0,decrypt:{crypto:yn,resolveChannelKey:xn,resolveUserPrivateKey:Pn,onDecryptRecovery:Kr}}),_s=Ve({getSelfId:()=>Ir,sendFrame:e=>Cs(e),emitter:vr}),Ns=$e({emitter:vr,getSelfId:()=>Ir}),Ls=qe({sendFrame:e=>Cs(e),emitter:vr,getSelfId:()=>Ir,domainState:{reconcileDirectContactEstablishedNotice:Zo.reconcileDirectContactEstablishedNotice,removeConversation:e=>{"string"!=typeof e?("direct"===e.conversationType&&go(e,"friend_relation_removed"),Zo.removeConversation(e)):Zo.removeConversation(e)}},resetDirectReadReceiptPreference:e=>$r.api.readReceipts.resetConversation({conversationType:"direct",conversationId:e}),onRelationshipChanged:an.updateRelationshipFromEvent}),Ks=We({sendFrame:e=>Cs(e),emitter:vr,domainState:{applyTransferStatusBySerialNumber:Zo.applyTransferStatusBySerialNumber}}),Fs=ze({getSelfId:()=>Ir,sendFrame:e=>Cs(e),emitter:vr}),Us=Je({getSelfId:()=>Ir,domainState:Zo,sendFrame:e=>Cs(e),emitter:vr,onRelationshipChanged:an.updateRelationshipFromEvent}),Bs=Qe({sendFrame:e=>Cs(e),emitter:vr,getSelfId:()=>Ir,isAuthenticated:()=>bs(),domainState:Zo}),Gs=Ye({sendFrame:e=>Cs(e),emitter:vr,getSelfId:()=>Ir,isAuthenticated:()=>bs(),domainState:Zo}),Hs=[...Bs.handlers,...Gs.commandHandlers],Vs=oe({isActive:()=>Cr&&bs(),getUserId:async()=>(await fr.getLoginContext())?.userId??null,pull:(e,t,r)=>cr({http:Er,userId:e,clientType:hr,deliveredMsgIds:t,signal:r}),onBatch:e=>{wr.record("info","sdk","call","signal-offline-pull",()=>({data:{count:e.items.length,cmdIds:e.items.map(e=>`0x${e.cmdId.toString(16)}`)}})),0===e.items.length&&vr.emit({type:"notification",cmdId:0,name:"OFFLINE_SIGNAL"})},onItem:e=>{if(vr.emit({type:"notification",cmdId:e.cmdId,name:"OFFLINE_SIGNAL"}),!Cr||!bs())return;const t=Hs.find(t=>t.command===e.cmdId);t?.handler(e.cmdId,e.body)},onError:e=>vr.emit({type:"error",error:{scope:"sync",message:"音视频离线信令拉取失败",cause:e}})}),$s=vr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&Vs.stop()}),qs=Xe({domainState:Zo,sendFrame:e=>Cs(e),getSelfId:()=>Ir,emitter:vr,logger:zr,keepRaw:!0}),Ws=at({domainState:Rs,getSelfId:()=>Ir,prefetchGroupKey:_n,clearGroupKeys:e=>{On.remove(e),jo({conversationType:"group",conversationId:e}),Rn?.clearGroupKeys(e)},clearConversationTermination:e=>Es(e)}),zs=vr.subscribe(e=>{"message:received"!==e.type&&"message:updated"!==e.type||Ws.handleMessage(e.message)}),Js=it({domainState:Rs,getSelfId:()=>Ir,prepareChannelKey:e=>{wr.record("debug","sdk","crypto","channel-key-prepare-requested",()=>({conversation:{conversationType:"channel",conversationId:e},data:{cacheHit:void 0!==Mn&&null!==Mn.getCachedChannelKey(e)}})),void 0!==Mn&&Mn.getChannelKey(e).catch(()=>{})},clearChannelKey:e=>{const t=void 0!==Mn&&null!==Mn.getCachedChannelKey(e);Mn?.clearChannelKey(e),wr.record("info","sdk","crypto","channel-key-cleared",()=>({conversation:{conversationType:"channel",conversationId:e},data:{cacheHit:t}}))},clearConversationTermination:e=>Es(e),stopChannelHistory:e=>{const t=_o(e);No(e),Zo.messageWindow.info().conversationId===e&&Zo.messageWindow.reset(),wr.record("info","sdk","history","channel-history-invalidated",()=>({conversation:{conversationType:"channel",conversationId:e},data:{previousEpoch:t,nextEpoch:_o(e)}}))}}),Qs=vr.subscribe(e=>{if("message:received"===e.type||"message:updated"===e.type){const t=e.message;"channel"===t.conversationType&&void 0!==t.body.system?.eventType&&wr.record("info","sdk","conversation","channel-membership-event-observed",()=>({conversation:{conversationType:"channel",conversationId:t.conversationId},messageId:t.id,data:{eventType:t.body.system?.eventType,source:e.source??"live",targetSelf:t.body.system?.targetUserIds?.includes(Ir)??!1,lifecycleEffects:!0===e.channelLifecycleEffects,stateBefore:Zo.getSession({conversationType:"channel",conversationId:t.conversationId})?.channelState??"missing"}})),Js.handleMessage(e.message,{source:e.source??"live",applyLifecycleEffects:e.channelLifecycleEffects})}}),Ys=/* @__PURE__ */new Set(["channel_member_left","channel_member_removed","channel_member_joined","channel_member_invited","channel_owner_transferred","channel_admin_added","channel_admin_removed","channel_member_renamed"]),Xs=/* @__PURE__ */new Set(["channel_member_left","channel_member_removed","channel_member_joined","channel_member_invited","channel_member_renamed"]),Zs=vr.subscribe(e=>{if("message:received"!==e.type&&"message:updated"!==e.type)return;if("live"!==(e.source??"live")&&!0!==e.channelLifecycleEffects)return;const t=e.message,r=t.body.system?.eventType;"channel"===t.conversationType&&void 0!==r&&(Ys.has(r)&&Uo?.invalidateChannelMembers(t.conversationId).catch(e=>{vr.emit({type:"error",error:{scope:"storage",message:"CHANNEL 成员缓存失效失败",cause:e}})}),Xs.has(r)&&Go.invalidate(t.conversationId).catch(e=>{vr.emit({type:"error",error:{scope:"storage",message:"CHANNEL @候选缓存失效失败",cause:e}})}))}),ea=c({fetchMessagesById:gs,onSourceUnavailable:e=>wr.record("warn","sdk","message","pinned-source-unavailable",()=>({conversation:{conversationType:"group",conversationId:e.conversationId},data:{messageId:e.messageId,localCleared:!0,serverCleanup:"requires-conditional-authorized-api"}})),...void 0===Tr?{}:{coreClient:Tr},domainState:Zo,emitter:vr}),ta=e({fetchMessagesById:hs,onSourceUnavailable:e=>wr.record("warn","sdk","message","pinned-source-unavailable",()=>({conversation:{conversationType:"channel",conversationId:e.conversationId},data:{messageId:e.messageId,localCleared:!0,serverCleanup:"requires-conditional-authorized-api"}})),...void 0===Tr?{}:{coreClient:Tr},domainState:Zo,emitter:vr}),ra=n({...void 0===Qo?{}:{joinApplications:Qo},http:Er,clientType:hr,buildOfflineDecrypt:()=>jn("history"),onContentDecodeError:Xr,onReaction:is,...void 0===Mn&&void 0===Tn?{}:{prepareKey:(e,t)=>An([e],{signal:t,priority:!0===po?.hasForeground({conversationType:"channel",conversationId:e})?"foreground":"background"})}});Ro=async(e,t,r)=>{const{context:o}=await ra.loadMessageContext(e,t,r);return o.messages};const oa=r({authProvider:fr,emitter:vr,domainState:Zo,loadMessageContext:ra.loadMessageContext,isActive:()=>Cr,getHistoryGeneration:()=>Oo,getHistoryEpoch:_o}),na=G({domainState:Zo,isActive:()=>Cr,loadSummary:async({channelId:e,readCursor:t})=>{const r=await fr.getLoginContext();if(null===r||!Cr||r.userId!==Ir)throw new Error("CHANNEL 已读摘要:无有效登录上下文");return(await qt({http:Er,userId:r.userId,clientType:hr,channels:[{channelId:e,readCursor:t}],keepRaw:!1})).find(t=>t.channelId===e)},report:(e,t,r)=>wr.record("channel-read-summary-failed"===e?"warn":"debug","sdk","sync",e,()=>({conversation:t,data:r}))}),sa=Pt({domainState:Zo,updateReadIndex:async({channelId:e,readCursor:t})=>{const r=await fr.getLoginContext();if(null===r||!Cr||r.userId!==Ir)throw new Error("CHANNEL 已读 readIndexes/edit:无登录上下文");await dr({http:Er,userId:r.userId,indexes:[{channelId:e,readCursor:t}]})},emitter:vr,logger:zr,onReadCommitted:na.request,onReadSettled:na.settled,syncRead:{getSelfId:()=>Ir,sendFrame:e=>Cs(e)}}),aa=Ze({getSelfId:()=>Ir,applyRemoteRead:e=>sa.applyRemoteRead(e),emitter:vr,logger:zr}),ia=et([pt({domainState:Zo,markGroupReadAll:async e=>{const t=await fr.getLoginContext();if(null===t)throw new Error("群已读 read_all:无登录上下文");await pr({http:Er,userId:t.userId,groupId:e})},emitter:vr,logger:zr,isAuthenticated:()=>bs(),syncRead:{getSelfId:()=>Ir,sendFrame:e=>Cs(e)}}),sa,lt({domainState:Zo}),ut({domainState:Zo})]),ca=tt({getSelfId:()=>Ir,sendFrame:e=>Cs(e),onListenerError:()=>vr.emit({type:"error",error:{scope:"unknown",message:"推送状态订阅者回调异常"}})}),da=rt({getSelfId:()=>Ir,sendFrame:e=>Cs(e),onListenerError:()=>vr.emit({type:"error",error:{scope:"unknown",message:"页面状态订阅者回调异常"}})}),pa=vr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&(ca.setAuthenticated(!1),da.setAuthenticated(!1))}),la=ot({transport:Rr,authProvider:fr,endpointProvider:mr.endpointProvider,emitter:vr,domainState:Zo,logger:zr,decrypt:{crypto:yn,resolvePrivateKey:({msgType:e})=>1===e||1e3===e?Tn?.getCachedPrivateKey(Ir)?.privateKey??null:null,onDecryptError:e=>Jr("live",e),onDecryptRecovery:Kr},encryptSend:void 0===En&&void 0===Mn?void 0:{crypto:yn,resolvePublicKey:e=>En?.getPeerPublicKey(e)??Promise.resolve(null),resolveGroupKey:Ln},media:void 0!==fn?{transfer:fn,recoveryPort:br?.port,retainFailedUploads:mr.uploadRecovery?.retainFailedUploads,shouldPersistUpload:(e,t)=>void 0!==br&&ct(t,!0===mr.media?.multipartTransfer&&!1!==mr.media.multipartUpload).multipart,waitUntilOnline:e=>Sr.wait(e),preview:wn,onTransferError:e=>{wr.record("error","core","media","media-transfer-failed",()=>({conversation:e.conversation,data:{stage:e.stage,kind:e.kind,messageId:e.messageId},error:{message:"媒体上传失败",data:e.cause}}))},onAlbumContentSize:e=>{wr.record("rejected"===e.outcome?"error":"warn","core","media","rejected"===e.outcome?"media-album-content-rejected":"media-album-content-large",()=>({conversation:e.conversation,data:{messageId:e.messageId,itemCount:e.itemCount,...void 0===e.contentBytes?{}:{contentBytes:e.contentBytes}},...void 0===e.cause?{}:{error:{message:"媒体合集正文未通过发送前体积闸门",data:e.cause}}}))},...void 0===Ur?{}:{assetCache:Ur,onAssetCacheError:e=>{wr.record("warn","core","media","media-asset-cache-put-failed",()=>({data:{operation:e.operation,kind:e.kind,messageId:e.messageId,byteLength:e.byteLength},error:{message:"发送媒体写入本机缓存失败",data:e.cause}}))}},...void 0===mr.media?.maxConcurrentUploads?{}:{maxConcurrentUploads:mr.media.maxConcurrentUploads}}:void 0,sendStrategies:fs,commandHandlers:[...da.commandHandlers,...ca.commandHandlers,...Ls,...Ns,...Ks,...Fs,...Us,...Hs,...ks,...Ds,...qs,...As,...Os,..._s,...aa,...js],readStrategies:ia,canSendDirectReadReceipt:e=>{if(!$r.isDirectReadReceiptEnabled(e))return!1;const t=an.peekRelationship(e);return void 0!==t&&"unknown"!==t?"friend"===t:void 0},recallStrategies:Is,channelMessageDeletion:{resolveProfile:e=>Fo?.getProfile(e)??Promise.resolve(null),onPermissionDenied:e=>Zo.refreshConversationProfile(e,"channel")},editStrategies:ws,storage:kr,onHeartbeat:()=>da.onHeartbeat(),onAuthenticated:()=>{da.setAuthenticated(!0),ca.setAuthenticated(!0);for(const e of oo)e.resumeMedia();const e=uo;uo=!0,(e||"auto"===lo)&&Pa().catch(()=>{}),Vs.start()},isOnline:()=>"undefined"==typeof navigator?void 0:navigator.onLine},mr.connection);Hr=e=>la.suppressDirectReadReceipts(e),Vr=e=>la.resumeDirectReadReceipts(e),Cs=la.sendFrame,bs=()=>"authenticated"===la.state,Ss=la.onChatAck,go=la.terminateConversationSending,Ts=la.markOutboxConversationTerminated,Es=la.clearOutboxConversationTerminated;const ua=L({operations:{getPending:la.getPendingOutbox,retry:la.retryOutboxMessage,cancel:la.cancelOutboxMessage},emitter:vr,isActive:()=>Cr}),ma=l({mediaCrypto:{executor:mn,generation:gr,isActive:()=>Cr},connection:la,domainState:Zo,crypto:yn,settleEmptyGroupRead:async e=>{const t=xo.get(e.conversationId)??0,r=Zo.getSession(e);let o=void 0===r,n=r?.unreadCount??0,s=r?.mentionUnreadCount??0,a=n,i=s;const c=()=>{const r=Zo.getSession(e);if(!Cr||o||void 0===r||t!==(xo.get(e.conversationId)??0)||void 0!==r.groupState&&"active"!==r.groupState)throw new DOMException("群已读请求已失效","AbortError");return r},d=vr.subscribe(t=>{if("conversation"in t&&"group"===t.conversation?.conversationType&&t.conversation.conversationId===e.conversationId&&(("session:removed"===t.type||"conversation-history:cleared"===t.type||"session:updated"===t.type&&void 0!==t.session.groupState&&"active"!==t.session.groupState)&&(o=!0),"read:updated"===t.type||"session:updated"===t.type)){const t=Zo.getReadState(e);if(void 0===t)return;const r=t.mentionUnreadCount??0;a=Math.max(0,a-Math.max(0,n-t.unreadCount)),i=Math.max(0,i-Math.max(0,s-r)),n=t.unreadCount,s=r}});try{c();const t=await fr.getLoginContext();if(c(),null===t||t.userId!==Ir)throw new Error("群已读 read_all:登录上下文已失效");await pr({http:Er,userId:t.userId,groupId:e.conversationId});const r=c(),o=Zo.getReadState(e),n=Math.max(0,(o?.unreadCount??r.unreadCount)-a),s=Math.max(0,(o?.mentionUnreadCount??r.mentionUnreadCount??0)-i);Zo.setReadState({...o??{...e,readCursor:r.readCursor??"",unreadCount:r.unreadCount},mentionUnreadCount:s}),Zo.applyServerUnread(e,n)}finally{d()}},...void 0===fn?{}:{mediaTransfer:fn},prepareDirectReadReceipt:async e=>{try{await an.ensureRelationship(e)}catch(t){vr.emit({type:"error",error:{scope:"http",message:"Direct 已读已在本地提交,但联系人关系查询失败,未发送对端可见回执",cause:{peerId:e,error:t}}})}}}),va=O({recoveryPort:br?.port,connection:la,domainState:Zo,emitter:vr,isActive:()=>Cr,preparePreview:Cn,prepareVideoPoster:bn,prepareImageThumbnail:Sn,onLocalPreviewError:({kind:e,byteLength:t,cause:r})=>{wr.record("warn","sdk","media","local-preview-failed",()=>({generation:gr,data:{kind:e,byteLength:t},error:{message:r instanceof Error?r.message:String(r)}}))},...void 0===Ur?{}:{assetCache:Ur,onAssetCacheEvent:e=>{wr.record("failed"===e.outcome?"warn":"debug","sdk","media",`media-asset-cache-${e.operation}-${e.outcome}`,()=>({data:{operation:e.operation,outcome:e.outcome,kind:e.kind,messageId:e.messageId,...void 0===e.byteLength?{}:{byteLength:e.byteLength}},...void 0===e.cause?{}:{error:{message:"媒体资产缓存操作失败",data:e.cause}}}))}},...void 0===fn?{}:{loaders:{loadImage:ma.operations.loadImage,loadVideo:ma.operations.loadVideo,loadVoice:ma.operations.loadVoice,loadFile:ma.operations.loadFile}}}),ya=J({isActive:()=>Cr&&"ready"===eo&&""!==Ir,maintain:async()=>{va.prune(),la.expireRetainedUploads();const e=(await Promise.allSettled([Fr?Ur?.prune?.():void 0,br?.prune()])).find(e=>"rejected"===e.status);if("rejected"===e?.status)throw e.reason},onError:e=>wr.record("warn","sdk","media","media-cache-maintenance-failed",()=>({error:{message:"媒体过期缓存清理失败",data:e}}))});rn=()=>{la.invalidateMediaAssetCacheWrites(),va.clearCache()},void 0===mr.transport&&"undefined"!=typeof window&&(la.setConnectionAllowed(!1),no=nt({onChange:(e,t)=>{if(!e){if(yo=!0,la.setConnectionAllowed(!1),!Cr)return io?.then(()=>{});Cr=!1,Vs.stop(),jr.clear(),Nn(),wo.abort(),Io.dispose(),Eo.dispose(),To.dispose(),po?.dispose(),mo=!1,vo+=1,ga.stop();return _a({localData:"preserve"},{requireStorageClose:!0,preserveUploadRecovery:!0,notifyReplacement:"replaced"===t}).then(()=>{})}},onError:e=>{ao=e,vr.emit({type:"error",error:{scope:"transport",message:"IM 页面连接协调不可用,请使用支持 Web Locks 的安全浏览器环境",cause:e}})}}));const ga=Ce({onOnline:()=>{Sr.setOnline(!0),la.notifyOnline()},onOffline:()=>{Sr.setOnline(!1),la.notifyOffline()},onVisible:()=>{ya.run(),la.notifyVisible();for(const e of oo)e.resumeMedia()},onPageHide:()=>{mo&&la.suspendForPageLifecycle()},onPageShow:()=>{if(ya.run(),mo){la.resumeFromPageLifecycle(),la.notifyVisible();for(const e of oo)e.resumeMedia()}}},mr.network);const ha=vr.subscribe(e=>{Cr&&"auth:invalid"===e.type&&(Vs.stop(),mo=!1,vo+=1,yo=void 0!==no,no?.terminate(),ga.stop())});async function fa(e,t={}){const r=await(Tn?.getUserPrivateKey(e,{priority:t.priority??"background",signal:t.signal??wo.signal}))??null;return{crypto:yn,resolvePrivateKey:({msgType:e})=>1===e||1e3===e?r?.privateKey??null:null,onDecryptError:t=>Jr("offline",t,e),onDecryptRecovery:Kr}}function Ia(e,t,r){const o=void 0===t?Zo.getMessages().filter(t=>t.conversationType===e):Zo.getMessagesByConversation(t).filter(e=>void 0===r||r.includes(e.id)),n=new Map(o.map(e=>[_r({conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id}),e])),s=/* @__PURE__ */new Set,a=vr.subscribe(o=>{if(("message:received"===o.type||"message:updated"===o.type)&&o.conversation.conversationType===e&&(void 0===t||o.conversation.conversationId===t.conversationId&&(void 0===r||r.includes(o.message.id)))){const e=_r({conversation:o.conversation,messageId:o.message.id}),t=n.get(e);"live"!==o.source||void 0!==t&&Ft(t,o.message)||s.add(e),n.set(e,o.message)}});return{stop:()=>{a(),n.clear(),s.clear()},acceptsRecovery:e=>!s.has(_r(e)),messages:e=>e.map(e=>{const t={conversationType:e.conversationType,conversationId:e.conversationId};return s.has(_r({conversation:t,messageId:e.id}))?Zo.getConversationMessage(t,e.id)??e:e})}}function wa(e,t){const r=Ir,o=new Map(Po),n=/* @__PURE__ */new Map,s=e=>{if(Rt(wo.signal),!Cr||r!==Ir)throw new DOMException("DIRECT 计算所属账号已失效","AbortError");void 0!==e&&n.set(we(e),e);for(const[e,t]of n)if((o.get(e)?.version??0)!==Ao(t))throw void 0!==Po.get(e)?.reason?Po.get(e).reason:new DOMException("DIRECT 计算所属会话已清理","AbortError");t?.()};return{publish(e,t){s();const r=t();return s(),r},executor:mn,generation:gr,operationId:"direct-batch:"+ ++Zn,priority:e,signal:wo.signal,assertCurrent:s,yieldToEventLoop:Ut}}function Ca(e,t,r){const o=Ir,n=new Map(Po),s=/* @__PURE__ */new Map,a=e=>{if(Rt(wo.signal),Rt(t),!Cr||Ir!==o)throw new DOMException("GROUP 计算所属账号已失效","AbortError");void 0!==e&&s.set(we(e),e);for(const[e,t]of s)if((n.get(e)?.version??0)!==Ao(t))throw void 0!==Po.get(e)?.reason?Po.get(e).reason:new DOMException("GROUP 计算所属群密钥、权限或历史已失效","AbortError");r?.()};return{publish(e,t){a();const r=e.filter(e=>{if("group"!==e.conversationType||void 0===e.body.system)return!1;const t=Bt(e.body.system,Ir);return null!==t&&"active"!==t.state}).map(e=>({conversationType:"group",conversationId:e.conversationId})),o=t();for(const e of r){const t=we(e);void 0===Po.get(t)?.reason&&n.set(t,{version:Ao(e)})}return a(),o},executor:{async decryptBatch(t){const r=[...s.values()];ls.set(t.operationId,r);try{const o="foreground"===e||r.some(e=>!0===po?.hasForeground(e))?"foreground":"background";return await mn.decryptBatch({...t,priority:o})}finally{ls.delete(t.operationId)}}},generation:gr,operationId:"group-batch:"+ ++Zn,priority:e,signal:t??wo.signal,assertCurrent:a,yieldToEventLoop:Ut}}async function ba(e,t,r,o,n){const s=[];let a;try{0===e.length&&0===t.length&&n([],()=>{s.push(Promise.resolve(Zo.commitReceivedMessages([],"offline")))});for(const e of t)n([],()=>{s.push(Promise.resolve(Zo.commitReceivedMessages([],"offline",void 0,{events:[e],apply:e=>Ms.ingest(e,"offline")})))});for(const t of e){const e=Zo.prepareOfflineMessageUpdate(t,o);("boolean"==typeof e?e:await e)&&n([t],()=>{s.push(Promise.resolve(Zo.commitReceivedMessages([t],"offline")))})}for(const e of r)n([],()=>{Kr(e);const t=Dr.get(_r(e));void 0!==t&&s.push(t)})}catch(e){a={cause:e}}const i=await Promise.allSettled(s);if(void 0!==a)throw a.cause;const c=i.find(e=>"rejected"===e.status);if("rejected"===c?.status)throw c.reason;o()}function Sa(e,t){return{endpoint:e,pullBatch:async({deliveredMsgInfos:r,limit:o})=>{const n=Ia("direct");try{const s=[],a=Ir,i=wa("background");i.assertCurrent?.();const c=await fr.getLoginContext();if(null===c)throw new Error(`sync(${e}): 无登录上下文(authProvider.getLoginContext 返回 null)`);if(i.assertCurrent?.(),""!==a&&c.userId!==a)throw new DOMException("DIRECT 离线同步的登录账号已改变","AbortError");const d=await fa(c.userId);i.assertCurrent?.();const p=[],l=await t({http:Er,userId:c.userId,clientType:hr,decryptDeps:{...d,onDecryptRecovery:e=>s.push(e)},asyncDecrypt:i,deliveredMsgInfos:r,...void 0===o?{}:{limit:o},onReaction:e=>p.push(e)});return i.assertCurrent?.(),{...l,reactions:p,commit:async()=>{try{await ba(n.messages(l.messages).sort(Nt),p,s.filter(n.acceptsRecovery),()=>i.assertCurrent?.(),i.publish)}finally{n.stop()}}}}catch(e){throw n.stop(),e}}}}async function Ta(e,t){const r=[...new Map(e.map(e=>[we(e),e])).values()],o=[];let n=0;if(await(async()=>{for(;n<r.length;){if(!Cr)return;const e=r[n++],s="group"===e.conversationType?{conversationType:"group",conversationId:e.conversationId}:void 0,a=void 0!==s&&void 0!==t&&t.groupIds.has(e.conversationId)&&Zo.hasRecoverableConversationDeletion(s)?{ref:s,userId:t.userId}:void 0;if(a||void 0!==Zo.getSession(e)&&void 0!==ps(e))try{if(await Io.waitForBackground(wo.signal),!Cr)return;if(a&&await Ea(a.ref,a.userId))continue;if(!Cr||void 0===Zo.getSession(e)||void 0===ps(e))continue;po.invalidate(e,{preserveForeground:!0}),await co({conversation:e,oldestLoaded:void 0,intent:"establish-latest",limit:30})}catch(t){if(a){o.push(t);continue}if(!Cr||void 0===Zo.getSession(e)||void 0===ps(e))continue;vr.emit({type:"error",error:{scope:"sync",message:"会话最新消息同步失败",cause:t}}),wr.record("warn","sdk","sync","session-latest-summary-failed",()=>({conversation:e,error:{message:"会话最新消息同步失败",data:t}}))}}})(),o.length>0)throw new AggregateError(o,"已删除群会话恢复失败")}async function Ea(e,t){if(!Zo.hasRecoverableConversationDeletion(e))return!1;const r=Ca("background");r.assertCurrent?.(e);const o=Ia("group",e);try{const n=[],s=[],a=await Ot({http:Er,userId:t,clientType:hr,groupId:e.conversationId,baseTime:Date.now(),direct:1,limit:30,signal:wo.signal,asyncDecrypt:r,decryptDeps:{...Un("history"),onDecryptRecovery:e=>n.push(e)},prepareKeys:e=>Fn(e,{priority:"background",signal:wo.signal}),onReaction:e=>s.push(e)});r.assertCurrent?.(e);const i=o.messages(a.messages).sort(Nt);return await ba(i,s,n.filter(o.acceptsRecovery),()=>r.assertCurrent?.(e),r.publish),void 0!==Zo.getSession(e)}finally{o.stop()}}async function Ra(){const e=Wr("sync");wr.record("info","sdk","sync","channel-sync-start",()=>({operationId:e,data:{clientTypeHeader:hr,sessionsClientTypeBody:"absent",offlineClientTypeBody:hr}}));try{await async function(e){const t=Oo,r=new Map(Do),n=e=>Cr&&t===Oo&&(r.get(e)??0)===_o(e);if(void 0===Fo)return void wr.record("info","sdk","sync","channel-sync-skipped",()=>({operationId:e,data:{reason:"profile-unavailable"}}));const s=await fr.getLoginContext();if(null===s)return void wr.record("info","sdk","sync","channel-sync-skipped",()=>({operationId:e,data:{reason:"auth-unavailable"}}));const a=(await Fo.listProfiles({forceRefresh:!0})).filter(e=>n(e.id));if(!Cr)return;if(0===a.length)return void wr.record("info","sdk","sync","channel-sync-complete",()=>({operationId:e,data:{profileCount:0,sessionCount:0,offlineMessageCount:0}}));const i=new Map(a.map(e=>[e.id,e]));for(const e of a){if(Zr(e.channelState)){Mn?.clearChannelKey(e.id),Rs.removeConversationForMembershipTermination({conversationType:"channel",conversationId:e.id},`channel_${e.channelState}`);continue}const t=e.permissions.sendMessages?void 0:`channel_${e.channelState}`;Zo.setChannelRestriction(e.id,e.channelState,t,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}}),Zo.updateConversationProfile({conversationType:"channel",conversationId:e.id},{title:e.name,avatar:e.avatar}),void 0!==e.muted&&Zo.setMuted({conversationType:"channel",conversationId:e.id},e.muted)}const c=new Map(a.map(e=>{const t={conversationType:"channel",conversationId:e.id},r=Zo.getReadState(t),o=Zo.getSession(t);return[e.id,{revision:Zo.getChannelReadRevision(t),pending:Zo.hasPendingChannelRead(t),readCursor:r?.readCursor??o?.readCursor??"",unreadCount:o?.unreadCount??r?.unreadCount??0,mentionUnreadCount:o?.mentionUnreadCount??r?.mentionUnreadCount??0}]})),d=a.map(e=>({channelId:e.id,readCursor:c.get(e.id).readCursor}));wr.record("debug","sdk","sync","channel-sessions-request",()=>({operationId:e,data:{channelCount:d.length,channelsWithReadCursor:d.filter(e=>""!==e.readCursor).length,clientTypeHeader:hr,clientTypeBody:hr}}));const p=await qt({http:Er,userId:s.userId,clientType:hr,channels:d,operationId:e,decryptDeps:jn("offline"),prepareKeys:e=>An(e.filter(e=>{const t=i.get(e)?.channelState;return void 0===t||!o(t)})),onContentDecodeError:Xr,onReaction:is});if(!Cr)return;wr.record("debug","sdk","sync","channel-sessions-response",()=>({operationId:e,data:{sessionCount:p.length,lastMessageCount:p.filter(e=>void 0!==e.last).length,decryptFailedLastCount:p.filter(e=>!0===e.last?.encryption.decryptFailed).length,unknownContentLastCount:p.filter(e=>"unknown"===e.last?.contentType&&!0!==e.last.encryption.decryptFailed).length}}));const l=new Set(p.filter(e=>{const t=c.get(e.channelId),r={conversationType:"channel",conversationId:e.channelId},o=Zo.getReadState(r),n=Zo.getSession(r);return void 0===t||t.pending||Zo.hasPendingChannelRead(r)||Zo.getChannelReadRevision(r)!==t.revision||(o?.readCursor??n?.readCursor??"")!==t.readCursor||(n?.unreadCount??o?.unreadCount??0)!==t.unreadCount||(n?.mentionUnreadCount??o?.mentionUnreadCount??0)!==t.mentionUnreadCount}).map(e=>e.channelId)),u=p.filter(e=>n(e.channelId)&&void 0!==Zo.getConversationContext({conversationType:"channel",conversationId:e.channelId})).map(e=>{const t=i.get(e.channelId),r=t?.channelState,n=void 0!==r&&o(r)?r:o(e.channelState)?e.channelState:r??e.channelState,s="active"===n?void 0:n===e.channelState?e.sendDisabledReason:`channel_${n}`;return{...e,channelState:n,sendDisabledReason:s}});for(const e of u){const t=i.get(e.channelId);Zo.setChannelRestriction(e.channelId,e.channelState,e.sendDisabledReason,void 0===t?void 0:{permissions:t.permissions,...void 0===t.accessSnapshot?{}:{snapshot:t.accessSnapshot}}),void 0!==t&&(Zo.updateConversationProfile({conversationType:"channel",conversationId:e.channelId},{title:t.name,avatar:t.avatar}),void 0!==t.muted&&Zo.setMuted({conversationType:"channel",conversationId:e.channelId},t.muted)),l.has(e.channelId)||Zo.applyChannelReadSummary({conversationType:"channel",conversationId:e.channelId},e),o(e.channelState)&&Mn?.clearChannelKey(e.channelId)}const m=e=>{const t=Zo.getConversationContext({conversationType:"channel",conversationId:e});return n(e)&&void 0!==t&&(void 0===t.channelState||!o(t.channelState))},v=(e,r=!0)=>{if(!Cr||t!==Oo)return[];const o=e.filter(e=>m(e.conversationId));return o.length>0&&Zo.upsertMessages(o,"offline",{applyChannelLifecycleEffects:r}),o},y=async(e,t,r=[],o=[],n=!0)=>{const s=()=>m(e.conversationId),a=()=>{if(!s())throw new DOMException("社群离线提交所属会话已失效","AbortError")};if(!s())return!1;const i=Ia("channel",e);try{const c=[];for(const e of[...t].sort(Nt)){const t=Zo.prepareOfflineMessageUpdate(e,a);("boolean"==typeof t?t:await t)&&c.push(e)}a();const d=async()=>{const e=o.filter(i.acceptsRecovery);if(e.length>0&&void 0===kr?.saveDecryptRecovery)throw new Error("CHANNEL 同步不能保存解密恢复记录");for(const t of e)await kr.saveDecryptRecovery(t)};if(!0===kr?.supportsChannelSyncCheckpoint)return await Zo.commitChannelSyncPage([e],()=>{v(i.messages(c),n);for(const e of r)s()&&is(e)},s,d);await Zo.commitReceivedMessages(i.messages(c),"offline",{applyChannelLifecycleEffects:n},{events:r,apply:e=>Ms.ingest(e,"offline")});for(const e of o.filter(i.acceptsRecovery))a(),Kr(e),await Dr.get(_r(e));return s()}finally{i.stop()}},g=[],h=/* @__PURE__ */new Set;for(const e of u)if(void 0!==e.last)try{await y({conversationType:"channel",conversationId:e.channelId},[e.last])}catch(t){g.push(t),h.add(e.channelId)}const f=/* @__PURE__ */new Set;for(const t of u){const r={conversationType:"channel",conversationId:t.channelId};if(void 0!==t.last||t.unreadCount<=0||""!==t.readCursor||o(t.channelState)||!Zo.hasRecoverableConversationDeletion(r,{includeRestored:!0}))continue;const n=Ia("channel",r);try{if(await Io.waitForBackground(wo.signal),!m(t.channelId))continue;const o=[],a=[],i=await Wt({http:Er,userId:s.userId,clientType:hr,channelId:t.channelId,count:lr,operationId:e,signal:wo.signal,decryptDeps:{...jn("history"),onDecryptRecovery:e=>a.push(e)},prepareKey:e=>An([e],{signal:wo.signal,priority:"background"}),onContentDecodeError:Xr,onReaction:e=>o.push(e)});await y(r,n.messages(i.messages),o,a.filter(n.acceptsRecovery),!1)&&f.add(t.channelId)}catch(e){g.push(e),h.add(t.channelId)}finally{n.stop()}}await Ta(u.filter(e=>void 0===e.last&&!o(e.channelState)&&!f.has(e.channelId)&&!h.has(e.channelId)).map(e=>({conversationType:"channel",conversationId:e.channelId})));const I=u.filter(e=>!h.has(e.channelId)&&!l.has(e.channelId)&&!o(e.channelState)&&e.unreadCount>0&&""!==e.readCursor);wr.record("debug","sdk","sync","channel-offline-plan",()=>{const t={staleRead:0,historyBlocked:0,zeroUnread:0,emptyReadCursor:0};for(const e of u)l.has(e.channelId)?t.staleRead+=1:o(e.channelState)?t.historyBlocked+=1:e.unreadCount<=0?t.zeroUnread+=1:""===e.readCursor&&(t.emptyReadCursor+=1);return{operationId:e,data:{acceptedSessionCount:u.length,eligibleChannelCount:I.length,staleReadSkippedCount:t.staleRead,historyBlockedSkippedCount:t.historyBlocked,zeroUnreadSkippedCount:t.zeroUnread,emptyReadCursorSkippedCount:t.emptyReadCursor,direction:0,contain:0,count:lr}}});const w=[],C=new Map(I.map(e=>[e.channelId,e.readCursor])),b=[];for(const t of I){const r={conversationType:"channel",conversationId:t.channelId},o=!0!==kr?.supportsChannelSyncCheckpoint?void 0:Qt(await kr.getMeta(Yt(r)),r);if(!m(t.channelId))continue;const n=o?.startIndex===t.readCursor;b.push({channelId:t.channelId,baseIndex:n?o.baseIndex:t.readCursor}),wr.record("debug","sdk","sync","channel-offline-resume",()=>({operationId:e,conversation:r,data:{resumed:n}}))}const S=[],T=[];let E;if(await zt({http:Er,userId:s.userId,clientType:hr,operationId:e,pulls:b,messageCount:lr,signal:wo.signal,beforePage:()=>Io.waitForBackground(wo.signal),isChannelCurrent:m,yieldToEventLoop:Ut,decryptDeps:{...jn("offline"),onDecryptRecovery:e=>T.push(e)},prepareKeys:e=>An(e,{recoverExistingMessages:!1}),onContentDecodeError:Xr,onReaction:e=>S.push(e),onPage:async(e,t)=>{const r=S.splice(0),o=T.splice(0),n=(async()=>{for(const n of t.pulls){const s={conversationType:"channel",conversationId:n.channelId},a=()=>m(n.channelId);if(!a())continue;const i=o.filter(e=>e.conversation.conversationId===n.channelId),c=e.filter(e=>e.conversationId===n.channelId),d=await y(s,c,r.filter(e=>e.conversation.conversationId===n.channelId),i);if(d&&w.push(...c),!0!==kr?.supportsChannelSyncCheckpoint)continue;if(!d||!a())continue;const p=t.nextBaseIndexes[n.channelId];void 0!==p&&await Zo.saveChannelSyncCheckpoint({version:1,conversation:s,startIndex:C.get(n.channelId),baseIndex:p},a);for(const e of i)a()&&ns(e).catch(e=>vr.emit({type:"error",error:{scope:"storage",message:"CHANNEL 解密恢复失败",cause:e}}))}})();Co.add(n);try{await n}finally{Co.delete(n)}}}).catch(e=>{E={cause:e}}),!Cr)return;const R=u.flatMap(e=>{const t=e.last;if(void 0===t||qn(t))return[];const r=t.extensions?.historyCursor;return[{summary:e,last:t,historyCursor:"string"==typeof r?r.trim():""}]}),M=(e,t)=>`${e}:${t}`,k=/* @__PURE__ */new Map,D=/* @__PURE__ */new Set;for(const{summary:e,last:t}of R){const r=Zo.getConversationMessage({conversationType:"channel",conversationId:e.channelId},t.id);if(void 0===r||!qn(r))continue;const o=M(e.channelId,t.id);k.set(o,r),D.add(o)}for(const e of w)qn(e)&&k.set(M(e.conversationId,e.id),e);const x=R.filter(({summary:e,last:t,historyCursor:r})=>!(""===r||l.has(e.channelId)||o(e.channelState)||k.has(M(t.conversationId,t.id))||$n.has(M(t.conversationId,t.id)))),P=R.filter(({summary:e,last:t})=>!l.has(e.channelId)&&!o(e.channelState)&&!D.has(M(t.conversationId,t.id))&&k.has(M(t.conversationId,t.id))).length;wr.record("debug","sdk","sync","channel-session-last-recovery-plan",()=>({operationId:e,data:{unusableLastCount:R.length,decryptFailedLastCount:R.filter(({last:e})=>!0===e.encryption.decryptFailed).length,unknownContentLastCount:R.filter(({last:e})=>"unknown"===e.contentType&&!0!==e.encryption.decryptFailed).length,localRecoveredCount:D.size,offlineRecoveredCount:P,contextRecoveryCount:x.length,staleReadSkippedCount:R.filter(e=>l.has(e.summary.channelId)).length,historyBlockedSkippedCount:R.filter(e=>o(e.summary.channelState)).length,missingHistoryCursorCount:R.filter(e=>""===e.historyCursor).length}}));const A=async({summary:t,last:r,historyCursor:n})=>{try{if(await Io.waitForBackground(wo.signal),!m(t.channelId))return;const{message:a}=await ra.loadMessageContext(t.channelId,n,s.userId,wo.signal),i=Zo.getConversationContext({conversationType:"channel",conversationId:t.channelId});if(!Cr||"channel"!==i?.type||void 0!==i.channelState&&o(i.channelState))return;if("channel"!==a.conversationType||a.conversationId!==t.channelId||a.id!==r.id)throw new Error(`CHANNEL sessions.last 精确恢复结果不匹配(channelId=${t.channelId}, messageId=${r.id})`);if(!qn(a)){if("unknown"===a.contentType&&!0!==a.encryption.decryptFailed)return $n.add(M(a.conversationId,a.id)),void wr.record("info","sdk","sync","channel-session-last-unknown-confirmed",()=>({operationId:e,conversation:{conversationType:"channel",conversationId:t.channelId},data:{messageId:r.id,reason:a.body.unknown?.reason}}));throw new Error(`CHANNEL sessions.last 精确恢复未取得可用正文(channelId=${t.channelId}, messageId=${r.id})`)}return a}catch(o){return void wr.record("warn","sdk","sync","channel-session-last-recovery-failed",()=>({operationId:e,conversation:{conversationType:"channel",conversationId:t.channelId},error:{message:"CHANNEL sessions.last 精确恢复失败",data:o},data:{messageId:r.id}}))}},j=[];for(const e of x){if(!Cr)break;j.push(await A(e))}for(const e of j)void 0!==e&&k.set(M(e.conversationId,e.id),e);const O=j.filter(e=>{if(void 0===e)return!1;const t=Zo.getConversationMessage({conversationType:"channel",conversationId:e.conversationId},e.id);return void 0===t||!qn(t)});if(v(O),1===g.length&&void 0===E)throw g[0];if(g.length>0)throw new AggregateError([...g,...void 0===E?[]:[E.cause]],"社群摘要或离线恢复保存失败");if(void 0!==E)throw E.cause;wr.record("info","sdk","sync","channel-sync-complete",()=>({operationId:e,data:{profileCount:a.length,terminalProfileCount:a.filter(e=>Zr(e.channelState)).length,sessionCount:p.length,acceptedSessionCount:u.length,sessionLastCount:u.filter(e=>void 0!==e.last).length,recoveredSessionLastCount:R.filter(({last:e})=>k.has(M(e.conversationId,e.id))).length,offlineMessageCount:w.length}}))}(e)}catch(t){throw wr.record("error","sdk","sync","channel-sync-failed",()=>({operationId:e,error:{message:"CHANNEL 同步失败",data:t}})),t}}let Ma=null,ka=!1;const Da=Kt({commitBatch:async function(e,t=[]){if(!Cr)throw new Error("离线消息提交已取消");await Zo.commitReceivedMessages(e,"offline",void 0,{events:t??[],apply:e=>Ms.ingest(e,"offline")});const r=e.flatMap(e=>{const t=Dr.get(_r({conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id}));return void 0===t?[]:[t]});if(await Promise.all(r),!Cr)throw new Error("离线消息提交已取消")},pullers:[Sa("chat",St),Sa("owner_chat",Tt),{endpoint:"group",pullBatch:async({deliveredMsgInfos:e,limit:t})=>{const r=Ir,o=Ca("background"),n=Ia("group");try{o.assertCurrent?.();const s=await fr.getLoginContext();if(null===s)throw new Error("sync(group): 无登录上下文(authProvider.getLoginContext 返回 null)");if(o.assertCurrent?.(),""!==r&&s.userId!==r)throw new DOMException("GROUP 离线同步的登录账号已改变","AbortError");const a=[],i=[],c=await _t({http:Er,userId:s.userId,clientType:hr,decryptDeps:{...Un("offline"),onDecryptRecovery:e=>i.push(e)},asyncDecrypt:o,prepareKeys:Fn,deliveredMsgInfos:e,...void 0===t?{}:{limit:t},onReaction:e=>a.push(e)});return o.assertCurrent?.(),{...c,reactions:a,commit:async()=>{try{await ba(n.messages(c.messages).sort(Nt),a,i.filter(n.acceptsRecovery),()=>o.assertCurrent?.(),o.publish)}finally{n.stop()}}}}catch(e){throw n.stop(),e}}}],domainState:Zo,emitter:vr,logger:zr,yieldToEventLoop:Ut});const xa=H({domainState:Zo,storage:kr,getSelfId:()=>Ir,assertCurrent:()=>{if(!Cr||wo.signal.aborted)throw new DOMException("客服历史恢复所属账号已失效","AbortError")},hasPendingSend:e=>la.getPendingOutbox().some(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId),fetch:async e=>{const t=Ir,r=()=>{if(!Cr||wo.signal.aborted||Ir!==t)throw new DOMException("客服历史查询所属账号已失效","AbortError")},o=await fa(t);r();const n=await Dt({http:Er,userId:t,clientType:hr,messageIds:e,decryptDeps:o,asyncDecrypt:wa("background",r)});if(r(),200!==n.code)throw new Error(`客服历史原文查询失败:${n.code}`);return n.messages}});async function Pa(){if(void 0!==no&&(!no.owned||yo))throw new Error("当前页面未持有 IM 连接,不能同步消息");const e=To.begin(),t=Eo.begin(),r=async function(){const e=Ir,t=Ca("background"),r=Ia("group");try{t.assertCurrent?.();const o=await fr.getLoginContext();if(null===o)return;if(t.assertCurrent?.(),""!==e&&o.userId!==e)throw new DOMException("GROUP 会话同步的登录账号已改变","AbortError");const n=[],s=[],a=await jt({http:Er,userId:o.userId,clientType:hr,decryptDeps:{...Un("offline"),onDecryptRecovery:e=>s.push(e)},asyncDecrypt:t,prepareKeys:Fn,onReaction:e=>n.push(e)});t.assertCurrent?.();for(const e of a.unreads)t.assertCurrent?.(),Zo.applyServerUnread({conversationType:"group",conversationId:e.groupId},e.unreadCount),_n(e.groupId);await ba(r.messages(a.messages).sort(Nt),n,s.filter(r.acceptsRecovery),()=>t.assertCurrent?.(),t.publish),t.assertCurrent?.(),await Ta(a.unreads.map(e=>({conversationType:"group",conversationId:e.groupId})),{userId:o.userId,groupIds:new Set(a.unreads.filter(e=>e.unreadCount>0).map(e=>e.groupId))}),t.assertCurrent?.(),Lt(a)}finally{r.stop()}}().catch(e=>{throw vr.emit({type:"error",error:{scope:"sync",message:"群会话摘要同步失败",cause:e}}),e}),o=(null!==Ma?(ka=!0,Ma):(Ma=(async()=>{let e;do{ka=!1,e=void 0;try{await Ra()}catch(t){e=t}}while(ka);if(void 0!==e)throw e})().finally(()=>{Ma=null}),Ma)).catch(e=>{throw vr.emit({type:"error",error:{scope:"sync",message:"CHANNEL 会话与离线消息同步失败",cause:e}}),e});bo+=1;try{const e=xa.run().catch(e=>{throw vr.emit({type:"error",error:{scope:"sync",message:"旧客服消息恢复失败,已保留未恢复的本机记录,可刷新重试",cause:e}}),e}),t=(await Promise.allSettled([Da.sync({rejectOnFailure:!0}),r,o,e])).find(e=>"rejected"===e.status);if("rejected"===t?.status)throw t.reason}finally{t(),e(),bo-=1,So="authenticated"===la.state,po?.notifySchedulingChanged()}}async function Aa(){if("ready"===eo)return;eo="preparing";const e=await fr.getLoginContext();if(Cr){if(null!==e){if(await async function(e){if(void 0!==no&&Cr){if(!yo){so??(so=no.start(yr.forAccount(e).name("ephemeral","connection",`client-${hr}`)));const t=await so;if(!Cr)return;if(Cr&&!yo&&t&&no.owned)return void la.setConnectionAllowed(!0)}if(la.setConnectionAllowed(!1),await la.connect(),void 0!==ao)throw Object.assign(new Error("Browser IM coordination is unavailable"),{code:"IM_CONNECTION_OWNERSHIP_UNAVAILABLE",cause:ao});throw Object.assign(new Error("Chat is active in another page; reload this page to continue here"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"})}}(e.userId),!Cr)return;Ir=e.userId;try{await(br?.prepare(e.userId))}catch{vr.emit({type:"error",error:{scope:"storage",message:"上传恢复记录不可用,本次上传仅支持当前页面内恢复"}})}if(!Cr)return;if(un.start(),void 0!==Tn&&Tn.getUserPrivateKey(e.userId,{priority:"foreground"}).catch(hn),void 0!==kr)try{if(await kr.open({namespace:e.userId}),Fr=!0,!Cr)return;try{await $r.hydrate()}catch(e){vr.emit({type:"error",error:{scope:"storage",message:"IM 设置初始化失败,已暂停发送 direct 已读回执",cause:e}})}if(!Cr)return;if(await Zo.hydrate(()=>Cr),!Cr)return;for(const e of Zo.getSessions())""===e.title&&"supergroup"!==e.type&&Zo.refreshConversationProfile(e.id,e.type);if(await la.hydrateOutbox(()=>Cr),!Cr)return}catch(e){vr.emit({type:"error",error:{scope:"storage",message:"本地存储初始化失败",cause:e}})}if(!Cr)return;if(void 0!==Rn)for(const e of Zo.getSessions())"group"===e.type&&_n(e.id)}Cr&&(eo="ready",""!==Ir&&ya.start())}}function ja(){if(yo)return Promise.reject(Object.assign(new Error("Chat is active in another page"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"}));if("ready"===eo)return Promise.resolve();if(null!==ho)return ho;const e=Date.now();return wr.record("info","sdk","session","prepare-start"),ho=Aa().then(()=>wr.record("info","sdk","session","prepare-complete",()=>({durationMs:Date.now()-e}))).catch(t=>{throw wr.record("error","sdk","session","prepare-failed",()=>({durationMs:Date.now()-e,error:{message:"IM prepare 失败",data:t}})),t}).finally(()=>{ho=null}),ho}function Oa(e){wr.record("info","sdk","connection","disconnect",()=>({data:{reason:e}})),mo=!1,vo+=1,Vs.stop(),la.disconnect(e),ga.stop()}function _a(e,t={}){if(void 0!==io)return io;let r,o;return io=new Promise((e,t)=>{r=e,o=t}),async function(e,t){const r=Date.now();let o;wr.record("info","sdk","session","teardown-start",()=>({data:{localData:e?.localData??"preserve",pendingMessages:e?.pendingMessages??"fail"}})),Cr=!1,jr.clear(),Nn(),wo.abort(),Io.dispose(),Eo.dispose(),To.dispose(),na.dispose(),t.notifyReplacement&&vr.emit({type:"session:replaced"});const n=ya.dispose(),s=po?.dispose();us(),pa(),ca.dispose(),da.dispose(),Vs.stop(),Bs.dispose(),Gs.dispose(),Ms.dispose(),ua.dispose(),va.dispose(),In.dispose(),cn.dispose(),an.dispose();const a=la.disposeMediaTasks({preserveRecovery:!0===t.preserveUploadRecovery});for(const e of oo)e.close();oo.clear(),Oo+=1,la.markOutboxForLogout(e?.pendingMessages??"fail"),ea.dispose(),ta.dispose(),ra.dispose(),Go.dispose(),Vo.dispose(),qo.dispose(),Gr.dispose();const i=$r.dispose();dn.dispose();const c=Zo.invalidateAndDrainDraftOperations();pn.dispose(),zs(),Qs(),Zs(),Ps(),Js.dispose(),sa.reset(),Mn?.clearAll(),Hn.clear(),Vn.clear(),$n.clear(),Oa("im-logout"),(t.requireStorageClose||!0===no?.owned)&&await(ho?.catch(()=>{}));try{await a}catch{vr.emit({type:"error",error:{scope:"storage",message:"上传任务清理未完成,请检查本地数据与网络状态"}})}await n;try{await(br?.dispose(!0===t.preserveUploadRecovery))}catch(e){o=e,vr.emit({type:"error",error:{scope:"storage",message:"上传恢复记录清理失败,请清除此站点的本地数据"}})}await c,await i,await s,await Promise.allSettled([...Co]),await Zo.waitForChannelSyncPersistence(),await Promise.allSettled([...Dr.values(),...Bn.values()]),await Promise.all([...Or.values()]),Zo.clearSession();const d="purge"===e?.localData?Ir:"";let p,l=""===d?void 0:o,u=!0;if(void 0!==kr)try{await kr.close()}catch(e){u=!1,""!==d&&(l=e),!1!==t.reportStorageErrors&&vr.emit({type:"error",error:{scope:"storage",message:""===d?"关闭本地存储失败":"关闭本地存储失败,已跳过删除本账号本地库",cause:e}})}if(""!==d&&u)try{void 0!==Mr?await Mr.purgeCurrentAccount({namespaceFactory:yr,accountId:d}):await ae(d,{namespaceFactory:yr}),void 0===l&&(p=d)}catch(e){l=e,!1!==t.reportStorageErrors&&vr.emit({type:"error",error:{scope:"storage",message:"删除本账号本地库失败",cause:e}})}if(eo="empty",wr.record("info","sdk","session","teardown-complete",()=>({durationMs:Date.now()-r,data:{purgedAccountId:p,purgeFailed:void 0!==l}})),sn(),to(),$s(),ha(),yo=!0,(t.requireStorageClose||void 0!==no)&&!u)throw new Error("Previous chat page could not close its account storage");return no?.stop(),{...void 0===p?{}:{purgedAccountId:p},...void 0===l?{}:{purgeError:l}}}(e,t).then(r,o),io}function Na(e){const t=e.conversationId,r=Ir,n=Oo,s=_o(t);let a,i;return async({readCursor:c,cursor:d,signal:p,isCurrent:l})=>{const u=Io.enterForeground();try{const u=()=>{const a=Zo.getConversationContext(e);return Cr&&Ir===r&&l()&&n===Oo&&s===_o(t)&&"channel"===a?.type&&(void 0===a.channelState||!o(a.channelState))};if(Rt(p),!u())return;if(void 0!==d&&(a!==c||void 0===i))return;const m=await fr.getLoginContext();if(Rt(p),null===m||m.userId!==r||!u())return;const v=[],y=[],g=await Mt({http:Er,userId:m.userId,clientType:hr,channelId:t,index:d??c,containAnchor:void 0===d,signal:p,decryptDeps:{...jn("history"),onDecryptRecovery:e=>y.push({...e,source:"history"})},prepareKey:e=>An([e],{recoverExistingMessages:!1,priority:"foreground",signal:p}),onContentDecodeError:Xr,onReaction:e=>v.push(e)});if(Rt(p),!u())return;if(void 0===d){const e=g.messages.find(e=>e.extensions?.historyCursor===c);if(void 0===e)return;a=c,i=e.sortKey}if(void 0===i)return;if(g.messages.length>0&&Zo.upsertMessages(g.messages,"offline",{backfillOnly:!0}),!u())return;for(const e of v){if(!u())return;is(e)}for(const e of y){if(!u())return;Kr(e)}if(!u())return;return{messages:g.messages.map(t=>{const r=Zo.getConversationMessage(e,t.id);if(void 0===r)throw new Error("首未读历史邻页在领域合并后缺少消息");return r}),readCursorSortKey:i,exhausted:!g.hasNewer,...void 0===g.nextCursor?{}:{nextCursor:g.nextCursor}}}finally{u()}}}async function La(){const e=Ia("direct");try{const t=[],r=[],o=Ir,n=wa("background");n.assertCurrent?.();const s=await fr.getLoginContext();if(null===s)throw new Error("pullOfflineChat: 无登录上下文(authProvider.getLoginContext 返回 null)");if(n.assertCurrent?.(),""!==o&&s.userId!==o)throw new DOMException("DIRECT 离线拉取的登录账号已改变","AbortError");const a={...await fa(s.userId),onDecryptRecovery:e=>t.push(e)},i=await Ct({http:Er,userId:s.userId,clientType:hr,decryptDeps:a,asyncDecrypt:n,onReaction:e=>r.push(e)}),c=await bt({http:Er,userId:s.userId,clientType:hr,decryptDeps:a,asyncDecrypt:wa("background",n.assertCurrent),onReaction:e=>r.push(e)});n.assertCurrent?.();const d=e.messages([...i,...c]);return await ba(d,r,t.filter(e.acceptsRecovery),()=>n.assertCurrent?.(),n.publish),d}finally{e.stop()}}Mo=async({conversation:e,newestLoaded:t,cursor:r,limit:n,signal:s})=>{Rt(s);const{conversationId:a}=e,i=Zo.getConversationContext(e);if(void 0===i)throw new Error(`加载更新消息失败:会话不存在(conversationId=${a})`);if("direct"===i.type||"robot"===i.type||"customerService"===i.type)return{messages:[],exhausted:!0};if("group"===i.type){if(void 0!==i.groupState&&"active"!==i.groupState)return{messages:[],exhausted:!0};const o={conversationType:"group",conversationId:a},c=Ir,d=Ca(!0===po?.hasForeground(e)?"foreground":"background",s);d.assertCurrent?.(o);const p=Ia("group",o);try{const o=await fr.getLoginContext();if(null===o)return{messages:[],exhausted:!0};if(d.assertCurrent?.(),o.userId!==c)throw new DOMException("GROUP 历史请求的登录账号已改变","AbortError");const i=void 0===r?t?.serverTime??t?.createdAt:ur(r,a);if(void 0===i)throw new Error(`GROUP 向新分页缺少可信 baseTime(groupId=${a}, messageId=${t?.id??""})`);const l=[],u=[],m=await Ot({asyncDecrypt:d,signal:s,http:Er,userId:o.userId,clientType:hr,groupId:a,baseTime:i,direct:2,limit:n,decryptDeps:{...Un("history"),onDecryptRecovery:e=>u.push(e)},prepareKeys:t=>Fn(t,{signal:s,priority:!0===po?.hasForeground(e)?"foreground":"background"}),onReaction:e=>l.push(e)});d.assertCurrent?.();const v=p.messages(m.messages);for(const e of v)d.publish([e],()=>Zo.upsertMessages([e],"offline",{backfillOnly:!0}));for(const e of l)d.publish([],()=>is(e));for(const e of u)d.publish([],()=>{p.acceptsRecovery(e)&&Kr(e)});d.assertCurrent?.();return{messages:v,...q({conversationId:a,direction:"newer",baseTime:i,batchSize:m.batchSize,boundaryTime:m.newestEntryTime,limit:n})}}finally{p.stop()}}if("channel"===i.type){if(void 0!==i.channelState&&o(i.channelState))return{messages:[],exhausted:!0};const n=r??t?.extensions?.historyCursor;if("string"!=typeof n||""===n.trim())throw new Error(`CHANNEL 向新分页缺少可信 historyCursor(channelId=${a}, messageId=${t?.id??""})`);const c=Oo,d=_o(a),p=await fr.getLoginContext();if(null===p)return{messages:[],exhausted:!0};const l=void 0===r?(await ra.loadMessageContext(a,n,p.userId,s)).context:await ra.loadNewerPage(a,n,p.userId,s);Rt(s);const u=Zo.getConversationContext(e);return!Cr||c!==Oo||d!==_o(a)||"channel"!==u?.type||void 0!==u.channelState&&o(u.channelState)?{messages:[],exhausted:!0}:(l.messages.length>0&&Zo.upsertMessages(l.messages,"offline",{backfillOnly:!0}),{messages:l.messages,exhausted:!l.hasNewer,...l.hasNewer&&void 0!==l.nextCursor?{nextCursor:l.nextCursor}:{}})}throw new Error(`向新分页未实现:${i.type}`)};function Ka(e){const t=_({...e,operation:"openConversation"});return Object.assign(new Error(t.code),t,{name:"ImConversationOpenError"})}function Fa(e){if(!Cr)throw Ka({code:"IM_SDK_CONVERSATION_RUNTIME_RELEASED",category:"state",retryable:!1,conversation:e})}function Ua(e,t){return{id:e.conversationId,type:e.conversationType,title:t.title.trim()||e.conversationId,...void 0===t.avatar?{}:{avatar:t.avatar},lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:t.muted??!1,...void 0===t.groupState?{}:{groupState:t.groupState},...void 0===t.channelState?{}:{channelState:t.channelState},...void 0===t.channelPermissions?{}:{channelPermissions:t.channelPermissions},...void 0===t.channelAccessSnapshot?{}:{channelAccessSnapshot:t.channelAccessSnapshot},...void 0===t.sendDisabledReason?{}:{sendDisabledReason:t.sendDisabledReason}}}const Ba={...a({...void 0===Tr?{}:{coreClient:Tr},authProvider:fr,http:Er,resolveInput:ln,domainState:Zo,operations:{list:function(){return Zo.getConversationList()},pullOffline:La,sync:async function(){await Pa()},prefetchRecent:(e,t)=>po.prefetchRecent(e,t)},beforeDeleteConversation:Lo,terminateConversationSending:(e,t)=>la.terminateConversationSending(e,t),resetConversationBackground:e=>Gr.api.resetBackground(e),reportStorageError:(e,t)=>vr.emit({type:"error",error:{scope:"storage",message:e,cause:t}}),markChannelRead:(e,t)=>la.markRead(e,t,"channel"),settleConversationRead:async e=>{const t=await Ha(e,{initialPosition:"latest"},"read");try{await t.markConversationRead()}finally{t.close()}}}),...Gr.api,ensureOpenableConversation:async function(e){const t=function(e){const t=e?.conversationType,r=e?.conversationId;if("supergroup"===t)throw Ka({code:"IM_SDK_SUPERGROUP_UNSUPPORTED",category:"unsupported",retryable:!1,conversation:e});if("direct"!==t&&"group"!==t&&"channel"!==t&&"robot"!==t&&"customerService"!==t||"string"!=typeof r||""===r.trim())throw Ka({code:"IM_SDK_CONVERSATION_INVALID",category:"validation",retryable:!1,...void 0===e?{}:{conversation:e}});return Object.freeze({conversationType:t,conversationId:r.trim()})}(e);if(Fa(t),void 0!==Zo.getSession(t))return t;const r=To.begin();let o=!1;const n=vr.subscribe(e=>{"session:removed"===e.type&&e.conversation.conversationType===t.conversationType&&e.conversation.conversationId===t.conversationId&&(o=!0)}),s=()=>{if(Fa(t),o)throw Ka({code:"IM_SDK_CONVERSATION_OPEN_INVALIDATED",category:"state",retryable:!0,conversation:t})};try{if("direct"===t.conversationType){const e=Vo.peekItem("individual",t.conversationId);if(void 0!==e)return Zo.prepareConversation(Ua(t,{title:e.displayName||e.cardDisplayName,...void 0===e.avatarUrl?{}:{avatar:e.avatarUrl}})),t;const r=await an.getRelationship(t.conversationId);if(s(),"friend"!==r)throw Ka({code:"IM_SDK_DIRECT_CONTACT_REQUIRED",category:"permission",retryable:!1,conversation:t,details:Object.freeze({relationship:r})});const o=await an.getProfile(t.conversationId);if(s(),null===o||o.id!==t.conversationId)throw Ka({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});return Zo.prepareConversation(Ua(t,{title:o.remark??o.nickname,...void 0===o.avatar?{}:{avatar:o.avatar},...void 0===o.muted?{}:{muted:o.muted}})),t}if("group"===t.conversationType){const e=Zo.isMembershipTerminated(t),r=Vo.peekItem("group",t.conversationId);if(void 0!==r&&!e)return Zo.prepareConversation(Ua(t,{title:r.displayName||r.cardDisplayName,...void 0===r.avatarUrl?{}:{avatar:r.avatarUrl},groupState:"active"})),t;if(void 0===Ko)throw Ka({code:"IM_SDK_CONVERSATION_PROFILE_UNAVAILABLE",category:"contract",retryable:!1,conversation:t});const o=await Ko.getGroupProfile(t.conversationId,e?{forceRefresh:!0}:void 0);if(s(),null===o||o.id!==t.conversationId)throw Ka({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});if(!1===o.isInGroup||e&&!0!==o.isInGroup||void 0!==o.status&&2!==o.status)throw Ka({code:"IM_SDK_GROUP_CONVERSATION_UNAVAILABLE",category:"permission",retryable:!1,conversation:t,details:Object.freeze({...void 0===o.status?{}:{status:o.status},...void 0===o.isInGroup?{}:{isInGroup:o.isInGroup}})});return Zo.prepareConversation(Ua(t,{title:o.name,...void 0===o.avatar?{}:{avatar:o.avatar},...void 0===o.muted?{}:{muted:o.muted},groupState:"active"}),{membershipConfirmed:e}),e&&(s(),Es({conversationType:"group",conversationId:t.conversationId})),t}if("customerService"===t.conversationType){if("__customer_service__"!==t.conversationId||void 0===Zo.getConversationContext(t))throw new Error("客服会话只能由已接收消息创建");return t}if("robot"===t.conversationType){const e=qo.peek(t.conversationId);return Zo.prepareConversation(Ua(t,{title:e?.displayName??t.conversationId,...void 0===e?.avatarUrl?{}:{avatar:e.avatarUrl}})),t}if(void 0===Fo)throw Ka({code:"IM_SDK_CONVERSATION_PROFILE_UNAVAILABLE",category:"contract",retryable:!1,conversation:t});const e=Zo.isMembershipTerminated(t),r=await Fo.getProfile(t.conversationId,e?{forceRefresh:!0}:void 0);if(s(),null===r||r.id!==t.conversationId)throw Ka({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});const o="active"===r.channelState||"muted"===r.channelState,n="muted"===r.channelState&&!0===r.accessSnapshot?.allMembersMuted&&"owner"!==r.role&&"admin"!==r.role;if(!o||n)throw Ka({code:"IM_SDK_CHANNEL_CONVERSATION_UNAVAILABLE",category:"permission",retryable:!1,conversation:t,details:Object.freeze({channelState:r.channelState,role:r.role,hiddenByAllMemberMute:n})});return Zo.prepareConversation(Ua(t,{title:r.name,...void 0===r.avatar?{}:{avatar:r.avatar},...void 0===r.muted?{}:{muted:r.muted},channelState:r.channelState,channelPermissions:r.permissions,...void 0===r.accessSnapshot?{}:{channelAccessSnapshot:r.accessSnapshot},...r.permissions.sendMessages?{}:{sendDisabledReason:`channel_${r.channelState}`}}),{membershipConfirmed:e}),e&&(s(),Es({conversationType:"channel",conversationId:t.conversationId})),t}catch(e){if(function(e){return e instanceof Error&&"ImConversationOpenError"===e.name&&"string"==typeof e.code}(e))throw e;const r=function(e){if("object"==typeof e&&null!==e&&"string"==typeof e.code&&"string"==typeof e.category&&"boolean"==typeof e.retryable){const t=e;return{code:t.code,category:t.category,retryable:t.retryable}}return e instanceof de?{code:"IM_SDK_CONVERSATION_PROFILE_READ_FAILED",category:"network",retryable:!0}:e instanceof pe||e instanceof Error&&"DirectoryMappingError"===e.name?{code:"IM_SDK_CONVERSATION_PROFILE_INVALID",category:"contract",retryable:!1}:{code:"IM_SDK_CONVERSATION_OPEN_PREREQUISITE_FAILED",category:"state",retryable:!1}}(e);throw Ka({...r,conversation:t,cause:e})}finally{n(),r()}},getContext:e=>Zo.getConversationContext(e)};function Ga(e,t,r=!0){if(!Cr)throw e.close(),new Error("IM SDK 账号运行时已释放,不能打开会话");return t?.aborted&&(e.close(),Rt(t)),function(e,t=!0){const r=new AbortController,o={...e,resumeMedia(){t&&Cr&&!r.signal.aborted&&"authenticated"===la.state&&"robot"!==e.ref.conversationType&&la.resumePausedMediaUploads(e.ref,r.signal).catch(()=>{Cr&&!r.signal.aborted&&vr.emit({type:"error",error:{scope:"unknown",message:"当前会话上传恢复失败,请重新选择文件"}})})},close(){r.abort(),e.close(),oo.delete(o)}};return b(o,e),oo.add(o),t&&o.resumeMedia(),o}(e,r)}async function Ha(e,t={},r){if(!Cr)throw new Error("IM SDK 账号运行时已释放,不能打开会话");const o=po?.enterForeground(e),n=Io.enterForeground(),s=To.begin();try{const o={beginReceiving:To.begin,domainState:Zo,invalidateHistory:Lo,emitter:vr,drafts:dn.api,sendText:ma.operations.sendText,sendContact:ma.operations.sendContact,sendImage:ma.operations.sendImage,sendVideo:ma.operations.sendVideo,sendVoice:ma.operations.sendVoice,sendFile:ma.operations.sendFile,sendGif:ma.operations.sendGif,sendMediaAlbum:ma.operations.sendMediaAlbum,sendExpression:ma.operations.sendExpression,sendGame:ma.operations.sendGame,sendMiniProgram:ma.operations.sendMiniProgram,sendTransfer:ma.operations.sendTransfer,sendGift:ma.operations.sendGift,sendLiveRoom:ma.operations.sendLiveRoom,replaceVideo:ma.operations.replaceInterruptedVideo,replaceFile:ma.operations.replaceInterruptedFile,forwardMessages:ma.operations.forwardMessages,recallMessage:ma.operations.recallMessage,editMessage:ma.operations.editMessage,setReaction:({conversation:e,parentMessageId:t,emoji:r,action:o})=>{if("robot"===e.conversationType||"customerService"===e.conversationType)return Promise.resolve({ok:!1,reason:"restricted"});const n={conversationType:e.conversationType,conversationId:e.conversationId};return"toggle"===o?Ms.toggle({conversation:n,parentMessageId:t,emoji:r}):Ms.set({conversation:n,parentMessageId:t,emoji:r,action:"add"===o?0:1})},markRead:ma.operations.markRead,markConversationRead:ma.operations.markConversationRead,markVisibleMessages:ma.operations.markVisibleMessages,markDirectMediaConsumed:ma.operations.markDirectMediaConsumed,prepareMediaPreview:Cn,getSelfId:()=>Ir,isOutboxOwned:e=>la.getPendingOutbox().some(t=>t.id===e),hasOutboxForConversation:e=>la.getPendingOutbox().some(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId)};switch(e.conversationType){case"direct":{const n={conversationType:"direct",conversationId:e.conversationId},s=await C(n,{...o,getRelationship:an.getRelationship,shouldCheckRelationship:()=>"authenticated"===la.state,appendContactRequiredTextFailure:e=>Zo.appendDirectContactRequiredTextFailure({conversationId:e.conversationId,senderId:Ir,text:e.text,...void 0===e.refMessageId?{}:{refMessageId:e.refMessageId}}),setMuted:(e,t)=>Ba.setMuted(e,t),fetchMessagesByIdBatch:e=>(async(e,t)=>{const r=Ia("direct",e,t);try{const o=Ir,n=Ao(e),s=()=>{if(!Cr||Ir!==o||n!==Ao(e))throw new DOMException("DIRECT 消息查询所属账号或历史已失效","AbortError")};s();const{userId:a}=await ys();if(s(),a!==o)throw new DOMException("DIRECT 消息查询的登录账号已改变","AbortError");const i=await fa(a,{priority:"foreground"});s();const c=[],d=[],p=await N(t,async t=>{s();const r=await Dt({http:Er,userId:a,clientType:hr,messageIds:t,asyncDecrypt:wa("foreground",s),decryptDeps:{...i,onDecryptRecovery:e=>d.push(e)},onPlaintextFallback:t=>wr.record("warn","sdk","crypto","direct-quoted-plaintext-fallback",()=>({conversation:e,data:{...t,endpoint:"/offline/v1/chat/msg/by_id",wireEncrypt:1,reason:"mislabeled-plaintext"}})),onReaction:e=>c.push(e)});if(s(),200!==r.code)throw Object.assign(new Error("DIRECT 按 ID 查询业务失败"),{code:r.code});return r});s();const l=r.messages(p.messages).filter(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId);for(const e of l)s(),vs([e]),s();for(const t of c)s(),t.conversation.conversationType===e.conversationType&&t.conversation.conversationId===e.conversationId&&is(t),s();for(const t of d)s(),r.acceptsRecovery(t)&&t.conversation.conversationType===e.conversationType&&t.conversation.conversationId===e.conversationId&&Kr(t),s();const u=l.map(t=>{const r=Zo.getConversationMessage(e,t.id);if(void 0===r)throw new Error("DIRECT 按 ID 查询在领域合并后缺少消息");return r}),m=new Set(u.map(e=>e.id)),v=new Set(p.missingMessageIds);for(const e of p.messages)m.has(e.id)||v.add(e.id);return{messages:u,missingMessageIds:[...v]}}finally{r.stop()}})(n,e)},t),a=Ga(s,t.signal,"read"!==r);return as(n),a}case"group":{const n={conversationType:"group",conversationId:e.conversationId},s=Ga(await w(n,{...o,getSendPermissionError:e=>{const t=Zo.getConversationContext(n),r="group"===t?.type?t.groupState:"unknown";if(void 0!==r&&"active"!==r)return _({code:"IM_SDK_GROUP_SEND_FORBIDDEN",category:"permission",operation:e,retryable:!1,conversation:n,details:Object.freeze({groupState:r})})},setMuted:(e,t)=>Ba.setMuted(e,t),fetchMessagesByIdBatch:e=>gs(n.conversationId,e)},t),t.signal,"read"!==r);return as(n),s}case"channel":{const n={conversationType:"channel",conversationId:e.conversationId},s=Ga(await I(n,{...o,loadEntryUnreadPage:Na(n),getSelfId:()=>Ir,deleteMessageForEveryone:la.deleteChannelMessageForEveryone,reconcilePage:oa.reconcilePage,getSendPermissionError:e=>{const t=Zo.getConversationContext(n),r="channel"===t?.type&&void 0!==t.channelState?t.channelState:"unknown_restricted",o=dt({channelState:r,nowMs:Date.now(),..."channel"!==t?.type||void 0===t.channelAccessSnapshot?{}:{snapshot:t.channelAccessSnapshot},..."channel"!==t?.type||void 0===t.channelPermissions?{}:{permissions:t.channelPermissions}});if("active"!==o.channelState||!o.permissions.sendMessages)return _({code:"IM_SDK_CHANNEL_SEND_FORBIDDEN",category:"permission",operation:e,retryable:!1,conversation:n,details:Object.freeze({channelState:o.channelState,...void 0===o.muteReason?{}:{muteReason:o.muteReason}})})},setMuted:(e,t)=>Ba.setMuted(e,t),fetchMessagesByIdBatch:e=>hs(n.conversationId,e)},t),t.signal,"read"!==r);return as(n),s}case"customerService":{const n={conversationType:"customerService",conversationId:e.conversationId};return Ga(await f(n,{...o,setMuted:async()=>{throw new Error("客服会话不支持免打扰设置")}},t),t.signal,"read"!==r)}case"robot":{const n={conversationType:"robot",conversationId:e.conversationId};return Ga(await h(n,{...o,setMuted:(e,t)=>Ba.setMuted(e,t)},t),t.signal,"read"!==r)}default:throw new Error(`openConversation:${e.conversationType} 产品 handler 未注册`)}}finally{s(),o?.(),n()}}return{advancedMessageDiagnostics:{sendDirectText:async e=>{await ma.operations.sendText({conversationId:e.peerId,conversationType:"direct",text:e.text,encrypted:e.encrypted})}},openConversation:Ha,localData:on,directory:Vo.search,customerService:tn,robots:qo.api,search:pn.api,applications:cn.api,expressions:zo.api,sessionFavorites:nn.api,outbox:ua.api,drafts:dn.api,connection:u({operations:{prepare:ja,connect:function(e){if(yo)return Promise.reject(Object.assign(new Error("Chat is active in another page"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"}));if(!Cr||yo)return Promise.reject(new Error("IM 连接已停止,请刷新页面后重试"));if(mo=!0,"authenticated"===la.state)return Promise.resolve();if(null!==fo)return fo;lo=e?.initialSync??"auto",uo=!1;const t=Date.now();wr.record("info","sdk","connection","connect-start",()=>({data:{initialSync:lo}}));const r=vo;return fo=(async()=>{await ja(),Cr&&mo&&r===vo&&(ga.start(),await la.connect())})().then(()=>wr.record("info","sdk","connection","connect-complete",()=>({durationMs:Date.now()-t}))).catch(e=>{throw wr.record("error","sdk","connection","connect-failed",()=>({durationMs:Date.now()-t,error:{message:"IM connect 失败",data:e}})),e}).finally(()=>{fo=null}),fo},disconnect:Oa,subscribe:function(e){return vr.subscribe(e)},getSnapshot:function(){return{connectionState:la.state,pendingOutbox:la.getPendingOutbox()}},getLifecycle:function(){return{sessionState:eo,connectionState:la.state,...""!==Ir?{userId:Ir}:{},prepared:"ready"===eo,connectionDesired:mo,authenticated:"authenticated"===la.state,receiving:To.receiving,syncing:Eo.receiving}}},getState:()=>la.state}),conversations:Ba,settings:$r.api,push:ca.api,activity:da.api,contact:an,group:d({directory:Vo.groups,...void 0===Ko?{}:{profile:{getGroupProfile:async(e,t)=>{const r=Zo.beginConversationProfileRead({conversationType:"group",conversationId:e},t);try{const o=await Ko.getGroupProfile(e,t);return null!==o&&r({id:o.id,title:o.name,avatar:o.avatar}),o}finally{r.finish()}},...void 0===Ko.getGroupMemberNames?{}:{getGroupMemberNames:Ko.getGroupMemberNames.bind(Ko)},...void 0===Ko.listGroupMembers?{}:{listGroupMembers:Ko.listGroupMembers.bind(Ko)},...void 0===Ko.peekGroupMembers?{}:{peekGroupMembers:Ko.peekGroupMembers.bind(Ko)},...void 0===Ko.peekGroupProfile?{}:{peekGroupProfile:Ko.peekGroupProfile.bind(Ko)},...void 0===Ko.peekGroupMemberNames?{}:{peekGroupMemberNames:Ko.peekGroupMemberNames.bind(Ko)}}},...void 0===Tr?{}:{coreClient:Tr},...void 0===fn?{}:{avatarTransfer:fn},domainState:{...Rs,prepareConversation:e=>Zo.prepareConversation(e)},emitter:vr,pinned:ea.operations}),channel:t({directory:Vo.channels,...void 0===Fo?{}:{channelProfile:{listProfiles:Fo.listProfiles.bind(Fo),getProfile:async(e,t)=>{const r=Zo.beginConversationProfileRead({conversationType:"channel",conversationId:e},t);try{const o=await Fo.getProfile(e,t);return null!==o&&r({id:o.id,title:o.name,avatar:o.avatar}),o}finally{r.finish()}}}},...void 0===Uo?{}:{channelMembers:Uo},...void 0===Bo?{}:{channelMentionMembers:Bo},mentionCandidates:Go.api,applications:ra.applications,pinned:ta.operations,...void 0===Tr?{}:{coreClient:Tr},...void 0===fn?{}:{avatarTransfer:fn},crypto:yn,domainState:{prepareConversation:e=>Zo.prepareConversation(e),setChannelRestriction:Zo.setChannelRestriction,removeConversationForMembershipTermination:Rs.removeConversationForMembershipTermination,updateConversationProfile:Zo.updateConversationProfile,refreshConversationProfile:Zo.refreshConversationProfile},emitter:vr,...void 0===Mn?{}:{cacheCreatedSecretKey:(e,t)=>Mn.primeChannelKey(e,t)},getSelfUserId:async()=>""!==Ir?Ir:(await fr.getLoginContext())?.userId??""}),media:va.api,calls:v(Bs),groupCalls:P(Gs),teardown:_a}}export{mr as createSessionRuntime};
|
|
1
|
+
import{createChannelPinnedRuntime as e,createChannelApi as t,createChannelLegacyMessageRepair as r,isChannelHistoryBlocked as o,createChannelOperationsRuntime as n}from"../domains/channel.js";import{createContactApi as s}from"../domains/contact.js";import{createConversationsApi as a,createConversationInputResolver as i}from"../domains/conversation.js";import{createGroupPinnedRuntime as c,createGroupApi as d}from"../domains/group.js";import{createMediaUploadComputation as p}from"../domains/media-byte-computation.js";import{createMessageOperationsRuntime as l}from"../domains/message.js";import{createConnectionApi as u}from"../domains/session.js";import{createApplicationsRuntime as m}from"../product/applications.js";import{createDirectCallsApi as v}from"../product/calls.js";import{createChannelMentionCandidatesRuntime as y}from"../product/channel-mention-candidates.js";import{createConversationBackgroundRuntime as g}from"../product/conversation-background.js";import{createRobotConversationHandle as h,createCustomerServiceConversationHandle as f,createChannelConversationHandle as I,createGroupConversationHandle as w,createDirectConversationHandle as C,linkConversationHandleDomainAccess as b}from"../product/conversation-handle.js";import{createCustomerServiceApi as S,createCustomerServiceError as T}from"../product/customer-service.js";import{createSdkDiagnosticWriter as E,toImDiagnosticMessage as R}from"../product/diagnostics.js";import{createDirectoryRuntime as M}from"../product/directory.js";import{createDraftsRuntime as k}from"../product/draft.js";import{isImReactionEmojiToken as D}from"../product/emoji-catalog.js";import{createExpressionsRuntime as x}from"../product/expressions.js";import{createGroupCallsApi as P}from"../product/group-calls.js";import{createLocalDataRuntime as A}from"../product/local-data.js";import{createDefaultMediaAssetCacheStrategyRegistry as j,createMediaTasksRuntime as O}from"../product/media.js";import{createImSdkError as _}from"../product/message.js";import{fetchMessagesByIdWithCaseVariants as N}from"../product/messages-by-id.js";import{createOutboxRuntime as L}from"../product/outbox.js";import{createRobotDirectoryRuntime as K}from"../product/robots.js";import{createSearchRuntime as F}from"../product/search.js";import{createSessionFavoritesRuntime as U}from"../product/session-favorites.js";import{createImSettingsRuntime as B}from"../product/settings.js";import{createChannelReadSummaryRefresh as G}from"./channel-read-summary-refresh.js";import{createCustomerServiceLegacyRecovery as H}from"./customer-service-legacy-recovery.js";import{recordDecryptFailedDiagnostic as V}from"./decrypt-diagnostics.js";import{createForegroundWorkCoordinator as $}from"./foreground-work-coordinator.js";import{resolveGroupHistoryPageBoundary as q}from"./group-history-page-boundary.js";import{DEFAULT_HISTORY_PAGE_SIZE as z}from"./history-page-size.js";import{createKeyPrefetchQueue as W}from"./key-prefetch.js";import{createLocalMediaPreviewPreparation as J}from"./local-media-preview.js";import{createMediaCacheMaintenance as Q}from"./media-cache-maintenance.js";import{createAccountMediaUploadRecovery as Y,createMediaOnlineWaiter as X}from"./media-upload-recovery.js";import{inspectProtobufWireShape as Z}from"./protobuf-wire-shape.js";import{createReceivingActivity as ee}from"./receiving-activity.js";import{createRecentHistoryFetcher as te}from"./recent-history-fetcher.js";import{createRecentHistoryPrefetch as re}from"./recent-history-prefetch.js";import{createSessionHttpClients as oe}from"./session-http-clients.js";import{createSignalOfflinePoller as ne}from"./signal-offline-poller.js";import{createWsTransport as se}from"../../../im-browser/src/transport/ws-transport.js";import{createIndexedDbStorageAdapter as ae,deleteIndexedDbNamespace as ie}from"../../../im-browser/src/storage/indexed-db-storage-adapter.js";import{createProfileHttpAdapter as ce}from"../../../im-browser/src/http/profile-http-adapter.js";import{createChannelHttpAdapter as de,ChannelHttpError as pe,ChannelProfileMappingError as le}from"../../../im-browser/src/http/channel-http-adapter.js";import{createChannelMemberHttpAdapter as ue}from"../../../im-browser/src/http/channel-member-http-adapter.js";import{createChannelMentionMemberHttpAdapter as me}from"../../../im-browser/src/http/channel-mention-member-http-adapter.js";import{createDirectoryHttpAdapter as ve}from"../../../im-browser/src/http/directory-http-adapter.js";import{createExpressionHttpAdapter as ye}from"../../../im-browser/src/http/expression-http-adapter.js";import{createSessionFavoriteHttpAdapter as ge}from"../../../im-browser/src/http/session-favorite-http-adapter.js";import{createChannelJoinApplicationHttpAdapter as he}from"../../../im-browser/src/http/channel-join-application-http-adapter.js";import{createContactApplicationHttpAdapter as fe,createGroupApplicationHttpAdapter as Ie}from"../../../im-browser/src/http/application-http-adapters.js";import{createDomainState as we}from"../../../im-core/src/state/domain-state.js";import{encodeConversationKey as Ce}from"../../../im-core/src/conversation-identity.js";import{createNetworkMonitor as be}from"../../../im-browser/src/network/network-monitor.js";import{createCryptoTaskExecutor as Se}from"../../../im-browser/src/crypto/crypto-task-executor.js";import{createMediaTransferAdapter as Te}from"../../../im-browser/src/media/media-transfer-adapter.js";import{createMediaPreviewPreparationExecutor as Ee}from"../../../im-browser/src/media/media-preview-preparation-executor.js";import{createChannelKeyService as Re}from"../../../im-browser/src/crypto/channel-key-service.js";import{createSendStrategyRegistry as Me}from"../../../im-core/src/message-flow/send/send-strategy-registry.js";import{createDirectSendStrategy as ke}from"../../../im-core/src/message-flow/send/direct-send-strategy.js";import{createGroupSendStrategy as De}from"../../../im-core/src/message-flow/send/group-send-strategy.js";import{createChannelSendStrategy as xe}from"../../../im-core/src/message-flow/send/channel-send-strategy.js";import{createRobotSendStrategy as Pe}from"../../../im-core/src/message-flow/send/robot-send-strategy.js";import{createRecallStrategyRegistry as Ae,createDirectRecallStrategy as je,createGroupRecallStrategy as Oe,createChannelRecallStrategy as _e}from"../../../im-core/src/message-flow/recall/recall-strategy.js";import{createEditStrategyRegistry as Ne,createDirectEditStrategy as Le,createGroupEditStrategy as Ke,createChannelEditStrategy as Fe}from"../../../im-core/src/message-flow/edit/edit-strategy.js";import{createReactionReceiveHandlers as Ue}from"../../../im-core/src/message-flow/reaction/reaction-receive-handlers.js";import{createGroupReceiveHandlers as Be}from"../../../im-core/src/message-flow/receive/group-receive-handlers.js";import{createChannelReceiveHandlers as Ge}from"../../../im-core/src/message-flow/receive/channel-receive-handlers.js";import{createRobotReceiveHandlers as He}from"../../../im-core/src/message-flow/receive/robot-receive-handlers.js";import{createChannelNotifyReceiveHandlers as Ve}from"../../../im-core/src/message-flow/receive/channel-notify-receive-handlers.js";import{createChannelApplicationReceiveHandlers as $e}from"../../../im-core/src/message-flow/receive/channel-application-receive-handlers.js";import{createSessionFavoriteReceiveHandlers as qe}from"../../../im-core/src/message-flow/receive/session-favorite-receive-handlers.js";import{createFriendActionReceiveHandlers as ze}from"../../../im-core/src/message-flow/receive/friend-action-receive-handlers.js";import{createWalletNotifyReceiveHandlers as We}from"../../../im-core/src/message-flow/receive/wallet-notify-receive-handlers.js";import{createContactApplicationReceiveHandlers as Je}from"../../../im-core/src/message-flow/receive/contact-application-receive-handlers.js";import{createContactApplicationAnswerReceiveHandlers as Qe}from"../../../im-core/src/message-flow/receive/contact-application-answer-receive-handlers.js";import{createDirectCallManager as Ye}from"../../../im-core/src/message-flow/call/direct-call-manager.js";import{createGroupCallManager as Xe}from"../../../im-core/src/message-flow/call/group-call-manager.js";import{createGroupEventReceiveHandlers as Ze}from"../../../im-core/src/message-flow/receive/group-event-receive-handlers.js";import{createChannelReadReceiveHandlers as et}from"../../../im-core/src/message-flow/read/channel-read-receive-handlers.js";import{createReadStrategyRegistry as tt}from"../../../im-core/src/message-flow/read/read-strategy.js";import{createPushRegistration as rt}from"../../../im-core/src/push/push-registration.js";import{createClientActivity as ot}from"../../../im-core/src/connection/client-activity.js";import{createImConnection as nt}from"../../../im-core/src/connection/connection-manager.js";import{createBrowserConnectionOwnership as st}from"../../../im-browser/src/network/browser-connection-ownership.js";import{CmdId as at}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{createGroupRestrictionCoordinator as it}from"../../../im-core/src/state/group-restriction-coordinator.js";import{createChannelRestrictionCoordinator as ct}from"../../../im-core/src/state/channel-restriction-coordinator.js";import{resolveMediaUploadPlan as dt}from"../../../im-browser/src/media/media-transfer-policy.js";import{resolveChannelAccess as pt}from"../../../im-core/src/state/channel-permissions.js";import{createGroupReadStrategy as lt}from"../../../im-core/src/message-flow/read/group-read-strategy.js";import{createRobotReadStrategy as ut}from"../../../im-core/src/message-flow/read/robot-read-strategy.js";import{createCustomerServiceReadStrategy as mt}from"../../../im-core/src/message-flow/read/customer-service-read-strategy.js";import{createMediaPreviewAdapter as vt}from"../../../im-browser/src/media/media-preview-adapter.js";import{isCryptoExecutionError as yt,CryptoExecutionError as gt}from"../../../im-core/src/ports/crypto-task-executor.js";import{createRsaTeaCryptoAdapter as ht}from"../../../im-browser/src/crypto/rsa-tea-crypto-adapter.js";import{createImDiagnosticLogger as ft}from"../../../im-core/src/diagnostics.js";import{createPeerPublicKeyService as It}from"../../../im-browser/src/crypto/peer-public-key-service.js";import{getChannelSecretKey as wt}from"../../../im-browser/src/http/requests/get-channel-secret-key.js";import{createEncryptKeyService as Ct}from"../../../im-browser/src/crypto/encrypt-key-service.js";import{pullOfflineInboundChat as bt,pullOfflineOwnerChat as St,pullOfflineInboundChatBatch as Tt,pullOfflineOwnerChatBatch as Et}from"../../../im-browser/src/http/requests/pull-offline-chat.js";import{createReactionManager as Rt}from"../../../im-core/src/message-flow/reaction/reaction-manager.js";import{throwIfAborted as Mt}from"../../../im-core/src/abort.js";import{pullChannelMessageContext as kt}from"../../../im-browser/src/http/requests/channel-message-context.js";import{pullGroupMessagesById as Dt,pullDirectMessagesById as xt,pullChannelMessagesById as Pt}from"../../../im-browser/src/http/requests/pull-messages-by-id.js";import{createChannelReadStrategy as At}from"../../../im-core/src/message-flow/read/channel-read-strategy.js";import{createGroupKeyService as jt}from"../../../im-browser/src/crypto/group-key-service.js";import{pullOfflineGroupSession as Ot,pullGroupHistory as _t,pullOfflineGroupBatch as Nt}from"../../../im-browser/src/http/requests/pull-offline-group.js";import{compareBySortKey as Lt}from"../../../im-core/src/mapping/sort.js";import{assertOfflineChatBatchComplete as Kt}from"../../../im-core/src/mapping/offline-mapper.js";import{createSyncManager as Ft}from"../../../im-core/src/sync/sync-manager.js";import{isMessageRecoveryBodyEqual as Ut}from"../../../im-core/src/mapping/merge.js";import{yieldToBrowser as Bt}from"../../../im-browser/src/scheduling/yield-to-browser.js";import{resolveGroupRestriction as Gt}from"../../../im-core/src/mapping/group-notify-mapper.js";import{bContentCodec as Ht,bMessageCodec as Vt}from"../../../im-protocol/src/protobuf/registry.js";import{mapIncomingChannelNotify as $t}from"../../../im-core/src/mapping/channel-notify-mapper.js";import{recoverDecryptedMessage as qt}from"../../../im-core/src/mapping/decrypt-recovery.js";import{pullChannelSessions as zt,pullChannelLatestPage as Wt,pullChannelOfflineMessages as Jt,pullChannelHistory as Qt}from"../../../im-browser/src/http/requests/pull-offline-channel.js";import{parseChannelSyncCheckpoint as Yt,channelSyncCheckpointKey as Xt}from"../../../im-core/src/sync/channel-sync-checkpoint.js";import{requestRobotMenuReply as Zt}from"../../../im-browser/src/http/requests/robot-menu-reply.js";import{mapIncomingRobotFixedChat as er}from"../../../im-core/src/mapping/robot-message-mapper.js";import{getRobotChatMenus as tr,confirmRobotChat as rr,getRobotProfile as or}from"../../../im-browser/src/http/requests/robot-profile.js";import{unbindRobotFromConversation as nr,bindRobotToConversation as sr}from"../../../im-browser/src/http/requests/bind-robot-conversation.js";import{searchRobots as ar}from"../../../im-browser/src/http/requests/search-robots.js";import{getCustomerServiceProfile as ir,downloadCustomerServiceFile as cr}from"../../../im-browser/src/http/requests/customer-service-profile.js";import{pullOfflineSignal as dr}from"../../../im-browser/src/http/requests/pull-offline-signal.js";import{updateChannelReadIndexes as pr}from"../../../im-browser/src/http/requests/channel-read-index.js";import{markGroupReadAll as lr}from"../../../im-browser/src/http/requests/mark-group-read-all.js";const ur=z;function mr(e,t){const r=Number(e);if(!Number.isSafeInteger(r)||r<0)throw new Error(`GROUP history cursor 非法(groupId=${t})`);return r}function vr(vr,yr,gr,hr=0){const fr=vr.clientType??2,Ir={...vr.authProvider,getLoginContext:async()=>{const e=await vr.authProvider.getLoginContext();return null===e?null:{...e,clientType:fr}}};let wr="";const Cr=E(vr.debug,()=>({generation:hr,...""===wr?{}:{accountId:wr}}));let br=!0;const Sr=vr.uploadRecovery?.enabled?Y(gr):void 0,Tr=X(!1!==globalThis.navigator?.onLine),{coreClient:Er,http:Rr}=oe({coreClient:vr.coreClient,http:vr.http,authProvider:Ir,endpointProvider:vr.endpointProvider,clientType:fr,isActive:()=>br,onRequestError:vr.onRequestError,onHandlerError:e=>Cr.record("error","sdk","session","request-error-handler-failed",()=>({error:{message:"宿主请求错误处理器失败",data:e}}))}),Mr=vr.transport??se(),kr=vr.adapters?.storage,Dr=void 0!==kr?kr.create({namespaceFactory:gr}):"undefined"==typeof indexedDB?void 0:ae({namespaceFactory:gr,mediaAssetCache:{strategies:j()}}),xr=/* @__PURE__ */new Map,Pr=/* @__PURE__ */new Map,Ar=/* @__PURE__ */new Map,jr=/* @__PURE__ */new Map,Or=/* @__PURE__ */new Map,_r=/* @__PURE__ */new Map,Nr=e=>`${Ce(e.conversation)}\0${e.messageId}`;function Lr(e,t){const r=Ce(e),o=(_r.get(r)??Promise.resolve()).then(t),n=o.then(()=>{},()=>{});return _r.set(r,n),n.then(()=>{_r.get(r)===n&&_r.delete(r)}),o}function Kr(e,t){return Lr(e.conversation,async()=>{t()&&(await(Dr?.deleteDecryptRecovery?.(e.conversation,e.messageId)),t()&&(Or.delete(Nr(e)),jr.delete(Nr(e)),xr.delete(Nr(e))))})}const Fr=e=>{const t=Dr?.saveDecryptRecovery;if(void 0===t)return;const r=Nr(e),o=(Ar.get(r)??0)+1;Ar.set(r,o),Or.delete(r),jr.set(r,e);const n=Ce(e.conversation),s=Pr.get(n)??0,a=()=>br&&s===(Pr.get(n)??0)&&o===Ar.get(r),i=Lr(e.conversation,async()=>{a()&&await t(e)});xr.set(r,i),i.then(()=>{if(xr.get(r)===i&&xr.delete(r),a())return as(e)}).catch(t=>yr.emit({type:"error",error:{scope:"storage",message:`保存解密恢复记录失败(conversationType=${e.conversation.conversationType}, messageId=${e.messageId})`,cause:t}}))};let Ur=!1;const Br="object"==typeof(Gr=Dr)&&null!==Gr&&"get"in Gr&&"function"==typeof Gr.get&&"put"in Gr&&"function"==typeof Gr.put&&"clear"in Gr&&"function"==typeof Gr.clear?Dr:void 0;var Gr;const Hr=g({...void 0===Dr?{}:{storage:Dr},...void 0===Er?{}:{coreClient:Er}});let Vr,$r;const qr=B({...void 0===Dr?{}:{storage:Dr},conversationBackgrounds:Hr.api,onDirectReadReceiptDisabled:e=>Vr?.(e)});let zr=0;function Wr(e){return zr+=1,`channel-${e}-${hr}-${zr}`}const Jr=ft(Cr),Qr=(e,t,r=wr)=>{const o=t.fromId===r?t.toId:t.fromId;V(Cr,{conversation:{conversationType:"direct",conversationId:o},source:e,messageId:t.msgId,senderId:t.fromId,receiverId:t.toId,messageType:t.msgType,encrypt:t.encrypt,encryptVersion:t.encryptVersion,reason:t.reason,resolverSource:"direct-private-key",...void 0===t.cmdId?{}:{commandId:t.cmdId},...void 0===t.cause?{}:{cause:t.cause}})},Yr=(e,t)=>{V(Cr,{conversation:{conversationType:"group",conversationId:t.groupId},source:e,messageId:t.msgId,senderId:t.fromId,messageType:t.msgType,encrypt:t.encrypt,encryptVersion:t.encryptVersion,reason:t.reason,resolverSource:"group-private-key",...void 0===t.cmdId?{}:{commandId:t.cmdId},...void 0===t.cause?{}:{cause:t.cause}})},Xr=(e,t)=>{V(Cr,{conversation:{conversationType:"channel",conversationId:t.channelId},source:e,messageId:t.messageId,encrypt:t.encrypt,reason:t.reason,resolverSource:"channel-symmetric-key",endpoint:t.endpoint,surface:t.surface,decryptStage:t.decryptStage,keySource:t.keySource,keyByteLength:t.keyByteLength,payloadByteLength:t.payloadByteLength,...void 0===t.cipherDataByteLength?{}:{cipherDataByteLength:t.cipherDataByteLength},...void 0===t.decryptedByteLength?{}:{decryptedByteLength:t.decryptedByteLength},...void 0===t.forceRefreshAttempted?{}:{forceRefreshAttempted:t.forceRefreshAttempted},...void 0===t.clientTypeHeader?{}:{clientTypeHeader:t.clientTypeHeader},...void 0===t.clientTypeBody?{}:{clientTypeBody:t.clientTypeBody},...void 0===t.operationId?{}:{operationId:t.operationId},...void 0===t.cause?{}:{cause:t.cause}})},Zr=e=>{Cr.record("warn","sdk","protocol","channel-content-decode",()=>({conversation:{conversationType:"channel",conversationId:e.channelId},...void 0===e.operationId?{}:{operationId:e.operationId},data:{messageId:e.messageId,encrypt:e.encrypt,contentLength:e.contentLength,...void 0===e.endpoint?{}:{endpoint:e.endpoint},...void 0===e.surface?{}:{surface:e.surface},...void 0===e.clientTypeHeader?{}:{clientTypeHeader:e.clientTypeHeader},...void 0===e.clientTypeBody?{}:{clientTypeBody:e.clientTypeBody}},error:{message:"CHANNEL 消息正文解码失败",data:e.cause}}))};function eo(e){return"left"===e||"removed"===e||"dismissed"===e}Cr.record("debug","sdk","session","runtime-created");let to="empty";const ro=yr.subscribe(e=>{if(br)if("connection:changed"!==e.type)if("message:received"!==e.type&&"message:updated"!==e.type)if("auth:invalid"!==e.type){if("error"===e.type){const t="storage"===e.error.scope?"storage":"crypto"===e.error.scope?"crypto":"session";Cr.record("error","sdk",t,"runtime-error",()=>({error:{message:e.error.message,data:e.error.cause}}))}}else Cr.record("warn","sdk","session","auth-invalid",()=>({data:e.issue}));else Cr.record("trace","sdk","message",e.type,()=>({conversation:e.conversation,message:R(e.message),data:{source:e.source,channelLifecycleEffects:e.channelLifecycleEffects}}));else Cr.record("info","sdk","connection","connection-state-changed",()=>({data:{state:e.state}}))});function oo(e){return e.cmdId===at.MES_CHAT_EDIT_MSG_C2C||e.cmdId===at.MES_GRPCHAT_EDIT_MSG_C2C||e.cmdId===at.MES_RADIO_EDIT_MSG_C2C}const no=/* @__PURE__ */new Set;let so,ao,io,co,po,lo,uo="auto",mo=!1,vo=!1,yo=0,go=!1,ho=()=>{},fo=null,Io=null;const wo=$(),Co=new AbortController,bo=/* @__PURE__ */new Set;let So=0,To=!1;const Eo=ee(e=>yr.emit({type:"receiving:changed",receiving:e})),Ro=ee(e=>yr.emit({type:"syncing:changed",syncing:e}));let Mo,ko,Do=!1;const xo=/* @__PURE__ */new Map,Po=/* @__PURE__ */new Map,Ao=/* @__PURE__ */new Map,jo=e=>Ao.get(Ce(e))?.version??0;function Oo(e,t){Ao.set(Ce(e),{version:jo(e)+1,...void 0===t?{}:{reason:t}})}let _o=0;const No=e=>xo.get(e)??0,Lo=e=>{xo.set(e,No(e)+1)};function Ko(e,t){Oo(e,t),lo?.invalidate(e,{reason:t}),"channel"===e.conversationType&&Lo(e.conversationId),"group"===e.conversationType&&Po.set(e.conversationId,(Po.get(e.conversationId)??0)+1)}const Fo=vr.profile??(void 0===Er?void 0:ce({client:Er,clientType:fr,...void 0===Dr?{}:{storage:Dr}})),Uo=vr.channelProfile??(void 0===Er?void 0:de({client:Er,clientType:fr,getUserId:async()=>{if(""!==wr)return wr;const e=await Ir.getLoginContext();return e?.userId??""},...void 0===Dr?{}:{storage:Dr}})),Bo=vr.channelMembers??(void 0===Er?void 0:ue({client:Er,clientType:fr,isActive:()=>br,...void 0===Dr?{}:{storage:Dr}})),Go=vr.channelMentionMembers??(void 0===Er?void 0:me({client:Er,clientType:fr})),Ho=y({...void 0===Go?{}:{provider:Go},...void 0===Dr?{}:{storage:Dr}}),Vo=vr.directory??(void 0===Er?void 0:ve({client:Er,clientType:fr,getUserId:async()=>""!==wr?wr:(await Ir.getLoginContext())?.userId??""})),$o=M({...void 0===Vo?{}:{provider:Vo}});let qo;const zo=K({onProfileUpdated:function(e){en.updateConversationProfile({conversationType:"robot",conversationId:e.id},{title:e.displayName,avatar:e.avatarUrl??""})},...void 0===Er?{}:{search:e=>ar(Er,{...e,...void 0===fr?{}:{clientType:fr}}),bind:e=>sr(Er,{...e,...void 0===fr?{}:{clientType:fr}}),unbind:e=>nr(Er,{...e,...void 0===fr?{}:{clientType:fr}}),getProfile:e=>or(Er,{...e,...void 0===fr?{}:{clientType:fr}}),confirmChat:e=>rr(Er,{robotId:e,...void 0===fr?{}:{clientType:fr}}),listChatMenus:e=>tr(Er,{robotId:e,...void 0===fr?{}:{clientType:fr}}),requestMenuReply:async e=>{const t=""!==wr?wr:(await Ir.getLoginContext())?.userId??"";if(""===t)throw new Error("机器人指令回复缺少当前用户");const r=await Zt(Rr,{...e,userId:t});if(!br)return;const o=er({robotId:e.robotId,userId:t,msgId:r.msgId,msgTime:r.msgTime,content:r.content},{selfId:t,keepRaw:!0});if(void 0!==o){if(void 0===qo)throw new Error("机器人指令回复尚未接入消息存储");await qo(o)}}}}),Wo=vr.expressionProvider??ye({...void 0===Er?{}:{coreClient:Er},...void 0===vr.expressions?.giphy?.apiKey?{}:{giphyApiKey:vr.expressions.giphy.apiKey}}),Jo=x({provider:Wo,isActive:()=>br}),Qo=vr.sessionFavoriteProvider??ge({...void 0===Er?{}:{coreClient:Er},getUserId:()=>wr}),Yo=vr.channelJoinApplications??(void 0===Er?void 0:he({client:Er,clientType:fr})),Xo=vr.contactApplications??(void 0===Er?void 0:fe({client:Er,clientType:fr})),Zo=vr.groupApplications??(void 0===Er?void 0:Ie({client:Er,clientType:fr})),en=we({emitter:yr,diagnostics:Cr,profile:Fo,channelProfile:Uo,storage:Dr,getSelfId:()=>wr,loadOlderFromRemote:async e=>{const t=lo?.enterForeground(e.conversation),r=wo.enterForeground(),o=Eo.begin();try{return void 0===po?{messages:[],exhausted:!0}:await po(e)}finally{o(),t?.(),r()}},loadNewerFromRemote:async e=>{const t=lo?.enterForeground(e.conversation),r=wo.enterForeground(),o=Eo.begin();try{return void 0===ko?{messages:[],exhausted:!0}:await ko(e)}finally{o(),t?.(),r()}}}),tn=S({download:async({messageId:e,itemIndex:t,signal:r})=>{const o=en.getConversationMessage({conversationType:"customerService",conversationId:"__customer_service__"},e),n=o?.body.customerService?.files[t];if(void 0===n)throw T({code:"IM_SDK_CUSTOMER_SERVICE_FILE_UNAVAILABLE",category:"state",operation:"customerService.downloadFile",retryable:!1});return await cr(n.url,r)},isActive:()=>br,load:e=>void 0===Er?Promise.reject(T({code:"IM_SDK_CORE_API_UNAVAILABLE",category:"contract",operation:"customerService.getProfile",retryable:!1})):ir(Er,e),update:e=>en.updateConversationProfile({conversationType:"customerService",conversationId:"__customer_service__"},{title:e.displayName,avatar:e.avatarUrl})}),rn=tn.api;let on=()=>{};const nn=A({namespaceFactory:gr,...void 0===Dr?{}:{storage:Dr},emitter:yr,getAccountId:()=>wr,isActive:()=>br,clearMemoryCaches:()=>{tn.clearCache(),Fo?.clearCache?.(),Uo?.clearCache?.(),Bo?.clearCache?.(),Ho.clear(),on(),lo?.clear().catch(e=>yr.emit({type:"error",error:{scope:"storage",message:"清理最近历史缓存失败",cause:e}}))}});qo=e=>en.commitReceivedMessages([e],"live");const sn=U({provider:Qo,isActive:()=>br,resolveMessage:async(e,t)=>en.getConversationMessage(e,t)??await(Dr?.getMessage(e,t))??void 0}),an=yr.subscribe(e=>{if("message:removed"===e.type||"conversation-history:cleared"===e.type||"session:removed"===e.type){const t=Ce(e.conversation);if(Pr.set(t,(Pr.get(t)??0)+1),"message:removed"===e.type)Or.delete(Nr({conversation:e.conversation,messageId:e.messageId}));else for(const e of Or.keys())e.startsWith(`${t}\0`)&&Or.delete(e)}if(void 0!==Dr?.deleteDecryptRecovery)if("message:received"!==e.type&&"message:updated"!==e.type||!0===e.message.encryption.decryptFailed){if("message:removed"===e.type)jr.delete(Nr({conversation:e.conversation,messageId:e.messageId})),Lr(e.conversation,()=>Dr.deleteDecryptRecovery(e.conversation,e.messageId)).catch(t=>yr.emit({type:"error",error:{scope:"storage",message:`删除消息密文记录失败(messageId=${e.messageId})`,cause:t}}));else if("conversation-history:cleared"===e.type){for(const[t,r]of jr)Ce(r.conversation)===Ce(e.conversation)&&jr.delete(t);Lr(e.conversation,async()=>Dr.deleteConversationDecryptRecoveries?.(e.conversation)).catch(t=>yr.emit({type:"error",error:{scope:"storage",message:`清理会话密文记录失败(conversationId=${e.conversation.conversationId})`,cause:t}}))}}else{const t=Ce(e.conversation),r=Pr.get(t)??0,o=Nr({conversation:e.conversation,messageId:e.message.id}),n=Ar.get(o)??0,s=()=>br&&r===(Pr.get(t)??0)&&n===(Ar.get(o)??0);(async()=>{const t=(await(Dr.getDecryptRecoveries?.(e.conversation))??[]).find(t=>t.messageId===e.message.id);void 0!==t&&!oo(t)&&s()&&(await en.commitReceivedMessages([e.message],"offline",{backfillOnly:!0}),await Kr(t,s))})().catch(t=>yr.emit({type:"error",error:{scope:"storage",message:`删除已恢复密文记录失败(messageId=${e.message.id})`,cause:t}}))}});const cn=s({directory:$o.contacts,getSelfId:()=>wr,...void 0===Fo?{}:{profile:{getUserProfile:en.readDirectProfile,...void 0===Fo.peekUserProfile?{}:{peekUserProfile:Fo.peekUserProfile.bind(Fo)}}},...void 0===Er?{}:{coreClient:Er},domainState:en,emitter:yr,terminateConversationSending:(e,t)=>ho(e,t),resetDirectReadReceiptPreference:e=>qr.api.readReceipts.resetConversation({conversationType:"direct",conversationId:e}),onRelationshipChanged:(e,t)=>{"friend"===t?$r?.(e):"unknown"!==t&&Vr?.(e)}}),dn=m({...void 0===Xo?{}:{contact:Xo},...void 0===Zo?{}:{group:Zo},...void 0===Yo?{}:{channel:Yo},onContactAccepted:async(e,t)=>{cn.updateRelationshipFromEvent(e,"friend"),await en.reconcileDirectContactEstablishedNotice(e,`contact-application:${t}`),en.refreshConversationProfile(e,"direct")},emitter:yr,isActive:()=>br&&"ready"===to}),pn=k({domainState:en,emitter:yr,isActive:()=>br}),ln=F({domainState:en,isAvailable:()=>br&&"ready"===to}),un=i(()=>en.getSessions()),mn=be({onHidden:()=>hn(!0),onVisible:()=>hn(!1),onPageHide:()=>hn(!0),onPageShow:()=>hn(!1)},vr.network),vn=vr.cryptoExecutorFactory?.(hr)??Se({generation:hr,diagnostics:Cr,lifecycleAware:mn.supportsLifecycle}),yn=p({executor:vn,generation:hr,isActive:()=>br}),gn=vr.crypto??{...ht(),async encryptSymmetricChunked(e){try{return await yn(e)}catch(e){throw yt(e)&&br&&yr.emit({type:"error",error:{scope:"crypto",message:"媒体加密计算失败",cause:e}}),e}}};function hn(e){vn.setSuspended(e)}function fn(e){!br||e instanceof Error&&"AbortError"===e.name||yr.emit({type:"error",error:{scope:"crypto",message:"密钥计算失败",cause:e}})}const In=void 0!==vr.media?Te(vr.media,Cr):void 0,wn=Ee(),Cn=vt(wn),{prepareLocalMediaPreview:bn,prepareLocalVideoPoster:Sn,prepareLocalImageThumbnail:Tn,prepareLocalImageDisplay:En}=J(wn,()=>hr),Rn=void 0===Er?void 0:Ct({client:Er,crypto:gn,cryptoExecutor:vn,generation:hr,clientType:fr,onError:(e,t)=>Jr?.("crypto",{message:e,cause:t})}),Mn=void 0===Er?void 0:It({client:Er,clientType:fr,onError:(e,t)=>Jr?.("crypto",{scope:"send-key",message:e,cause:t})}),kn=void 0===Er?void 0:jt({client:Er,crypto:gn,cryptoExecutor:vn,generation:hr,clientType:fr,onError:(e,t)=>Jr?.("crypto",{scope:"group-key",message:e,cause:t})}),Dn=vr.channelKeyService??(void 0===Er?void 0:Re({loadSecretKey:e=>wt(Er,{channelId:e,clientType:fr}),onError:(e,t)=>Jr?.("crypto",{scope:"channel-key",message:e,cause:t})})),xn=async(e,t={})=>{if(void 0===Dn)return;const r=null===Dn.getCachedChannelKey(e);try{await Dn.getChannelKey(e)}catch{return}if(!1!==t.recoverExistingMessages&&r&&br)try{await cs({conversationType:"channel",conversationId:e},{recoverLegacyWithoutSidecar:!1})}catch(t){yr.emit({type:"error",error:{scope:"storage",message:`CHANNEL key 就绪后读取解密恢复记录失败(channelId=${e})`,cause:t}})}},Pn=async e=>void 0===Dn?null:Dn.getChannelKey(e),An=e=>{if(void 0===Dn)return null;const t=Dn.getCachedChannelKey(e);return null===t&&xn(e),t},jn=()=>Rn?.getCachedPrivateKey(wr)?.privateKey??null,On=async(e,t={})=>{const r=[];void 0!==Dn&&r.push(...[...new Set(e)].map(e=>xn(e,t))),void 0!==Rn&&""!==wr&&r.push(Rn.getUserPrivateKey(wr,{priority:t.priority??"background",signal:t.signal??Co.signal})),await Promise.all(r)},_n=e=>({crypto:gn,resolveChannelKey:e=>Dn?.getCachedChannelKey(e)??null,resolveUserPrivateKey:jn,onDecryptError:t=>Xr(e,t),onDecryptRecovery:Fr}),Nn=W({fetch:async e=>{await(kn?.getGroupKeys(e,{priority:"background"}))},onError:fn});function Ln(e){br&&void 0!==kn&&""!==e&&Nn.enqueue(e)}function Kn(){Nn.dispose(),mn.stop(),Rn?.dispose(),kn?.dispose(),vn.dispose()}const Fn=async e=>{if(void 0===kn)return null;const t=await kn.getGroupKeys(e);return null===t?null:{publicKey:t.publicKey,version:t.version}},Un=e=>{if(void 0===kn)return null;const t=kn.getCachedGroupKeys(e);return null!==t?t.privateKey:(Ln(e),null)},Bn=async(e,t={})=>{const r=t.signal??Co.signal;if(Mt(r),void 0===kn)return;const o=[...new Set(e)];let n,s=0;const a=async()=>{for(;void 0===n&&s<o.length;){if(!br)return;const e=o[s++];try{await kn.getGroupKeys(e,{priority:t.priority??"background",signal:r})}catch(e){throw n=e,e}}};await Promise.all([a(),a()]),Mt(r)},Gn=e=>({crypto:gn,resolvePrivateKey:({groupId:e})=>Un(e),onDecryptError:t=>Yr(e,t),onDecryptRecovery:Fr}),Hn=/* @__PURE__ */new Map,Vn=/* @__PURE__ */new Map,$n=/* @__PURE__ */new Map,qn=/* @__PURE__ */new Set,zn=/* @__PURE__ */new Set;function Wn(e){return!0!==e.encryption.decryptFailed&&"unknown"!==e.contentType}function Jn(e){$n.delete(Ce(e))}function Qn(e,t){return e.length===t.length&&e.every((e,r)=>e===t[r])}function Yn(e){if("group"===e.conversation.conversationType)return kn?.getCachedGroupKeyVersion(e.conversation.conversationId)??void 0}function Xn(e){return 2===e.wireEncrypt?"channel-base64-pad-tea":"group"===e.conversation.conversationType?"group-rsa-tea":"channel"===e.conversation.conversationType?"channel-web-rsa-tea":"direct-rsa-tea"}function Zn(e){return 101===e.contentType?Number.isInteger(e.type)&&e.type>0:27===e.contentType?0n===e.gameType?e.gameValue>=1n&&e.gameValue<=3n:1n===e.gameType&&e.gameValue>=1n&&e.gameValue<=6n:[1,2,3,4,5,7,8,11].includes(e.contentType)}function es(e,t){const r=new Map(en.getMessagesByConversation(e).filter(e=>void 0===t||e.id===t).map(e=>[e.id,e])),o=/* @__PURE__ */new Map;return{stop:yr.subscribe(n=>{if(!br||"message:received"!==n.type&&"message:updated"!==n.type||"live"!==n.source||n.conversation.conversationType!==e.conversationType||n.conversation.conversationId!==e.conversationId||void 0!==t&&n.message.id!==t||!0===n.message.encryption.decryptFailed)return;const s=r.get(n.message.id);if(void 0===s||!Ut(s,n.message)){const t=Nr({conversation:e,messageId:n.message.id});o.set(t,Ar.get(t)??0)}}),hasChanged:e=>{const t=Nr(e);return o.has(t)&&o.get(t)===(Ar.get(t)??0)}}}let ts=0;const rs=[],os=/* @__PURE__ */new Map;let ns=0;function ss(){for(;ns<2&&rs.length>0;){const e=rs.shift();ns+=1,Promise.resolve().then(async()=>{if(Mt(Co.signal),!e.isCurrent())throw new DOMException("端到端排队恢复所属账号、会话或消息已失效","AbortError");await is(e.record,e.hasBodyChanged)}).then(e.resolve,e.reject).finally(()=>{ns-=1,ss()})}}function as(e,t){if("direct"!==e.conversation.conversationType&&"group"!==e.conversation.conversationType)return is(e);const r=Nr(e),o=Ar.get(r)??0,n=os.get(r);if(n?.version===o&&n.isCurrent())return n.promise;const s=wr,a=Ce(e.conversation),i=Pr.get(a)??0,c=jo(e.conversation),d=()=>br&&wr===s&&i===(Pr.get(a)??0)&&c===jo(e.conversation)&&o===(Ar.get(r)??0),p=void 0===t?es(e.conversation,e.messageId):void 0,l=t??(()=>p.hasChanged(e)),u=new Promise((t,r)=>{rs.push({record:e,isCurrent:d,hasBodyChanged:l,resolve:t,reject:r})}).finally(()=>{p?.stop(),os.get(r)?.promise===u&&os.delete(r)});return os.set(r,{version:o,isCurrent:d,promise:u}),ss(),u}async function is(e,t){const r=Nr(e);e=jr.get(r)??e;const o=Ar.get(r)??0,n=Ce(e.conversation),s=Pr.get(n)??0,a=jo(e.conversation),i=()=>br&&a===jo(e.conversation)&&s===(Pr.get(n)??0)&&o===(Ar.get(r)??0),c=Hn.get(r);if(void 0!==c)return Vn.get(r)===o?c:(await c.catch(()=>{}),void(i()&&jr.get(r)===e&&await is(e,t)));const d=async()=>en.getConversationMessage(e.conversation,e.messageId)??await(Dr?.getMessage(e.conversation,e.messageId))??void 0,p=(async()=>{const n=await d();if(!i()||void 0===n)return;const s=oo(e),a=()=>!("direct"!==e.conversation.conversationType&&"group"!==e.conversation.conversationType||!s)&&(t?.()&&Or.set(r,o),Or.get(r)===o);if(a())return await en.commitReceivedMessages([n],"offline",{backfillOnly:!0}),void await Kr(e,i);if(!0!==n.encryption.decryptFailed&&!s)return await en.commitReceivedMessages([n],"offline",{backfillOnly:!0}),void await Kr(e,i);let c,p;Cr.record("debug","sdk","crypto","decrypt-recovery-context",()=>({conversation:e.conversation,data:{messageId:e.messageId,messageSenderId:n.senderId,messageCreatedAt:n.createdAt,selfMessage:n.senderId===wr,source:e.source,wireEncrypt:e.wireEncrypt,sContentBytes:e.sContent.length,...void 0===e.cmdId?{}:{cmdId:e.cmdId},...void 0===e.encryptVersion?{}:{encryptVersion:e.encryptVersion}}}));let l="key-resolve",u=Xn(e);for(const t of[!1,!0]){const r=t?"force":"current";let o;try{l="bcontent";const n=Ht.decode(e.sContent);if(1===e.wireEncrypt){if(0===n.secretKey.length||0===n.cipherData.length)throw new Error("BContent.secretKey/cipherData 缺失");l="key-resolve";const s={priority:"background",signal:Co.signal,...t?{staleKey:"string"==typeof p?p:void 0}:{}},a="group"===e.conversation.conversationType?(await(kn?.getGroupKeys(e.conversation.conversationId,s)))?.privateKey??null:(await(Rn?.getUserPrivateKey(wr,s)))?.privateKey??null;if(!i())return;t&&void 0!==p&&(o="string"==typeof p&&null!==a&&p!==a),!0===o&&Jn(e.conversation),t||(p=a);const d=Yn(e);if(null===a){Cr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Xn(e),finalStage:l,reason:"no-key",...void 0===d?{}:{resolvedKeyVersion:d},...void 0===o?{}:{keyChanged:o}}}));continue}const u=await vn.decryptBatch({operationId:"end-to-end-recovery:"+ ++ts,generation:hr,items:[{itemIndex:0,input:{secretKey:n.secretKey,cipherData:n.cipherData,privateKey:a}}],priority:"background",signal:Co.signal});if(!i())return;if(1!==u.length||0!==u[0]?.itemIndex)throw new gt("protocol-mismatch");const m=u[0].result;if(!m.ok)throw l=m.stage,new Error(`End-to-end recovery ${m.stage} failed`);const v=m.plain;Cr.record("debug","sdk","crypto","decrypt-recovery-byte-shape",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:Xn(e),rsaCipherBytes:n.secretKey.length,cipherDataBytes:n.cipherData.length,cipherDataBlockRemainder:n.cipherData.length%8,plainBytes:v.length,plainBlockRemainder:v.length%8,startsWithContentTypeField:8===v[0],startsWithMobileCardType:8===v[0]&&8===v[1],...Z(v)}})),l="bmessage",c=Vt.decode(v)}else if("channel"===e.conversation.conversationType){if(0===n.cipherData.length)throw new Error("BContent.cipherData 缺失");l="key-resolve";const s=t?{...p instanceof Uint8Array?{staleKey:p}:{}}:void 0,a=void 0===Dn?.getChannelKeyCandidates?await(Dn?.getChannelKey(e.conversation.conversationId,s).then(e=>[{strategy:"canonical-base64-pad",key:e}]))??[]:await Dn.getChannelKeyCandidates(e.conversation.conversationId,s),i=Dn?.getCachedChannelKeyMetadata?.(e.conversation.conversationId);null!=i&&Cr.record("info","sdk","crypto","decrypt-recovery-key-material",()=>({conversation:e.conversation,data:{messageId:e.messageId,attempt:r,...i}}));const d=a.find(e=>"canonical-base64-pad"===e.strategy)?.key??null;if(t&&p instanceof Uint8Array&&null!==d&&(o=!Qn(p,d)),!0===o&&Jn(e.conversation),t||(p=d?.slice()??null),0===a.length){Cr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Xn(e),finalStage:l,reason:"no-key",...void 0===o?{}:{keyChanged:o}}}));continue}for(const t of a)try{l="tea";const s=gn.decryptSymmetric({teaKey:t.key,cipherData:n.cipherData});l="bmessage";const a=Vt.decode(s);if("legacy-ascii16"===t.strategy&&!Zn(a))throw new Error("legacy ASCII candidate 未通过已知 BMessage 语义校验");c=a,u=t.strategy,Cr.record("info","sdk","crypto","decrypt-recovery-candidate",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:t.strategy,finalStage:"recovered",reason:"recovered",...void 0===o?{}:{keyChanged:o}}}));break}catch(n){Cr.record("warn","sdk","crypto","decrypt-recovery-candidate",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:t.strategy,finalStage:l,reason:"decrypt-failed",...void 0===o?{}:{keyChanged:o}},error:{message:"CHANNEL decrypt recovery candidate failed",data:n}}))}}if(void 0!==c){Cr.record("info","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:u,finalStage:"recovered",reason:"recovered",...void 0===o?{}:{keyChanged:o}}}));break}}catch(t){if(yt(t)||t instanceof Error&&"AbortError"===t.name)throw t;const n=Yn(e);Cr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Xn(e),finalStage:l,reason:"decrypt-failed",...void 0===n?{}:{resolvedKeyVersion:n},...void 0===o?{}:{keyChanged:o}},error:{message:"IM message decryption recovery failed",data:t}}))}}if(!i()||void 0===c)return void(void 0===c&&(!function(e,t){const r=Ce(e),o=$n.get(r)??/* @__PURE__ */new Set;o.add(t),$n.set(r,o)}(e.conversation,e.messageId),Cr.record("warn","sdk","crypto","decrypt-recovery-exhausted",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,strategy:Xn(e),attempts:2,finalStage:l}}))));const m=await d();if(!i()||void 0===m||!0!==m.encryption.decryptFailed&&!s)return;if(("direct"===e.conversation.conversationType||"group"===e.conversation.conversationType)&&s&&(a()||!Ut(n,m)))return Or.set(r,o),await en.commitReceivedMessages([m],"offline",{backfillOnly:!0}),void await Kr(e,i);const v="channel"!==e.conversation.conversationType||e.cmdId!==at.RADIO_NOTIFY_DELIVER&&101!==c.contentType?{...qt(m,c,wr),...s?{edited:!0}:{}}:$t({channelId:BigInt(e.conversation.conversationId),messageId:e.messageId,occurredAt:BigInt(m.serverTime??m.createdAt),notifyType:c.type,operatorId:c.oprUserId,targetUserIds:c.mnpledUserId,content:c.content,..."string"==typeof m.extensions?.historyCursor?{historyCursor:m.extensions.historyCursor}:{},..."string"==typeof m.extensions?.channelSequence?{sequence:BigInt(m.extensions.channelSequence)}:{},encrypted:!0},{cmdId:e.cmdId,keepRaw:void 0!==m.raw});await en.commitReceivedMessages([v],"offline",{backfillOnly:!0,refreshSessionSummary:!0}),await Kr(e,i)})().finally(()=>{Hn.get(r)===p&&(Hn.delete(r),Vn.delete(r))});return Hn.set(r,p),Vn.set(r,o),p}async function cs(e,t={}){const r="direct"===e.conversationType||"group"===e.conversationType?es(e):void 0;try{const o=Ce(e),n=wr,s=Pr.get(o)??0,a=jo(e),i=()=>br&&n===wr&&s===(Pr.get(o)??0)&&a===jo(e),c=await(Dr?.getDecryptRecoveries?.(e))??[];if(!i())return;const d=$n.get(o),p=void 0===d?c:c.filter(e=>!d.has(e.messageId));if("direct"===e.conversationType||"group"===e.conversationType){let e=0;const t=async()=>{for(;e<p.length;){if(!i())return;const t=p[e++];await as(t,()=>r.hasChanged(t))}},o=(await Promise.allSettled([t(),t()])).find(e=>"rejected"===e.status);if("rejected"===o?.status)throw o.reason}else await Promise.all(p.map(e=>as(e)));if(!br||!1===t.recoverLegacyWithoutSidecar)return;const l=$n.get(o),u=new Set(c.filter(e=>void 0===l||!l.has(e.messageId)).map(e=>e.messageId)),m=en.getMessagesByConversation(e).filter(e=>!0===e.encryption.decryptFailed&&!u.has(e.id));if(0===m.length||qn.has(o))return;if(qn.add(o),Cr.record("info","sdk","crypto","decrypt-repair-start",()=>({conversation:e,data:{stuckCount:m.length,withoutSidecar:m.filter(e=>!c.some(t=>t.messageId===e.id)).length}})),"channel"===e.conversationType){const t=await Ir.getLoginContext();if(null===t||void 0===Mo)return;for(const r of m.slice(0,20)){const o=r.extensions?.historyCursor;if("string"!=typeof o||""===o.trim())continue;const n=await Mo(e.conversationId,o,t.userId);if(!br)return;n.length>0&&en.upsertMessages(n,"offline")}}else"group"===e.conversationType?await async function(e,t){if(void 0===po)return;const r=[...t].sort((e,t)=>e.sortKey.localeCompare(t.sortKey)),o=r[0],n=r.at(-1);if(void 0===o||void 0===n)return;const s=o.serverTime??o.createdAt;let a;for(let t=0;t<5;t++){const t=await po({conversation:e,oldestLoaded:n,...void 0===a?{}:{cursor:a},intent:"older",limit:50});if(!br||t.exhausted||void 0===t.nextCursor)return;const r=Number(t.nextCursor);if(Number.isFinite(r)&&r<=s)return;a=t.nextCursor}}({conversationType:"group",conversationId:e.conversationId},m):"direct"===e.conversationType&&await Fa()}catch(t){if(!br||t instanceof Error&&"AbortError"===t.name)return;yr.emit({type:"error",error:{scope:"crypto",message:`解密失败消息恢复失败(conversationType=${e.conversationType}, conversationId=${e.conversationId})`,cause:t}})}finally{r?.stop()}}let ds=()=>{throw new Error("离线 Reaction 写入失败:Reaction manager 尚未就绪")};function ps(e,t=!0){const r=e.channelPermissions,o=e.channelAccessSnapshot;return JSON.stringify(["group"===e.type?e.groupState??"active":void 0,e.channelState,void 0===r?void 0:[r.sendMessages,r.mentionAll,r.editProfile,r.manageMembers,r.manageAdmins,r.moderateMessages,r.manageMute,r.dismissChannel,r.transferOwnership],t&&void 0!==o?[o.role,o.baseState,o.resolvedState,o.allMembersMuted,o.currentUserMuted,o.mutePeriod]:void 0])}const ls=/* @__PURE__ */new Map;function us(e){const t=en.getConversationContext(e);if(!br||void 0===t||"group"===e.conversationType&&void 0!==t.groupState&&"active"!==t.groupState||"channel"===e.conversationType&&void 0!==t.channelState&&o(t.channelState))return;const r=en.getMessagesByConversation(e).at(-1);return JSON.stringify([z,wr,void 0===r?t.timestamp:void 0,ps(t),r?.id,r?.sortKey])}const ms=/* @__PURE__ */new Map;lo=re({...void 0===Dr?.recentHistoryCache?{}:{cache:Dr.recentHistoryCache},fingerprint:us,canRunBackground:function(){return br&&"ready"===to&&To&&0===So&&"authenticated"===ma.state},onForeground:e=>{if("group"===e.conversationType){kn?.promote(e.conversationId);for(const[t,r]of ms)r.some(t=>t.conversationId===e.conversationId)&&vn.promote(t)}else"channel"!==e.conversationType&&"direct"!==e.conversationType||Rn?.promote(wr)},fetchPage:async(e,t)=>{const r="group"===e.conversationType?Ca("group",{conversationType:"group",conversationId:e.conversationId}):void 0;try{const o=await te({http:Rr,authProvider:Ir,clientType:fr,groupDecrypt:()=>Gn("history"),groupAsyncDecrypt:(e,t)=>{const r=Sa(!0===lo?.hasForeground(e)?"foreground":"background",t);return r.assertCurrent?.(e),r},assertLoginContext:e=>{if(!br||""!==wr&&e!==wr)throw new DOMException("最近历史请求的登录账号已改变","AbortError")},channelDecrypt:()=>_n("history"),prepareGroupKeys:Bn,prepareChannelKeys:(e,t)=>On(e,{...t,recoverExistingMessages:!1}),keyPriority:e=>!0===lo?.hasForeground(e)?"foreground":"background"})(e,t);return void 0===r?o:{...o,messages:r.messages(o.messages),recoveries:o.recoveries?.filter(r.acceptsRecovery)}}finally{r?.stop()}},yieldToEventLoop:Bt,report:(e,t,r)=>Cr.record(e.endsWith("failed")?"warn":"debug","sdk","history",e,()=>({conversation:t,data:r}))});const vs=yr.subscribe(e=>{if("connection:changed"===e.type)return"authenticated"!==e.state&&(To=!1),void lo?.notifySchedulingChanged();if("session:updated"===e.type){if("group"!==e.conversation.conversationType&&"channel"!==e.conversation.conversationType)return;const t=Ce(e.conversation),r=ls.get(t),o={timestamp:e.session.timestamp,access:ps(e.session),capabilities:ps(e.session,!1),state:"group"===e.session.type?e.session.groupState??"active":e.session.channelState,hasPermissions:void 0!==e.session.channelPermissions,hasSnapshot:void 0!==e.session.channelAccessSnapshot};if(ls.set(t,o),"group"===e.conversation.conversationType&&"active"!==o.state&&r?.state!==o.state&&Oo(e.conversation),"ready"===to&&void 0!==r&&(r.access!==o.access||!Do&&r.timestamp!==o.timestamp)){const t=!r.hasSnapshot&&o.hasSnapshot&&(r.capabilities===o.capabilities||!r.hasPermissions&&r.state===o.state);lo?.invalidate(e.conversation,{preserveForeground:r.access===o.access||t})}return}return"session:removed"===e.type?(Oo(e.conversation),ls.delete(Ce(e.conversation)),void("ready"===to&&lo?.invalidate(e.conversation))):"conversation-history:cleared"===e.type?(Oo(e.conversation),void("ready"===to&&lo?.invalidate(e.conversation))):void("ready"===to&&!Do&&"conversation"in e&&void 0!==e.conversation&&("message:received"!==e.type&&"message:updated"!==e.type&&"message:removed"!==e.type||lo?.invalidate(e.conversation,{preserveForeground:"message:received"===e.type})))});function ys(e,t=!0){const r="group"===e.conversation.conversationType?Sa("foreground"):void 0;r?.assertCurrent?.({conversationType:"group",conversationId:e.conversation.conversationId}),Do=!0;try{if(void 0===r){e.messages.length>0&&en.upsertMessages(e.messages,"offline",{backfillOnly:!0,refreshSessionSummary:t});for(const t of e.reactions)ds(t);for(const t of lo.takeRecoveries(e))Fr(t)}else{const o=lo.takeRecoveries(e);for(const o of e.messages)r.publish([o],()=>en.upsertMessages([o],"offline",{backfillOnly:!0,refreshSessionSummary:t}));for(const t of e.reactions)r.publish([],()=>ds(t));for(const e of o)r.publish([],()=>Fr(e))}}finally{Do=!1}}po=async({conversation:e,oldestLoaded:t,cursor:r,intent:n,limit:s,signal:a})=>{Mt(a);const{conversationId:i}=e,c=en.getConversationContext(e);if(void 0===c)throw new Error(`加载远端历史失败:会话不存在(conversationId=${i})`);if("direct"===c.type||"robot"===c.type||"customerService"===c.type)return{messages:[],exhausted:!0};if("establish-latest"===n&&s===z&&("group"===c.type||"channel"===c.type)){const e={conversationType:c.type,conversationId:i};if(void 0===us(e))return{messages:[],exhausted:!0};const t=await lo.readCached(e,!0).catch(t=>(Cr.record("warn","sdk","history","recent-history-cache-read-failed",()=>({conversation:e,error:{message:"读取最近历史缓存失败",data:t}})),null));null!==t&&lo.isPageCurrent(t)&&Date.now()-t.fetchedAt>3e5&&ys(t,!1),Mt(a);const r=await lo.latest(e,a).catch(t=>{if(!yt(t)&&br&&void 0===us(e))return null;throw t});if(null===r)return{messages:[],exhausted:!0};if(Mt(a),!br||!lo.isPageCurrent(r)||void 0===us(e))throw new Error("最近历史请求已失效");if(ys(r),await lo.confirmConsumed(r),Mt(a),!lo.isPageCurrent(r))throw new Error("最近历史页在窗口提交前已失效");return{messages:r.messages,exhausted:r.exhausted,...void 0===r.nextCursor?{}:{nextCursor:r.nextCursor},replaceWindow:!0}}if("group"===c.type){if(void 0!==c.groupState&&"active"!==c.groupState)return{messages:[],exhausted:!0};const o={conversationType:"group",conversationId:i},d=wr,p=Sa(!0===lo?.hasForeground(e)?"foreground":"background",a);p.assertCurrent?.(o);const l=Ca("group",o);try{const o=await Ir.getLoginContext();if(null===o)return{messages:[],exhausted:!0};if(p.assertCurrent?.(),o.userId!==d)throw new DOMException("GROUP 历史请求的登录账号已改变","AbortError");const c="establish-latest"===n?Date.now():void 0===r?t?.serverTime??t?.createdAt??Date.now():mr(r,i),u=[],m=[],v=await _t({asyncDecrypt:p,signal:a,http:Rr,userId:o.userId,clientType:fr,groupId:i,baseTime:c,direct:1,limit:s,decryptDeps:{...Gn("history"),onDecryptRecovery:e=>m.push(e)},prepareKeys:t=>Bn(t,{signal:a,priority:!0===lo?.hasForeground(e)?"foreground":"background"}),onReaction:e=>u.push(e)});p.assertCurrent?.();const y=l.messages(v.messages);for(const e of y)p.publish([e],()=>en.upsertMessages([e],"offline",{backfillOnly:!0,refreshSessionSummary:"establish-latest"===n}));for(const e of u)p.publish([],()=>ds(e));for(const e of m)p.publish([],()=>{l.acceptsRecovery(e)&&Fr(e)});p.assertCurrent?.();return{messages:y,...q({conversationId:i,direction:"older",baseTime:c,batchSize:v.batchSize,boundaryTime:v.oldestEntryTime,limit:s}),..."establish-latest"===n?{replaceWindow:!0}:{}}}finally{l.stop()}}if("channel"===c.type){const s=Wr("history");if(void 0!==c.channelState&&o(c.channelState))return Cr.record("info","sdk","history","channel-history-blocked",()=>({conversation:e,operationId:s,data:{state:c.channelState}})),{messages:[],exhausted:!0};const l=_o,u=No(i),m=await Ir.getLoginContext();if(null===m)return{messages:[],exhausted:!0};if("establish-latest"===n){const t=await Wt({signal:a,http:Rr,userId:m.userId,clientType:fr,channelId:i,count:ur,operationId:s,decryptDeps:_n("history"),prepareKey:void 0===Dn&&void 0===Rn?void 0:t=>On([t],{signal:a,priority:!0===lo?.hasForeground(e)?"foreground":"background"}),onContentDecodeError:Zr,onReaction:ds});Mt(a);const r=en.getConversationContext(e);return!br||l!==_o||u!==No(i)||"channel"!==r?.type||void 0!==r.channelState&&o(r.channelState)?{messages:[],exhausted:!0}:(Mt(a),t.messages.length>0&&en.upsertMessages(t.messages,"offline",{backfillOnly:!0,refreshSessionSummary:!0}),{messages:t.messages,exhausted:!t.hasOlder,...void 0===t.nextCursor?{}:{nextCursor:t.nextCursor},replaceWindow:!0})}let v,y=r??"";if(void 0===r&&void 0!==t){const e=t.extensions?.historyCursor;if("string"==typeof e&&""!==e.trim())y=e;else if(d=t,p=m.userId,void 0===d||d.senderId!==p||"pending"!==d.status&&"uploading"!==d.status&&"sending"!==d.status||"string"==typeof d.extensions?.historyCursor&&""!==d.extensions.historyCursor.trim())throw new Error(`CHANNEL historyCursor 缺失(channelId=${i}, messageId=${t.id})`)}Cr.record("debug","sdk","history","channel-history-page-start",()=>({conversation:e,operationId:s,data:{baseIndexPresent:""!==y,direction:1,contain:0,count:ur,historyGeneration:l,historyEpoch:u,clientTypeHeader:fr,clientTypeBody:fr}}));try{v=await Qt({signal:a,http:Rr,userId:m.userId,clientType:fr,channelId:i,baseIndex:y,count:ur,contain:0,operationId:s,decryptDeps:_n("history"),prepareKey:void 0===Dn&&void 0===Rn?void 0:t=>On([t],{signal:a,priority:!0===lo?.hasForeground(e)?"foreground":"background"}),onContentDecodeError:Zr,onReaction:ds})}catch(t){throw Cr.record("error","sdk","history","channel-history-page-failed",()=>({conversation:e,operationId:s,data:{baseIndexPresent:""!==y,direction:1,contain:0,count:ur},error:{message:"CHANNEL 历史页加载失败",data:t}})),t}Mt(a);const g=en.getConversationContext(e);return!br||l!==_o||u!==No(i)||"channel"!==g?.type||void 0!==g.channelState&&o(g.channelState)?{messages:[],exhausted:!0}:(Mt(a),v.messages.length>0&&en.upsertMessages(v.messages,"offline",{backfillOnly:!0}),Cr.record("debug","sdk","history","channel-history-page-complete",()=>({conversation:e,operationId:s,data:{responseBatchSize:v.batchSize,messageCount:v.messages.length,exhausted:v.exhausted,nextBaseIndexPresent:void 0!==v.nextBaseIndex}})),{messages:v.messages,exhausted:v.exhausted,...void 0===v.nextBaseIndex?{}:{nextCursor:v.nextBaseIndex}})}var d,p;throw new Error(`远端历史未实现:${c.type}`)};const gs=e=>{e.length>0&&en.upsertMessages(e,"offline",{backfillOnly:!0})},hs=async()=>{const e=await Ir.getLoginContext();if(null===e)throw new Error("按消息 ID 回源失败:当前没有登录态");return{userId:e.userId}},fs=async(e,t)=>{const r={conversationType:"group",conversationId:e},o=Ca("group",r,t);try{const n=wr,s=jo(r),a=()=>{if(!br||wr!==n||s!==jo(r))throw new DOMException("GROUP 消息查询所属账号或历史已失效","AbortError")},i=Sa("foreground",void 0,a);i.assertCurrent?.(r);const{userId:c}=await hs();if(a(),c!==n)throw new DOMException("GROUP 消息查询的登录账号已改变","AbortError");const d=[],p=[],l=Gn("history"),u=await N(t,async t=>{a();const r=await Dt({asyncDecrypt:i,http:Rr,userId:c,clientType:fr,groupId:e,messageIds:t,decryptDeps:{...l,onDecryptRecovery:e=>p.push(e)},prepareKeys:e=>Bn(e,{priority:"foreground"}),onReaction:e=>d.push(e)});if(a(),200!==r.code)throw Object.assign(new Error("GROUP 按 ID 查询业务失败"),{code:r.code});return r});a(),i.assertCurrent?.();const m=o.messages(u.messages).filter(e=>e.conversationType===r.conversationType&&e.conversationId===r.conversationId);for(const e of m)i.assertCurrent?.(),gs([e]),i.assertCurrent?.();for(const e of d)i.assertCurrent?.(),e.conversation.conversationType===r.conversationType&&e.conversation.conversationId===r.conversationId&&ds(e),i.assertCurrent?.();for(const e of p)i.assertCurrent?.(),o.acceptsRecovery(e)&&e.conversation.conversationType===r.conversationType&&e.conversation.conversationId===r.conversationId&&Fr(e),i.assertCurrent?.();return{messages:m.map(e=>{const t=en.getConversationMessage(r,e.id);if(void 0===t)throw new Error("GROUP 按 ID 查询在领域合并后缺少消息");return t}),missingMessageIds:u.missingMessageIds}}finally{o.stop()}},Is=async(e,t)=>{const r={conversationType:"channel",conversationId:e},n=wr,s=_o,a=No(e),i=()=>{const t=en.getConversationContext(r);if(!br||wr!==n||s!==_o||a!==No(e)||"channel"!==t?.type||void 0!==t.channelState&&o(t.channelState))throw new DOMException("CHANNEL 消息查询所属账号或历史已失效","AbortError")};i();const{userId:c}=await hs();if(i(),c!==n)throw new DOMException("CHANNEL 消息查询的登录账号已改变","AbortError");const d=[],p=[],l=await N(t,async t=>{i();const r=await Pt({http:Rr,userId:c,clientType:fr,channelId:e,messageIds:t,operationId:Wr("history"),decryptDeps:{..._n("history"),onDecryptRecovery:e=>p.push({...e,source:"history"})},prepareKey:void 0===Dn&&void 0===Rn?void 0:async e=>{await On([e],{recoverExistingMessages:!1,priority:"foreground"}),i()},onContentDecodeError:Zr,onReaction:e=>d.push(e)});if(i(),0!==r.code)throw Object.assign(new Error("CHANNEL 按 ID 查询业务失败"),{code:r.code});return r});i();for(const e of l.messages)i(),gs([e]);for(const e of d)i(),ds(e);for(const e of p)i(),Fr(e);i();return{messages:l.messages.map(e=>{const t=en.getConversationMessage(r,e.id);if(void 0===t)throw new Error("CHANNEL 按 ID 查询在领域合并后缺少消息");return t}),missingMessageIds:l.missingMessageIds}},ws=Me([ke({includeOppositeEnd:!0,resolveOwnKey:async e=>{const t=await(Rn?.getUserPrivateKey(e));return t?.publicKey?{publicKey:t.publicKey,version:t.version}:null}}),De({resolveGroupKey:Fn}),xe({resolveChannelKey:Pn}),Pe()]),Cs=Ae([je(),Oe(),_e()]),bs=Ne([Le(),Ke(),Fe({resolveChannelKey:Pn,resolveProfile:e=>Uo?.getProfile(e)??Promise.resolve(null)})]);let Ss=()=>{throw new Error("群收包回 ACK 失败:connection.sendFrame 尚未就绪")},Ts=()=>!1,Es=()=>{throw new Error("群发送 ACK 回填失败:connection.onChatAck 尚未就绪")},Rs=()=>{},Ms=()=>{};const ks={...en,removeConversationForMembershipTermination:(e,t)=>{Rs(e,t),"group"===e.conversationType?(Nn.remove(e.conversationId),Oo(e),kn?.clearGroupKeys(e.conversationId)):Dn?.clearChannelKey(e.conversationId),en.removeConversationForMembershipTermination(e,t),Hr.api.resetBackground(e).catch(e=>yr.emit({type:"error",error:{scope:"storage",message:"终态删除后清理会话背景失败",cause:e}}))}},Ds=Rt({domainState:en,sendFrame:e=>Ss(e),getSelfId:()=>wr,isAuthenticated:()=>Ts(),reportReaction:e=>Wo.reportReaction(e),isEmojiSupported:D,logger:Jr});ds=e=>{Ds.ingest(e,"offline")};const xs=Ue({manager:Ds,getSelfId:()=>wr,logger:Jr}),Ps=Be({domainState:en,outbox:{onChatAck:e=>Es(e)},sendFrame:e=>Ss(e),getSelfId:()=>wr,emitter:yr,logger:Jr,keepRaw:!0,decrypt:{crypto:gn,resolvePrivateKey:({groupId:e})=>Un(e),preparePrivateKey:async({groupId:e})=>{if(void 0===kn)return null;const t=await kn.getGroupKeys(e);return t?.privateKey??null},onDecryptError:e=>Yr("live",e),onDecryptRecovery:Fr},isActive:()=>br});let As=0;const js=yr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&As++}),Os=Ge({domainState:en,outbox:{onChatAck:e=>Es(e)},sendFrame:e=>Ss(e),getSelfId:()=>wr,emitter:yr,logger:Jr,keepRaw:!0,decrypt:{crypto:gn,resolveChannelKey:An,resolveUserPrivateKey:jn,onDecryptRecovery:Fr,onDecryptError:e=>{const t=void 0!==Dn&&void 0===Dr?.saveDecryptRecovery&&2===e.encrypt&&"decrypt-failed"===e.reason;if(Xr("live",{...e,forceRefreshAttempted:t}),!t)return;const r=Dn.getCachedChannelKey(e.channelId)??void 0;Dn.getChannelKey(e.channelId,{staleKey:r}).catch(()=>{})}},isActive:()=>br&&Ts(),getConnectionEpoch:()=>As}),_s=He({isActive:()=>br,domainState:en,outbox:{onChatAck:e=>Es(e)},sendFrame:e=>Ss(e),getSelfId:()=>wr,emitter:yr,logger:Jr,keepRaw:!0}),Ns=Ve({domainState:en,sendFrame:e=>Ss(e),getSelfId:()=>wr,emitter:yr,logger:Jr,keepRaw:!0,decrypt:{crypto:gn,resolveChannelKey:An,resolveUserPrivateKey:jn,onDecryptRecovery:Fr}}),Ls=$e({getSelfId:()=>wr,sendFrame:e=>Ss(e),emitter:yr}),Ks=qe({emitter:yr,getSelfId:()=>wr}),Fs=ze({sendFrame:e=>Ss(e),emitter:yr,getSelfId:()=>wr,domainState:{reconcileDirectContactEstablishedNotice:en.reconcileDirectContactEstablishedNotice,removeConversation:e=>{"string"!=typeof e?("direct"===e.conversationType&&ho(e,"friend_relation_removed"),en.removeConversation(e)):en.removeConversation(e)}},resetDirectReadReceiptPreference:e=>qr.api.readReceipts.resetConversation({conversationType:"direct",conversationId:e}),onRelationshipChanged:cn.updateRelationshipFromEvent}),Us=We({sendFrame:e=>Ss(e),emitter:yr,domainState:{applyTransferStatusBySerialNumber:en.applyTransferStatusBySerialNumber}}),Bs=Je({getSelfId:()=>wr,sendFrame:e=>Ss(e),emitter:yr}),Gs=Qe({getSelfId:()=>wr,domainState:en,sendFrame:e=>Ss(e),emitter:yr,onRelationshipChanged:cn.updateRelationshipFromEvent}),Hs=Ye({sendFrame:e=>Ss(e),emitter:yr,getSelfId:()=>wr,isAuthenticated:()=>Ts(),domainState:en}),Vs=Xe({sendFrame:e=>Ss(e),emitter:yr,getSelfId:()=>wr,isAuthenticated:()=>Ts(),domainState:en}),$s=[...Hs.handlers,...Vs.commandHandlers],qs=ne({isActive:()=>br&&Ts(),getUserId:async()=>(await Ir.getLoginContext())?.userId??null,pull:(e,t,r)=>dr({http:Rr,userId:e,clientType:fr,deliveredMsgIds:t,signal:r}),onBatch:e=>{Cr.record("info","sdk","call","signal-offline-pull",()=>({data:{count:e.items.length,cmdIds:e.items.map(e=>`0x${e.cmdId.toString(16)}`)}})),0===e.items.length&&yr.emit({type:"notification",cmdId:0,name:"OFFLINE_SIGNAL"})},onItem:e=>{if(yr.emit({type:"notification",cmdId:e.cmdId,name:"OFFLINE_SIGNAL"}),!br||!Ts())return;const t=$s.find(t=>t.command===e.cmdId);t?.handler(e.cmdId,e.body)},onError:e=>yr.emit({type:"error",error:{scope:"sync",message:"音视频离线信令拉取失败",cause:e}})}),zs=yr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&qs.stop()}),Ws=Ze({domainState:en,sendFrame:e=>Ss(e),getSelfId:()=>wr,emitter:yr,logger:Jr,keepRaw:!0}),Js=it({domainState:ks,getSelfId:()=>wr,prefetchGroupKey:Ln,clearGroupKeys:e=>{Nn.remove(e),Oo({conversationType:"group",conversationId:e}),kn?.clearGroupKeys(e)},clearConversationTermination:e=>Ms(e)}),Qs=yr.subscribe(e=>{"message:received"!==e.type&&"message:updated"!==e.type||Js.handleMessage(e.message)}),Ys=ct({domainState:ks,getSelfId:()=>wr,prepareChannelKey:e=>{Cr.record("debug","sdk","crypto","channel-key-prepare-requested",()=>({conversation:{conversationType:"channel",conversationId:e},data:{cacheHit:void 0!==Dn&&null!==Dn.getCachedChannelKey(e)}})),void 0!==Dn&&Dn.getChannelKey(e).catch(()=>{})},clearChannelKey:e=>{const t=void 0!==Dn&&null!==Dn.getCachedChannelKey(e);Dn?.clearChannelKey(e),Cr.record("info","sdk","crypto","channel-key-cleared",()=>({conversation:{conversationType:"channel",conversationId:e},data:{cacheHit:t}}))},clearConversationTermination:e=>Ms(e),stopChannelHistory:e=>{const t=No(e);Lo(e),en.messageWindow.info().conversationId===e&&en.messageWindow.reset(),Cr.record("info","sdk","history","channel-history-invalidated",()=>({conversation:{conversationType:"channel",conversationId:e},data:{previousEpoch:t,nextEpoch:No(e)}}))}}),Xs=yr.subscribe(e=>{if("message:received"===e.type||"message:updated"===e.type){const t=e.message;"channel"===t.conversationType&&void 0!==t.body.system?.eventType&&Cr.record("info","sdk","conversation","channel-membership-event-observed",()=>({conversation:{conversationType:"channel",conversationId:t.conversationId},messageId:t.id,data:{eventType:t.body.system?.eventType,source:e.source??"live",targetSelf:t.body.system?.targetUserIds?.includes(wr)??!1,lifecycleEffects:!0===e.channelLifecycleEffects,stateBefore:en.getSession({conversationType:"channel",conversationId:t.conversationId})?.channelState??"missing"}})),Ys.handleMessage(e.message,{source:e.source??"live",applyLifecycleEffects:e.channelLifecycleEffects})}}),Zs=/* @__PURE__ */new Set(["channel_member_left","channel_member_removed","channel_member_joined","channel_member_invited","channel_owner_transferred","channel_admin_added","channel_admin_removed","channel_member_renamed"]),ea=/* @__PURE__ */new Set(["channel_member_left","channel_member_removed","channel_member_joined","channel_member_invited","channel_member_renamed"]),ta=yr.subscribe(e=>{if("message:received"!==e.type&&"message:updated"!==e.type)return;if("live"!==(e.source??"live")&&!0!==e.channelLifecycleEffects)return;const t=e.message,r=t.body.system?.eventType;"channel"===t.conversationType&&void 0!==r&&(Zs.has(r)&&Bo?.invalidateChannelMembers(t.conversationId).catch(e=>{yr.emit({type:"error",error:{scope:"storage",message:"CHANNEL 成员缓存失效失败",cause:e}})}),ea.has(r)&&Ho.invalidate(t.conversationId).catch(e=>{yr.emit({type:"error",error:{scope:"storage",message:"CHANNEL @候选缓存失效失败",cause:e}})}))}),ra=c({fetchMessagesById:fs,onSourceUnavailable:e=>Cr.record("warn","sdk","message","pinned-source-unavailable",()=>({conversation:{conversationType:"group",conversationId:e.conversationId},data:{messageId:e.messageId,localCleared:!0,serverCleanup:"requires-conditional-authorized-api"}})),...void 0===Er?{}:{coreClient:Er},domainState:en,emitter:yr}),oa=e({fetchMessagesById:Is,onSourceUnavailable:e=>Cr.record("warn","sdk","message","pinned-source-unavailable",()=>({conversation:{conversationType:"channel",conversationId:e.conversationId},data:{messageId:e.messageId,localCleared:!0,serverCleanup:"requires-conditional-authorized-api"}})),...void 0===Er?{}:{coreClient:Er},domainState:en,emitter:yr}),na=n({...void 0===Yo?{}:{joinApplications:Yo},http:Rr,clientType:fr,buildOfflineDecrypt:()=>_n("history"),onContentDecodeError:Zr,onReaction:ds,...void 0===Dn&&void 0===Rn?{}:{prepareKey:(e,t)=>On([e],{signal:t,priority:!0===lo?.hasForeground({conversationType:"channel",conversationId:e})?"foreground":"background"})}});Mo=async(e,t,r)=>{const{context:o}=await na.loadMessageContext(e,t,r);return o.messages};const sa=r({authProvider:Ir,emitter:yr,domainState:en,loadMessageContext:na.loadMessageContext,isActive:()=>br,getHistoryGeneration:()=>_o,getHistoryEpoch:No}),aa=G({domainState:en,isActive:()=>br,loadSummary:async({channelId:e,readCursor:t})=>{const r=await Ir.getLoginContext();if(null===r||!br||r.userId!==wr)throw new Error("CHANNEL 已读摘要:无有效登录上下文");return(await zt({http:Rr,userId:r.userId,clientType:fr,channels:[{channelId:e,readCursor:t}],keepRaw:!1})).find(t=>t.channelId===e)},report:(e,t,r)=>Cr.record("channel-read-summary-failed"===e?"warn":"debug","sdk","sync",e,()=>({conversation:t,data:r}))}),ia=At({domainState:en,updateReadIndex:async({channelId:e,readCursor:t})=>{const r=await Ir.getLoginContext();if(null===r||!br||r.userId!==wr)throw new Error("CHANNEL 已读 readIndexes/edit:无登录上下文");await pr({http:Rr,userId:r.userId,indexes:[{channelId:e,readCursor:t}]})},emitter:yr,logger:Jr,onReadCommitted:aa.request,onReadSettled:aa.settled,syncRead:{getSelfId:()=>wr,sendFrame:e=>Ss(e)}}),ca=et({getSelfId:()=>wr,applyRemoteRead:e=>ia.applyRemoteRead(e),emitter:yr,logger:Jr}),da=tt([lt({domainState:en,markGroupReadAll:async e=>{const t=await Ir.getLoginContext();if(null===t)throw new Error("群已读 read_all:无登录上下文");await lr({http:Rr,userId:t.userId,groupId:e})},emitter:yr,logger:Jr,isAuthenticated:()=>Ts(),syncRead:{getSelfId:()=>wr,sendFrame:e=>Ss(e)}}),ia,ut({domainState:en}),mt({domainState:en})]),pa=rt({getSelfId:()=>wr,sendFrame:e=>Ss(e),onListenerError:()=>yr.emit({type:"error",error:{scope:"unknown",message:"推送状态订阅者回调异常"}})}),la=ot({getSelfId:()=>wr,sendFrame:e=>Ss(e),onListenerError:()=>yr.emit({type:"error",error:{scope:"unknown",message:"页面状态订阅者回调异常"}})}),ua=yr.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&(pa.setAuthenticated(!1),la.setAuthenticated(!1))}),ma=nt({transport:Mr,authProvider:Ir,endpointProvider:vr.endpointProvider,emitter:yr,domainState:en,logger:Jr,decrypt:{crypto:gn,resolvePrivateKey:({msgType:e})=>1===e||1e3===e?Rn?.getCachedPrivateKey(wr)?.privateKey??null:null,onDecryptError:e=>Qr("live",e),onDecryptRecovery:Fr},encryptSend:void 0===Mn&&void 0===Dn?void 0:{crypto:gn,resolvePublicKey:e=>Mn?.getPeerPublicKey(e)??Promise.resolve(null),resolveGroupKey:Fn},media:void 0!==In?{transfer:In,recoveryPort:Sr?.port,retainFailedUploads:vr.uploadRecovery?.retainFailedUploads,shouldPersistUpload:(e,t)=>void 0!==Sr&&dt(t,!0===vr.media?.multipartTransfer&&!1!==vr.media.multipartUpload).multipart,waitUntilOnline:e=>Tr.wait(e),preview:Cn,onTransferError:e=>{Cr.record("error","core","media","media-transfer-failed",()=>({conversation:e.conversation,data:{stage:e.stage,kind:e.kind,messageId:e.messageId},error:{message:"媒体上传失败",data:e.cause}}))},onAlbumContentSize:e=>{Cr.record("rejected"===e.outcome?"error":"warn","core","media","rejected"===e.outcome?"media-album-content-rejected":"media-album-content-large",()=>({conversation:e.conversation,data:{messageId:e.messageId,itemCount:e.itemCount,...void 0===e.contentBytes?{}:{contentBytes:e.contentBytes}},...void 0===e.cause?{}:{error:{message:"媒体合集正文未通过发送前体积闸门",data:e.cause}}}))},...void 0===Br?{}:{assetCache:Br,onAssetCacheError:e=>{Cr.record("warn","core","media","media-asset-cache-put-failed",()=>({data:{operation:e.operation,kind:e.kind,messageId:e.messageId,byteLength:e.byteLength},error:{message:"发送媒体写入本机缓存失败",data:e.cause}}))}},...void 0===vr.media?.maxConcurrentUploads?{}:{maxConcurrentUploads:vr.media.maxConcurrentUploads}}:void 0,sendStrategies:ws,commandHandlers:[...la.commandHandlers,...pa.commandHandlers,...Fs,...Ks,...Us,...Bs,...Gs,...$s,...xs,...Ps,...Ws,...Os,...Ns,...Ls,...ca,..._s],readStrategies:da,canSendDirectReadReceipt:e=>{if(!qr.isDirectReadReceiptEnabled(e))return!1;const t=cn.peekRelationship(e);return void 0!==t&&"unknown"!==t?"friend"===t:void 0},recallStrategies:Cs,channelMessageDeletion:{resolveProfile:e=>Uo?.getProfile(e)??Promise.resolve(null),onPermissionDenied:e=>en.refreshConversationProfile(e,"channel")},editStrategies:bs,storage:Dr,onHeartbeat:()=>la.onHeartbeat(),onAuthenticated:()=>{la.setAuthenticated(!0),pa.setAuthenticated(!0);for(const e of no)e.resumeMedia();const e=mo;mo=!0,(e||"auto"===uo)&&ja().catch(()=>{})},isOnline:()=>"undefined"==typeof navigator?void 0:navigator.onLine},vr.connection);Vr=e=>ma.suppressDirectReadReceipts(e),$r=e=>ma.resumeDirectReadReceipts(e),Ss=ma.sendFrame,Ts=()=>"authenticated"===ma.state,Es=ma.onChatAck,ho=ma.terminateConversationSending,Rs=ma.markOutboxConversationTerminated,Ms=ma.clearOutboxConversationTerminated;const va=L({operations:{getPending:ma.getPendingOutbox,retry:ma.retryOutboxMessage,cancel:ma.cancelOutboxMessage},emitter:yr,isActive:()=>br}),ya=l({mediaCrypto:{executor:vn,generation:hr,isActive:()=>br},connection:ma,domainState:en,crypto:gn,settleEmptyGroupRead:async e=>{const t=Po.get(e.conversationId)??0,r=en.getSession(e);let o=void 0===r,n=r?.unreadCount??0,s=r?.mentionUnreadCount??0,a=n,i=s;const c=()=>{const r=en.getSession(e);if(!br||o||void 0===r||t!==(Po.get(e.conversationId)??0)||void 0!==r.groupState&&"active"!==r.groupState)throw new DOMException("群已读请求已失效","AbortError");return r},d=yr.subscribe(t=>{if("conversation"in t&&"group"===t.conversation?.conversationType&&t.conversation.conversationId===e.conversationId&&(("session:removed"===t.type||"conversation-history:cleared"===t.type||"session:updated"===t.type&&void 0!==t.session.groupState&&"active"!==t.session.groupState)&&(o=!0),"read:updated"===t.type||"session:updated"===t.type)){const t=en.getReadState(e);if(void 0===t)return;const r=t.mentionUnreadCount??0;a=Math.max(0,a-Math.max(0,n-t.unreadCount)),i=Math.max(0,i-Math.max(0,s-r)),n=t.unreadCount,s=r}});try{c();const t=await Ir.getLoginContext();if(c(),null===t||t.userId!==wr)throw new Error("群已读 read_all:登录上下文已失效");await lr({http:Rr,userId:t.userId,groupId:e.conversationId});const r=c(),o=en.getReadState(e),n=Math.max(0,(o?.unreadCount??r.unreadCount)-a),s=Math.max(0,(o?.mentionUnreadCount??r.mentionUnreadCount??0)-i);en.setReadState({...o??{...e,readCursor:r.readCursor??"",unreadCount:r.unreadCount},mentionUnreadCount:s}),en.applyServerUnread(e,n)}finally{d()}},...void 0===In?{}:{mediaTransfer:In},prepareDirectReadReceipt:async e=>{try{await cn.ensureRelationship(e)}catch(t){yr.emit({type:"error",error:{scope:"http",message:"Direct 已读已在本地提交,但联系人关系查询失败,未发送对端可见回执",cause:{peerId:e,error:t}}})}}}),ga=O({recoveryPort:Sr?.port,connection:ma,domainState:en,emitter:yr,isActive:()=>br,preparePreview:bn,prepareVideoPoster:Sn,prepareImageThumbnail:Tn,prepareImageDisplay:En,onLocalPreviewError:({kind:e,byteLength:t,cause:r})=>{Cr.record("warn","sdk","media","local-preview-failed",()=>({generation:hr,data:{kind:e,byteLength:t},error:{message:r instanceof Error?r.message:String(r)}}))},...void 0===Br?{}:{assetCache:Br,onAssetCacheEvent:e=>{Cr.record("failed"===e.outcome?"warn":"debug","sdk","media",`media-asset-cache-${e.operation}-${e.outcome}`,()=>({data:{operation:e.operation,outcome:e.outcome,kind:e.kind,messageId:e.messageId,...void 0===e.byteLength?{}:{byteLength:e.byteLength}},...void 0===e.cause?{}:{error:{message:"媒体资产缓存操作失败",data:e.cause}}}))}},...void 0===In?{}:{loaders:{loadImage:ya.operations.loadImage,loadVideo:ya.operations.loadVideo,loadVoice:ya.operations.loadVoice,loadFile:ya.operations.loadFile}}}),ha=Q({isActive:()=>br&&"ready"===to&&""!==wr,maintain:async()=>{ga.prune(),ma.expireRetainedUploads();const e=(await Promise.allSettled([Ur?Br?.prune?.():void 0,Sr?.prune()])).find(e=>"rejected"===e.status);if("rejected"===e?.status)throw e.reason},onError:e=>Cr.record("warn","sdk","media","media-cache-maintenance-failed",()=>({error:{message:"媒体过期缓存清理失败",data:e}}))});on=()=>{ma.invalidateMediaAssetCacheWrites(),ga.clearCache()},void 0===vr.transport&&"undefined"!=typeof window&&(ma.setConnectionAllowed(!1),so=st({onChange:(e,t)=>{if(!e){if(go=!0,ma.setConnectionAllowed(!1),!br)return co?.then(()=>{});br=!1,qs.stop(),Or.clear(),Kn(),Co.abort(),wo.dispose(),Ro.dispose(),Eo.dispose(),lo?.dispose(),vo=!1,yo+=1,fa.stop();return La({localData:"preserve"},{requireStorageClose:!0,preserveUploadRecovery:!0,notifyReplacement:"replaced"===t}).then(()=>{})}},onError:e=>{io=e,yr.emit({type:"error",error:{scope:"transport",message:"IM 页面连接协调不可用,请使用支持 Web Locks 的安全浏览器环境",cause:e}})}}));const fa=be({onOnline:()=>{Tr.setOnline(!0),ma.notifyOnline()},onOffline:()=>{Tr.setOnline(!1),ma.notifyOffline()},onVisible:()=>{ha.run(),ma.notifyVisible();for(const e of no)e.resumeMedia()},onPageHide:()=>{vo&&ma.suspendForPageLifecycle()},onPageShow:()=>{if(ha.run(),vo){ma.resumeFromPageLifecycle(),ma.notifyVisible();for(const e of no)e.resumeMedia()}}},vr.network);const Ia=yr.subscribe(e=>{br&&"auth:invalid"===e.type&&(qs.stop(),vo=!1,yo+=1,go=void 0!==so,so?.terminate(),fa.stop())});async function wa(e,t={}){const r=await(Rn?.getUserPrivateKey(e,{priority:t.priority??"background",signal:t.signal??Co.signal}))??null;return{crypto:gn,resolvePrivateKey:({msgType:e})=>1===e||1e3===e?r?.privateKey??null:null,onDecryptError:t=>Qr("offline",t,e),onDecryptRecovery:Fr}}function Ca(e,t,r){const o=void 0===t?en.getMessages().filter(t=>t.conversationType===e):en.getMessagesByConversation(t).filter(e=>void 0===r||r.includes(e.id)),n=new Map(o.map(e=>[Nr({conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id}),e])),s=/* @__PURE__ */new Set,a=yr.subscribe(o=>{if(("message:received"===o.type||"message:updated"===o.type)&&o.conversation.conversationType===e&&(void 0===t||o.conversation.conversationId===t.conversationId&&(void 0===r||r.includes(o.message.id)))){const e=Nr({conversation:o.conversation,messageId:o.message.id}),t=n.get(e);"live"!==o.source||void 0!==t&&Ut(t,o.message)||s.add(e),n.set(e,o.message)}});return{stop:()=>{a(),n.clear(),s.clear()},acceptsRecovery:e=>!s.has(Nr(e)),messages:e=>e.map(e=>{const t={conversationType:e.conversationType,conversationId:e.conversationId};return s.has(Nr({conversation:t,messageId:e.id}))?en.getConversationMessage(t,e.id)??e:e})}}function ba(e,t){const r=wr,o=new Map(Ao),n=/* @__PURE__ */new Map,s=e=>{if(Mt(Co.signal),!br||r!==wr)throw new DOMException("DIRECT 计算所属账号已失效","AbortError");void 0!==e&&n.set(Ce(e),e);for(const[e,t]of n)if((o.get(e)?.version??0)!==jo(t))throw void 0!==Ao.get(e)?.reason?Ao.get(e).reason:new DOMException("DIRECT 计算所属会话已清理","AbortError");t?.()};return{publish(e,t){s();const r=t();return s(),r},executor:vn,generation:hr,operationId:"direct-batch:"+ ++ts,priority:e,signal:Co.signal,assertCurrent:s,yieldToEventLoop:Bt}}function Sa(e,t,r){const o=wr,n=new Map(Ao),s=/* @__PURE__ */new Map,a=e=>{if(Mt(Co.signal),Mt(t),!br||wr!==o)throw new DOMException("GROUP 计算所属账号已失效","AbortError");void 0!==e&&s.set(Ce(e),e);for(const[e,t]of s)if((n.get(e)?.version??0)!==jo(t))throw void 0!==Ao.get(e)?.reason?Ao.get(e).reason:new DOMException("GROUP 计算所属群密钥、权限或历史已失效","AbortError");r?.()};return{publish(e,t){a();const r=e.filter(e=>{if("group"!==e.conversationType||void 0===e.body.system)return!1;const t=Gt(e.body.system,wr);return null!==t&&"active"!==t.state}).map(e=>({conversationType:"group",conversationId:e.conversationId})),o=t();for(const e of r){const t=Ce(e);void 0===Ao.get(t)?.reason&&n.set(t,{version:jo(e)})}return a(),o},executor:{async decryptBatch(t){const r=[...s.values()];ms.set(t.operationId,r);try{const o="foreground"===e||r.some(e=>!0===lo?.hasForeground(e))?"foreground":"background";return await vn.decryptBatch({...t,priority:o})}finally{ms.delete(t.operationId)}}},generation:hr,operationId:"group-batch:"+ ++ts,priority:e,signal:t??Co.signal,assertCurrent:a,yieldToEventLoop:Bt}}async function Ta(e,t,r,o,n){const s=[];let a;try{0===e.length&&0===t.length&&n([],()=>{s.push(Promise.resolve(en.commitReceivedMessages([],"offline")))});for(const e of t)n([],()=>{s.push(Promise.resolve(en.commitReceivedMessages([],"offline",void 0,{events:[e],apply:e=>Ds.ingest(e,"offline")})))});for(const t of e){const e=en.prepareOfflineMessageUpdate(t,o);("boolean"==typeof e?e:await e)&&n([t],()=>{s.push(Promise.resolve(en.commitReceivedMessages([t],"offline")))})}for(const e of r)n([],()=>{Fr(e);const t=xr.get(Nr(e));void 0!==t&&s.push(t)})}catch(e){a={cause:e}}const i=await Promise.allSettled(s);if(void 0!==a)throw a.cause;const c=i.find(e=>"rejected"===e.status);if("rejected"===c?.status)throw c.reason;o()}function Ea(e,t){return{endpoint:e,pullBatch:async({deliveredMsgInfos:r,limit:o})=>{const n=Ca("direct");try{const s=[],a=wr,i=ba("background");i.assertCurrent?.();const c=await Ir.getLoginContext();if(null===c)throw new Error(`sync(${e}): 无登录上下文(authProvider.getLoginContext 返回 null)`);if(i.assertCurrent?.(),""!==a&&c.userId!==a)throw new DOMException("DIRECT 离线同步的登录账号已改变","AbortError");const d=await wa(c.userId);i.assertCurrent?.();const p=[],l=await t({http:Rr,userId:c.userId,clientType:fr,decryptDeps:{...d,onDecryptRecovery:e=>s.push(e)},asyncDecrypt:i,deliveredMsgInfos:r,...void 0===o?{}:{limit:o},onReaction:e=>p.push(e)});return i.assertCurrent?.(),{...l,reactions:p,commit:async()=>{try{await Ta(n.messages(l.messages).sort(Lt),p,s.filter(n.acceptsRecovery),()=>i.assertCurrent?.(),i.publish)}finally{n.stop()}}}}catch(e){throw n.stop(),e}}}}async function Ra(e,t){const r=[...new Map(e.map(e=>[Ce(e),e])).values()],o=[];let n=0;if(await(async()=>{for(;n<r.length;){if(!br)return;const e=r[n++],s="group"===e.conversationType?{conversationType:"group",conversationId:e.conversationId}:void 0,a=void 0!==s&&void 0!==t&&t.groupIds.has(e.conversationId)&&en.hasRecoverableConversationDeletion(s)?{ref:s,userId:t.userId}:void 0;if(a||void 0!==en.getSession(e)&&void 0!==us(e))try{if(await wo.waitForBackground(Co.signal),!br)return;if(a&&await Ma(a.ref,a.userId))continue;if(!br||void 0===en.getSession(e)||void 0===us(e))continue;lo.invalidate(e,{preserveForeground:!0}),await po({conversation:e,oldestLoaded:void 0,intent:"establish-latest",limit:z})}catch(t){if(a){o.push(t);continue}if(!br||void 0===en.getSession(e)||void 0===us(e))continue;yr.emit({type:"error",error:{scope:"sync",message:"会话最新消息同步失败",cause:t}}),Cr.record("warn","sdk","sync","session-latest-summary-failed",()=>({conversation:e,error:{message:"会话最新消息同步失败",data:t}}))}}})(),o.length>0)throw new AggregateError(o,"已删除群会话恢复失败")}async function Ma(e,t){if(!en.hasRecoverableConversationDeletion(e))return!1;const r=Sa("background");r.assertCurrent?.(e);const o=Ca("group",e);try{const n=[],s=[],a=await _t({http:Rr,userId:t,clientType:fr,groupId:e.conversationId,baseTime:Date.now(),direct:1,limit:z,signal:Co.signal,asyncDecrypt:r,decryptDeps:{...Gn("history"),onDecryptRecovery:e=>n.push(e)},prepareKeys:e=>Bn(e,{priority:"background",signal:Co.signal}),onReaction:e=>s.push(e)});r.assertCurrent?.(e);const i=o.messages(a.messages).sort(Lt);return await Ta(i,s,n.filter(o.acceptsRecovery),()=>r.assertCurrent?.(e),r.publish),void 0!==en.getSession(e)}finally{o.stop()}}async function ka(){const e=Wr("sync");Cr.record("info","sdk","sync","channel-sync-start",()=>({operationId:e,data:{clientTypeHeader:fr,sessionsClientTypeBody:"absent",offlineClientTypeBody:fr}}));try{await async function(e){const t=_o,r=new Map(xo),n=e=>br&&t===_o&&(r.get(e)??0)===No(e);if(void 0===Uo)return void Cr.record("info","sdk","sync","channel-sync-skipped",()=>({operationId:e,data:{reason:"profile-unavailable"}}));const s=await Ir.getLoginContext();if(null===s)return void Cr.record("info","sdk","sync","channel-sync-skipped",()=>({operationId:e,data:{reason:"auth-unavailable"}}));const a=(await Uo.listProfiles({forceRefresh:!0})).filter(e=>n(e.id));if(!br)return;if(0===a.length)return void Cr.record("info","sdk","sync","channel-sync-complete",()=>({operationId:e,data:{profileCount:0,sessionCount:0,offlineMessageCount:0}}));const i=new Map(a.map(e=>[e.id,e]));for(const e of a){if(eo(e.channelState)){Dn?.clearChannelKey(e.id),ks.removeConversationForMembershipTermination({conversationType:"channel",conversationId:e.id},`channel_${e.channelState}`);continue}const t=e.permissions.sendMessages?void 0:`channel_${e.channelState}`;en.setChannelRestriction(e.id,e.channelState,t,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}}),en.updateConversationProfile({conversationType:"channel",conversationId:e.id},{title:e.name,avatar:e.avatar}),void 0!==e.muted&&en.setMuted({conversationType:"channel",conversationId:e.id},e.muted)}const c=new Map(a.map(e=>{const t={conversationType:"channel",conversationId:e.id},r=en.getReadState(t),o=en.getSession(t);return[e.id,{revision:en.getChannelReadRevision(t),pending:en.hasPendingChannelRead(t),readCursor:r?.readCursor??o?.readCursor??"",unreadCount:o?.unreadCount??r?.unreadCount??0,mentionUnreadCount:o?.mentionUnreadCount??r?.mentionUnreadCount??0}]})),d=a.map(e=>({channelId:e.id,readCursor:c.get(e.id).readCursor}));Cr.record("debug","sdk","sync","channel-sessions-request",()=>({operationId:e,data:{channelCount:d.length,channelsWithReadCursor:d.filter(e=>""!==e.readCursor).length,clientTypeHeader:fr,clientTypeBody:fr}}));const p=await zt({http:Rr,userId:s.userId,clientType:fr,channels:d,operationId:e,decryptDeps:_n("offline"),prepareKeys:e=>On(e.filter(e=>{const t=i.get(e)?.channelState;return void 0===t||!o(t)})),onContentDecodeError:Zr,onReaction:ds});if(!br)return;Cr.record("debug","sdk","sync","channel-sessions-response",()=>({operationId:e,data:{sessionCount:p.length,lastMessageCount:p.filter(e=>void 0!==e.last).length,decryptFailedLastCount:p.filter(e=>!0===e.last?.encryption.decryptFailed).length,unknownContentLastCount:p.filter(e=>"unknown"===e.last?.contentType&&!0!==e.last.encryption.decryptFailed).length}}));const l=new Set(p.filter(e=>{const t=c.get(e.channelId),r={conversationType:"channel",conversationId:e.channelId},o=en.getReadState(r),n=en.getSession(r);return void 0===t||t.pending||en.hasPendingChannelRead(r)||en.getChannelReadRevision(r)!==t.revision||(o?.readCursor??n?.readCursor??"")!==t.readCursor||(n?.unreadCount??o?.unreadCount??0)!==t.unreadCount||(n?.mentionUnreadCount??o?.mentionUnreadCount??0)!==t.mentionUnreadCount}).map(e=>e.channelId)),u=p.filter(e=>n(e.channelId)&&void 0!==en.getConversationContext({conversationType:"channel",conversationId:e.channelId})).map(e=>{const t=i.get(e.channelId),r=t?.channelState,n=void 0!==r&&o(r)?r:o(e.channelState)?e.channelState:r??e.channelState,s="active"===n?void 0:n===e.channelState?e.sendDisabledReason:`channel_${n}`;return{...e,channelState:n,sendDisabledReason:s}});for(const e of u){const t=i.get(e.channelId);en.setChannelRestriction(e.channelId,e.channelState,e.sendDisabledReason,void 0===t?void 0:{permissions:t.permissions,...void 0===t.accessSnapshot?{}:{snapshot:t.accessSnapshot}}),void 0!==t&&(en.updateConversationProfile({conversationType:"channel",conversationId:e.channelId},{title:t.name,avatar:t.avatar}),void 0!==t.muted&&en.setMuted({conversationType:"channel",conversationId:e.channelId},t.muted)),l.has(e.channelId)||en.applyChannelReadSummary({conversationType:"channel",conversationId:e.channelId},e),o(e.channelState)&&Dn?.clearChannelKey(e.channelId)}const m=e=>{const t=en.getConversationContext({conversationType:"channel",conversationId:e});return n(e)&&void 0!==t&&(void 0===t.channelState||!o(t.channelState))},v=(e,r=!0)=>{if(!br||t!==_o)return[];const o=e.filter(e=>m(e.conversationId));return o.length>0&&en.upsertMessages(o,"offline",{applyChannelLifecycleEffects:r}),o},y=async(e,t,r=[],o=[],n=!0)=>{const s=()=>m(e.conversationId),a=()=>{if(!s())throw new DOMException("社群离线提交所属会话已失效","AbortError")};if(!s())return!1;const i=Ca("channel",e);try{const c=[];for(const e of[...t].sort(Lt)){const t=en.prepareOfflineMessageUpdate(e,a);("boolean"==typeof t?t:await t)&&c.push(e)}a();const d=async()=>{const e=o.filter(i.acceptsRecovery);if(e.length>0&&void 0===Dr?.saveDecryptRecovery)throw new Error("CHANNEL 同步不能保存解密恢复记录");for(const t of e)await Dr.saveDecryptRecovery(t)};if(!0===Dr?.supportsChannelSyncCheckpoint)return await en.commitChannelSyncPage([e],()=>{v(i.messages(c),n);for(const e of r)s()&&ds(e)},s,d);await en.commitReceivedMessages(i.messages(c),"offline",{applyChannelLifecycleEffects:n},{events:r,apply:e=>Ds.ingest(e,"offline")});for(const e of o.filter(i.acceptsRecovery))a(),Fr(e),await xr.get(Nr(e));return s()}finally{i.stop()}},g=[],h=/* @__PURE__ */new Set;for(const e of u)if(void 0!==e.last)try{await y({conversationType:"channel",conversationId:e.channelId},[e.last])}catch(t){g.push(t),h.add(e.channelId)}const f=/* @__PURE__ */new Set;for(const t of u){const r={conversationType:"channel",conversationId:t.channelId};if(void 0!==t.last||t.unreadCount<=0||""!==t.readCursor||o(t.channelState)||!en.hasRecoverableConversationDeletion(r,{includeRestored:!0}))continue;const n=Ca("channel",r);try{if(await wo.waitForBackground(Co.signal),!m(t.channelId))continue;const o=[],a=[],i=await Wt({http:Rr,userId:s.userId,clientType:fr,channelId:t.channelId,count:ur,operationId:e,signal:Co.signal,decryptDeps:{..._n("history"),onDecryptRecovery:e=>a.push(e)},prepareKey:e=>On([e],{signal:Co.signal,priority:"background"}),onContentDecodeError:Zr,onReaction:e=>o.push(e)});await y(r,n.messages(i.messages),o,a.filter(n.acceptsRecovery),!1)&&f.add(t.channelId)}catch(e){g.push(e),h.add(t.channelId)}finally{n.stop()}}await Ra(u.filter(e=>void 0===e.last&&!o(e.channelState)&&!f.has(e.channelId)&&!h.has(e.channelId)).map(e=>({conversationType:"channel",conversationId:e.channelId})));const I=u.filter(e=>!h.has(e.channelId)&&!l.has(e.channelId)&&!o(e.channelState)&&e.unreadCount>0&&""!==e.readCursor);Cr.record("debug","sdk","sync","channel-offline-plan",()=>{const t={staleRead:0,historyBlocked:0,zeroUnread:0,emptyReadCursor:0};for(const e of u)l.has(e.channelId)?t.staleRead+=1:o(e.channelState)?t.historyBlocked+=1:e.unreadCount<=0?t.zeroUnread+=1:""===e.readCursor&&(t.emptyReadCursor+=1);return{operationId:e,data:{acceptedSessionCount:u.length,eligibleChannelCount:I.length,staleReadSkippedCount:t.staleRead,historyBlockedSkippedCount:t.historyBlocked,zeroUnreadSkippedCount:t.zeroUnread,emptyReadCursorSkippedCount:t.emptyReadCursor,direction:0,contain:0,count:ur}}});const w=[],C=new Map(I.map(e=>[e.channelId,e.readCursor])),b=[];for(const t of I){const r={conversationType:"channel",conversationId:t.channelId},o=!0!==Dr?.supportsChannelSyncCheckpoint?void 0:Yt(await Dr.getMeta(Xt(r)),r);if(!m(t.channelId))continue;const n=o?.startIndex===t.readCursor;b.push({channelId:t.channelId,baseIndex:n?o.baseIndex:t.readCursor}),Cr.record("debug","sdk","sync","channel-offline-resume",()=>({operationId:e,conversation:r,data:{resumed:n}}))}const S=[],T=[];let E;if(await Jt({http:Rr,userId:s.userId,clientType:fr,operationId:e,pulls:b,messageCount:ur,signal:Co.signal,beforePage:()=>wo.waitForBackground(Co.signal),isChannelCurrent:m,yieldToEventLoop:Bt,decryptDeps:{..._n("offline"),onDecryptRecovery:e=>T.push(e)},prepareKeys:e=>On(e,{recoverExistingMessages:!1}),onContentDecodeError:Zr,onReaction:e=>S.push(e),onPage:async(e,t)=>{const r=S.splice(0),o=T.splice(0),n=(async()=>{for(const n of t.pulls){const s={conversationType:"channel",conversationId:n.channelId},a=()=>m(n.channelId);if(!a())continue;const i=o.filter(e=>e.conversation.conversationId===n.channelId),c=e.filter(e=>e.conversationId===n.channelId),d=await y(s,c,r.filter(e=>e.conversation.conversationId===n.channelId),i);if(d&&w.push(...c),!0!==Dr?.supportsChannelSyncCheckpoint)continue;if(!d||!a())continue;const p=t.nextBaseIndexes[n.channelId];void 0!==p&&await en.saveChannelSyncCheckpoint({version:1,conversation:s,startIndex:C.get(n.channelId),baseIndex:p},a);for(const e of i)a()&&as(e).catch(e=>yr.emit({type:"error",error:{scope:"storage",message:"CHANNEL 解密恢复失败",cause:e}}))}})();bo.add(n);try{await n}finally{bo.delete(n)}}}).catch(e=>{E={cause:e}}),!br)return;const R=u.flatMap(e=>{const t=e.last;if(void 0===t||Wn(t))return[];const r=t.extensions?.historyCursor;return[{summary:e,last:t,historyCursor:"string"==typeof r?r.trim():""}]}),M=(e,t)=>`${e}:${t}`,k=/* @__PURE__ */new Map,D=/* @__PURE__ */new Set;for(const{summary:e,last:t}of R){const r=en.getConversationMessage({conversationType:"channel",conversationId:e.channelId},t.id);if(void 0===r||!Wn(r))continue;const o=M(e.channelId,t.id);k.set(o,r),D.add(o)}for(const e of w)Wn(e)&&k.set(M(e.conversationId,e.id),e);const x=R.filter(({summary:e,last:t,historyCursor:r})=>!(""===r||l.has(e.channelId)||o(e.channelState)||k.has(M(t.conversationId,t.id))||zn.has(M(t.conversationId,t.id)))),P=R.filter(({summary:e,last:t})=>!l.has(e.channelId)&&!o(e.channelState)&&!D.has(M(t.conversationId,t.id))&&k.has(M(t.conversationId,t.id))).length;Cr.record("debug","sdk","sync","channel-session-last-recovery-plan",()=>({operationId:e,data:{unusableLastCount:R.length,decryptFailedLastCount:R.filter(({last:e})=>!0===e.encryption.decryptFailed).length,unknownContentLastCount:R.filter(({last:e})=>"unknown"===e.contentType&&!0!==e.encryption.decryptFailed).length,localRecoveredCount:D.size,offlineRecoveredCount:P,contextRecoveryCount:x.length,staleReadSkippedCount:R.filter(e=>l.has(e.summary.channelId)).length,historyBlockedSkippedCount:R.filter(e=>o(e.summary.channelState)).length,missingHistoryCursorCount:R.filter(e=>""===e.historyCursor).length}}));const A=async({summary:t,last:r,historyCursor:n})=>{try{if(await wo.waitForBackground(Co.signal),!m(t.channelId))return;const{message:a}=await na.loadMessageContext(t.channelId,n,s.userId,Co.signal),i=en.getConversationContext({conversationType:"channel",conversationId:t.channelId});if(!br||"channel"!==i?.type||void 0!==i.channelState&&o(i.channelState))return;if("channel"!==a.conversationType||a.conversationId!==t.channelId||a.id!==r.id)throw new Error(`CHANNEL sessions.last 精确恢复结果不匹配(channelId=${t.channelId}, messageId=${r.id})`);if(!Wn(a)){if("unknown"===a.contentType&&!0!==a.encryption.decryptFailed)return zn.add(M(a.conversationId,a.id)),void Cr.record("info","sdk","sync","channel-session-last-unknown-confirmed",()=>({operationId:e,conversation:{conversationType:"channel",conversationId:t.channelId},data:{messageId:r.id,reason:a.body.unknown?.reason}}));throw new Error(`CHANNEL sessions.last 精确恢复未取得可用正文(channelId=${t.channelId}, messageId=${r.id})`)}return a}catch(o){return void Cr.record("warn","sdk","sync","channel-session-last-recovery-failed",()=>({operationId:e,conversation:{conversationType:"channel",conversationId:t.channelId},error:{message:"CHANNEL sessions.last 精确恢复失败",data:o},data:{messageId:r.id}}))}},j=[];for(const e of x){if(!br)break;j.push(await A(e))}for(const e of j)void 0!==e&&k.set(M(e.conversationId,e.id),e);const O=j.filter(e=>{if(void 0===e)return!1;const t=en.getConversationMessage({conversationType:"channel",conversationId:e.conversationId},e.id);return void 0===t||!Wn(t)});if(v(O),1===g.length&&void 0===E)throw g[0];if(g.length>0)throw new AggregateError([...g,...void 0===E?[]:[E.cause]],"社群摘要或离线恢复保存失败");if(void 0!==E)throw E.cause;Cr.record("info","sdk","sync","channel-sync-complete",()=>({operationId:e,data:{profileCount:a.length,terminalProfileCount:a.filter(e=>eo(e.channelState)).length,sessionCount:p.length,acceptedSessionCount:u.length,sessionLastCount:u.filter(e=>void 0!==e.last).length,recoveredSessionLastCount:R.filter(({last:e})=>k.has(M(e.conversationId,e.id))).length,offlineMessageCount:w.length}}))}(e)}catch(t){throw Cr.record("error","sdk","sync","channel-sync-failed",()=>({operationId:e,error:{message:"CHANNEL 同步失败",data:t}})),t}}let Da=null,xa=!1;const Pa=Ft({commitBatch:async function(e,t=[]){if(!br)throw new Error("离线消息提交已取消");await en.commitReceivedMessages(e,"offline",void 0,{events:t??[],apply:e=>Ds.ingest(e,"offline")});const r=e.flatMap(e=>{const t=xr.get(Nr({conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id}));return void 0===t?[]:[t]});if(await Promise.all(r),!br)throw new Error("离线消息提交已取消")},pullers:[Ea("chat",Tt),Ea("owner_chat",Et),{endpoint:"group",pullBatch:async({deliveredMsgInfos:e,limit:t})=>{const r=wr,o=Sa("background"),n=Ca("group");try{o.assertCurrent?.();const s=await Ir.getLoginContext();if(null===s)throw new Error("sync(group): 无登录上下文(authProvider.getLoginContext 返回 null)");if(o.assertCurrent?.(),""!==r&&s.userId!==r)throw new DOMException("GROUP 离线同步的登录账号已改变","AbortError");const a=[],i=[],c=await Nt({http:Rr,userId:s.userId,clientType:fr,decryptDeps:{...Gn("offline"),onDecryptRecovery:e=>i.push(e)},asyncDecrypt:o,prepareKeys:Bn,deliveredMsgInfos:e,...void 0===t?{}:{limit:t},onReaction:e=>a.push(e)});return o.assertCurrent?.(),{...c,reactions:a,commit:async()=>{try{await Ta(n.messages(c.messages).sort(Lt),a,i.filter(n.acceptsRecovery),()=>o.assertCurrent?.(),o.publish)}finally{n.stop()}}}}catch(e){throw n.stop(),e}}}],domainState:en,emitter:yr,logger:Jr,yieldToEventLoop:Bt});const Aa=H({domainState:en,storage:Dr,getSelfId:()=>wr,assertCurrent:()=>{if(!br||Co.signal.aborted)throw new DOMException("客服历史恢复所属账号已失效","AbortError")},hasPendingSend:e=>ma.getPendingOutbox().some(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId),fetch:async e=>{const t=wr,r=()=>{if(!br||Co.signal.aborted||wr!==t)throw new DOMException("客服历史查询所属账号已失效","AbortError")},o=await wa(t);r();const n=await xt({http:Rr,userId:t,clientType:fr,messageIds:e,decryptDeps:o,asyncDecrypt:ba("background",r)});if(r(),200!==n.code)throw new Error(`客服历史原文查询失败:${n.code}`);return n.messages}});async function ja(){if(void 0!==so&&(!so.owned||go))throw new Error("当前页面未持有 IM 连接,不能同步消息");const e=Eo.begin(),t=Ro.begin(),r=async function(){const e=wr,t=Sa("background"),r=Ca("group");try{t.assertCurrent?.();const o=await Ir.getLoginContext();if(null===o)return;if(t.assertCurrent?.(),""!==e&&o.userId!==e)throw new DOMException("GROUP 会话同步的登录账号已改变","AbortError");const n=[],s=[],a=await Ot({http:Rr,userId:o.userId,clientType:fr,decryptDeps:{...Gn("offline"),onDecryptRecovery:e=>s.push(e)},asyncDecrypt:t,prepareKeys:Bn,onReaction:e=>n.push(e)});t.assertCurrent?.();for(const e of a.unreads)t.assertCurrent?.(),en.applyServerUnread({conversationType:"group",conversationId:e.groupId},e.unreadCount),Ln(e.groupId);await Ta(r.messages(a.messages).sort(Lt),n,s.filter(r.acceptsRecovery),()=>t.assertCurrent?.(),t.publish),t.assertCurrent?.(),await Ra(a.unreads.map(e=>({conversationType:"group",conversationId:e.groupId})),{userId:o.userId,groupIds:new Set(a.unreads.filter(e=>e.unreadCount>0).map(e=>e.groupId))}),t.assertCurrent?.(),Kt(a)}finally{r.stop()}}().catch(e=>{throw yr.emit({type:"error",error:{scope:"sync",message:"群会话摘要同步失败",cause:e}}),e}),o=(null!==Da?(xa=!0,Da):(Da=(async()=>{let e;do{xa=!1,e=void 0;try{await ka()}catch(t){e=t}}while(xa);if(void 0!==e)throw e})().finally(()=>{Da=null}),Da)).catch(e=>{throw yr.emit({type:"error",error:{scope:"sync",message:"CHANNEL 会话与离线消息同步失败",cause:e}}),e});So+=1;try{const e=Aa.run().catch(e=>{throw yr.emit({type:"error",error:{scope:"sync",message:"旧客服消息恢复失败,已保留未恢复的本机记录,可刷新重试",cause:e}}),e}),t=(await Promise.allSettled([Pa.sync({rejectOnFailure:!0}),r,o,e])).find(e=>"rejected"===e.status);if("rejected"===t?.status)throw t.reason}finally{t(),e(),So-=1,To="authenticated"===ma.state,lo?.notifySchedulingChanged()}}async function Oa(){if("ready"===to)return;to="preparing";const e=await Ir.getLoginContext();if(br){if(null!==e){if(await async function(e){if(void 0!==so&&br){if(!go){ao??(ao=so.start(gr.forAccount(e).name("ephemeral","connection",`client-${fr}`)));const t=await ao;if(!br)return;if(br&&!go&&t&&so.owned)return void ma.setConnectionAllowed(!0)}if(ma.setConnectionAllowed(!1),await ma.connect(),void 0!==io)throw Object.assign(new Error("Browser IM coordination is unavailable"),{code:"IM_CONNECTION_OWNERSHIP_UNAVAILABLE",cause:io});throw Object.assign(new Error("Chat is active in another page; reload this page to continue here"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"})}}(e.userId),!br)return;wr=e.userId;try{await(Sr?.prepare(e.userId))}catch{yr.emit({type:"error",error:{scope:"storage",message:"上传恢复记录不可用,本次上传仅支持当前页面内恢复"}})}if(!br)return;if(mn.start(),void 0!==Rn&&Rn.getUserPrivateKey(e.userId,{priority:"foreground"}).catch(fn),void 0!==Dr)try{if(await Dr.open({namespace:e.userId}),Ur=!0,!br)return;try{await qr.hydrate()}catch(e){yr.emit({type:"error",error:{scope:"storage",message:"IM 设置初始化失败,已暂停发送 direct 已读回执",cause:e}})}if(!br)return;if(await en.hydrate(()=>br),!br)return;for(const e of en.getSessions())""===e.title&&"supergroup"!==e.type&&en.refreshConversationProfile(e.id,e.type);if(await ma.hydrateOutbox(()=>br),!br)return}catch(e){yr.emit({type:"error",error:{scope:"storage",message:"本地存储初始化失败",cause:e}})}if(!br)return;if(void 0!==kn)for(const e of en.getSessions())"group"===e.type&&Ln(e.id)}br&&(to="ready",""!==wr&&ha.start())}}function _a(){if(go)return Promise.reject(Object.assign(new Error("Chat is active in another page"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"}));if("ready"===to)return Promise.resolve();if(null!==fo)return fo;const e=Date.now();return Cr.record("info","sdk","session","prepare-start"),fo=Oa().then(()=>Cr.record("info","sdk","session","prepare-complete",()=>({durationMs:Date.now()-e}))).catch(t=>{throw Cr.record("error","sdk","session","prepare-failed",()=>({durationMs:Date.now()-e,error:{message:"IM prepare 失败",data:t}})),t}).finally(()=>{fo=null}),fo}function Na(e){Cr.record("info","sdk","connection","disconnect",()=>({data:{reason:e}})),vo=!1,yo+=1,qs.stop(),ma.disconnect(e),fa.stop()}function La(e,t={}){if(void 0!==co)return co;let r,o;return co=new Promise((e,t)=>{r=e,o=t}),async function(e,t){const r=Date.now();let o;Cr.record("info","sdk","session","teardown-start",()=>({data:{localData:e?.localData??"preserve",pendingMessages:e?.pendingMessages??"fail"}})),br=!1,Or.clear(),Kn(),Co.abort(),wo.dispose(),Ro.dispose(),Eo.dispose(),aa.dispose(),t.notifyReplacement&&yr.emit({type:"session:replaced"});const n=ha.dispose(),s=lo?.dispose();vs(),ua(),pa.dispose(),la.dispose(),qs.stop(),Hs.dispose(),Vs.dispose(),Ds.dispose(),va.dispose(),ga.dispose(),wn.dispose(),dn.dispose(),cn.dispose();const a=ma.disposeMediaTasks({preserveRecovery:!0===t.preserveUploadRecovery});for(const e of no)e.close();no.clear(),_o+=1,ma.markOutboxForLogout(e?.pendingMessages??"fail"),ra.dispose(),oa.dispose(),na.dispose(),Ho.dispose(),$o.dispose(),zo.dispose(),Hr.dispose();const i=qr.dispose();pn.dispose();const c=en.invalidateAndDrainDraftOperations();ln.dispose(),Qs(),Xs(),ta(),js(),Ys.dispose(),ia.reset(),Dn?.clearAll(),$n.clear(),qn.clear(),zn.clear(),Na("im-logout"),(t.requireStorageClose||!0===so?.owned)&&await(fo?.catch(()=>{}));try{await a}catch{yr.emit({type:"error",error:{scope:"storage",message:"上传任务清理未完成,请检查本地数据与网络状态"}})}await n;try{await(Sr?.dispose(!0===t.preserveUploadRecovery))}catch(e){o=e,yr.emit({type:"error",error:{scope:"storage",message:"上传恢复记录清理失败,请清除此站点的本地数据"}})}await c,await i,await s,await Promise.allSettled([...bo]),await en.waitForChannelSyncPersistence(),await Promise.allSettled([...xr.values(),...Hn.values()]),await Promise.all([..._r.values()]),en.clearSession();const d="purge"===e?.localData?wr:"";let p,l=""===d?void 0:o,u=!0;if(void 0!==Dr)try{await Dr.close()}catch(e){u=!1,""!==d&&(l=e),!1!==t.reportStorageErrors&&yr.emit({type:"error",error:{scope:"storage",message:""===d?"关闭本地存储失败":"关闭本地存储失败,已跳过删除本账号本地库",cause:e}})}if(""!==d&&u)try{void 0!==kr?await kr.purgeCurrentAccount({namespaceFactory:gr,accountId:d}):await ie(d,{namespaceFactory:gr}),void 0===l&&(p=d)}catch(e){l=e,!1!==t.reportStorageErrors&&yr.emit({type:"error",error:{scope:"storage",message:"删除本账号本地库失败",cause:e}})}if(to="empty",Cr.record("info","sdk","session","teardown-complete",()=>({durationMs:Date.now()-r,data:{purgedAccountId:p,purgeFailed:void 0!==l}})),an(),ro(),zs(),Ia(),go=!0,(t.requireStorageClose||void 0!==so)&&!u)throw new Error("Previous chat page could not close its account storage");return so?.stop(),{...void 0===p?{}:{purgedAccountId:p},...void 0===l?{}:{purgeError:l}}}(e,t).then(r,o),co}function Ka(e){const t=e.conversationId,r=wr,n=_o,s=No(t);let a,i;return async({readCursor:c,cursor:d,signal:p,isCurrent:l})=>{const u=wo.enterForeground();try{const u=()=>{const a=en.getConversationContext(e);return br&&wr===r&&l()&&n===_o&&s===No(t)&&"channel"===a?.type&&(void 0===a.channelState||!o(a.channelState))};if(Mt(p),!u())return;if(void 0!==d&&(a!==c||void 0===i))return;const m=await Ir.getLoginContext();if(Mt(p),null===m||m.userId!==r||!u())return;const v=[],y=[],g=await kt({http:Rr,userId:m.userId,clientType:fr,channelId:t,index:d??c,containAnchor:void 0===d,signal:p,decryptDeps:{..._n("history"),onDecryptRecovery:e=>y.push({...e,source:"history"})},prepareKey:e=>On([e],{recoverExistingMessages:!1,priority:"foreground",signal:p}),onContentDecodeError:Zr,onReaction:e=>v.push(e)});if(Mt(p),!u())return;if(void 0===d){const e=g.messages.find(e=>e.extensions?.historyCursor===c);if(void 0===e)return;a=c,i=e.sortKey}if(void 0===i)return;if(g.messages.length>0&&en.upsertMessages(g.messages,"offline",{backfillOnly:!0}),!u())return;for(const e of v){if(!u())return;ds(e)}for(const e of y){if(!u())return;Fr(e)}if(!u())return;return{messages:g.messages.map(t=>{const r=en.getConversationMessage(e,t.id);if(void 0===r)throw new Error("首未读历史邻页在领域合并后缺少消息");return r}),readCursorSortKey:i,exhausted:!g.hasNewer,...void 0===g.nextCursor?{}:{nextCursor:g.nextCursor}}}finally{u()}}}async function Fa(){const e=Ca("direct");try{const t=[],r=[],o=wr,n=ba("background");n.assertCurrent?.();const s=await Ir.getLoginContext();if(null===s)throw new Error("pullOfflineChat: 无登录上下文(authProvider.getLoginContext 返回 null)");if(n.assertCurrent?.(),""!==o&&s.userId!==o)throw new DOMException("DIRECT 离线拉取的登录账号已改变","AbortError");const a={...await wa(s.userId),onDecryptRecovery:e=>t.push(e)},i=await bt({http:Rr,userId:s.userId,clientType:fr,decryptDeps:a,asyncDecrypt:n,onReaction:e=>r.push(e)}),c=await St({http:Rr,userId:s.userId,clientType:fr,decryptDeps:a,asyncDecrypt:ba("background",n.assertCurrent),onReaction:e=>r.push(e)});n.assertCurrent?.();const d=e.messages([...i,...c]);return await Ta(d,r,t.filter(e.acceptsRecovery),()=>n.assertCurrent?.(),n.publish),d}finally{e.stop()}}ko=async({conversation:e,newestLoaded:t,cursor:r,limit:n,signal:s})=>{Mt(s);const{conversationId:a}=e,i=en.getConversationContext(e);if(void 0===i)throw new Error(`加载更新消息失败:会话不存在(conversationId=${a})`);if("direct"===i.type||"robot"===i.type||"customerService"===i.type)return{messages:[],exhausted:!0};if("group"===i.type){if(void 0!==i.groupState&&"active"!==i.groupState)return{messages:[],exhausted:!0};const o={conversationType:"group",conversationId:a},c=wr,d=Sa(!0===lo?.hasForeground(e)?"foreground":"background",s);d.assertCurrent?.(o);const p=Ca("group",o);try{const o=await Ir.getLoginContext();if(null===o)return{messages:[],exhausted:!0};if(d.assertCurrent?.(),o.userId!==c)throw new DOMException("GROUP 历史请求的登录账号已改变","AbortError");const i=void 0===r?t?.serverTime??t?.createdAt:mr(r,a);if(void 0===i)throw new Error(`GROUP 向新分页缺少可信 baseTime(groupId=${a}, messageId=${t?.id??""})`);const l=[],u=[],m=await _t({asyncDecrypt:d,signal:s,http:Rr,userId:o.userId,clientType:fr,groupId:a,baseTime:i,direct:2,limit:n,decryptDeps:{...Gn("history"),onDecryptRecovery:e=>u.push(e)},prepareKeys:t=>Bn(t,{signal:s,priority:!0===lo?.hasForeground(e)?"foreground":"background"}),onReaction:e=>l.push(e)});d.assertCurrent?.();const v=p.messages(m.messages);for(const e of v)d.publish([e],()=>en.upsertMessages([e],"offline",{backfillOnly:!0}));for(const e of l)d.publish([],()=>ds(e));for(const e of u)d.publish([],()=>{p.acceptsRecovery(e)&&Fr(e)});d.assertCurrent?.();return{messages:v,...q({conversationId:a,direction:"newer",baseTime:i,batchSize:m.batchSize,boundaryTime:m.newestEntryTime,limit:n})}}finally{p.stop()}}if("channel"===i.type){if(void 0!==i.channelState&&o(i.channelState))return{messages:[],exhausted:!0};const n=r??t?.extensions?.historyCursor;if("string"!=typeof n||""===n.trim())throw new Error(`CHANNEL 向新分页缺少可信 historyCursor(channelId=${a}, messageId=${t?.id??""})`);const c=_o,d=No(a),p=await Ir.getLoginContext();if(null===p)return{messages:[],exhausted:!0};const l=void 0===r?(await na.loadMessageContext(a,n,p.userId,s)).context:await na.loadNewerPage(a,n,p.userId,s);Mt(s);const u=en.getConversationContext(e);return!br||c!==_o||d!==No(a)||"channel"!==u?.type||void 0!==u.channelState&&o(u.channelState)?{messages:[],exhausted:!0}:(l.messages.length>0&&en.upsertMessages(l.messages,"offline",{backfillOnly:!0}),{messages:l.messages,exhausted:!l.hasNewer,...l.hasNewer&&void 0!==l.nextCursor?{nextCursor:l.nextCursor}:{}})}throw new Error(`向新分页未实现:${i.type}`)};function Ua(e){const t=_({...e,operation:"openConversation"});return Object.assign(new Error(t.code),t,{name:"ImConversationOpenError"})}function Ba(e){if(!br)throw Ua({code:"IM_SDK_CONVERSATION_RUNTIME_RELEASED",category:"state",retryable:!1,conversation:e})}function Ga(e,t){return{id:e.conversationId,type:e.conversationType,title:t.title.trim()||e.conversationId,...void 0===t.avatar?{}:{avatar:t.avatar},lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:t.muted??!1,...void 0===t.groupState?{}:{groupState:t.groupState},...void 0===t.channelState?{}:{channelState:t.channelState},...void 0===t.channelPermissions?{}:{channelPermissions:t.channelPermissions},...void 0===t.channelAccessSnapshot?{}:{channelAccessSnapshot:t.channelAccessSnapshot},...void 0===t.sendDisabledReason?{}:{sendDisabledReason:t.sendDisabledReason}}}const Ha={...a({...void 0===Er?{}:{coreClient:Er},authProvider:Ir,http:Rr,resolveInput:un,domainState:en,operations:{list:function(){return en.getConversationList()},pullOffline:Fa,sync:async function(){await ja()},prefetchRecent:(e,t)=>lo.prefetchRecent(e,t)},beforeDeleteConversation:Ko,terminateConversationSending:(e,t)=>ma.terminateConversationSending(e,t),resetConversationBackground:e=>Hr.api.resetBackground(e),reportStorageError:(e,t)=>yr.emit({type:"error",error:{scope:"storage",message:e,cause:t}}),markChannelRead:(e,t)=>ma.markRead(e,t,"channel"),settleConversationRead:async e=>{const t=await $a(e,{initialPosition:"latest"},"read");try{await t.markConversationRead()}finally{t.close()}}}),...Hr.api,ensureOpenableConversation:async function(e){const t=function(e){const t=e?.conversationType,r=e?.conversationId;if("supergroup"===t)throw Ua({code:"IM_SDK_SUPERGROUP_UNSUPPORTED",category:"unsupported",retryable:!1,conversation:e});if("direct"!==t&&"group"!==t&&"channel"!==t&&"robot"!==t&&"customerService"!==t||"string"!=typeof r||""===r.trim())throw Ua({code:"IM_SDK_CONVERSATION_INVALID",category:"validation",retryable:!1,...void 0===e?{}:{conversation:e}});return Object.freeze({conversationType:t,conversationId:r.trim()})}(e);if(Ba(t),void 0!==en.getSession(t))return t;const r=Eo.begin();let o=!1;const n=yr.subscribe(e=>{"session:removed"===e.type&&e.conversation.conversationType===t.conversationType&&e.conversation.conversationId===t.conversationId&&(o=!0)}),s=()=>{if(Ba(t),o)throw Ua({code:"IM_SDK_CONVERSATION_OPEN_INVALIDATED",category:"state",retryable:!0,conversation:t})};try{if("direct"===t.conversationType){const e=$o.peekItem("individual",t.conversationId);if(void 0!==e)return en.prepareConversation(Ga(t,{title:e.displayName||e.cardDisplayName,...void 0===e.avatarUrl?{}:{avatar:e.avatarUrl}})),t;const r=await cn.getRelationship(t.conversationId);if(s(),"friend"!==r)throw Ua({code:"IM_SDK_DIRECT_CONTACT_REQUIRED",category:"permission",retryable:!1,conversation:t,details:Object.freeze({relationship:r})});const o=await cn.getProfile(t.conversationId);if(s(),null===o||o.id!==t.conversationId)throw Ua({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});return en.prepareConversation(Ga(t,{title:o.remark??o.nickname,...void 0===o.avatar?{}:{avatar:o.avatar},...void 0===o.muted?{}:{muted:o.muted}})),t}if("group"===t.conversationType){const e=en.isMembershipTerminated(t),r=$o.peekItem("group",t.conversationId);if(void 0!==r&&!e)return en.prepareConversation(Ga(t,{title:r.displayName||r.cardDisplayName,...void 0===r.avatarUrl?{}:{avatar:r.avatarUrl},groupState:"active"})),t;if(void 0===Fo)throw Ua({code:"IM_SDK_CONVERSATION_PROFILE_UNAVAILABLE",category:"contract",retryable:!1,conversation:t});const o=await Fo.getGroupProfile(t.conversationId,e?{forceRefresh:!0}:void 0);if(s(),null===o||o.id!==t.conversationId)throw Ua({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});if(!1===o.isInGroup||e&&!0!==o.isInGroup||void 0!==o.status&&2!==o.status)throw Ua({code:"IM_SDK_GROUP_CONVERSATION_UNAVAILABLE",category:"permission",retryable:!1,conversation:t,details:Object.freeze({...void 0===o.status?{}:{status:o.status},...void 0===o.isInGroup?{}:{isInGroup:o.isInGroup}})});return en.prepareConversation(Ga(t,{title:o.name,...void 0===o.avatar?{}:{avatar:o.avatar},...void 0===o.muted?{}:{muted:o.muted},groupState:"active"}),{membershipConfirmed:e}),e&&(s(),Ms({conversationType:"group",conversationId:t.conversationId})),t}if("customerService"===t.conversationType){if("__customer_service__"!==t.conversationId||void 0===en.getConversationContext(t))throw new Error("客服会话只能由已接收消息创建");return t}if("robot"===t.conversationType){const e=zo.peek(t.conversationId);return en.prepareConversation(Ga(t,{title:e?.displayName??t.conversationId,...void 0===e?.avatarUrl?{}:{avatar:e.avatarUrl}})),t}if(void 0===Uo)throw Ua({code:"IM_SDK_CONVERSATION_PROFILE_UNAVAILABLE",category:"contract",retryable:!1,conversation:t});const e=en.isMembershipTerminated(t),r=await Uo.getProfile(t.conversationId,e?{forceRefresh:!0}:void 0);if(s(),null===r||r.id!==t.conversationId)throw Ua({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});const o="active"===r.channelState||"muted"===r.channelState,n="muted"===r.channelState&&!0===r.accessSnapshot?.allMembersMuted&&"owner"!==r.role&&"admin"!==r.role;if(!o||n)throw Ua({code:"IM_SDK_CHANNEL_CONVERSATION_UNAVAILABLE",category:"permission",retryable:!1,conversation:t,details:Object.freeze({channelState:r.channelState,role:r.role,hiddenByAllMemberMute:n})});return en.prepareConversation(Ga(t,{title:r.name,...void 0===r.avatar?{}:{avatar:r.avatar},...void 0===r.muted?{}:{muted:r.muted},channelState:r.channelState,channelPermissions:r.permissions,...void 0===r.accessSnapshot?{}:{channelAccessSnapshot:r.accessSnapshot},...r.permissions.sendMessages?{}:{sendDisabledReason:`channel_${r.channelState}`}}),{membershipConfirmed:e}),e&&(s(),Ms({conversationType:"channel",conversationId:t.conversationId})),t}catch(e){if(function(e){return e instanceof Error&&"ImConversationOpenError"===e.name&&"string"==typeof e.code}(e))throw e;const r=function(e){if("object"==typeof e&&null!==e&&"string"==typeof e.code&&"string"==typeof e.category&&"boolean"==typeof e.retryable){const t=e;return{code:t.code,category:t.category,retryable:t.retryable}}return e instanceof pe?{code:"IM_SDK_CONVERSATION_PROFILE_READ_FAILED",category:"network",retryable:!0}:e instanceof le||e instanceof Error&&"DirectoryMappingError"===e.name?{code:"IM_SDK_CONVERSATION_PROFILE_INVALID",category:"contract",retryable:!1}:{code:"IM_SDK_CONVERSATION_OPEN_PREREQUISITE_FAILED",category:"state",retryable:!1}}(e);throw Ua({...r,conversation:t,cause:e})}finally{n(),r()}},getContext:e=>en.getConversationContext(e)};function Va(e,t,r=!0){if(!br)throw e.close(),new Error("IM SDK 账号运行时已释放,不能打开会话");return t?.aborted&&(e.close(),Mt(t)),function(e,t=!0){const r=new AbortController,o={...e,resumeMedia(){t&&br&&!r.signal.aborted&&"authenticated"===ma.state&&"robot"!==e.ref.conversationType&&ma.resumePausedMediaUploads(e.ref,r.signal).catch(()=>{br&&!r.signal.aborted&&yr.emit({type:"error",error:{scope:"unknown",message:"当前会话上传恢复失败,请重新选择文件"}})})},close(){r.abort(),e.close(),no.delete(o)}};return b(o,e),no.add(o),t&&o.resumeMedia(),o}(e,r)}async function $a(e,t={},r){if(!br)throw new Error("IM SDK 账号运行时已释放,不能打开会话");const o=lo?.enterForeground(e),n=wo.enterForeground(),s=Eo.begin();try{const o={beginReceiving:Eo.begin,domainState:en,invalidateHistory:Ko,emitter:yr,drafts:pn.api,sendText:ya.operations.sendText,sendContact:ya.operations.sendContact,sendImage:ya.operations.sendImage,sendVideo:ya.operations.sendVideo,sendVoice:ya.operations.sendVoice,sendFile:ya.operations.sendFile,sendGif:ya.operations.sendGif,sendMediaAlbum:ya.operations.sendMediaAlbum,sendExpression:ya.operations.sendExpression,sendGame:ya.operations.sendGame,sendMiniProgram:ya.operations.sendMiniProgram,sendTransfer:ya.operations.sendTransfer,sendGift:ya.operations.sendGift,sendLiveRoom:ya.operations.sendLiveRoom,replaceVideo:ya.operations.replaceInterruptedVideo,replaceFile:ya.operations.replaceInterruptedFile,forwardMessages:ya.operations.forwardMessages,recallMessage:ya.operations.recallMessage,editMessage:ya.operations.editMessage,setReaction:({conversation:e,parentMessageId:t,emoji:r,action:o})=>{if("robot"===e.conversationType||"customerService"===e.conversationType)return Promise.resolve({ok:!1,reason:"restricted"});const n={conversationType:e.conversationType,conversationId:e.conversationId};return"toggle"===o?Ds.toggle({conversation:n,parentMessageId:t,emoji:r}):Ds.set({conversation:n,parentMessageId:t,emoji:r,action:"add"===o?0:1})},markRead:ya.operations.markRead,markConversationRead:ya.operations.markConversationRead,markVisibleMessages:ya.operations.markVisibleMessages,markDirectMediaConsumed:ya.operations.markDirectMediaConsumed,prepareMediaPreview:bn,getSelfId:()=>wr,isOutboxOwned:e=>ma.getPendingOutbox().some(t=>t.id===e),hasOutboxForConversation:e=>ma.getPendingOutbox().some(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId)};switch(e.conversationType){case"direct":{const n={conversationType:"direct",conversationId:e.conversationId},s=await C(n,{...o,getRelationship:cn.getRelationship,shouldCheckRelationship:()=>"authenticated"===ma.state,appendContactRequiredTextFailure:e=>en.appendDirectContactRequiredTextFailure({conversationId:e.conversationId,senderId:wr,text:e.text,...void 0===e.refMessageId?{}:{refMessageId:e.refMessageId}}),setMuted:(e,t)=>Ha.setMuted(e,t),fetchMessagesByIdBatch:e=>(async(e,t)=>{const r=Ca("direct",e,t);try{const o=wr,n=jo(e),s=()=>{if(!br||wr!==o||n!==jo(e))throw new DOMException("DIRECT 消息查询所属账号或历史已失效","AbortError")};s();const{userId:a}=await hs();if(s(),a!==o)throw new DOMException("DIRECT 消息查询的登录账号已改变","AbortError");const i=await wa(a,{priority:"foreground"});s();const c=[],d=[],p=await N(t,async t=>{s();const r=await xt({http:Rr,userId:a,clientType:fr,messageIds:t,asyncDecrypt:ba("foreground",s),decryptDeps:{...i,onDecryptRecovery:e=>d.push(e)},onPlaintextFallback:t=>Cr.record("warn","sdk","crypto","direct-quoted-plaintext-fallback",()=>({conversation:e,data:{...t,endpoint:"/offline/v1/chat/msg/by_id",wireEncrypt:1,reason:"mislabeled-plaintext"}})),onReaction:e=>c.push(e)});if(s(),200!==r.code)throw Object.assign(new Error("DIRECT 按 ID 查询业务失败"),{code:r.code});return r});s();const l=r.messages(p.messages).filter(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId);for(const e of l)s(),gs([e]),s();for(const t of c)s(),t.conversation.conversationType===e.conversationType&&t.conversation.conversationId===e.conversationId&&ds(t),s();for(const t of d)s(),r.acceptsRecovery(t)&&t.conversation.conversationType===e.conversationType&&t.conversation.conversationId===e.conversationId&&Fr(t),s();const u=l.map(t=>{const r=en.getConversationMessage(e,t.id);if(void 0===r)throw new Error("DIRECT 按 ID 查询在领域合并后缺少消息");return r}),m=new Set(u.map(e=>e.id)),v=new Set(p.missingMessageIds);for(const e of p.messages)m.has(e.id)||v.add(e.id);return{messages:u,missingMessageIds:[...v]}}finally{r.stop()}})(n,e)},t),a=Va(s,t.signal,"read"!==r);return cs(n),a}case"group":{const n={conversationType:"group",conversationId:e.conversationId},s=Va(await w(n,{...o,getSendPermissionError:e=>{const t=en.getConversationContext(n),r="group"===t?.type?t.groupState:"unknown";if(void 0!==r&&"active"!==r)return _({code:"IM_SDK_GROUP_SEND_FORBIDDEN",category:"permission",operation:e,retryable:!1,conversation:n,details:Object.freeze({groupState:r})})},setMuted:(e,t)=>Ha.setMuted(e,t),fetchMessagesByIdBatch:e=>fs(n.conversationId,e)},t),t.signal,"read"!==r);return cs(n),s}case"channel":{const n={conversationType:"channel",conversationId:e.conversationId},s=Va(await I(n,{...o,loadEntryUnreadPage:Ka(n),getSelfId:()=>wr,deleteMessageForEveryone:ma.deleteChannelMessageForEveryone,reconcilePage:sa.reconcilePage,getSendPermissionError:e=>{const t=en.getConversationContext(n),r="channel"===t?.type&&void 0!==t.channelState?t.channelState:"unknown_restricted",o=pt({channelState:r,nowMs:Date.now(),..."channel"!==t?.type||void 0===t.channelAccessSnapshot?{}:{snapshot:t.channelAccessSnapshot},..."channel"!==t?.type||void 0===t.channelPermissions?{}:{permissions:t.channelPermissions}});if("active"!==o.channelState||!o.permissions.sendMessages)return _({code:"IM_SDK_CHANNEL_SEND_FORBIDDEN",category:"permission",operation:e,retryable:!1,conversation:n,details:Object.freeze({channelState:o.channelState,...void 0===o.muteReason?{}:{muteReason:o.muteReason}})})},setMuted:(e,t)=>Ha.setMuted(e,t),fetchMessagesByIdBatch:e=>Is(n.conversationId,e)},t),t.signal,"read"!==r);return cs(n),s}case"customerService":{const n={conversationType:"customerService",conversationId:e.conversationId};return Va(await f(n,{...o,setMuted:async()=>{throw new Error("客服会话不支持免打扰设置")}},t),t.signal,"read"!==r)}case"robot":{const n={conversationType:"robot",conversationId:e.conversationId};return Va(await h(n,{...o,setMuted:(e,t)=>Ha.setMuted(e,t)},t),t.signal,"read"!==r)}default:throw new Error(`openConversation:${e.conversationType} 产品 handler 未注册`)}}finally{s(),o?.(),n()}}return{advancedMessageDiagnostics:{sendDirectText:async e=>{await ya.operations.sendText({conversationId:e.peerId,conversationType:"direct",text:e.text,encrypted:e.encrypted})}},openConversation:$a,localData:nn,directory:$o.search,customerService:rn,robots:zo.api,search:ln.api,applications:dn.api,expressions:Jo.api,sessionFavorites:sn.api,outbox:va.api,drafts:pn.api,connection:u({operations:{prepare:_a,connect:function(e){if(go)return Promise.reject(Object.assign(new Error("Chat is active in another page"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"}));if(!br||go)return Promise.reject(new Error("IM 连接已停止,请刷新页面后重试"));if(vo=!0,"authenticated"===ma.state)return Promise.resolve();if(null!==Io)return Io;uo=e?.initialSync??"auto",mo=!1;const t=Date.now();Cr.record("info","sdk","connection","connect-start",()=>({data:{initialSync:uo}}));const r=yo;return Io=(async()=>{await _a(),br&&vo&&r===yo&&(fa.start(),await ma.connect())})().then(()=>Cr.record("info","sdk","connection","connect-complete",()=>({durationMs:Date.now()-t}))).catch(e=>{throw Cr.record("error","sdk","connection","connect-failed",()=>({durationMs:Date.now()-t,error:{message:"IM connect 失败",data:e}})),e}).finally(()=>{Io=null}),Io},disconnect:Na,subscribe:function(e){return yr.subscribe(e)},getSnapshot:function(){return{connectionState:ma.state,pendingOutbox:ma.getPendingOutbox()}},getLifecycle:function(){return{sessionState:to,connectionState:ma.state,...""!==wr?{userId:wr}:{},prepared:"ready"===to,connectionDesired:vo,authenticated:"authenticated"===ma.state,receiving:Eo.receiving,syncing:Ro.receiving}}},getState:()=>ma.state}),conversations:Ha,settings:qr.api,push:pa.api,activity:la.api,contact:cn,group:d({directory:$o.groups,...void 0===Fo?{}:{profile:{getGroupProfile:async(e,t)=>{const r=en.beginConversationProfileRead({conversationType:"group",conversationId:e},t);try{const o=await Fo.getGroupProfile(e,t);return null!==o&&r({id:o.id,title:o.name,avatar:o.avatar}),o}finally{r.finish()}},...void 0===Fo.getGroupMemberNames?{}:{getGroupMemberNames:Fo.getGroupMemberNames.bind(Fo)},...void 0===Fo.listGroupMembers?{}:{listGroupMembers:Fo.listGroupMembers.bind(Fo)},...void 0===Fo.peekGroupMembers?{}:{peekGroupMembers:Fo.peekGroupMembers.bind(Fo)},...void 0===Fo.peekGroupProfile?{}:{peekGroupProfile:Fo.peekGroupProfile.bind(Fo)},...void 0===Fo.peekGroupMemberNames?{}:{peekGroupMemberNames:Fo.peekGroupMemberNames.bind(Fo)}}},...void 0===Er?{}:{coreClient:Er},...void 0===In?{}:{avatarTransfer:In},domainState:{...ks,prepareConversation:e=>en.prepareConversation(e)},emitter:yr,pinned:ra.operations}),channel:t({directory:$o.channels,...void 0===Uo?{}:{channelProfile:{listProfiles:Uo.listProfiles.bind(Uo),getProfile:async(e,t)=>{const r=en.beginConversationProfileRead({conversationType:"channel",conversationId:e},t);try{const o=await Uo.getProfile(e,t);return null!==o&&r({id:o.id,title:o.name,avatar:o.avatar}),o}finally{r.finish()}}}},...void 0===Bo?{}:{channelMembers:Bo},...void 0===Go?{}:{channelMentionMembers:Go},mentionCandidates:Ho.api,applications:na.applications,pinned:oa.operations,...void 0===Er?{}:{coreClient:Er},...void 0===In?{}:{avatarTransfer:In},crypto:gn,domainState:{prepareConversation:e=>en.prepareConversation(e),setChannelRestriction:en.setChannelRestriction,removeConversationForMembershipTermination:ks.removeConversationForMembershipTermination,updateConversationProfile:en.updateConversationProfile,refreshConversationProfile:en.refreshConversationProfile},emitter:yr,...void 0===Dn?{}:{cacheCreatedSecretKey:(e,t)=>Dn.primeChannelKey(e,t)},getSelfUserId:async()=>""!==wr?wr:(await Ir.getLoginContext())?.userId??""}),media:ga.api,calls:v(Hs),groupCalls:P(Vs),teardown:La}}export{vr as createSessionRuntime};
|