k2-im 0.1.57 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. package/README.md +3 -1
  2. package/dist/browser.d.ts +1 -1
  3. package/dist/browser.js +1 -1
  4. package/dist/chat-kit-pinia.d.ts +227 -170
  5. package/dist/chat-kit-pinia.js +1 -1
  6. package/dist/chat-kit-vue.d.ts +64 -44
  7. package/dist/chat-kit-vue.js +1 -1
  8. package/dist/chat-kit.d.ts +244 -173
  9. package/dist/chat-kit.js +1 -1
  10. package/dist/crypto.worker.js +17 -25
  11. package/dist/i18n.d.ts +61 -41
  12. package/dist/i18n.js +1 -1
  13. package/dist/index.d.ts +259 -188
  14. package/dist/index.js +1 -1
  15. package/dist/modules/api-protocol-client/src/bi-feedback.js +1 -0
  16. package/dist/modules/api-protocol-client/src/browser.js +1 -0
  17. package/dist/modules/api-protocol-client/src/client.js +1 -0
  18. package/dist/modules/api-protocol-client/src/config.js +1 -0
  19. package/dist/modules/api-protocol-client/src/constants.js +1 -0
  20. package/dist/modules/api-protocol-client/src/json.js +1 -0
  21. package/dist/modules/api-protocol-client/src/nonce.js +1 -0
  22. package/dist/modules/api-protocol-client/src/transports/axios.js +1 -0
  23. package/dist/modules/api-protocol-client/src/utils.js +1 -0
  24. package/dist/modules/crypto/browser.js +1 -0
  25. package/dist/modules/crypto/driver.js +1 -0
  26. package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -0
  27. package/dist/modules/im-browser/src/crypto/channel-key-service.js +1 -0
  28. package/dist/modules/im-browser/src/crypto/collect-tea.js +1 -0
  29. package/dist/modules/im-browser/src/crypto/crypto-task-executor.js +1 -0
  30. package/dist/modules/im-browser/src/crypto/crypto-worker-factory.js +1 -0
  31. package/dist/modules/im-browser/src/crypto/crypto-worker-protocol.js +1 -0
  32. package/dist/modules/im-browser/src/crypto/encrypt-key-service.js +1 -0
  33. package/dist/modules/im-browser/src/crypto/group-key-service.js +1 -0
  34. package/dist/modules/im-browser/src/crypto/peer-public-key-service.js +1 -0
  35. package/dist/modules/im-browser/src/crypto/rsa-private-key.js +1 -0
  36. package/dist/modules/im-browser/src/crypto/rsa-tea-crypto-adapter.js +1 -0
  37. package/dist/modules/im-browser/src/crypto/stale-key-refresh.js +1 -0
  38. package/dist/modules/im-browser/src/crypto/tea.js +1 -0
  39. package/dist/modules/im-browser/src/crypto/wait-for-key-signal.js +1 -0
  40. package/dist/modules/im-browser/src/http/application-http-adapters.js +1 -0
  41. package/dist/modules/im-browser/src/http/channel-http-adapter.js +1 -0
  42. package/dist/modules/im-browser/src/http/channel-join-application-http-adapter.js +1 -0
  43. package/dist/modules/im-browser/src/http/channel-member-http-adapter.js +1 -0
  44. package/dist/modules/im-browser/src/http/channel-mention-member-http-adapter.js +1 -0
  45. package/dist/modules/im-browser/src/http/cm-http-adapter.js +1 -0
  46. package/dist/modules/im-browser/src/http/directory-http-adapter.js +1 -0
  47. package/dist/modules/im-browser/src/http/expression-http-adapter.js +1 -0
  48. package/dist/modules/im-browser/src/http/lazy-api-protocol-client.js +1 -0
  49. package/dist/modules/im-browser/src/http/profile-http-adapter.js +1 -0
  50. package/dist/modules/im-browser/src/http/requests/applications.js +1 -0
  51. package/dist/modules/im-browser/src/http/requests/bind-robot-conversation.js +1 -0
  52. package/dist/modules/im-browser/src/http/requests/board-pinned-message-validation.js +1 -0
  53. package/dist/modules/im-browser/src/http/requests/channel-join-applications.js +1 -0
  54. package/dist/modules/im-browser/src/http/requests/channel-management.js +1 -0
  55. package/dist/modules/im-browser/src/http/requests/channel-members.js +1 -0
  56. package/dist/modules/im-browser/src/http/requests/channel-mention-members.js +1 -0
  57. package/dist/modules/im-browser/src/http/requests/channel-message-context.js +1 -0
  58. package/dist/modules/im-browser/src/http/requests/channel-mini-program-rel.js +1 -0
  59. package/dist/modules/im-browser/src/http/requests/channel-profile.js +1 -0
  60. package/dist/modules/im-browser/src/http/requests/channel-read-index.js +1 -0
  61. package/dist/modules/im-browser/src/http/requests/contact-blocklist.js +1 -0
  62. package/dist/modules/im-browser/src/http/requests/contact-friendship.js +1 -0
  63. package/dist/modules/im-browser/src/http/requests/contact-report.js +1 -0
  64. package/dist/modules/im-browser/src/http/requests/core-json-request.js +1 -0
  65. package/dist/modules/im-browser/src/http/requests/create-channel.js +1 -0
  66. package/dist/modules/im-browser/src/http/requests/create-face-to-face-group.js +1 -0
  67. package/dist/modules/im-browser/src/http/requests/create-group.js +1 -0
  68. package/dist/modules/im-browser/src/http/requests/customer-service-profile.js +1 -0
  69. package/dist/modules/im-browser/src/http/requests/get-board-pinned-message.js +1 -0
  70. package/dist/modules/im-browser/src/http/requests/get-channel-board-pinned-message.js +1 -0
  71. package/dist/modules/im-browser/src/http/requests/get-channel-secret-key.js +1 -0
  72. package/dist/modules/im-browser/src/http/requests/get-conversation-background-presets.js +1 -0
  73. package/dist/modules/im-browser/src/http/requests/get-group-encrypt-info.js +1 -0
  74. package/dist/modules/im-browser/src/http/requests/get-group-info.js +1 -0
  75. package/dist/modules/im-browser/src/http/requests/get-group-member-list.js +1 -0
  76. package/dist/modules/im-browser/src/http/requests/get-user-encrypt-info.js +1 -0
  77. package/dist/modules/im-browser/src/http/requests/get-user-info-friend.js +1 -0
  78. package/dist/modules/im-browser/src/http/requests/get-user-info-other.js +1 -0
  79. package/dist/modules/im-browser/src/http/requests/group-management.js +1 -0
  80. package/dist/modules/im-browser/src/http/requests/mark-group-read-all.js +1 -0
  81. package/dist/modules/im-browser/src/http/requests/membership-join.js +1 -0
  82. package/dist/modules/im-browser/src/http/requests/pin-board-message.js +1 -0
  83. package/dist/modules/im-browser/src/http/requests/pin-channel-board-message.js +1 -0
  84. package/dist/modules/im-browser/src/http/requests/pull-messages-by-id.js +1 -0
  85. package/dist/modules/im-browser/src/http/requests/pull-offline-channel.js +1 -0
  86. package/dist/modules/im-browser/src/http/requests/pull-offline-chat.js +1 -0
  87. package/dist/modules/im-browser/src/http/requests/pull-offline-group.js +1 -0
  88. package/dist/modules/im-browser/src/http/requests/pull-offline-signal.js +1 -0
  89. package/dist/modules/im-browser/src/http/requests/robot-menu-reply.js +1 -0
  90. package/dist/modules/im-browser/src/http/requests/robot-profile.js +1 -0
  91. package/dist/modules/im-browser/src/http/requests/search-robots.js +1 -0
  92. package/dist/modules/im-browser/src/http/requests/set-conversation-undisturb.js +1 -0
  93. package/dist/modules/im-browser/src/http/requests/set-friend-remark.js +1 -0
  94. package/dist/modules/im-browser/src/http/requests/set-group-nickname.js +1 -0
  95. package/dist/modules/im-browser/src/http/requests/unpin-board-message.js +1 -0
  96. package/dist/modules/im-browser/src/http/requests/unpin-channel-board-message.js +1 -0
  97. package/dist/modules/im-browser/src/http/requests/update-group-info.js +1 -0
  98. package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -0
  99. package/dist/modules/im-browser/src/media/file-md5.js +1 -0
  100. package/dist/modules/im-browser/src/media/image-clipboard.js +1 -0
  101. package/dist/modules/im-browser/src/media/image-header-dimensions.js +1 -0
  102. package/dist/modules/im-browser/src/media/media-downloader.js +1 -0
  103. package/dist/modules/im-browser/src/media/media-preview-adapter.js +1 -0
  104. package/dist/modules/im-browser/src/media/media-preview-preparation-executor.js +1 -0
  105. package/dist/modules/im-browser/src/media/media-request-limiter.js +1 -0
  106. package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -0
  107. package/dist/modules/im-browser/src/media/media-transfer-errors.js +1 -0
  108. package/dist/modules/im-browser/src/media/media-transfer-policy.js +1 -0
  109. package/dist/modules/im-browser/src/media/media-upload-credentials.js +1 -0
  110. package/dist/modules/im-browser/src/media/media-upload-recovery-codec.js +1 -0
  111. package/dist/modules/im-browser/src/media/media-upload-recovery-store.js +1 -0
  112. package/dist/modules/im-browser/src/media/media-upload-source-fingerprint.js +1 -0
  113. package/dist/modules/im-browser/src/media/s3-multipart-uploader.js +1 -0
  114. package/dist/modules/im-browser/src/media/xhr-upload-idle-timeout.js +1 -0
  115. package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -0
  116. package/dist/modules/im-browser/src/network/network-monitor.js +1 -0
  117. package/dist/modules/im-browser/src/scheduling/yield-to-browser.js +1 -0
  118. package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -0
  119. package/dist/modules/im-browser/src/transport/ws-transport.js +1 -0
  120. package/dist/modules/im-browser/src/voice/voice-amplitude.js +1 -0
  121. package/dist/modules/im-browser/src/voice/voice-capabilities.js +1 -0
  122. package/dist/modules/im-browser/src/voice/voice-codec.js +1 -0
  123. package/dist/modules/im-browser/src/voice/voice-errors.js +1 -0
  124. package/dist/modules/im-browser/src/voice/voice-playback.js +1 -0
  125. package/dist/modules/im-browser/src/voice/voice-player.js +1 -0
  126. package/dist/modules/im-browser/src/voice/voice-recorder.js +1 -0
  127. package/dist/modules/im-chat-kit/src/i18n/use-im-text.js +1 -0
  128. package/dist/modules/im-chat-kit/src/pinia/applications.store.js +1 -0
  129. package/dist/modules/im-chat-kit/src/pinia/capabilities.store.js +1 -0
  130. package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -0
  131. package/dist/modules/im-chat-kit/src/pinia/context.js +1 -0
  132. package/dist/modules/im-chat-kit/src/pinia/conversation-activation.js +1 -0
  133. package/dist/modules/im-chat-kit/src/pinia/conversation-deletion.js +1 -0
  134. package/dist/modules/im-chat-kit/src/pinia/conversation-list.store.js +1 -0
  135. package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -0
  136. package/dist/modules/im-chat-kit/src/pinia/history-return-after-send.js +1 -0
  137. package/dist/modules/im-chat-kit/src/pinia/media-transfer-estimate.js +1 -0
  138. package/dist/modules/im-chat-kit/src/pinia/media.store.js +1 -0
  139. package/dist/modules/im-chat-kit/src/pinia/message-operations.store.js +1 -0
  140. package/dist/modules/im-chat-kit/src/pinia/profile-directory.store.js +1 -0
  141. package/dist/modules/im-chat-kit/src/pinia/quoted-message.store.js +1 -0
  142. package/dist/modules/im-chat-kit/src/pinia/reaction.store.js +1 -0
  143. package/dist/modules/im-chat-kit/src/pinia/search-senders.js +1 -0
  144. package/dist/modules/im-chat-kit/src/pinia/search.store.js +1 -0
  145. package/dist/modules/im-chat-kit/src/pinia/session-favorites.store.js +1 -0
  146. package/dist/modules/im-chat-kit/src/pinia/session.store.js +1 -0
  147. package/dist/modules/im-chat-kit/src/pinia/thread-paging.store.js +1 -0
  148. package/dist/modules/im-chat-kit/src/pinia/thread-return-to-latest.js +1 -0
  149. package/dist/modules/im-chat-kit/src/pinia/thread.store.js +1 -0
  150. package/dist/modules/im-chat-kit/src/presentation/channel-mini-program-open.js +1 -0
  151. package/dist/modules/im-chat-kit/src/presentation/channel-mini-program-rels.js +1 -0
  152. package/dist/modules/im-chat-kit/src/presentation/conversation-list.js +1 -0
  153. package/dist/modules/im-chat-kit/src/presentation/conversation-unread.js +1 -0
  154. package/dist/modules/im-chat-kit/src/presentation/delayed-loading-indicator.js +1 -0
  155. package/dist/modules/im-chat-kit/src/presentation/media-source-priority.js +1 -0
  156. package/dist/modules/im-chat-kit/src/presentation/message-notification.js +1 -0
  157. package/dist/modules/im-chat-kit/src/presentation/message-search.js +1 -0
  158. package/dist/modules/im-chat-kit/src/presentation/mini-program-game-preview.js +1 -0
  159. package/dist/modules/im-chat-kit/src/presentation/mini-program-open-url.js +1 -0
  160. package/dist/modules/im-chat-kit/src/runtime/chat-runtime.js +1 -0
  161. package/dist/modules/im-chat-kit/src/runtime/conversation-prefetch-controller.js +1 -0
  162. package/dist/modules/im-chat-kit/src/runtime/media-object-url-registry.js +1 -0
  163. package/dist/modules/im-chat-kit/src/runtime/runtime-operation.js +1 -0
  164. package/dist/modules/im-chat-kit/src/services/capabilities.js +1 -0
  165. package/dist/modules/im-chat-kit/src/services/channel-member-management.service.js +1 -0
  166. package/dist/modules/im-chat-kit/src/services/channel-profile-management.service.js +1 -0
  167. package/dist/modules/im-chat-kit/src/services/channel-send-restriction.js +1 -0
  168. package/dist/modules/im-chat-kit/src/services/direct-contact-management.service.js +1 -0
  169. package/dist/modules/im-chat-kit/src/services/forward.service.js +1 -0
  170. package/dist/modules/im-chat-kit/src/services/group-member-management.service.js +1 -0
  171. package/dist/modules/im-chat-kit/src/services/group-profile-management.service.js +1 -0
  172. package/dist/modules/im-chat-kit/src/services/image-copy.service.js +1 -0
  173. package/dist/modules/im-chat-kit/src/services/media-file-classification.js +1 -0
  174. package/dist/modules/im-chat-kit/src/services/media.service.js +1 -0
  175. package/dist/modules/im-chat-kit/src/services/message.service.js +1 -0
  176. package/dist/modules/im-chat-kit/src/services/pinned-message-rules.js +1 -0
  177. package/dist/modules/im-chat-kit/src/services/pinned-message.service.js +1 -0
  178. package/dist/modules/im-chat-kit/src/services/profile-access.service.js +1 -0
  179. package/dist/modules/im-chat-kit/src/services/profile-directory.service.js +1 -0
  180. package/dist/modules/im-chat-kit/src/services/profile-display.js +1 -0
  181. package/dist/modules/im-chat-kit/src/services/profile.service.js +1 -0
  182. package/dist/modules/im-chat-kit/src/services/read.service.js +1 -0
  183. package/dist/modules/im-chat-kit/src/services/robot-sender-profile.js +1 -0
  184. package/dist/modules/im-chat-kit/src/services/search.service.js +1 -0
  185. package/dist/modules/im-chat-kit/src/services/send.service.js +1 -0
  186. package/dist/modules/im-chat-kit/src/thread/active-date.js +1 -0
  187. package/dist/modules/im-chat-kit/src/thread/create-thread-items.js +1 -0
  188. package/dist/modules/im-chat-kit/src/thread/message-locate-result.js +1 -0
  189. package/dist/modules/im-chat-kit/src/thread/new-message-badge.js +1 -0
  190. package/dist/modules/im-chat-kit/src/thread/resolve-message-body-kind.js +1 -0
  191. package/dist/modules/im-chat-kit/src/thread/resolve-quoted-message-presentation.js +1 -0
  192. package/dist/modules/im-chat-kit/src/thread/viewport-rules.js +1 -0
  193. package/dist/modules/im-chat-kit/src/utils/emoji/emoji-legacy-catalog.json.js +1 -0
  194. package/dist/modules/im-chat-kit/src/utils/emoji/index.js +1 -0
  195. package/dist/modules/im-chat-kit/src/utils/emoji/recent.js +1 -0
  196. package/dist/modules/im-chat-kit/src/utils/emoji/unicode-emoji-catalog.json.js +1 -0
  197. package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -0
  198. package/dist/modules/im-chat-kit/src/utils/highlight.js +1 -0
  199. package/dist/modules/im-chat-kit/src/utils/link.js +1 -0
  200. package/dist/modules/im-chat-kit/src/utils/media-batch.js +1 -0
  201. package/dist/modules/im-chat-kit/src/utils/media-dimensions.js +1 -0
  202. package/dist/modules/im-chat-kit/src/utils/media-format.js +1 -0
  203. package/dist/modules/im-chat-kit/src/utils/media-transfer-presentation.js +1 -0
  204. package/dist/modules/im-chat-kit/src/utils/time-display.js +1 -0
  205. package/dist/modules/im-chat-kit/src/utils/waveform.js +1 -0
  206. package/dist/modules/im-chat-kit/src/vue/thread/ImThreadBodySwitch.js +1 -0
  207. package/dist/modules/im-chat-kit/src/vue/thread/ImThreadItems.js +1 -0
  208. package/dist/modules/im-chat-kit/src/vue/thread/ImThreadSurface.js +1 -0
  209. package/dist/modules/im-chat-kit/src/vue/thread/ImThreadViewport.js +1 -0
  210. package/dist/modules/im-chat-kit/src/vue/thread/message-renderer-registry.js +1 -0
  211. package/dist/modules/im-chat-kit/src/vue/thread/thread-idle-task.js +1 -0
  212. package/dist/modules/im-chat-kit/src/vue/thread/thread-layout-measurements.js +1 -0
  213. package/dist/modules/im-chat-kit/src/vue/thread/thread-read-actions-context.js +1 -0
  214. package/dist/modules/im-chat-kit/src/vue/thread/thread-surface-context.js +1 -0
  215. package/dist/modules/im-chat-kit/src/vue/thread/thread-viewport-context.js +1 -0
  216. package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-target-group.js +1 -0
  217. package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-targets.js +1 -0
  218. package/dist/modules/im-chat-kit/src/vue/thread/use-im-thread-layout-measurement.js +1 -0
  219. package/dist/modules/im-core/src/abort.js +1 -0
  220. package/dist/modules/im-core/src/cache-namespace.js +1 -0
  221. package/dist/modules/im-core/src/connection/backoff.js +1 -0
  222. package/dist/modules/im-core/src/connection/connection-manager.js +1 -0
  223. package/dist/modules/im-core/src/connection/heartbeat-manager.js +1 -0
  224. package/dist/modules/im-core/src/conversation-identity.js +1 -0
  225. package/dist/modules/im-core/src/diagnostics.js +1 -0
  226. package/dist/modules/im-core/src/event-emitter.js +1 -0
  227. package/dist/modules/im-core/src/login/login-handler.js +1 -0
  228. package/dist/modules/im-core/src/mapping/bot-sender.js +1 -0
  229. package/dist/modules/im-core/src/mapping/call-record-body.js +1 -0
  230. package/dist/modules/im-core/src/mapping/channel-message-mapper.js +1 -0
  231. package/dist/modules/im-core/src/mapping/channel-notify-mapper.js +1 -0
  232. package/dist/modules/im-core/src/mapping/channel-offline-mapper.js +1 -0
  233. package/dist/modules/im-core/src/mapping/channel-pinned-message-mapper.js +1 -0
  234. package/dist/modules/im-core/src/mapping/channel-read-position.js +1 -0
  235. package/dist/modules/im-core/src/mapping/contact-body.js +1 -0
  236. package/dist/modules/im-core/src/mapping/content-body.js +1 -0
  237. package/dist/modules/im-core/src/mapping/conversation.js +1 -0
  238. package/dist/modules/im-core/src/mapping/crypto-batch-preparation.js +1 -0
  239. package/dist/modules/im-core/src/mapping/customer-service-body.js +1 -0
  240. package/dist/modules/im-core/src/mapping/customer-service-message-mapper.js +1 -0
  241. package/dist/modules/im-core/src/mapping/decrypt-recovery.js +1 -0
  242. package/dist/modules/im-core/src/mapping/file-body.js +1 -0
  243. package/dist/modules/im-core/src/mapping/files-album-body.js +1 -0
  244. package/dist/modules/im-core/src/mapping/game-body.js +1 -0
  245. package/dist/modules/im-core/src/mapping/gift-body.js +1 -0
  246. package/dist/modules/im-core/src/mapping/group-message-mapper.js +1 -0
  247. package/dist/modules/im-core/src/mapping/group-notify-mapper.js +1 -0
  248. package/dist/modules/im-core/src/mapping/group-offline-mapper.js +1 -0
  249. package/dist/modules/im-core/src/mapping/image-body.js +1 -0
  250. package/dist/modules/im-core/src/mapping/live-room-body.js +1 -0
  251. package/dist/modules/im-core/src/mapping/media-album-body.js +1 -0
  252. package/dist/modules/im-core/src/mapping/merge.js +1 -0
  253. package/dist/modules/im-core/src/mapping/mes-chat-mapper.js +1 -0
  254. package/dist/modules/im-core/src/mapping/message-id.js +1 -0
  255. package/dist/modules/im-core/src/mapping/message-mapper.js +1 -0
  256. package/dist/modules/im-core/src/mapping/messages-by-id.js +1 -0
  257. package/dist/modules/im-core/src/mapping/mini-program-body.js +1 -0
  258. package/dist/modules/im-core/src/mapping/offline-mapper.js +1 -0
  259. package/dist/modules/im-core/src/mapping/pinned-message-mapper.js +1 -0
  260. package/dist/modules/im-core/src/mapping/profile-mapper.js +1 -0
  261. package/dist/modules/im-core/src/mapping/reaction-mapper.js +1 -0
  262. package/dist/modules/im-core/src/mapping/recall-mapper.js +1 -0
  263. package/dist/modules/im-core/src/mapping/red-packet-body.js +1 -0
  264. package/dist/modules/im-core/src/mapping/robot-body.js +1 -0
  265. package/dist/modules/im-core/src/mapping/robot-message-mapper.js +1 -0
  266. package/dist/modules/im-core/src/mapping/search-text.js +1 -0
  267. package/dist/modules/im-core/src/mapping/session-mapper.js +1 -0
  268. package/dist/modules/im-core/src/mapping/signal-offline-mapper.js +1 -0
  269. package/dist/modules/im-core/src/mapping/sort.js +1 -0
  270. package/dist/modules/im-core/src/mapping/sticker-body.js +1 -0
  271. package/dist/modules/im-core/src/mapping/stored-message.js +1 -0
  272. package/dist/modules/im-core/src/mapping/system-event-timeline-policy.js +1 -0
  273. package/dist/modules/im-core/src/mapping/text-segments.js +1 -0
  274. package/dist/modules/im-core/src/mapping/transfer-body.js +1 -0
  275. package/dist/modules/im-core/src/mapping/transfer-status.js +1 -0
  276. package/dist/modules/im-core/src/mapping/unread-divider.js +1 -0
  277. package/dist/modules/im-core/src/mapping/video-body.js +1 -0
  278. package/dist/modules/im-core/src/mapping/voice-body.js +1 -0
  279. package/dist/modules/im-core/src/message-flow/call/direct-call-manager.js +1 -0
  280. package/dist/modules/im-core/src/message-flow/call/direct-call-record.js +1 -0
  281. package/dist/modules/im-core/src/message-flow/call/direct-p2p-call.js +1 -0
  282. package/dist/modules/im-core/src/message-flow/call/group-call-manager.js +1 -0
  283. package/dist/modules/im-core/src/message-flow/call/group-call-record.js +1 -0
  284. package/dist/modules/im-core/src/message-flow/conversation-support.js +1 -0
  285. package/dist/modules/im-core/src/message-flow/edit/edit-frame.js +1 -0
  286. package/dist/modules/im-core/src/message-flow/edit/edit-manager.js +1 -0
  287. package/dist/modules/im-core/src/message-flow/edit/edit-receive-handlers.js +1 -0
  288. package/dist/modules/im-core/src/message-flow/edit/edit-strategy.js +1 -0
  289. package/dist/modules/im-core/src/message-flow/expression/expression-message.js +1 -0
  290. package/dist/modules/im-core/src/message-flow/forward/can-transmit.js +1 -0
  291. package/dist/modules/im-core/src/message-flow/forward/forward-content-spec.js +1 -0
  292. package/dist/modules/im-core/src/message-flow/forward/forward-messages.js +1 -0
  293. package/dist/modules/im-core/src/message-flow/game/game-message.js +1 -0
  294. package/dist/modules/im-core/src/message-flow/gift/gift-message.js +1 -0
  295. package/dist/modules/im-core/src/message-flow/live-room/live-room-message.js +1 -0
  296. package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -0
  297. package/dist/modules/im-core/src/message-flow/mini-program/mini-program-message.js +1 -0
  298. package/dist/modules/im-core/src/message-flow/reaction/can-react.js +1 -0
  299. package/dist/modules/im-core/src/message-flow/reaction/reaction-manager.js +1 -0
  300. package/dist/modules/im-core/src/message-flow/reaction/reaction-receive-handlers.js +1 -0
  301. package/dist/modules/im-core/src/message-flow/read/channel-read-receive-handlers.js +1 -0
  302. package/dist/modules/im-core/src/message-flow/read/channel-read-strategy.js +1 -0
  303. package/dist/modules/im-core/src/message-flow/read/customer-service-read-strategy.js +1 -0
  304. package/dist/modules/im-core/src/message-flow/read/direct-read-sync.js +1 -0
  305. package/dist/modules/im-core/src/message-flow/read/group-read-strategy.js +1 -0
  306. package/dist/modules/im-core/src/message-flow/read/read-strategy.js +1 -0
  307. package/dist/modules/im-core/src/message-flow/read/robot-read-strategy.js +1 -0
  308. package/dist/modules/im-core/src/message-flow/recall/channel-message-deletion-manager.js +1 -0
  309. package/dist/modules/im-core/src/message-flow/recall/recall-frame.js +1 -0
  310. package/dist/modules/im-core/src/message-flow/recall/recall-manager.js +1 -0
  311. package/dist/modules/im-core/src/message-flow/recall/recall-receive-handlers.js +1 -0
  312. package/dist/modules/im-core/src/message-flow/recall/recall-strategy.js +1 -0
  313. package/dist/modules/im-core/src/message-flow/receive/channel-application-receive-handlers.js +1 -0
  314. package/dist/modules/im-core/src/message-flow/receive/channel-notify-receive-handlers.js +1 -0
  315. package/dist/modules/im-core/src/message-flow/receive/channel-receive-handlers.js +1 -0
  316. package/dist/modules/im-core/src/message-flow/receive/command-handler-registry.js +1 -0
  317. package/dist/modules/im-core/src/message-flow/receive/contact-application-answer-receive-handlers.js +1 -0
  318. package/dist/modules/im-core/src/message-flow/receive/contact-application-receive-handlers.js +1 -0
  319. package/dist/modules/im-core/src/message-flow/receive/direct-receive-handlers.js +1 -0
  320. package/dist/modules/im-core/src/message-flow/receive/friend-action-receive-handlers.js +1 -0
  321. package/dist/modules/im-core/src/message-flow/receive/group-event-receive-handlers.js +1 -0
  322. package/dist/modules/im-core/src/message-flow/receive/group-receive-handlers.js +1 -0
  323. package/dist/modules/im-core/src/message-flow/receive/mes-chat-receive-handlers.js +1 -0
  324. package/dist/modules/im-core/src/message-flow/receive/robot-receive-handlers.js +1 -0
  325. package/dist/modules/im-core/src/message-flow/receive/session-favorite-receive-handlers.js +1 -0
  326. package/dist/modules/im-core/src/message-flow/receive/wallet-notify-receive-handlers.js +1 -0
  327. package/dist/modules/im-core/src/message-flow/send/channel-outgoing-frame.js +1 -0
  328. package/dist/modules/im-core/src/message-flow/send/channel-send-strategy.js +1 -0
  329. package/dist/modules/im-core/src/message-flow/send/direct-outgoing-frame.js +1 -0
  330. package/dist/modules/im-core/src/message-flow/send/direct-send-strategy.js +1 -0
  331. package/dist/modules/im-core/src/message-flow/send/group-outgoing-frame.js +1 -0
  332. package/dist/modules/im-core/src/message-flow/send/group-send-strategy.js +1 -0
  333. package/dist/modules/im-core/src/message-flow/send/robot-outgoing-frame.js +1 -0
  334. package/dist/modules/im-core/src/message-flow/send/robot-send-strategy.js +1 -0
  335. package/dist/modules/im-core/src/message-flow/send/send-strategy-registry.js +1 -0
  336. package/dist/modules/im-core/src/message-flow/transfer/transfer-message.js +1 -0
  337. package/dist/modules/im-core/src/outbox/outbox-manager.js +1 -0
  338. package/dist/modules/im-core/src/packet-router.js +1 -0
  339. package/dist/modules/im-core/src/ports/crypto-port.js +1 -0
  340. package/dist/modules/im-core/src/ports/crypto-task-executor.js +1 -0
  341. package/dist/modules/im-core/src/ports/http-port.js +1 -0
  342. package/dist/modules/im-core/src/ports/media-asset-cache-port.js +1 -0
  343. package/dist/modules/im-core/src/push/push-registration.js +1 -0
  344. package/dist/modules/im-core/src/read/read-reporter.js +1 -0
  345. package/dist/modules/im-core/src/request-tracker.js +1 -0
  346. package/dist/modules/im-core/src/session-favorite-album.js +1 -0
  347. package/dist/modules/im-core/src/session-favorite-files.js +1 -0
  348. package/dist/modules/im-core/src/state/channel-permissions.js +1 -0
  349. package/dist/modules/im-core/src/state/channel-restriction-coordinator.js +1 -0
  350. package/dist/modules/im-core/src/state/domain-state.js +1 -0
  351. package/dist/modules/im-core/src/state/draft-store.js +1 -0
  352. package/dist/modules/im-core/src/state/group-restriction-coordinator.js +1 -0
  353. package/dist/modules/im-core/src/state/local-message-window-read-error.js +1 -0
  354. package/dist/modules/im-core/src/state/message-reactions.js +1 -0
  355. package/dist/modules/im-core/src/state/message-store.js +1 -0
  356. package/dist/modules/im-core/src/state/message-window-store.js +1 -0
  357. package/dist/modules/im-core/src/state/pinned-message-coordinator.js +1 -0
  358. package/dist/modules/im-core/src/state/pinned-message-store.js +1 -0
  359. package/dist/modules/im-core/src/state/read-store.js +1 -0
  360. package/dist/modules/im-core/src/state/session-sort.js +1 -0
  361. package/dist/modules/im-core/src/state/session-store.js +1 -0
  362. package/dist/modules/im-core/src/sync/channel-sync-checkpoint.js +1 -0
  363. package/dist/modules/im-core/src/sync/sync-manager.js +1 -0
  364. package/dist/modules/im-i18n/src/catalog/en-US.js +1 -0
  365. package/dist/modules/im-i18n/src/catalog/index.js +1 -0
  366. package/dist/modules/im-i18n/src/catalog/th-TH.js +1 -0
  367. package/dist/modules/im-i18n/src/catalog/vi-VN.js +1 -0
  368. package/dist/modules/im-i18n/src/catalog/zh-CN.js +1 -0
  369. package/dist/modules/im-i18n/src/catalog/zh-TW.js +1 -0
  370. package/dist/modules/im-i18n/src/create-im-i18n.js +1 -0
  371. package/dist/modules/im-i18n/src/format/failure.js +1 -0
  372. package/dist/modules/im-i18n/src/format/last-message.js +1 -0
  373. package/dist/modules/im-i18n/src/format/media.js +1 -0
  374. package/dist/modules/im-i18n/src/format/mention.js +1 -0
  375. package/dist/modules/im-i18n/src/format/service-text.js +1 -0
  376. package/dist/modules/im-i18n/src/format/system-message.js +1 -0
  377. package/dist/modules/im-i18n/src/internal/duration.js +1 -0
  378. package/dist/modules/im-i18n/src/internal/interpolate.js +1 -0
  379. package/dist/modules/im-i18n/src/locale.js +1 -0
  380. package/dist/modules/im-protocol/src/board-pinned-message.js +1 -0
  381. package/dist/modules/im-protocol/src/frame-codec.js +1 -0
  382. package/dist/modules/im-protocol/src/protobuf/gen/channel_pb.js +1 -0
  383. package/dist/modules/im-protocol/src/protobuf/gen/group_pb.js +1 -0
  384. package/dist/modules/im-protocol/src/protobuf/gen/im.app.msg_pb.js +1 -0
  385. package/dist/modules/im-protocol/src/protobuf/gen/im.channel_pb.js +1 -0
  386. package/dist/modules/im-protocol/src/protobuf/gen/im.group_pb.js +1 -0
  387. package/dist/modules/im-protocol/src/protobuf/gen/im.login_pb.js +1 -0
  388. package/dist/modules/im-protocol/src/protobuf/gen/im.msg_pb.js +1 -0
  389. package/dist/modules/im-protocol/src/protobuf/gen/im.pub_pb.js +1 -0
  390. package/dist/modules/im-protocol/src/protobuf/gen/im.robot_pb.js +1 -0
  391. package/dist/modules/im-protocol/src/protobuf/gen/im.sig_pb.js +1 -0
  392. package/dist/modules/im-protocol/src/protobuf/gen/msg_pb.js +1 -0
  393. package/dist/modules/im-protocol/src/protobuf/registry.js +1 -0
  394. package/dist/modules/im-sdk/src/cache-prefix-migration.js +1 -0
  395. package/dist/modules/im-sdk/src/create-im-client.js +1 -0
  396. package/dist/modules/im-sdk/src/domains/channel.js +1 -0
  397. package/dist/modules/im-sdk/src/domains/contact.js +1 -0
  398. package/dist/modules/im-sdk/src/domains/conversation.js +1 -0
  399. package/dist/modules/im-sdk/src/domains/group.js +1 -0
  400. package/dist/modules/im-sdk/src/domains/media-byte-computation.js +1 -0
  401. package/dist/modules/im-sdk/src/domains/media.js +1 -0
  402. package/dist/modules/im-sdk/src/domains/message.js +1 -0
  403. package/dist/modules/im-sdk/src/domains/pinned-message-source.js +1 -0
  404. package/dist/modules/im-sdk/src/domains/pinned-message.js +1 -0
  405. package/dist/modules/im-sdk/src/domains/session.js +1 -0
  406. package/dist/modules/im-sdk/src/product/applications.js +1 -0
  407. package/dist/modules/im-sdk/src/product/calls.js +1 -0
  408. package/dist/modules/im-sdk/src/product/capabilities.js +1 -0
  409. package/dist/modules/im-sdk/src/product/channel-mention-candidates.js +1 -0
  410. package/dist/modules/im-sdk/src/product/conversation-background.js +1 -0
  411. package/dist/modules/im-sdk/src/product/conversation-entry-unread.js +1 -0
  412. package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -0
  413. package/dist/modules/im-sdk/src/product/conversations.js +1 -0
  414. package/dist/modules/im-sdk/src/product/customer-service.js +1 -0
  415. package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -0
  416. package/dist/modules/im-sdk/src/product/diagnostics.js +1 -0
  417. package/dist/modules/im-sdk/src/product/directory.js +1 -0
  418. package/dist/modules/im-sdk/src/product/draft.js +1 -0
  419. package/dist/modules/im-sdk/src/product/emoji-catalog.js +1 -0
  420. package/dist/modules/im-sdk/src/product/emoji-catalog.json.js +1 -0
  421. package/dist/modules/im-sdk/src/product/events.js +1 -0
  422. package/dist/modules/im-sdk/src/product/expressions.js +1 -0
  423. package/dist/modules/im-sdk/src/product/face-to-face-group.js +1 -0
  424. package/dist/modules/im-sdk/src/product/group-calls.js +1 -0
  425. package/dist/modules/im-sdk/src/product/image-format.js +1 -0
  426. package/dist/modules/im-sdk/src/product/local-data.js +1 -0
  427. package/dist/modules/im-sdk/src/product/media.js +1 -0
  428. package/dist/modules/im-sdk/src/product/mention.js +1 -0
  429. package/dist/modules/im-sdk/src/product/message.js +1 -0
  430. package/dist/modules/im-sdk/src/product/messages-by-id.js +1 -0
  431. package/dist/modules/im-sdk/src/product/outbox.js +1 -0
  432. package/dist/modules/im-sdk/src/product/profiles.js +1 -0
  433. package/dist/modules/im-sdk/src/product/resource-uploader.js +1 -0
  434. package/dist/modules/im-sdk/src/product/robots.js +1 -0
  435. package/dist/modules/im-sdk/src/product/search.js +1 -0
  436. package/dist/modules/im-sdk/src/product/session-favorites.js +1 -0
  437. package/dist/modules/im-sdk/src/product/settings.js +1 -0
  438. package/dist/modules/im-sdk/src/runtime/advanced-message-diagnostics.js +1 -0
  439. package/dist/modules/im-sdk/src/runtime/channel-read-summary-refresh.js +1 -0
  440. package/dist/modules/im-sdk/src/runtime/customer-service-legacy-recovery.js +1 -0
  441. package/dist/modules/im-sdk/src/runtime/decrypt-diagnostics.js +1 -0
  442. package/dist/modules/im-sdk/src/runtime/foreground-work-coordinator.js +1 -0
  443. package/dist/modules/im-sdk/src/runtime/group-history-page-boundary.js +1 -0
  444. package/dist/modules/im-sdk/src/runtime/key-prefetch.js +1 -0
  445. package/dist/modules/im-sdk/src/runtime/local-media-preview.js +1 -0
  446. package/dist/modules/im-sdk/src/runtime/media-cache-maintenance.js +1 -0
  447. package/dist/modules/im-sdk/src/runtime/media-upload-recovery.js +1 -0
  448. package/dist/modules/im-sdk/src/runtime/protobuf-wire-shape.js +1 -0
  449. package/dist/modules/im-sdk/src/runtime/receiving-activity.js +1 -0
  450. package/dist/modules/im-sdk/src/runtime/recent-history-fetcher.js +1 -0
  451. package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -0
  452. package/dist/modules/im-sdk/src/runtime/session-http-clients.js +1 -0
  453. package/dist/modules/im-sdk/src/runtime/session-runtime.js +1 -0
  454. package/dist/modules/im-sdk/src/runtime/signal-offline-poller.js +1 -0
  455. package/dist/request-crypto.js +1 -1
  456. package/dist/sdk.d.ts +170 -111
  457. package/dist/sdk.js +1 -1
  458. package/package.json +2 -2
  459. package/dist/browser-2MUNHRDS.js +0 -1
  460. package/dist/browser-RTCHWSQ2.js +0 -2
  461. package/dist/chunk-2OCWQHFJ.js +0 -2
  462. package/dist/chunk-46ARFR7U.js +0 -8
  463. package/dist/chunk-HQDLYL3K.js +0 -2
  464. package/dist/chunk-IC6HI33O.js +0 -1
  465. package/dist/chunk-IDECJJXC.js +0 -0
  466. package/dist/chunk-J3TLOAQI.js +0 -2
  467. package/dist/chunk-Q2DEFN53.js +0 -1
  468. package/dist/chunk-SXY56EVC.js +0 -0
  469. package/dist/chunk-WL3NFQ7Y.js +0 -1
  470. package/dist/chunk-WOT6VMZA.js +0 -1
  471. package/dist/chunk-WS7BWP7C.js +0 -1
@@ -0,0 +1 @@
1
+ import{throwIfAborted as e}from"../../../im-core/src/abort.js";function r(){const r=/* @__PURE__ */new Set,o=/* @__PURE__ */new Set;let t=!1;function n(){for(const e of[...o])e()}function i(r){if(e(r),t){const e=new Error("账号已释放,后台工作停止等待");throw e.name="AbortError",e}}return{enterForeground(){if(t)return()=>{};const e=/* @__PURE__ */Symbol("foreground-work");return r.add(e),()=>{r.delete(e)&&0===r.size&&n()}},async waitForBackground(e){for(i(e);r.size>0;)await new Promise(r=>{const t=()=>{o.delete(t),e?.removeEventListener("abort",t),r()};o.add(t),e?.addEventListener("abort",t,{once:!0})}),i(e)},dispose(){t=!0,r.clear(),n()}}}export{r as createForegroundWorkCoordinator};
@@ -0,0 +1 @@
1
+ var e=Object.defineProperty,r=(r,o,t)=>((r,o,t)=>o in r?e(r,o,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[o]=t)(r,"symbol"!=typeof o?o+"":o,t);class o extends Error{constructor(e,o){super("群历史满页未提供可继续的分页位置,无法确认是否已经到达末尾"),r(this,"code","IM_SDK_HISTORY_PAGE_STALLED"),r(this,"category","protocol"),r(this,"retryable",!0),r(this,"operation"),r(this,"conversation"),this.name="GroupHistoryPageBoundaryError",this.operation="older"===o?"history.loadOlder":"history.loadNewer",this.conversation={conversationType:"group",conversationId:e}}}function t(e){if(e.batchSize<e.limit)return{exhausted:!0};const r=e.boundaryTime;if(void 0===r||!Number.isSafeInteger(r)||r<0||("older"===e.direction?r>=e.baseTime:r<=e.baseTime))throw new o(e.conversationId,e.direction);return{exhausted:!1,nextCursor:String(r)}}export{o as GroupHistoryPageBoundaryError,t as resolveGroupHistoryPageBoundary};
@@ -0,0 +1 @@
1
+ function e(e){const n=/* @__PURE__ */new Set,t=/* @__PURE__ */new Map;let r=!1;function o(){for(;!r&&t.size<2&&n.size>0;){const c=n.values().next().value;n.delete(c);const a={canceled:!1};t.set(c,a),Promise.resolve().then(()=>{if(!r&&!a.canceled)return e.fetch(c)}).catch(t=>{t instanceof Error&&"AbortError"===t.name||r||(r=!0,n.clear(),e.onError(t))}).finally(()=>{t.delete(c),o()})}}return{enqueue(e){r||t.has(e)||(n.add(e),o())},remove(e){n.delete(e);const r=t.get(e);void 0!==r&&(r.canceled=!0)},dispose(){r=!0,n.clear()}}}export{e as createKeyPrefetchQueue};
@@ -0,0 +1 @@
1
+ function e(e,t){return{prepareLocalMediaPreview:async i=>{const a=await e.prepare({operationId:i.operationId,generation:t(),kind:i.kind,file:i.file,includePoster:"video"===i.kind,..."video"===i.kind&&i.includeDisplayPoster?{includeDisplayPoster:!0}:{},..."video"===i.kind?{maxSize:320,targetBytes:10240,maxBytes:16384,quality:.84,minQuality:.68}:{}},i.signal);return"video"===i.kind?{width:a.width,height:a.height,...void 0===a.duration?{}:{duration:a.duration},...void 0===a.posterData?{}:{posterData:new Uint8Array(a.posterData)},...void 0===a.displayPosterData?{}:{displayPosterData:new Uint8Array(a.displayPosterData)}}:{width:a.width,height:a.height}},prepareLocalVideoPoster:async i=>{const a=await e.prepare({operationId:i.operationId,generation:t(),kind:"video",file:i.file,includePoster:!0,maxSize:960,targetBytes:163840,maxBytes:262144,quality:.9,minQuality:.8},i.signal);return{width:a.width,height:a.height,...void 0===a.posterData?{}:{posterData:new Uint8Array(a.posterData)}}},prepareLocalImageThumbnail:async i=>{const a=await e.prepare({operationId:i.operationId,generation:t(),kind:"image",file:i.file,includePoster:!0,maxSize:256,targetBytes:262144,maxBytes:262144,quality:.9,minQuality:.9},i.signal);return{width:a.width,height:a.height,...void 0===a.posterData?{}:{posterData:new Uint8Array(a.posterData)}}}}}export{e as createLocalMediaPreviewPreparation};
@@ -0,0 +1 @@
1
+ function e(e){let i,t,r=!1,n=!1;function a(){return r&&!n&&e.isActive()?(t??(t=Promise.resolve().then(async()=>{!n&&e.isActive()&&await e.maintain()}).catch(i=>{!n&&e.isActive()&&e.onError(i)}).finally(()=>{t=void 0})),t):Promise.resolve()}return{start(){r||n||(r=!0,i=setInterval(()=>{a()},3e5),a())},run:a,async dispose(){n=!0,void 0!==i&&clearInterval(i),i=void 0,await t}}}export{e as createMediaCacheMaintenance};
@@ -0,0 +1 @@
1
+ import{MediaUploadRecoveryError as e}from"../../../im-browser/src/media/media-upload-recovery-codec.js";import{createBrowserMediaUploadRecovery as a}from"../../../im-browser/src/media/media-upload-recovery-store.js";function r(r){let n,t,o=!1,i=!1;const s=new AbortController;function c(){if(!n||!i||o)throw new e("unavailable");return n}return{port:{get:async(...e)=>c().get(...e),list:async()=>c().list(),save:async e=>c().save(e),remove:async(...e)=>c().remove(...e),clear:async()=>c().clear(),drain:async()=>n?.drain(),fingerprint:async(...e)=>c().fingerprint(...e),acquireLease:async e=>c().acquireLease(e),close:async()=>n?.close()},prepare:c=>o?Promise.reject(new e("unavailable")):(t??(t=(async()=>{n=a({namespaceFactory:r,accountId:c}),await n.acquireLease(s.signal),await n.list(),s.signal.throwIfAborted(),i=!0})()),t),async prune(){i&&!o&&await c().list()},async dispose(e){if(o=!0,s.abort(),await(t?.catch(()=>{})),n)try{e||await n.clear()}finally{await n.close()}}}}function n(e){let a=e;const r=/* @__PURE__ */new Set;return{setOnline(e){if(a=e,a)for(const e of[...r])e()},wait:e=>(e.throwIfAborted(),a?Promise.resolve():new Promise((a,n)=>{function t(){r.delete(o),e.removeEventListener("abort",i)}function o(){t(),a()}function i(){t(),n(e.reason)}r.add(o),e.addEventListener("abort",i,{once:!0})}))}}export{r as createAccountMediaUploadRecovery,n as createMediaOnlineWaiter};
@@ -0,0 +1 @@
1
+ function t(t){function e(e){let n=0n;for(let i=0;i<10;i++){const r=e+i,u=t[r];if(void 0===u)return{ok:!1,kind:"truncated-varint"};if(n|=BigInt(127&u)<<BigInt(7*i),!(128&u))return{ok:!0,nextOffset:r+1,value:n}}return{ok:!1,kind:"invalid-varint"}}const n=[];let i,r=0;function u(e,r,u){return{protobufWireStatus:e,protobufFieldNumbers:n,...void 0===i?{}:{protobufLastCompleteFieldNumber:i},protobufFailureKind:r,protobufFailureOffset:u,protobufBytesRemaining:Math.max(0,t.length-u)}}function a(t){n.length<32&&!n.includes(t)&&n.push(t),i=t}for(;r<t.length;){const n=r,i=e(n);if(!i.ok)return u("truncated-varint"===i.kind?"truncated":"invalid","truncated-varint"===i.kind?"truncated-tag":i.kind,n);const d=Number(i.value>>3n),o=Number(0x07n&i.value);if(!Number.isSafeInteger(d)||d<=0)return u("invalid","invalid-field-number",n);if(r=i.nextOffset,0===o){const t=r,n=e(t);if(!n.ok)return u("truncated-varint"===n.kind?"truncated":"invalid",n.kind,t);r=n.nextOffset}else if(1===o){if(t.length-r<8)return u("truncated","truncated-fixed64",r);r+=8}else if(2===o){const n=r,i=e(n);if(!i.ok)return u("truncated-varint"===i.kind?"truncated":"invalid","truncated-varint"===i.kind?"truncated-length":i.kind,n);if(i.value>BigInt(Number.MAX_SAFE_INTEGER))return u("invalid","invalid-varint",n);r=i.nextOffset;const a=Number(i.value);if(a>t.length-r)return u("truncated","truncated-length-delimited",r);r+=a}else{if(5!==o)return u("invalid","invalid-wire-type",n);if(t.length-r<4)return u("truncated","truncated-fixed32",r);r+=4}a(d)}return{protobufWireStatus:"complete",protobufFieldNumbers:n,...void 0===i?{}:{protobufLastCompleteFieldNumber:i}}}export{t as inspectProtobufWireShape};
@@ -0,0 +1 @@
1
+ function e(e){const n=/* @__PURE__ */new Set;let t=!1;return{get receiving(){return n.size>0},begin(){if(t)return()=>{};const i=/* @__PURE__ */Symbol("receiving");return n.add(i),1===n.size&&e(!0),()=>{n.delete(i)&&0===n.size&&e(!1)}},dispose(){t=!0;const i=n.size>0;n.clear(),i&&e(!1)}}}export{e as createReceivingActivity};
@@ -0,0 +1 @@
1
+ import{resolveGroupHistoryPageBoundary as e}from"./group-history-page-boundary.js";import{throwIfAborted as r}from"../../../im-core/src/abort.js";import{pullGroupHistory as o}from"../../../im-browser/src/http/requests/pull-offline-group.js";import{pullChannelLatestPage as t}from"../../../im-browser/src/http/requests/pull-offline-channel.js";import{yieldToBrowser as s}from"../../../im-browser/src/scheduling/yield-to-browser.js";function n(n){return async(i,p)=>{r(p);const a="group"===i.conversationType?n.groupAsyncDecrypt?.({conversationType:"group",conversationId:i.conversationId},p):void 0;a?.assertCurrent?.();const c=await n.authProvider.getLoginContext();if(r(p),null===c)throw new Error("最近历史请求缺少当前账号");n.assertLoginContext?.(c.userId),a?.assertCurrent?.();const u=[],y=[],d=e=>{y.push({...e,source:"history"})},l=e=>{u.push(e)};if("group"===i.conversationType){const t={...n.groupDecrypt(),onDecryptRecovery:d},m=Date.now(),g=await o({asyncDecrypt:a,http:n.http,userId:c.userId,clientType:n.clientType,groupId:i.conversationId,baseTime:m,direct:1,limit:30,decryptDeps:t,prepareKeys:e=>n.prepareGroupKeys(e,{signal:p,priority:n.keyPriority?.(i)??"foreground"}),onReaction:l,signal:p,keepRaw:!1,yieldToEventLoop:s});r(p),a?.assertCurrent?.();const h=e({conversationId:i.conversationId,direction:"older",baseTime:m,batchSize:g.batchSize,boundaryTime:g.oldestEntryTime,limit:30});return{messages:g.messages,reactions:u,recoveries:y,...h}}const m={...n.channelDecrypt(),onDecryptRecovery:d},g=await t({http:n.http,userId:c.userId,clientType:n.clientType,channelId:i.conversationId,count:30,decryptDeps:m,prepareKey:e=>n.prepareChannelKeys([e],{signal:p,priority:n.keyPriority?.(i)??"foreground"}),onReaction:l,signal:p,keepRaw:!1,yieldToEventLoop:s});return r(p),{messages:g.messages,reactions:u,recoveries:y,exhausted:!g.hasOlder,...void 0===g.nextCursor?{}:{nextCursor:g.nextCursor}}}}export{n as createRecentHistoryFetcher};
@@ -0,0 +1 @@
1
+ var e=Object.defineProperty,t=(t,r,n)=>((t,r,n)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n)(t,"symbol"!=typeof r?r+"":r,n);import{createImSdkError as r}from"../product/message.js";import{encodeConversationKey as n}from"../../../im-core/src/conversation-identity.js";const o=2097152;class a extends Error{constructor(e){super(e),t(this,"reason"),this.reason=e}}function s(){return Object.assign(new Error("最近历史请求已取消"),{name:"AbortError"})}function i(e){const t=e.now??Date.now,i=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map,d=/* @__PURE__ */new Map,u=/* @__PURE__ */new Map;let l,f=!0,g=0;const p=/* @__PURE__ */new WeakMap,h=/* @__PURE__ */new WeakSet,v=/* @__PURE__ */new WeakMap;let y=0,b=Promise.resolve();function w(t,r,n){try{e.report(t,{...r},{remainingNetworkPages:Math.max(0,20-y),...n})}catch{}}function m(e,r=t()){return void 0===e?0:Math.max(0,r-e)}function k(e,t,r,n){const o=n?.diagnostics;w("recent-history-prefetch-result",e,{status:t,reason:r,queueDurationMs:m(o?.queuedAt,o?.startedAt),requestDurationMs:o?.requestDurationMs??m(o?.requestStartedAt),persistenceDurationMs:o?.persistenceDurationMs??m(o?.persistenceStartedAt)})}function E(e){const t=b.then(e,e);return b=t.catch(()=>{}),t}function A(t){if(!f||t.generation!==g||t.controller.signal.aborted||t.epoch!==(i.get(t.key)??0))return!1;const r=e.fingerprint(t.ref);return void 0!==r&&(r===t.fingerprint||!M(t)&&[...t.consumers.values()].includes("foreground"))}function M(e){return e.cacheRevision===(c.get(e.key)??0)}function T(e){if(!A(e))throw s()}async function j(r,o=!1){const a=n(r),s=i.get(a)??0,d={key:a,epoch:s,generation:g,cacheRevision:c.get(a)??0},u=g,l=e.fingerprint(r),h=e=>(w("recent-history-cache-miss",r,{reason:e,allowStale:o}),null);if(!f||void 0===l||void 0===e.cache)return h(f?void 0===l?"unavailable":"storage-unavailable":"disposed");if(await b,!f||u!==g||s!==(i.get(a)??0)||!M(d)||e.fingerprint(r)!==l)return h("invalidated");const v=await e.cache.get(r);return f&&u===g&&s===(i.get(a)??0)&&M(d)&&e.fingerprint(r)===l?null===v?h("empty"):2!==v.version?h("version-mismatch"):n(v.conversation)!==a?h("identity-mismatch"):v.fingerprint!==l?h("fingerprint-mismatch"):v.fetchedAt>t()?h("future-timestamp"):t()-v.fetchedAt>(o?864e5:3e5)?h("expired"):(p.set(v,d),v):h("invalidated")}async function q(r){T(r);try{const e=await j(r.ref);if(T(r),null!==e&&M(r))return r.diagnostics.source="cache",w("recent-history-cache-hit",r.ref),{page:e,durable:!0}}catch(e){if(T(r),r.diagnostics.failureReason="cache-read-failed",w("recent-history-cache-read-failed",r.ref,{reason:"cache-read-failed"}),![...r.consumers.values()].includes("foreground"))throw e}if(![...r.consumers.values()].includes("foreground")){if(y>=20)throw new a("budget");y+=1}const n=t();let s;r.diagnostics.source="network",r.diagnostics.requestStartedAt=n;try{s=await e.fetchPage(r.ref,r.controller.signal)}catch(e){throw r.diagnostics.failureReason="request-failed",e}finally{r.diagnostics.requestDurationMs=m(n)}T(r),await e.yieldToEventLoop(),T(r);const i={version:2,conversation:{...r.ref},fetchedAt:t(),fingerprint:r.fingerprint,messages:s.messages,reactions:s.reactions,exhausted:s.exhausted,...void 0===s.nextCursor?{}:{nextCursor:s.nextCursor},byteLength:0};if(p.set(i,{key:r.key,epoch:r.epoch,generation:r.generation,cacheRevision:r.cacheRevision}),void 0!==s.recoveries&&s.recoveries.length>0&&v.set(i,s.recoveries),v.has(i)||i.messages.some(e=>!0===e.encryption.decryptFailed))return h.add(i),{page:i,durable:!1,reason:"decrypt-failed"};if(i.byteLength=await async function(e,t){const r=new TextEncoder,n=/* @__PURE__ */new WeakSet;let a=0,s=0,i=performance.now();async function c(){++s%64==0&&performance.now()-i>=4&&(await t(),i=performance.now())}return await async function e(t){if(!(a>o))if(await c(),"string"==typeof t){a+=8;for(let e=0;e<t.length&&a<=o;e+=16384)a+=r.encode(t.slice(e,e+16384)).byteLength,await c()}else if(null!==t&&"object"==typeof t){if(n.has(t))return;if(n.add(t),a+=32,ArrayBuffer.isView(t)||t instanceof ArrayBuffer)return void(a+=t.byteLength);for(const r in t)if(Object.hasOwn(t,r)&&(await e(r),await e(t[r]),a>o))break}else a+=8}(e),a}(i,e.yieldToEventLoop),T(r),w("recent-history-page-loaded",r.ref,{durationMs:t()-n,messageCount:i.messages.length,byteLength:i.byteLength}),i.byteLength>o)return{page:i,durable:!1,reason:"page-too-large"};if(void 0===e.cache)return{page:i,durable:!1,reason:"storage-unavailable"};if(!M(r))return{page:i,durable:!1,reason:"invalidated"};r.diagnostics.persistenceStartedAt=t();try{const t=await E(async()=>(T(r),!!M(r)&&e.cache.put(i)));return T(r),M(r)?{page:i,durable:t,...t?{}:{reason:"page-too-large"}}:{page:i,durable:!1,reason:"invalidated"}}catch(e){return T(r),r.diagnostics.failureReason="cache-write-failed",w("recent-history-cache-write-failed",r.ref,{reason:"cache-write-failed"}),{page:i,durable:!1,storageError:e}}finally{r.diagnostics.persistenceDurationMs=m(r.diagnostics.persistenceStartedAt)}}function L(r,n){r.started||(r.started=!0,r.diagnostics.startedAt=t(),w("recent-history-prefetch-start",r.ref,{kind:n?"background":"foreground",queueDurationMs:m(r.diagnostics.queuedAt,r.diagnostics.startedAt)}),n&&(l=r),q(r).then(r.resolve,r.reject).finally(async()=>{d.get(r.key)===r&&d.delete(r.key),l===r&&(l=void 0),await e.yieldToEventLoop(),R()}).catch(e=>{if(!(e instanceof Error&&"AbortError"===e.name))throw e}))}function R(){if(!f||void 0!==l||u.size>0||!e.canRunBackground())return;const t=[...d.values()].find(e=>!e.started&&e.consumers.size>0);void 0!==t&&L(t,!0)}function S(r,o,u){if(!f||!0===u?.aborted)return"background"===o&&k(r,"cancelled","cancelled"),Promise.reject(s());const l=n(r),p=e.fingerprint(r);if(void 0===p)return"background"===o&&k(r,"skipped","unavailable"),Promise.reject(new a("unavailable"));let h=d.get(l);void 0===h||A(h)||(h.controller.abort(),h.reject(s()),d.delete(l),h=void 0);const v=void 0!==h;if(void 0===h){let e,n;const o=new Promise((t,r)=>{e=t,n=r});h={ref:{...r},key:l,fingerprint:p,generation:g,epoch:i.get(l)??0,cacheRevision:c.get(l)??0,controller:new AbortController,consumers:/* @__PURE__ */new Map,started:!1,promise:o,resolve:e,reject:n,diagnostics:{queuedAt:t()}},d.set(l,h)}const y=h,b=Symbol(o);y.consumers.set(b,o),"background"===o&&w("recent-history-prefetch-queued",r,{reason:v?"shared-request":"new-request"});const m=new Promise((e,t)=>{let n=!1;const i=(i,l)=>{n||(n=!0,i?.durable&&!M(y)&&(i={...i,durable:!1,reason:"invalidated"}),u?.removeEventListener("abort",c),y.consumers.delete(b),0===y.consumers.size&&(y.controller.abort(),y.started||(d.get(y.key)===y&&d.delete(y.key),y.reject(s()))),"background"===o&&(l instanceof a?k(r,"skipped",l.reason,y):l instanceof Error&&"AbortError"===l.name?k(r,"cancelled","cancelled",y):void 0!==l||void 0!==i?.storageError?k(r,"failed",y.diagnostics.failureReason??"request-failed",y):!0===i?.durable?k(r,"ready","cache"===y.diagnostics.source?"cache-hit":"persisted",y):k(r,"skipped",i?.reason??"not-persisted",y)),void 0!==l?t(l):e(i))};function c(){i(void 0,s())}u?.addEventListener("abort",c,{once:!0}),y.promise.then(e=>i(e),e=>i(void 0,e))});return"foreground"===o?L(y,!1):R(),m}function x(t,r={}){if(!f||"group"!==t.conversationType&&"channel"!==t.conversationType)return;const o={...t,conversationType:t.conversationType},a=n(t);c.set(a,(c.get(a)??0)+1),r.preserveForeground||i.set(a,(i.get(a)??0)+1);const u=d.get(a);r.preserveForeground&&u&&[...u.consumers.values()].includes("foreground")||(u?.reject(r.reason??s()),u?.controller.abort(r.reason),d.delete(a)),w("recent-history-cache-invalidated",o,{reason:r.preserveForeground?"cache-only-invalidation":"explicit-invalidation"}),E(async()=>e.cache?.delete(o)).catch(()=>w("recent-history-cache-delete-failed",o,{reason:"cache-delete-failed"}))}function D(e){const t=p.get(e);return f&&void 0!==t&&t.generation===g&&t.epoch===(i.get(t.key)??0)}return{readCached:j,isPageCurrent:D,enterForeground:function(t){const r=n(t);u.set(r,(u.get(r)??0)+1),e.onForeground?.(t),void 0===l||l.key===r||[...l.consumers.values()].includes("foreground")||(l.controller.abort(),l.reject(s()));let o=!1;return()=>{if(o)return;o=!0;const e=(u.get(r)??1)-1;e>0?u.set(r,e):u.delete(r),R()}},hasForeground:e=>(u.get(n(e))??0)>0,invalidate:x,notifySchedulingChanged:R,takeRecoveries(e){if(!D(e))return[];const t=v.get(e)??[];return v.delete(e),t},async confirmConsumed(t){const r=e.fingerprint(t.conversation),a=p.get(t);if(!D(t)||void 0===a||!M(a)||h.has(t)||void 0===r||void 0===e.cache||r===t.fingerprint||t.byteLength>o||t.messages.some(e=>!0===e.encryption.decryptFailed))return;const s=n(t.conversation),c=i.get(s)??0;await E(async()=>{D(t)&&M(a)&&c===(i.get(s)??0)&&e.fingerprint(t.conversation)===r&&await e.cache.put({...t,fingerprint:r})}).catch(()=>w("recent-history-cache-write-failed",t.conversation,{reason:"cache-write-failed"}))},latest:async(e,t)=>(await S(e,"foreground",t)).page,async prefetchRecent(t,n={}){const o=[];for(const[s,i]of t.entries())if(s>0&&s%16==0&&await e.yieldToEventLoop(),!0!==n.signal?.aborted&&f)if("direct"!==i.conversationType&&"robot"!==i.conversationType&&"customerService"!==i.conversationType)if(void 0!==e.cache)try{const e=await S({...i,conversationType:i.conversationType},"background",n.signal);if(void 0!==e.storageError)throw e.storageError;o.push({ref:i,status:e.durable?"ready":"skipped",...void 0===e.reason?{}:{reason:e.reason}})}catch(e){e instanceof a?o.push({ref:i,status:"skipped",reason:e.reason}):e instanceof Error&&"AbortError"===e.name?o.push({ref:i,status:"cancelled",reason:"cancelled"}):(w("recent-history-prefetch-failed",i,{reason:"prefetch-failed"}),o.push({ref:i,status:"failed",error:r({code:"IM_SDK_HISTORY_PREFETCH_FAILED",category:"state",operation:"conversations.prefetchRecent",retryable:!0,conversation:i,cause:e})}))}else k(i,"skipped","storage-unavailable"),o.push({ref:i,status:"skipped",reason:"storage-unavailable"});else k(i,"skipped","unsupported"),o.push({ref:i,status:"skipped",reason:"unsupported"});else k(i,"cancelled","cancelled"),o.push({ref:i,status:"cancelled",reason:"cancelled"});return o},dispose(){f=!1;for(const e of d.values())e.controller.abort(),e.reject(s());return d.clear(),b.then(()=>{})},async clear(){if(f){g+=1;for(const e of[...d.values()])x(e.ref);await E(async()=>e.cache?.clear())}}}}export{i as createRecentHistoryPrefetch};
@@ -0,0 +1 @@
1
+ import{createImSdkError as t}from"../product/message.js";import{ImHttpRequestError as e}from"../../../im-core/src/ports/http-port.js";import{createCmHttpAdapter as o}from"../../../im-browser/src/http/cm-http-adapter.js";function r(r){function n(t,e){return i(),globalThis.fetch(t,e)}function i(){if(!r.isActive())throw t({code:"IM_SDK_HTTP_RUNTIME_RELEASED",category:"state",operation:"http.request",retryable:!1})}if(void 0===r.onRequestError){const t=r.coreClient,e=r.http??(s=r.authProvider.getLoginContext,o({getBaseUrl:()=>r.endpointProvider.getCmHttpBaseUrl(),getAuth:s,getClientType:()=>r.clientType,fetch:n}));return{coreClient:void 0===t?void 0:async(e,o)=>{i();const r=await t(e,o);return i(),r},http:{async postProtobuf(t){i();const o=await e.postProtobuf(t);return i(),o}}}}var s;async function a(t,e,o){if(r.isActive()&&!o?.aborted&&e?.userId&&e.token)try{const n=await r.authProvider.getLoginContext();if(!r.isActive()||o?.aborted||n?.userId!==e.userId||n.token!==e.token)return;Promise.resolve(r.onRequestError?.(Object.freeze(t))).catch(r.onHandlerError)}catch(t){r.onHandlerError(t)}}async function c(){const t=await r.authProvider.getLoginContext();return i(),null===t?null:{...t}}const p=r.coreClient;return{coreClient:void 0===p?void 0:async(e,o)=>{const r=await c();let n;const s=await p(e,{...o,token:r?.token??"",skipBusinessResponseHandler:!0,onResponse:t=>{n=t}});if(i(),void 0===n)throw t({code:"IM_SDK_HTTP_OBSERVATION_UNAVAILABLE",category:"contract",operation:"http.observe",retryable:!1});const u=function(t){const{transportStatus:e,httpStatus:o,businessCode:r}=t,n="http_error"===e?"http":"network_error"===e?"network":"invalid_response"===e||void 0===r?"invalid-response":void 0!==r&&200!==r?"business":void 0;return void 0===n?void 0:Object.freeze({service:"core",kind:n,...void 0===o?{}:{httpStatus:o},...void 0===r?{}:{businessCode:r}})}(n);return void 0!==u&&await a(u,r,o?.signal),s},http:{async postProtobuf(t){const s=await c(),p=void 0===r.http?await r.endpointProvider.getCmHttpBaseUrl():void 0;if(""===p)throw new Error("CmHttp.postProtobuf:缺少 CM HTTP 基址(getCmHttpBaseUrl 为空)");const u=r.http??o({getBaseUrl:()=>p,getAuth:async()=>s,getClientType:()=>r.clientType,fetch:n});try{i();const e=await u.postProtobuf(t);return i(),e}catch(o){throw await a(o instanceof e?{service:"cm",kind:"http",httpStatus:o.status}:{service:"cm",kind:"network"},s,t.signal),o}}}}}export{r as createSessionHttpClients};
@@ -0,0 +1 @@
1
+ import{createChannelPinnedRuntime as e,createChannelApi as t,createChannelLegacyMessageRepair as r,isChannelHistoryBlocked as o,createChannelOperationsRuntime as n}from"../domains/channel.js";import{createContactApi as s}from"../domains/contact.js";import{createConversationsApi as a,createConversationInputResolver as i}from"../domains/conversation.js";import{createGroupPinnedRuntime as c,createGroupApi as d}from"../domains/group.js";import{createMediaUploadComputation as p}from"../domains/media-byte-computation.js";import{createMessageOperationsRuntime as l}from"../domains/message.js";import{createConnectionApi as u}from"../domains/session.js";import{createApplicationsRuntime as m}from"../product/applications.js";import{createDirectCallsApi as v}from"../product/calls.js";import{createChannelMentionCandidatesRuntime as y}from"../product/channel-mention-candidates.js";import{createConversationBackgroundRuntime as g}from"../product/conversation-background.js";import{createRobotConversationHandle as f,createCustomerServiceConversationHandle as h,createChannelConversationHandle as I,createGroupConversationHandle as w,createDirectConversationHandle as C,linkConversationHandleDomainAccess as b}from"../product/conversation-handle.js";import{createCustomerServiceApi as S,createCustomerServiceError as T}from"../product/customer-service.js";import{createSdkDiagnosticWriter as E,toImDiagnosticMessage as M}from"../product/diagnostics.js";import{createDirectoryRuntime as R}from"../product/directory.js";import{createDraftsRuntime as k}from"../product/draft.js";import{isImReactionEmojiToken as x}from"../product/emoji-catalog.js";import{createExpressionsRuntime as D}from"../product/expressions.js";import{createGroupCallsApi as P}from"../product/group-calls.js";import{createLocalDataRuntime as A}from"../product/local-data.js";import{createDefaultMediaAssetCacheStrategyRegistry as j,createMediaTasksRuntime as O}from"../product/media.js";import{createImSdkError as _}from"../product/message.js";import{fetchMessagesByIdWithCaseVariants as N}from"../product/messages-by-id.js";import{createOutboxRuntime as L}from"../product/outbox.js";import{createRobotDirectoryRuntime as K}from"../product/robots.js";import{createSearchRuntime as F}from"../product/search.js";import{createSessionFavoritesRuntime as U}from"../product/session-favorites.js";import{createImSettingsRuntime as B}from"../product/settings.js";import{createChannelReadSummaryRefresh as G}from"./channel-read-summary-refresh.js";import{createCustomerServiceLegacyRecovery as V}from"./customer-service-legacy-recovery.js";import{recordDecryptFailedDiagnostic as H}from"./decrypt-diagnostics.js";import{createForegroundWorkCoordinator as $}from"./foreground-work-coordinator.js";import{resolveGroupHistoryPageBoundary as q}from"./group-history-page-boundary.js";import{createKeyPrefetchQueue as W}from"./key-prefetch.js";import{createLocalMediaPreviewPreparation as z}from"./local-media-preview.js";import{createMediaCacheMaintenance as J}from"./media-cache-maintenance.js";import{createAccountMediaUploadRecovery as Q,createMediaOnlineWaiter as Y}from"./media-upload-recovery.js";import{inspectProtobufWireShape as X}from"./protobuf-wire-shape.js";import{createReceivingActivity as Z}from"./receiving-activity.js";import{createRecentHistoryFetcher as ee}from"./recent-history-fetcher.js";import{createRecentHistoryPrefetch as te}from"./recent-history-prefetch.js";import{createSessionHttpClients as re}from"./session-http-clients.js";import{createSignalOfflinePoller as oe}from"./signal-offline-poller.js";import{createWsTransport as ne}from"../../../im-browser/src/transport/ws-transport.js";import{createIndexedDbStorageAdapter as se,deleteIndexedDbNamespace as ae}from"../../../im-browser/src/storage/indexed-db-storage-adapter.js";import{createProfileHttpAdapter as ie}from"../../../im-browser/src/http/profile-http-adapter.js";import{createChannelHttpAdapter as ce,ChannelHttpError as de,ChannelProfileMappingError as pe}from"../../../im-browser/src/http/channel-http-adapter.js";import{createChannelMemberHttpAdapter as le}from"../../../im-browser/src/http/channel-member-http-adapter.js";import{createChannelMentionMemberHttpAdapter as ue}from"../../../im-browser/src/http/channel-mention-member-http-adapter.js";import{createDirectoryHttpAdapter as me}from"../../../im-browser/src/http/directory-http-adapter.js";import{createExpressionHttpAdapter as ve}from"../../../im-browser/src/http/expression-http-adapter.js";import{createSessionFavoriteHttpAdapter as ye}from"../../../im-browser/src/http/session-favorite-http-adapter.js";import{createChannelJoinApplicationHttpAdapter as ge}from"../../../im-browser/src/http/channel-join-application-http-adapter.js";import{createContactApplicationHttpAdapter as fe,createGroupApplicationHttpAdapter as he}from"../../../im-browser/src/http/application-http-adapters.js";import{createDomainState as Ie}from"../../../im-core/src/state/domain-state.js";import{encodeConversationKey as we}from"../../../im-core/src/conversation-identity.js";import{createNetworkMonitor as Ce}from"../../../im-browser/src/network/network-monitor.js";import{createCryptoTaskExecutor as be}from"../../../im-browser/src/crypto/crypto-task-executor.js";import{createMediaTransferAdapter as Se}from"../../../im-browser/src/media/media-transfer-adapter.js";import{createMediaPreviewPreparationExecutor as Te}from"../../../im-browser/src/media/media-preview-preparation-executor.js";import{createChannelKeyService as Ee}from"../../../im-browser/src/crypto/channel-key-service.js";import{createSendStrategyRegistry as Me}from"../../../im-core/src/message-flow/send/send-strategy-registry.js";import{createDirectSendStrategy as Re}from"../../../im-core/src/message-flow/send/direct-send-strategy.js";import{createGroupSendStrategy as ke}from"../../../im-core/src/message-flow/send/group-send-strategy.js";import{createChannelSendStrategy as xe}from"../../../im-core/src/message-flow/send/channel-send-strategy.js";import{createRobotSendStrategy as De}from"../../../im-core/src/message-flow/send/robot-send-strategy.js";import{createRecallStrategyRegistry as Pe,createDirectRecallStrategy as Ae,createGroupRecallStrategy as je,createChannelRecallStrategy as Oe}from"../../../im-core/src/message-flow/recall/recall-strategy.js";import{createEditStrategyRegistry as _e,createDirectEditStrategy as Ne,createGroupEditStrategy as Le,createChannelEditStrategy as Ke}from"../../../im-core/src/message-flow/edit/edit-strategy.js";import{createReactionReceiveHandlers as Fe}from"../../../im-core/src/message-flow/reaction/reaction-receive-handlers.js";import{createGroupReceiveHandlers as Ue}from"../../../im-core/src/message-flow/receive/group-receive-handlers.js";import{createChannelReceiveHandlers as Be}from"../../../im-core/src/message-flow/receive/channel-receive-handlers.js";import{createRobotReceiveHandlers as Ge}from"../../../im-core/src/message-flow/receive/robot-receive-handlers.js";import{createChannelNotifyReceiveHandlers as Ve}from"../../../im-core/src/message-flow/receive/channel-notify-receive-handlers.js";import{createChannelApplicationReceiveHandlers as He}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{createImConnection as rt}from"../../../im-core/src/connection/connection-manager.js";import{createBrowserConnectionOwnership as ot}from"../../../im-browser/src/network/browser-connection-ownership.js";import{CmdId as nt}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{createGroupRestrictionCoordinator as st}from"../../../im-core/src/state/group-restriction-coordinator.js";import{createChannelRestrictionCoordinator as at}from"../../../im-core/src/state/channel-restriction-coordinator.js";import{resolveMediaUploadPlan as it}from"../../../im-browser/src/media/media-transfer-policy.js";import{resolveChannelAccess as ct}from"../../../im-core/src/state/channel-permissions.js";import{createGroupReadStrategy as dt}from"../../../im-core/src/message-flow/read/group-read-strategy.js";import{createRobotReadStrategy as pt}from"../../../im-core/src/message-flow/read/robot-read-strategy.js";import{createCustomerServiceReadStrategy as lt}from"../../../im-core/src/message-flow/read/customer-service-read-strategy.js";import{createMediaPreviewAdapter as ut}from"../../../im-browser/src/media/media-preview-adapter.js";import{isCryptoExecutionError as mt,CryptoExecutionError as vt}from"../../../im-core/src/ports/crypto-task-executor.js";import{createRsaTeaCryptoAdapter as yt}from"../../../im-browser/src/crypto/rsa-tea-crypto-adapter.js";import{createImDiagnosticLogger as gt}from"../../../im-core/src/diagnostics.js";import{createPeerPublicKeyService as ft}from"../../../im-browser/src/crypto/peer-public-key-service.js";import{getChannelSecretKey as ht}from"../../../im-browser/src/http/requests/get-channel-secret-key.js";import{createEncryptKeyService as It}from"../../../im-browser/src/crypto/encrypt-key-service.js";import{pullOfflineInboundChat as wt,pullOfflineOwnerChat as Ct,pullOfflineInboundChatBatch as bt,pullOfflineOwnerChatBatch as St}from"../../../im-browser/src/http/requests/pull-offline-chat.js";import{createReactionManager as Tt}from"../../../im-core/src/message-flow/reaction/reaction-manager.js";import{throwIfAborted as Et}from"../../../im-core/src/abort.js";import{pullChannelMessageContext as Mt}from"../../../im-browser/src/http/requests/channel-message-context.js";import{pullGroupMessagesById as Rt,pullDirectMessagesById as kt,pullChannelMessagesById as xt}from"../../../im-browser/src/http/requests/pull-messages-by-id.js";import{createChannelReadStrategy as Dt}from"../../../im-core/src/message-flow/read/channel-read-strategy.js";import{createGroupKeyService as Pt}from"../../../im-browser/src/crypto/group-key-service.js";import{pullOfflineGroupSession as At,pullGroupHistory as jt,pullOfflineGroupBatch as Ot}from"../../../im-browser/src/http/requests/pull-offline-group.js";import{assertOfflineChatBatchComplete as _t}from"../../../im-core/src/mapping/offline-mapper.js";import{createSyncManager as Nt}from"../../../im-core/src/sync/sync-manager.js";import{yieldToBrowser as Lt}from"../../../im-browser/src/scheduling/yield-to-browser.js";import{resolveGroupRestriction as Kt}from"../../../im-core/src/mapping/group-notify-mapper.js";import{bContentCodec as Ft,bMessageCodec as Ut}from"../../../im-protocol/src/protobuf/registry.js";import{mapIncomingChannelNotify as Bt}from"../../../im-core/src/mapping/channel-notify-mapper.js";import{recoverDecryptedMessage as Gt}from"../../../im-core/src/mapping/decrypt-recovery.js";import{isMessageEqual as Vt}from"../../../im-core/src/mapping/merge.js";import{pullChannelSessions as Ht,pullChannelOfflineMessages as $t,pullChannelLatestPage as qt,pullChannelHistory as Wt}from"../../../im-browser/src/http/requests/pull-offline-channel.js";import{parseChannelSyncCheckpoint as zt,channelSyncCheckpointKey as Jt}from"../../../im-core/src/sync/channel-sync-checkpoint.js";import{requestRobotMenuReply as Qt}from"../../../im-browser/src/http/requests/robot-menu-reply.js";import{mapIncomingRobotFixedChat as Yt}from"../../../im-core/src/mapping/robot-message-mapper.js";import{getRobotChatMenus as Xt,confirmRobotChat as Zt,getRobotProfile as er}from"../../../im-browser/src/http/requests/robot-profile.js";import{unbindRobotFromConversation as tr,bindRobotToConversation as rr}from"../../../im-browser/src/http/requests/bind-robot-conversation.js";import{searchRobots as or}from"../../../im-browser/src/http/requests/search-robots.js";import{getCustomerServiceProfile as nr,downloadCustomerServiceFile as sr}from"../../../im-browser/src/http/requests/customer-service-profile.js";import{pullOfflineSignal as ar}from"../../../im-browser/src/http/requests/pull-offline-signal.js";import{updateChannelReadIndexes as ir}from"../../../im-browser/src/http/requests/channel-read-index.js";import{markGroupReadAll as cr}from"../../../im-browser/src/http/requests/mark-group-read-all.js";const dr=30;function pr(e,t){const r=Number(e);if(!Number.isSafeInteger(r)||r<0)throw new Error(`GROUP history cursor 非法(groupId=${t})`);return r}function lr(lr,ur,mr,vr=0){const yr=lr.clientType??2,gr={...lr.authProvider,getLoginContext:async()=>{const e=await lr.authProvider.getLoginContext();return null===e?null:{...e,clientType:yr}}};let fr="";const hr=E(lr.debug,()=>({generation:vr,...""===fr?{}:{accountId:fr}}));let Ir=!0;const wr=lr.uploadRecovery?.enabled?Q(mr):void 0,Cr=Y(!1!==globalThis.navigator?.onLine),{coreClient:br,http:Sr}=re({coreClient:lr.coreClient,http:lr.http,authProvider:gr,endpointProvider:lr.endpointProvider,clientType:yr,isActive:()=>Ir,onRequestError:lr.onRequestError,onHandlerError:e=>hr.record("error","sdk","session","request-error-handler-failed",()=>({error:{message:"宿主请求错误处理器失败",data:e}}))}),Tr=lr.transport??ne(),Er=lr.adapters?.storage,Mr=void 0!==Er?Er.create({namespaceFactory:mr}):"undefined"==typeof indexedDB?void 0:se({namespaceFactory:mr,mediaAssetCache:{strategies:j()}}),Rr=/* @__PURE__ */new Map,kr=/* @__PURE__ */new Map,xr=/* @__PURE__ */new Map,Dr=/* @__PURE__ */new Map,Pr=/* @__PURE__ */new Map,Ar=/* @__PURE__ */new Map,jr=e=>`${we(e.conversation)}\0${e.messageId}`;function Or(e,t){const r=we(e),o=(Ar.get(r)??Promise.resolve()).then(t),n=o.then(()=>{},()=>{});return Ar.set(r,n),n.then(()=>{Ar.get(r)===n&&Ar.delete(r)}),o}function _r(e,t){return Or(e.conversation,async()=>{t()&&(await(Mr?.deleteDecryptRecovery?.(e.conversation,e.messageId)),t()&&(Pr.delete(jr(e)),Dr.delete(jr(e)),Rr.delete(jr(e))))})}const Nr=e=>{const t=Mr?.saveDecryptRecovery;if(void 0===t)return;const r=jr(e),o=(xr.get(r)??0)+1;xr.set(r,o),Pr.delete(r),Dr.set(r,e);const n=we(e.conversation),s=kr.get(n)??0,a=()=>Ir&&s===(kr.get(n)??0)&&o===xr.get(r),i=Or(e.conversation,async()=>{a()&&await t(e)});Rr.set(r,i),i.then(()=>{if(Rr.get(r)===i&&Rr.delete(r),a())return os(e)}).catch(t=>ur.emit({type:"error",error:{scope:"storage",message:`保存解密恢复记录失败(conversationType=${e.conversation.conversationType}, messageId=${e.messageId})`,cause:t}}))};let Lr=!1;const Kr="object"==typeof(Fr=Mr)&&null!==Fr&&"get"in Fr&&"function"==typeof Fr.get&&"put"in Fr&&"function"==typeof Fr.put&&"clear"in Fr&&"function"==typeof Fr.clear?Mr:void 0;var Fr;const Ur=g({...void 0===Mr?{}:{storage:Mr},...void 0===br?{}:{coreClient:br}});let Br,Gr;const Vr=B({...void 0===Mr?{}:{storage:Mr},conversationBackgrounds:Ur.api,onDirectReadReceiptDisabled:e=>Br?.(e)});let Hr=0;function $r(e){return Hr+=1,`channel-${e}-${vr}-${Hr}`}const qr=gt(hr),Wr=(e,t,r=fr)=>{const o=t.fromId===r?t.toId:t.fromId;H(hr,{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}})},zr=(e,t)=>{H(hr,{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}})},Jr=(e,t)=>{H(hr,{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}})},Qr=e=>{hr.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 Yr(e){return"left"===e||"removed"===e||"dismissed"===e}hr.record("debug","sdk","session","runtime-created");let Xr="empty";const Zr=ur.subscribe(e=>{if(Ir)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";hr.record("error","sdk",t,"runtime-error",()=>({error:{message:e.error.message,data:e.error.cause}}))}}else hr.record("warn","sdk","session","auth-invalid",()=>({data:e.issue}));else hr.record("trace","sdk","message",e.type,()=>({conversation:e.conversation,message:M(e.message),data:{source:e.source,channelLifecycleEffects:e.channelLifecycleEffects}}));else hr.record("info","sdk","connection","connection-state-changed",()=>({data:{state:e.state}}))});function eo(e){return e.cmdId===nt.MES_CHAT_EDIT_MSG_C2C||e.cmdId===nt.MES_GRPCHAT_EDIT_MSG_C2C||e.cmdId===nt.MES_RADIO_EDIT_MSG_C2C}function to(e,t){return Vt(e,{...e,body:t.body,contentType:t.contentType,encryption:t.encryption,edited:t.edited,recalled:t.recalled})}const ro=/* @__PURE__ */new Set;let oo,no,so,ao,io,co,po="auto",lo=!1,uo=!1,mo=0,vo=!1,yo=()=>{},go=null,fo=null;const ho=$(),Io=new AbortController,wo=/* @__PURE__ */new Set;let Co=0,bo=!1;const So=Z(e=>ur.emit({type:"receiving:changed",receiving:e})),To=Z(e=>ur.emit({type:"syncing:changed",syncing:e}));let Eo,Mo,Ro=!1;const ko=/* @__PURE__ */new Map,xo=/* @__PURE__ */new Map,Do=/* @__PURE__ */new Map,Po=e=>Do.get(we(e))?.version??0;function Ao(e,t){Do.set(we(e),{version:Po(e)+1,...void 0===t?{}:{reason:t}})}let jo=0;const Oo=e=>ko.get(e)??0,_o=e=>{ko.set(e,Oo(e)+1)};function No(e,t){Ao(e,t),co?.invalidate(e,{reason:t}),"channel"===e.conversationType&&_o(e.conversationId),"group"===e.conversationType&&xo.set(e.conversationId,(xo.get(e.conversationId)??0)+1)}const Lo=lr.profile??(void 0===br?void 0:ie({client:br,clientType:yr,...void 0===Mr?{}:{storage:Mr}})),Ko=lr.channelProfile??(void 0===br?void 0:ce({client:br,clientType:yr,getUserId:async()=>{if(""!==fr)return fr;const e=await gr.getLoginContext();return e?.userId??""},...void 0===Mr?{}:{storage:Mr}})),Fo=lr.channelMembers??(void 0===br?void 0:le({client:br,clientType:yr,isActive:()=>Ir,...void 0===Mr?{}:{storage:Mr}})),Uo=lr.channelMentionMembers??(void 0===br?void 0:ue({client:br,clientType:yr})),Bo=y({...void 0===Uo?{}:{provider:Uo},...void 0===Mr?{}:{storage:Mr}}),Go=lr.directory??(void 0===br?void 0:me({client:br,clientType:yr,getUserId:async()=>""!==fr?fr:(await gr.getLoginContext())?.userId??""})),Vo=R({...void 0===Go?{}:{provider:Go}});let Ho;const $o=K({onProfileUpdated:function(e){Xo.updateConversationProfile({conversationType:"robot",conversationId:e.id},{title:e.displayName,avatar:e.avatarUrl??""})},...void 0===br?{}:{search:e=>or(br,{...e,...void 0===yr?{}:{clientType:yr}}),bind:e=>rr(br,{...e,...void 0===yr?{}:{clientType:yr}}),unbind:e=>tr(br,{...e,...void 0===yr?{}:{clientType:yr}}),getProfile:e=>er(br,{...e,...void 0===yr?{}:{clientType:yr}}),confirmChat:e=>Zt(br,{robotId:e,...void 0===yr?{}:{clientType:yr}}),listChatMenus:e=>Xt(br,{robotId:e,...void 0===yr?{}:{clientType:yr}}),requestMenuReply:async e=>{const t=""!==fr?fr:(await gr.getLoginContext())?.userId??"";if(""===t)throw new Error("机器人指令回复缺少当前用户");const r=await Qt(Sr,{...e,userId:t});if(!Ir)return;const o=Yt({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===Ho)throw new Error("机器人指令回复尚未接入消息存储");await Ho(o)}}}}),qo=lr.expressionProvider??ve({...void 0===br?{}:{coreClient:br},...void 0===lr.expressions?.giphy?.apiKey?{}:{giphyApiKey:lr.expressions.giphy.apiKey}}),Wo=D({provider:qo,isActive:()=>Ir}),zo=lr.sessionFavoriteProvider??ye({...void 0===br?{}:{coreClient:br},getUserId:()=>fr}),Jo=lr.channelJoinApplications??(void 0===br?void 0:ge({client:br,clientType:yr})),Qo=lr.contactApplications??(void 0===br?void 0:fe({client:br,clientType:yr})),Yo=lr.groupApplications??(void 0===br?void 0:he({client:br,clientType:yr})),Xo=Ie({emitter:ur,diagnostics:hr,profile:Lo,channelProfile:Ko,storage:Mr,getSelfId:()=>fr,loadOlderFromRemote:async e=>{const t=co?.enterForeground(e.conversation),r=ho.enterForeground(),o=So.begin();try{return void 0===io?{messages:[],exhausted:!0}:await io(e)}finally{o(),t?.(),r()}},loadNewerFromRemote:async e=>{const t=co?.enterForeground(e.conversation),r=ho.enterForeground(),o=So.begin();try{return void 0===Mo?{messages:[],exhausted:!0}:await Mo(e)}finally{o(),t?.(),r()}}}),Zo=S({download:async({messageId:e,itemIndex:t,signal:r})=>{const o=Xo.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 sr(n.url,r)},isActive:()=>Ir,load:e=>void 0===br?Promise.reject(T({code:"IM_SDK_CORE_API_UNAVAILABLE",category:"contract",operation:"customerService.getProfile",retryable:!1})):nr(br,e),update:e=>Xo.updateConversationProfile({conversationType:"customerService",conversationId:"__customer_service__"},{title:e.displayName,avatar:e.avatarUrl})}),en=Zo.api;let tn=()=>{};const rn=A({namespaceFactory:mr,...void 0===Mr?{}:{storage:Mr},emitter:ur,getAccountId:()=>fr,isActive:()=>Ir,clearMemoryCaches:()=>{Zo.clearCache(),Lo?.clearCache?.(),Ko?.clearCache?.(),Fo?.clearCache?.(),Bo.clear(),tn(),co?.clear().catch(e=>ur.emit({type:"error",error:{scope:"storage",message:"清理最近历史缓存失败",cause:e}}))}});Ho=e=>Xo.commitReceivedMessages([e],"live");const on=U({provider:zo,isActive:()=>Ir,resolveMessage:async(e,t)=>Xo.getConversationMessage(e,t)??await(Mr?.getMessage(e,t))??void 0}),nn=ur.subscribe(e=>{if("message:removed"===e.type||"conversation-history:cleared"===e.type||"session:removed"===e.type){const t=we(e.conversation);if(kr.set(t,(kr.get(t)??0)+1),"message:removed"===e.type)Pr.delete(jr({conversation:e.conversation,messageId:e.messageId}));else for(const e of Pr.keys())e.startsWith(`${t}\0`)&&Pr.delete(e)}if(void 0!==Mr?.deleteDecryptRecovery)if("message:received"!==e.type&&"message:updated"!==e.type||!0===e.message.encryption.decryptFailed){if("message:removed"===e.type)Dr.delete(jr({conversation:e.conversation,messageId:e.messageId})),Or(e.conversation,()=>Mr.deleteDecryptRecovery(e.conversation,e.messageId)).catch(t=>ur.emit({type:"error",error:{scope:"storage",message:`删除消息密文记录失败(messageId=${e.messageId})`,cause:t}}));else if("conversation-history:cleared"===e.type){for(const[t,r]of Dr)we(r.conversation)===we(e.conversation)&&Dr.delete(t);Or(e.conversation,async()=>Mr.deleteConversationDecryptRecoveries?.(e.conversation)).catch(t=>ur.emit({type:"error",error:{scope:"storage",message:`清理会话密文记录失败(conversationId=${e.conversation.conversationId})`,cause:t}}))}}else{const t=we(e.conversation),r=kr.get(t)??0,o=jr({conversation:e.conversation,messageId:e.message.id}),n=xr.get(o)??0,s=()=>Ir&&r===(kr.get(t)??0)&&n===(xr.get(o)??0);(async()=>{const t=(await(Mr.getDecryptRecoveries?.(e.conversation))??[]).find(t=>t.messageId===e.message.id);void 0!==t&&!eo(t)&&s()&&(await Xo.commitReceivedMessages([e.message],"offline",{backfillOnly:!0}),await _r(t,s))})().catch(t=>ur.emit({type:"error",error:{scope:"storage",message:`删除已恢复密文记录失败(messageId=${e.message.id})`,cause:t}}))}});const sn=s({directory:Vo.contacts,getSelfId:()=>fr,...void 0===Lo?{}:{profile:{getUserProfile:Xo.readDirectProfile,...void 0===Lo.peekUserProfile?{}:{peekUserProfile:Lo.peekUserProfile.bind(Lo)}}},...void 0===br?{}:{coreClient:br},domainState:Xo,emitter:ur,terminateConversationSending:(e,t)=>yo(e,t),resetDirectReadReceiptPreference:e=>Vr.api.readReceipts.resetConversation({conversationType:"direct",conversationId:e}),onRelationshipChanged:(e,t)=>{"friend"===t?Gr?.(e):"unknown"!==t&&Br?.(e)}}),an=m({...void 0===Qo?{}:{contact:Qo},...void 0===Yo?{}:{group:Yo},...void 0===Jo?{}:{channel:Jo},onContactAccepted:async(e,t)=>{sn.updateRelationshipFromEvent(e,"friend"),await Xo.reconcileDirectContactEstablishedNotice(e,`contact-application:${t}`),Xo.refreshConversationProfile(e,"direct")},emitter:ur,isActive:()=>Ir&&"ready"===Xr}),cn=k({domainState:Xo,emitter:ur,isActive:()=>Ir}),dn=F({domainState:Xo,isAvailable:()=>Ir&&"ready"===Xr}),pn=i(()=>Xo.getSessions()),ln=Ce({onHidden:()=>yn(!0),onVisible:()=>yn(!1),onPageHide:()=>yn(!0),onPageShow:()=>yn(!1)},lr.network),un=lr.cryptoExecutorFactory?.(vr)??be({generation:vr,diagnostics:hr,lifecycleAware:ln.supportsLifecycle}),mn=p({executor:un,generation:vr,isActive:()=>Ir}),vn=lr.crypto??{...yt(),async encryptSymmetricChunked(e){try{return await mn(e)}catch(e){throw mt(e)&&Ir&&ur.emit({type:"error",error:{scope:"crypto",message:"媒体加密计算失败",cause:e}}),e}}};function yn(e){un.setSuspended(e)}function gn(e){!Ir||e instanceof Error&&"AbortError"===e.name||ur.emit({type:"error",error:{scope:"crypto",message:"密钥计算失败",cause:e}})}const fn=void 0!==lr.media?Se(lr.media,hr):void 0,hn=Te(),In=ut(hn),{prepareLocalMediaPreview:wn,prepareLocalVideoPoster:Cn,prepareLocalImageThumbnail:bn}=z(hn,()=>vr),Sn=void 0===br?void 0:It({client:br,crypto:vn,cryptoExecutor:un,generation:vr,clientType:yr,onError:(e,t)=>qr?.("crypto",{message:e,cause:t})}),Tn=void 0===br?void 0:ft({client:br,clientType:yr,onError:(e,t)=>qr?.("crypto",{scope:"send-key",message:e,cause:t})}),En=void 0===br?void 0:Pt({client:br,crypto:vn,cryptoExecutor:un,generation:vr,clientType:yr,onError:(e,t)=>qr?.("crypto",{scope:"group-key",message:e,cause:t})}),Mn=lr.channelKeyService??(void 0===br?void 0:Ee({loadSecretKey:e=>ht(br,{channelId:e,clientType:yr}),onError:(e,t)=>qr?.("crypto",{scope:"channel-key",message:e,cause:t})})),Rn=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&&Ir)try{await ss({conversationType:"channel",conversationId:e},{recoverLegacyWithoutSidecar:!1})}catch(t){ur.emit({type:"error",error:{scope:"storage",message:`CHANNEL key 就绪后读取解密恢复记录失败(channelId=${e})`,cause:t}})}},kn=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&&Rn(e),t},Dn=()=>Sn?.getCachedPrivateKey(fr)?.privateKey??null,Pn=async(e,t={})=>{const r=[];void 0!==Mn&&r.push(...[...new Set(e)].map(e=>Rn(e,t))),void 0!==Sn&&""!==fr&&r.push(Sn.getUserPrivateKey(fr,{priority:t.priority??"background",signal:t.signal??Io.signal})),await Promise.all(r)},An=e=>({crypto:vn,resolveChannelKey:e=>Mn?.getCachedChannelKey(e)??null,resolveUserPrivateKey:Dn,onDecryptError:t=>Jr(e,t),onDecryptRecovery:Nr}),jn=W({fetch:async e=>{await(En?.getGroupKeys(e,{priority:"background"}))},onError:gn});function On(e){Ir&&void 0!==En&&""!==e&&jn.enqueue(e)}function _n(){jn.dispose(),ln.stop(),Sn?.dispose(),En?.dispose(),un.dispose()}const Nn=async e=>{if(void 0===En)return null;const t=await En.getGroupKeys(e);return null===t?null:{publicKey:t.publicKey,version:t.version}},Ln=e=>{if(void 0===En)return null;const t=En.getCachedGroupKeys(e);return null!==t?t.privateKey:(On(e),null)},Kn=async(e,t={})=>{const r=t.signal??Io.signal;if(Et(r),void 0===En)return;const o=[...new Set(e)];let n,s=0;const a=async()=>{for(;void 0===n&&s<o.length;){if(!Ir)return;const e=o[s++];try{await En.getGroupKeys(e,{priority:t.priority??"background",signal:r})}catch(e){throw n=e,e}}};await Promise.all([a(),a()]),Et(r)},Fn=e=>({crypto:vn,resolvePrivateKey:({groupId:e})=>Ln(e),onDecryptError:t=>zr(e,t),onDecryptRecovery:Nr}),Un=/* @__PURE__ */new Map,Bn=/* @__PURE__ */new Map,Gn=/* @__PURE__ */new Map,Vn=/* @__PURE__ */new Set,Hn=/* @__PURE__ */new Set;function $n(e){return!0!==e.encryption.decryptFailed&&"unknown"!==e.contentType}function qn(e){Gn.delete(we(e))}function Wn(e,t){return e.length===t.length&&e.every((e,r)=>e===t[r])}function zn(e){if("group"===e.conversation.conversationType)return En?.getCachedGroupKeyVersion(e.conversation.conversationId)??void 0}function Jn(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 Qn(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 Yn(e,t){const r=new Map(Xo.getMessagesByConversation(e).filter(e=>void 0===t||e.id===t).map(e=>[e.id,e])),o=/* @__PURE__ */new Map;return{stop:ur.subscribe(n=>{if(!Ir||"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||!to(s,n.message)){const t=jr({conversation:e,messageId:n.message.id});o.set(t,xr.get(t)??0)}}),hasChanged:e=>{const t=jr(e);return o.has(t)&&o.get(t)===(xr.get(t)??0)}}}let Xn=0;const Zn=[],es=/* @__PURE__ */new Map;let ts=0;function rs(){for(;ts<2&&Zn.length>0;){const e=Zn.shift();ts+=1,Promise.resolve().then(async()=>{if(Et(Io.signal),!e.isCurrent())throw new DOMException("端到端排队恢复所属账号、会话或消息已失效","AbortError");await ns(e.record,e.hasBodyChanged)}).then(e.resolve,e.reject).finally(()=>{ts-=1,rs()})}}function os(e,t){if("direct"!==e.conversation.conversationType&&"group"!==e.conversation.conversationType)return ns(e);const r=jr(e),o=xr.get(r)??0,n=es.get(r);if(n?.version===o&&n.isCurrent())return n.promise;const s=fr,a=we(e.conversation),i=kr.get(a)??0,c=Po(e.conversation),d=()=>Ir&&fr===s&&i===(kr.get(a)??0)&&c===Po(e.conversation)&&o===(xr.get(r)??0),p=void 0===t?Yn(e.conversation,e.messageId):void 0,l=t??(()=>p.hasChanged(e)),u=new Promise((t,r)=>{Zn.push({record:e,isCurrent:d,hasBodyChanged:l,resolve:t,reject:r})}).finally(()=>{p?.stop(),es.get(r)?.promise===u&&es.delete(r)});return es.set(r,{version:o,isCurrent:d,promise:u}),rs(),u}async function ns(e,t){const r=jr(e);e=Dr.get(r)??e;const o=xr.get(r)??0,n=we(e.conversation),s=kr.get(n)??0,a=Po(e.conversation),i=()=>Ir&&a===Po(e.conversation)&&s===(kr.get(n)??0)&&o===(xr.get(r)??0),c=Un.get(r);if(void 0!==c)return Bn.get(r)===o?c:(await c.catch(()=>{}),void(i()&&Dr.get(r)===e&&await ns(e,t)));const d=async()=>Xo.getConversationMessage(e.conversation,e.messageId)??await(Mr?.getMessage(e.conversation,e.messageId))??void 0,p=(async()=>{const n=await d();if(!i()||void 0===n)return;const s=eo(e),a=()=>!("direct"!==e.conversation.conversationType&&"group"!==e.conversation.conversationType||!s)&&(t?.()&&Pr.set(r,o),Pr.get(r)===o);if(a())return await Xo.commitReceivedMessages([n],"offline",{backfillOnly:!0}),void await _r(e,i);if(!0!==n.encryption.decryptFailed&&!s)return await Xo.commitReceivedMessages([n],"offline",{backfillOnly:!0}),void await _r(e,i);let c,p;hr.record("debug","sdk","crypto","decrypt-recovery-context",()=>({conversation:e.conversation,data:{messageId:e.messageId,messageSenderId:n.senderId,messageCreatedAt:n.createdAt,selfMessage:n.senderId===fr,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=Jn(e);for(const t of[!1,!0]){const r=t?"force":"current";let o;try{l="bcontent";const n=Ft.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:Io.signal,...t?{staleKey:"string"==typeof p?p:void 0}:{}},a="group"===e.conversation.conversationType?(await(En?.getGroupKeys(e.conversation.conversationId,s)))?.privateKey??null:(await(Sn?.getUserPrivateKey(fr,s)))?.privateKey??null;if(!i())return;t&&void 0!==p&&(o="string"==typeof p&&null!==a&&p!==a),!0===o&&qn(e.conversation),t||(p=a);const d=zn(e);if(null===a){hr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Jn(e),finalStage:l,reason:"no-key",...void 0===d?{}:{resolvedKeyVersion:d},...void 0===o?{}:{keyChanged:o}}}));continue}const u=await un.decryptBatch({operationId:"end-to-end-recovery:"+ ++Xn,generation:vr,items:[{itemIndex:0,input:{secretKey:n.secretKey,cipherData:n.cipherData,privateKey:a}}],priority:"background",signal:Io.signal});if(!i())return;if(1!==u.length||0!==u[0]?.itemIndex)throw new vt("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;hr.record("debug","sdk","crypto","decrypt-recovery-byte-shape",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,attempt:r,strategy:Jn(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=Ut.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&&hr.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=!Wn(p,d)),!0===o&&qn(e.conversation),t||(p=d?.slice()??null),0===a.length){hr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Jn(e),finalStage:l,reason:"no-key",...void 0===o?{}:{keyChanged:o}}}));continue}for(const t of a)try{l="tea";const s=vn.decryptSymmetric({teaKey:t.key,cipherData:n.cipherData});l="bmessage";const a=Ut.decode(s);if("legacy-ascii16"===t.strategy&&!Qn(a))throw new Error("legacy ASCII candidate 未通过已知 BMessage 语义校验");c=a,u=t.strategy,hr.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){hr.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){hr.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(mt(t)||t instanceof Error&&"AbortError"===t.name)throw t;const n=zn(e);hr.record("warn","sdk","crypto","decrypt-recovery-attempt",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,attempt:r,strategy:Jn(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=Gn.get(r)??/* @__PURE__ */new Set;o.add(t),Gn.set(r,o)}(e.conversation,e.messageId),hr.record("warn","sdk","crypto","decrypt-recovery-exhausted",()=>({conversation:e.conversation,data:{messageId:e.messageId,source:e.source,wireEncrypt:e.wireEncrypt,strategy:Jn(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()||!to(n,m)))return Pr.set(r,o),await Xo.commitReceivedMessages([m],"offline",{backfillOnly:!0}),void await _r(e,i);const v="channel"!==e.conversation.conversationType||e.cmdId!==nt.RADIO_NOTIFY_DELIVER&&101!==c.contentType?{...Gt(m,c,fr),...s?{edited:!0}:{}}:Bt({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 Xo.commitReceivedMessages([v],"offline",{backfillOnly:!0,refreshSessionSummary:!0}),await _r(e,i)})().finally(()=>{Un.get(r)===p&&(Un.delete(r),Bn.delete(r))});return Un.set(r,p),Bn.set(r,o),p}async function ss(e,t={}){const r="direct"===e.conversationType||"group"===e.conversationType?Yn(e):void 0;try{const o=we(e),n=fr,s=kr.get(o)??0,a=Po(e),i=()=>Ir&&n===fr&&s===(kr.get(o)??0)&&a===Po(e),c=await(Mr?.getDecryptRecoveries?.(e))??[];if(!i())return;const d=Gn.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 os(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=>os(e)));if(!Ir||!1===t.recoverLegacyWithoutSidecar)return;const l=Gn.get(o),u=new Set(c.filter(e=>void 0===l||!l.has(e.messageId)).map(e=>e.messageId)),m=Xo.getMessagesByConversation(e).filter(e=>!0===e.encryption.decryptFailed&&!u.has(e.id));if(0===m.length||Vn.has(o))return;if(Vn.add(o),hr.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 gr.getLoginContext();if(null===t||void 0===Eo)return;for(const r of m.slice(0,20)){const o=r.extensions?.historyCursor;if("string"!=typeof o||""===o.trim())continue;const n=await Eo(e.conversationId,o,t.userId);if(!Ir)return;n.length>0&&Xo.upsertMessages(n,"offline")}}else"group"===e.conversationType?await async function(e,t){if(void 0===io)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 io({conversation:e,oldestLoaded:n,...void 0===a?{}:{cursor:a},intent:"older",limit:50});if(!Ir||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 Aa()}catch(t){if(!Ir||t instanceof Error&&"AbortError"===t.name)return;ur.emit({type:"error",error:{scope:"crypto",message:`解密失败消息恢复失败(conversationType=${e.conversationType}, conversationId=${e.conversationId})`,cause:t}})}finally{r?.stop()}}let as=()=>{throw new Error("离线 Reaction 写入失败:Reaction manager 尚未就绪")};function is(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 cs=/* @__PURE__ */new Map;function ds(e){const t=Xo.getConversationContext(e);if(!Ir||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=Xo.getMessagesByConversation(e).at(-1);return JSON.stringify([fr,void 0===r?t.timestamp:void 0,is(t),r?.id,r?.sortKey])}const ps=/* @__PURE__ */new Map;co=te({...void 0===Mr?.recentHistoryCache?{}:{cache:Mr.recentHistoryCache},fingerprint:ds,canRunBackground:function(){return Ir&&"ready"===Xr&&bo&&0===Co&&"authenticated"===ia.state},onForeground:e=>{if("group"===e.conversationType){En?.promote(e.conversationId);for(const[t,r]of ps)r.some(t=>t.conversationId===e.conversationId)&&un.promote(t)}else"channel"!==e.conversationType&&"direct"!==e.conversationType||Sn?.promote(fr)},fetchPage:async(e,t)=>{const r="group"===e.conversationType?ya("group",{conversationType:"group",conversationId:e.conversationId}):void 0;try{const o=await ee({http:Sr,authProvider:gr,clientType:yr,groupDecrypt:()=>Fn("history"),groupAsyncDecrypt:(e,t)=>{const r=fa(!0===co?.hasForeground(e)?"foreground":"background",t);return r.assertCurrent?.(e),r},assertLoginContext:e=>{if(!Ir||""!==fr&&e!==fr)throw new DOMException("最近历史请求的登录账号已改变","AbortError")},channelDecrypt:()=>An("history"),prepareGroupKeys:Kn,prepareChannelKeys:(e,t)=>Pn(e,{...t,recoverExistingMessages:!1}),keyPriority:e=>!0===co?.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:Lt,report:(e,t,r)=>hr.record(e.endsWith("failed")?"warn":"debug","sdk","history",e,()=>({conversation:t,data:r}))});const ls=ur.subscribe(e=>{if("connection:changed"===e.type)return"authenticated"!==e.state&&(bo=!1),void co?.notifySchedulingChanged();if("session:updated"===e.type){if("group"!==e.conversation.conversationType&&"channel"!==e.conversation.conversationType)return;const t=we(e.conversation),r=cs.get(t),o={timestamp:e.session.timestamp,access:is(e.session),capabilities:is(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(cs.set(t,o),"group"===e.conversation.conversationType&&"active"!==o.state&&r?.state!==o.state&&Ao(e.conversation),"ready"===Xr&&void 0!==r&&(r.access!==o.access||!Ro&&r.timestamp!==o.timestamp)){const t=!r.hasSnapshot&&o.hasSnapshot&&(r.capabilities===o.capabilities||!r.hasPermissions&&r.state===o.state);co?.invalidate(e.conversation,{preserveForeground:r.access===o.access||t})}return}return"session:removed"===e.type?(Ao(e.conversation),cs.delete(we(e.conversation)),void("ready"===Xr&&co?.invalidate(e.conversation))):"conversation-history:cleared"===e.type?(Ao(e.conversation),void("ready"===Xr&&co?.invalidate(e.conversation))):void("ready"===Xr&&!Ro&&"conversation"in e&&void 0!==e.conversation&&("message:received"!==e.type&&"message:updated"!==e.type&&"message:removed"!==e.type||co?.invalidate(e.conversation,{preserveForeground:"message:received"===e.type})))});function us(e,t=!0){const r="group"===e.conversation.conversationType?fa("foreground"):void 0;r?.assertCurrent?.({conversationType:"group",conversationId:e.conversation.conversationId}),Ro=!0;try{if(void 0===r){e.messages.length>0&&Xo.upsertMessages(e.messages,"offline",{backfillOnly:!0,refreshSessionSummary:t});for(const t of e.reactions)as(t);for(const t of co.takeRecoveries(e))Nr(t)}else{const o=co.takeRecoveries(e);for(const o of e.messages)r.publish([o],()=>Xo.upsertMessages([o],"offline",{backfillOnly:!0,refreshSessionSummary:t}));for(const t of e.reactions)r.publish([],()=>as(t));for(const e of o)r.publish([],()=>Nr(e))}}finally{Ro=!1}}io=async({conversation:e,oldestLoaded:t,cursor:r,intent:n,limit:s,signal:a})=>{Et(a);const{conversationId:i}=e,c=Xo.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===ds(e))return{messages:[],exhausted:!0};const t=await co.readCached(e,!0).catch(t=>(hr.record("warn","sdk","history","recent-history-cache-read-failed",()=>({conversation:e,error:{message:"读取最近历史缓存失败",data:t}})),null));null!==t&&co.isPageCurrent(t)&&Date.now()-t.fetchedAt>3e5&&us(t,!1),Et(a);const r=await co.latest(e,a).catch(t=>{if(!mt(t)&&Ir&&void 0===ds(e))return null;throw t});if(null===r)return{messages:[],exhausted:!0};if(Et(a),!Ir||!co.isPageCurrent(r)||void 0===ds(e))throw new Error("最近历史请求已失效");if(us(r),await co.confirmConsumed(r),Et(a),!co.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=fr,p=fa(!0===co?.hasForeground(e)?"foreground":"background",a);p.assertCurrent?.(o);const l=ya("group",o);try{const o=await gr.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():pr(r,i),u=[],m=[],v=await jt({asyncDecrypt:p,signal:a,http:Sr,userId:o.userId,clientType:yr,groupId:i,baseTime:c,direct:1,limit:s,decryptDeps:{...Fn("history"),onDecryptRecovery:e=>m.push(e)},prepareKeys:t=>Kn(t,{signal:a,priority:!0===co?.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],()=>Xo.upsertMessages([e],"offline",{backfillOnly:!0,refreshSessionSummary:"establish-latest"===n}));for(const e of u)p.publish([],()=>as(e));for(const e of m)p.publish([],()=>{l.acceptsRecovery(e)&&Nr(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=$r("history");if(void 0!==c.channelState&&o(c.channelState))return hr.record("info","sdk","history","channel-history-blocked",()=>({conversation:e,operationId:s,data:{state:c.channelState}})),{messages:[],exhausted:!0};const l=jo,u=Oo(i),m=await gr.getLoginContext();if(null===m)return{messages:[],exhausted:!0};if("establish-latest"===n){const t=await qt({signal:a,http:Sr,userId:m.userId,clientType:yr,channelId:i,count:dr,operationId:s,decryptDeps:An("history"),prepareKey:void 0===Mn&&void 0===Sn?void 0:t=>Pn([t],{signal:a,priority:!0===co?.hasForeground(e)?"foreground":"background"}),onContentDecodeError:Qr,onReaction:as});Et(a);const r=Xo.getConversationContext(e);return!Ir||l!==jo||u!==Oo(i)||"channel"!==r?.type||void 0!==r.channelState&&o(r.channelState)?{messages:[],exhausted:!0}:(Et(a),t.messages.length>0&&Xo.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})`)}hr.record("debug","sdk","history","channel-history-page-start",()=>({conversation:e,operationId:s,data:{baseIndexPresent:""!==y,direction:1,contain:0,count:dr,historyGeneration:l,historyEpoch:u,clientTypeHeader:yr,clientTypeBody:yr}}));try{v=await Wt({signal:a,http:Sr,userId:m.userId,clientType:yr,channelId:i,baseIndex:y,count:dr,contain:0,operationId:s,decryptDeps:An("history"),prepareKey:void 0===Mn&&void 0===Sn?void 0:t=>Pn([t],{signal:a,priority:!0===co?.hasForeground(e)?"foreground":"background"}),onContentDecodeError:Qr,onReaction:as})}catch(t){throw hr.record("error","sdk","history","channel-history-page-failed",()=>({conversation:e,operationId:s,data:{baseIndexPresent:""!==y,direction:1,contain:0,count:dr},error:{message:"CHANNEL 历史页加载失败",data:t}})),t}Et(a);const g=Xo.getConversationContext(e);return!Ir||l!==jo||u!==Oo(i)||"channel"!==g?.type||void 0!==g.channelState&&o(g.channelState)?{messages:[],exhausted:!0}:(Et(a),v.messages.length>0&&Xo.upsertMessages(v.messages,"offline",{backfillOnly:!0}),hr.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 ms=e=>{e.length>0&&Xo.upsertMessages(e,"offline",{backfillOnly:!0})},vs=async()=>{const e=await gr.getLoginContext();if(null===e)throw new Error("按消息 ID 回源失败:当前没有登录态");return{userId:e.userId}},ys=async(e,t)=>{const r={conversationType:"group",conversationId:e},o=ya("group",r,t);try{const n=fr,s=Po(r),a=()=>{if(!Ir||fr!==n||s!==Po(r))throw new DOMException("GROUP 消息查询所属账号或历史已失效","AbortError")},i=fa("foreground",void 0,a);i.assertCurrent?.(r);const{userId:c}=await vs();if(a(),c!==n)throw new DOMException("GROUP 消息查询的登录账号已改变","AbortError");const d=[],p=[],l=Fn("history"),u=await N(t,async t=>{a();const r=await Rt({asyncDecrypt:i,http:Sr,userId:c,clientType:yr,groupId:e,messageIds:t,decryptDeps:{...l,onDecryptRecovery:e=>p.push(e)},prepareKeys:e=>Kn(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?.(),ms([e]),i.assertCurrent?.();for(const e of d)i.assertCurrent?.(),e.conversation.conversationType===r.conversationType&&e.conversation.conversationId===r.conversationId&&as(e),i.assertCurrent?.();for(const e of p)i.assertCurrent?.(),o.acceptsRecovery(e)&&e.conversation.conversationType===r.conversationType&&e.conversation.conversationId===r.conversationId&&Nr(e),i.assertCurrent?.();return{messages:m.map(e=>{const t=Xo.getConversationMessage(r,e.id);if(void 0===t)throw new Error("GROUP 按 ID 查询在领域合并后缺少消息");return t}),missingMessageIds:u.missingMessageIds}}finally{o.stop()}},gs=async(e,t)=>{const r={conversationType:"channel",conversationId:e},n=fr,s=jo,a=Oo(e),i=()=>{const t=Xo.getConversationContext(r);if(!Ir||fr!==n||s!==jo||a!==Oo(e)||"channel"!==t?.type||void 0!==t.channelState&&o(t.channelState))throw new DOMException("CHANNEL 消息查询所属账号或历史已失效","AbortError")};i();const{userId:c}=await vs();if(i(),c!==n)throw new DOMException("CHANNEL 消息查询的登录账号已改变","AbortError");const d=[],p=[],l=await N(t,async t=>{i();const r=await xt({http:Sr,userId:c,clientType:yr,channelId:e,messageIds:t,operationId:$r("history"),decryptDeps:{...An("history"),onDecryptRecovery:e=>p.push({...e,source:"history"})},prepareKey:void 0===Mn&&void 0===Sn?void 0:async e=>{await Pn([e],{recoverExistingMessages:!1,priority:"foreground"}),i()},onContentDecodeError:Qr,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(),ms([e]);for(const e of d)i(),as(e);for(const e of p)i(),Nr(e);i();return{messages:l.messages.map(e=>{const t=Xo.getConversationMessage(r,e.id);if(void 0===t)throw new Error("CHANNEL 按 ID 查询在领域合并后缺少消息");return t}),missingMessageIds:l.missingMessageIds}},fs=Me([Re({includeOppositeEnd:!0,resolveOwnKey:async e=>{const t=await(Sn?.getUserPrivateKey(e));return t?.publicKey?{publicKey:t.publicKey,version:t.version}:null}}),ke({resolveGroupKey:Nn}),xe({resolveChannelKey:kn}),De()]),hs=Pe([Ae(),je(),Oe()]),Is=_e([Ne(),Le(),Ke({resolveChannelKey:kn,resolveProfile:e=>Ko?.getProfile(e)??Promise.resolve(null)})]);let ws=()=>{throw new Error("群收包回 ACK 失败:connection.sendFrame 尚未就绪")},Cs=()=>!1,bs=()=>{throw new Error("群发送 ACK 回填失败:connection.onChatAck 尚未就绪")},Ss=()=>{},Ts=()=>{};const Es={...Xo,removeConversationForMembershipTermination:(e,t)=>{Ss(e,t),"group"===e.conversationType?(jn.remove(e.conversationId),Ao(e),En?.clearGroupKeys(e.conversationId)):Mn?.clearChannelKey(e.conversationId),Xo.removeConversationForMembershipTermination(e,t),Ur.api.resetBackground(e).catch(e=>ur.emit({type:"error",error:{scope:"storage",message:"终态删除后清理会话背景失败",cause:e}}))}},Ms=Tt({domainState:Xo,sendFrame:e=>ws(e),getSelfId:()=>fr,isAuthenticated:()=>Cs(),reportReaction:e=>qo.reportReaction(e),isEmojiSupported:x,logger:qr});as=e=>{Ms.ingest(e,"offline")};const Rs=Fe({manager:Ms,getSelfId:()=>fr,logger:qr}),ks=Ue({domainState:Xo,outbox:{onChatAck:e=>bs(e)},sendFrame:e=>ws(e),getSelfId:()=>fr,emitter:ur,logger:qr,keepRaw:!0,decrypt:{crypto:vn,resolvePrivateKey:({groupId:e})=>Ln(e),preparePrivateKey:async({groupId:e})=>{if(void 0===En)return null;const t=await En.getGroupKeys(e);return t?.privateKey??null},onDecryptError:e=>zr("live",e),onDecryptRecovery:Nr},isActive:()=>Ir}),xs=Be({domainState:Xo,outbox:{onChatAck:e=>bs(e)},sendFrame:e=>ws(e),getSelfId:()=>fr,emitter:ur,logger:qr,keepRaw:!0,decrypt:{crypto:vn,resolveChannelKey:xn,resolveUserPrivateKey:Dn,onDecryptRecovery:Nr,onDecryptError:e=>{const t=void 0!==Mn&&void 0===Mr?.saveDecryptRecovery&&2===e.encrypt&&"decrypt-failed"===e.reason;if(Jr("live",{...e,forceRefreshAttempted:t}),!t)return;const r=Mn.getCachedChannelKey(e.channelId)??void 0;Mn.getChannelKey(e.channelId,{staleKey:r}).catch(()=>{})}}}),Ds=Ge({isActive:()=>Ir,domainState:Xo,outbox:{onChatAck:e=>bs(e)},sendFrame:e=>ws(e),getSelfId:()=>fr,emitter:ur,logger:qr,keepRaw:!0}),Ps=Ve({domainState:Xo,sendFrame:e=>ws(e),getSelfId:()=>fr,emitter:ur,logger:qr,keepRaw:!0,decrypt:{crypto:vn,resolveChannelKey:xn,resolveUserPrivateKey:Dn,onDecryptRecovery:Nr}}),As=He({getSelfId:()=>fr,sendFrame:e=>ws(e),emitter:ur}),js=$e({emitter:ur,getSelfId:()=>fr}),Os=qe({sendFrame:e=>ws(e),emitter:ur,getSelfId:()=>fr,domainState:{reconcileDirectContactEstablishedNotice:Xo.reconcileDirectContactEstablishedNotice,removeConversation:e=>{"string"!=typeof e?("direct"===e.conversationType&&yo(e,"friend_relation_removed"),Xo.removeConversation(e)):Xo.removeConversation(e)}},resetDirectReadReceiptPreference:e=>Vr.api.readReceipts.resetConversation({conversationType:"direct",conversationId:e}),onRelationshipChanged:sn.updateRelationshipFromEvent}),_s=We({sendFrame:e=>ws(e),emitter:ur,domainState:{applyTransferStatusBySerialNumber:Xo.applyTransferStatusBySerialNumber}}),Ns=ze({getSelfId:()=>fr,sendFrame:e=>ws(e),emitter:ur}),Ls=Je({getSelfId:()=>fr,domainState:Xo,sendFrame:e=>ws(e),emitter:ur,onRelationshipChanged:sn.updateRelationshipFromEvent}),Ks=Qe({sendFrame:e=>ws(e),emitter:ur,getSelfId:()=>fr,isAuthenticated:()=>Cs(),domainState:Xo}),Fs=Ye({sendFrame:e=>ws(e),emitter:ur,getSelfId:()=>fr,isAuthenticated:()=>Cs(),domainState:Xo}),Us=[...Ks.handlers,...Fs.commandHandlers],Bs=oe({isActive:()=>Ir&&Cs(),getUserId:async()=>(await gr.getLoginContext())?.userId??null,pull:(e,t,r)=>ar({http:Sr,userId:e,clientType:yr,deliveredMsgIds:t,signal:r}),onBatch:e=>{hr.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&&ur.emit({type:"notification",cmdId:0,name:"OFFLINE_SIGNAL"})},onItem:e=>{if(ur.emit({type:"notification",cmdId:e.cmdId,name:"OFFLINE_SIGNAL"}),!Ir||!Cs())return;const t=Us.find(t=>t.command===e.cmdId);t?.handler(e.cmdId,e.body)},onError:e=>ur.emit({type:"error",error:{scope:"sync",message:"音视频离线信令拉取失败",cause:e}})}),Gs=ur.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&Bs.stop()}),Vs=Xe({domainState:Xo,sendFrame:e=>ws(e),getSelfId:()=>fr,emitter:ur,logger:qr,keepRaw:!0}),Hs=st({domainState:Es,getSelfId:()=>fr,prefetchGroupKey:On,clearGroupKeys:e=>{jn.remove(e),Ao({conversationType:"group",conversationId:e}),En?.clearGroupKeys(e)},clearConversationTermination:e=>Ts(e)}),$s=ur.subscribe(e=>{"message:received"!==e.type&&"message:updated"!==e.type||Hs.handleMessage(e.message)}),qs=at({domainState:Es,getSelfId:()=>fr,prepareChannelKey:e=>{hr.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),hr.record("info","sdk","crypto","channel-key-cleared",()=>({conversation:{conversationType:"channel",conversationId:e},data:{cacheHit:t}}))},clearConversationTermination:e=>Ts(e),stopChannelHistory:e=>{const t=Oo(e);_o(e),Xo.messageWindow.info().conversationId===e&&Xo.messageWindow.reset(),hr.record("info","sdk","history","channel-history-invalidated",()=>({conversation:{conversationType:"channel",conversationId:e},data:{previousEpoch:t,nextEpoch:Oo(e)}}))}}),Ws=ur.subscribe(e=>{if("message:received"===e.type||"message:updated"===e.type){const t=e.message;"channel"===t.conversationType&&void 0!==t.body.system?.eventType&&hr.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(fr)??!1,lifecycleEffects:!0===e.channelLifecycleEffects,stateBefore:Xo.getSession({conversationType:"channel",conversationId:t.conversationId})?.channelState??"missing"}})),qs.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"]),Js=/* @__PURE__ */new Set(["channel_member_left","channel_member_removed","channel_member_joined","channel_member_invited","channel_member_renamed"]),Qs=ur.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)&&Fo?.invalidateChannelMembers(t.conversationId).catch(e=>{ur.emit({type:"error",error:{scope:"storage",message:"CHANNEL 成员缓存失效失败",cause:e}})}),Js.has(r)&&Bo.invalidate(t.conversationId).catch(e=>{ur.emit({type:"error",error:{scope:"storage",message:"CHANNEL @候选缓存失效失败",cause:e}})}))}),Ys=c({fetchMessagesById:ys,onSourceUnavailable:e=>hr.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===br?{}:{coreClient:br},domainState:Xo,emitter:ur}),Xs=e({fetchMessagesById:gs,onSourceUnavailable:e=>hr.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===br?{}:{coreClient:br},domainState:Xo,emitter:ur}),Zs=n({...void 0===Jo?{}:{joinApplications:Jo},http:Sr,clientType:yr,buildOfflineDecrypt:()=>An("history"),onContentDecodeError:Qr,onReaction:as,...void 0===Mn&&void 0===Sn?{}:{prepareKey:(e,t)=>Pn([e],{signal:t,priority:!0===co?.hasForeground({conversationType:"channel",conversationId:e})?"foreground":"background"})}});Eo=async(e,t,r)=>{const{context:o}=await Zs.loadMessageContext(e,t,r);return o.messages};const ea=r({authProvider:gr,emitter:ur,domainState:Xo,loadMessageContext:Zs.loadMessageContext,isActive:()=>Ir,getHistoryGeneration:()=>jo,getHistoryEpoch:Oo}),ta=G({domainState:Xo,isActive:()=>Ir,loadSummary:async({channelId:e,readCursor:t})=>{const r=await gr.getLoginContext();if(null===r||!Ir||r.userId!==fr)throw new Error("CHANNEL 已读摘要:无有效登录上下文");return(await Ht({http:Sr,userId:r.userId,clientType:yr,channels:[{channelId:e,readCursor:t}],keepRaw:!1})).find(t=>t.channelId===e)},report:(e,t,r)=>hr.record("channel-read-summary-failed"===e?"warn":"debug","sdk","sync",e,()=>({conversation:t,data:r}))}),ra=Dt({domainState:Xo,updateReadIndex:async({channelId:e,readCursor:t})=>{const r=await gr.getLoginContext();if(null===r||!Ir||r.userId!==fr)throw new Error("CHANNEL 已读 readIndexes/edit:无登录上下文");await ir({http:Sr,userId:r.userId,indexes:[{channelId:e,readCursor:t}]})},emitter:ur,logger:qr,onReadCommitted:ta.request,onReadSettled:ta.settled,syncRead:{getSelfId:()=>fr,sendFrame:e=>ws(e)}}),oa=Ze({getSelfId:()=>fr,applyRemoteRead:e=>ra.applyRemoteRead(e),emitter:ur,logger:qr}),na=et([dt({domainState:Xo,markGroupReadAll:async e=>{const t=await gr.getLoginContext();if(null===t)throw new Error("群已读 read_all:无登录上下文");await cr({http:Sr,userId:t.userId,groupId:e})},emitter:ur,logger:qr,isAuthenticated:()=>Cs(),syncRead:{getSelfId:()=>fr,sendFrame:e=>ws(e)}}),ra,pt({domainState:Xo}),lt({domainState:Xo})]),sa=tt({getSelfId:()=>fr,sendFrame:e=>ws(e),onListenerError:()=>ur.emit({type:"error",error:{scope:"unknown",message:"推送状态订阅者回调异常"}})}),aa=ur.subscribe(e=>{"connection:changed"===e.type&&"authenticated"!==e.state&&sa.setAuthenticated(!1)}),ia=rt({transport:Tr,authProvider:gr,endpointProvider:lr.endpointProvider,emitter:ur,domainState:Xo,logger:qr,decrypt:{crypto:vn,resolvePrivateKey:({msgType:e})=>1===e||1e3===e?Sn?.getCachedPrivateKey(fr)?.privateKey??null:null,onDecryptError:e=>Wr("live",e),onDecryptRecovery:Nr},encryptSend:void 0===Tn&&void 0===Mn?void 0:{crypto:vn,resolvePublicKey:e=>Tn?.getPeerPublicKey(e)??Promise.resolve(null),resolveGroupKey:Nn},media:void 0!==fn?{transfer:fn,recoveryPort:wr?.port,retainFailedUploads:lr.uploadRecovery?.retainFailedUploads,shouldPersistUpload:(e,t)=>void 0!==wr&&it(t,!0===lr.media?.multipartTransfer&&!1!==lr.media.multipartUpload).multipart,waitUntilOnline:e=>Cr.wait(e),preview:In,onTransferError:e=>{hr.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=>{hr.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===Kr?{}:{assetCache:Kr,onAssetCacheError:e=>{hr.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===lr.media?.maxConcurrentUploads?{}:{maxConcurrentUploads:lr.media.maxConcurrentUploads}}:void 0,sendStrategies:fs,commandHandlers:[...sa.commandHandlers,...Os,...js,..._s,...Ns,...Ls,...Us,...Rs,...ks,...Vs,...xs,...Ps,...As,...oa,...Ds],readStrategies:na,canSendDirectReadReceipt:e=>{if(!Vr.isDirectReadReceiptEnabled(e))return!1;const t=sn.peekRelationship(e);return void 0!==t&&"unknown"!==t?"friend"===t:void 0},recallStrategies:hs,channelMessageDeletion:{resolveProfile:e=>Ko?.getProfile(e)??Promise.resolve(null),onPermissionDenied:e=>Xo.refreshConversationProfile(e,"channel")},editStrategies:Is,storage:Mr,onAuthenticated:()=>{sa.setAuthenticated(!0);for(const e of ro)e.resumeMedia();const e=lo;lo=!0,(e||"auto"===po)&&Ma().catch(()=>{}),Bs.start()},isOnline:()=>"undefined"==typeof navigator?void 0:navigator.onLine},lr.connection);Br=e=>ia.suppressDirectReadReceipts(e),Gr=e=>ia.resumeDirectReadReceipts(e),ws=ia.sendFrame,Cs=()=>"authenticated"===ia.state,bs=ia.onChatAck,yo=ia.terminateConversationSending,Ss=ia.markOutboxConversationTerminated,Ts=ia.clearOutboxConversationTerminated;const ca=L({operations:{getPending:ia.getPendingOutbox,retry:ia.retryOutboxMessage,cancel:ia.cancelOutboxMessage},emitter:ur,isActive:()=>Ir}),da=l({mediaCrypto:{executor:un,generation:vr,isActive:()=>Ir},connection:ia,domainState:Xo,crypto:vn,settleEmptyGroupRead:async e=>{const t=xo.get(e.conversationId)??0,r=Xo.getSession(e);let o=void 0===r,n=r?.unreadCount??0,s=r?.mentionUnreadCount??0,a=n,i=s;const c=()=>{const r=Xo.getSession(e);if(!Ir||o||void 0===r||t!==(xo.get(e.conversationId)??0)||void 0!==r.groupState&&"active"!==r.groupState)throw new DOMException("群已读请求已失效","AbortError");return r},d=ur.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=Xo.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 gr.getLoginContext();if(c(),null===t||t.userId!==fr)throw new Error("群已读 read_all:登录上下文已失效");await cr({http:Sr,userId:t.userId,groupId:e.conversationId});const r=c(),o=Xo.getReadState(e),n=Math.max(0,(o?.unreadCount??r.unreadCount)-a),s=Math.max(0,(o?.mentionUnreadCount??r.mentionUnreadCount??0)-i);Xo.setReadState({...o??{...e,readCursor:r.readCursor??"",unreadCount:r.unreadCount},mentionUnreadCount:s}),Xo.applyServerUnread(e,n)}finally{d()}},...void 0===fn?{}:{mediaTransfer:fn},prepareDirectReadReceipt:async e=>{try{await sn.ensureRelationship(e)}catch(t){ur.emit({type:"error",error:{scope:"http",message:"Direct 已读已在本地提交,但联系人关系查询失败,未发送对端可见回执",cause:{peerId:e,error:t}}})}}}),pa=O({recoveryPort:wr?.port,connection:ia,domainState:Xo,emitter:ur,isActive:()=>Ir,preparePreview:wn,prepareVideoPoster:Cn,prepareImageThumbnail:bn,onLocalPreviewError:({kind:e,byteLength:t,cause:r})=>{hr.record("warn","sdk","media","local-preview-failed",()=>({generation:vr,data:{kind:e,byteLength:t},error:{message:r instanceof Error?r.message:String(r)}}))},...void 0===Kr?{}:{assetCache:Kr,onAssetCacheEvent:e=>{hr.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:da.operations.loadImage,loadVideo:da.operations.loadVideo,loadVoice:da.operations.loadVoice,loadFile:da.operations.loadFile}}}),la=J({isActive:()=>Ir&&"ready"===Xr&&""!==fr,maintain:async()=>{pa.prune(),ia.expireRetainedUploads();const e=(await Promise.allSettled([Lr?Kr?.prune?.():void 0,wr?.prune()])).find(e=>"rejected"===e.status);if("rejected"===e?.status)throw e.reason},onError:e=>hr.record("warn","sdk","media","media-cache-maintenance-failed",()=>({error:{message:"媒体过期缓存清理失败",data:e}}))});tn=()=>{ia.invalidateMediaAssetCacheWrites(),pa.clearCache()},void 0===lr.transport&&"undefined"!=typeof window&&(ia.setConnectionAllowed(!1),oo=ot({onChange:(e,t)=>{if(!e){if(vo=!0,ia.setConnectionAllowed(!1),!Ir)return ao?.then(()=>{});Ir=!1,Bs.stop(),Pr.clear(),_n(),Io.abort(),ho.dispose(),To.dispose(),So.dispose(),co?.dispose(),uo=!1,mo+=1,ua.stop();return Da({localData:"preserve"},{requireStorageClose:!0,preserveUploadRecovery:!0,notifyReplacement:"replaced"===t}).then(()=>{})}},onError:e=>{so=e,ur.emit({type:"error",error:{scope:"transport",message:"IM 页面连接协调不可用,请使用支持 Web Locks 的安全浏览器环境",cause:e}})}}));const ua=Ce({onOnline:()=>{Cr.setOnline(!0),ia.notifyOnline()},onOffline:()=>{Cr.setOnline(!1),ia.notifyOffline()},onVisible:()=>{la.run(),ia.notifyVisible();for(const e of ro)e.resumeMedia()},onPageHide:()=>{uo&&ia.suspendForPageLifecycle()},onPageShow:()=>{if(la.run(),uo){ia.resumeFromPageLifecycle(),ia.notifyVisible();for(const e of ro)e.resumeMedia()}}},lr.network);const ma=ur.subscribe(e=>{Ir&&"auth:invalid"===e.type&&(Bs.stop(),uo=!1,mo+=1,vo=void 0!==oo,oo?.terminate(),ua.stop())});async function va(e,t={}){const r=await(Sn?.getUserPrivateKey(e,{priority:t.priority??"background",signal:t.signal??Io.signal}))??null;return{crypto:vn,resolvePrivateKey:({msgType:e})=>1===e||1e3===e?r?.privateKey??null:null,onDecryptError:t=>Wr("offline",t,e),onDecryptRecovery:Nr}}function ya(e,t,r){const o=void 0===t?Xo.getMessages().filter(t=>t.conversationType===e):Xo.getMessagesByConversation(t).filter(e=>void 0===r||r.includes(e.id)),n=new Map(o.map(e=>[jr({conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id}),e])),s=/* @__PURE__ */new Set,a=ur.subscribe(o=>{if(("message:received"===o.type||"message:updated"===o.type)&&"live"===o.source&&o.conversation.conversationType===e&&(void 0===t||o.conversation.conversationId===t.conversationId&&(void 0===r||r.includes(o.message.id)))){const e=jr({conversation:o.conversation,messageId:o.message.id}),t=n.get(e);void 0!==t&&to(t,o.message)||s.add(e)}});return{stop:()=>{a(),n.clear(),s.clear()},acceptsRecovery:e=>!s.has(jr(e)),messages:e=>e.map(e=>{const t={conversationType:e.conversationType,conversationId:e.conversationId};return s.has(jr({conversation:t,messageId:e.id}))?Xo.getConversationMessage(t,e.id)??e:e})}}function ga(e,t){const r=fr,o=new Map(Do),n=/* @__PURE__ */new Map,s=e=>{if(Et(Io.signal),!Ir||r!==fr)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)!==Po(t))throw void 0!==Do.get(e)?.reason?Do.get(e).reason:new DOMException("DIRECT 计算所属会话已清理","AbortError");t?.()};return{publish(e,t){s();const r=t();return s(),r},executor:un,generation:vr,operationId:"direct-batch:"+ ++Xn,priority:e,signal:Io.signal,assertCurrent:s,yieldToEventLoop:Lt}}function fa(e,t,r){const o=fr,n=new Map(Do),s=/* @__PURE__ */new Map,a=e=>{if(Et(Io.signal),Et(t),!Ir||fr!==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)!==Po(t))throw void 0!==Do.get(e)?.reason?Do.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=Kt(e.body.system,fr);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===Do.get(t)?.reason&&n.set(t,{version:Po(e)})}return a(),o},executor:{async decryptBatch(t){const r=[...s.values()];ps.set(t.operationId,r);try{const o="foreground"===e||r.some(e=>!0===co?.hasForeground(e))?"foreground":"background";return await un.decryptBatch({...t,priority:o})}finally{ps.delete(t.operationId)}}},generation:vr,operationId:"group-batch:"+ ++Xn,priority:e,signal:t??Io.signal,assertCurrent:a,yieldToEventLoop:Lt}}async function ha(e,t,r,o,n){const s=[];let a;try{for(const e of t)n([],()=>{s.push(Promise.resolve(Xo.commitReceivedMessages([],"offline",void 0,{events:[e],apply:e=>Ms.ingest(e,"offline")})))});for(const t of e)n([t],()=>{s.push(Promise.resolve(Xo.commitReceivedMessages([t],"offline")))});for(const e of r)n([],()=>{Nr(e);const t=Rr.get(jr(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 Ia(e,t){return{endpoint:e,pullBatch:async({deliveredMsgInfos:r,limit:o})=>{const n=ya("direct");try{const s=[],a=fr,i=ga("background");i.assertCurrent?.();const c=await gr.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 va(c.userId);i.assertCurrent?.();const p=[],l=await t({http:Sr,userId:c.userId,clientType:yr,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 ha(n.messages(l.messages),p,s.filter(n.acceptsRecovery),()=>i.assertCurrent?.(),i.publish)}finally{n.stop()}}}}catch(e){throw n.stop(),e}}}}async function wa(e){const t=[...new Map(e.map(e=>[we(e),e])).values()];let r=0;await(async()=>{for(;r<t.length;){if(!Ir)return;const e=t[r++];if(void 0!==Xo.getSession(e)&&void 0!==ds(e))try{if(await ho.waitForBackground(Io.signal),!Ir||void 0===Xo.getSession(e)||void 0===ds(e))continue;co.invalidate(e,{preserveForeground:!0}),await io({conversation:e,oldestLoaded:void 0,intent:"establish-latest",limit:30})}catch(t){if(!Ir||void 0===Xo.getSession(e)||void 0===ds(e))continue;ur.emit({type:"error",error:{scope:"sync",message:"会话最新消息同步失败",cause:t}}),hr.record("warn","sdk","sync","session-latest-summary-failed",()=>({conversation:e,error:{message:"会话最新消息同步失败",data:t}}))}}})()}async function Ca(){const e=$r("sync");hr.record("info","sdk","sync","channel-sync-start",()=>({operationId:e,data:{clientTypeHeader:yr,sessionsClientTypeBody:"absent",offlineClientTypeBody:yr}}));try{await async function(e){if(void 0===Ko)return void hr.record("info","sdk","sync","channel-sync-skipped",()=>({operationId:e,data:{reason:"profile-unavailable"}}));const t=await gr.getLoginContext();if(null===t)return void hr.record("info","sdk","sync","channel-sync-skipped",()=>({operationId:e,data:{reason:"auth-unavailable"}}));const r=await Ko.listProfiles({forceRefresh:!0});if(!Ir)return;if(0===r.length)return void hr.record("info","sdk","sync","channel-sync-complete",()=>({operationId:e,data:{profileCount:0,sessionCount:0,offlineMessageCount:0}}));const n=new Map(r.map(e=>[e.id,e]));for(const e of r){if(Yr(e.channelState)){Mn?.clearChannelKey(e.id),Es.removeConversationForMembershipTermination({conversationType:"channel",conversationId:e.id},`channel_${e.channelState}`);continue}const t=e.permissions.sendMessages?void 0:`channel_${e.channelState}`;Xo.setChannelRestriction(e.id,e.channelState,t,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}}),Xo.updateConversationProfile({conversationType:"channel",conversationId:e.id},{title:e.name,avatar:e.avatar}),void 0!==e.muted&&Xo.setMuted({conversationType:"channel",conversationId:e.id},e.muted)}const s=new Map(r.map(e=>{const t={conversationType:"channel",conversationId:e.id},r=Xo.getReadState(t),o=Xo.getSession(t);return[e.id,{revision:Xo.getChannelReadRevision(t),pending:Xo.hasPendingChannelRead(t),readCursor:r?.readCursor??o?.readCursor??"",unreadCount:o?.unreadCount??r?.unreadCount??0,mentionUnreadCount:o?.mentionUnreadCount??r?.mentionUnreadCount??0}]})),a=r.map(e=>({channelId:e.id,readCursor:s.get(e.id).readCursor}));hr.record("debug","sdk","sync","channel-sessions-request",()=>({operationId:e,data:{channelCount:a.length,channelsWithReadCursor:a.filter(e=>""!==e.readCursor).length,clientTypeHeader:yr,clientTypeBody:yr}}));const i=await Ht({http:Sr,userId:t.userId,clientType:yr,channels:a,operationId:e,decryptDeps:An("offline"),prepareKeys:e=>Pn(e.filter(e=>{const t=n.get(e)?.channelState;return void 0===t||!o(t)})),onContentDecodeError:Qr,onReaction:as});if(!Ir)return;hr.record("debug","sdk","sync","channel-sessions-response",()=>({operationId:e,data:{sessionCount:i.length,lastMessageCount:i.filter(e=>void 0!==e.last).length,decryptFailedLastCount:i.filter(e=>!0===e.last?.encryption.decryptFailed).length,unknownContentLastCount:i.filter(e=>"unknown"===e.last?.contentType&&!0!==e.last.encryption.decryptFailed).length}}));const c=new Set(i.filter(e=>{const t=s.get(e.channelId),r={conversationType:"channel",conversationId:e.channelId},o=Xo.getReadState(r),n=Xo.getSession(r);return void 0===t||t.pending||Xo.hasPendingChannelRead(r)||Xo.getChannelReadRevision(r)!==t.revision||(o?.readCursor??n?.readCursor??"")!==t.readCursor||(n?.unreadCount??o?.unreadCount??0)!==t.unreadCount||(n?.mentionUnreadCount??o?.mentionUnreadCount??0)!==t.mentionUnreadCount}).map(e=>e.channelId)),d=i.filter(e=>void 0!==Xo.getConversationContext({conversationType:"channel",conversationId:e.channelId})).map(e=>{const t=n.get(e.channelId),r=t?.channelState,s=void 0!==r&&o(r)?r:o(e.channelState)?e.channelState:r??e.channelState,a="active"===s?void 0:s===e.channelState?e.sendDisabledReason:`channel_${s}`;return{...e,channelState:s,sendDisabledReason:a}});for(const e of d){const t=n.get(e.channelId);Xo.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&&(Xo.updateConversationProfile({conversationType:"channel",conversationId:e.channelId},{title:t.name,avatar:t.avatar}),void 0!==t.muted&&Xo.setMuted({conversationType:"channel",conversationId:e.channelId},t.muted)),c.has(e.channelId)||Xo.applyChannelReadSummary({conversationType:"channel",conversationId:e.channelId},e),o(e.channelState)&&Mn?.clearChannelKey(e.channelId)}const p=jo,l=new Map(d.map(e=>[e.channelId,Oo(e.channelId)])),u=e=>{const t=Xo.getConversationContext({conversationType:"channel",conversationId:e});return Ir&&p===jo&&l.get(e)===Oo(e)&&void 0!==t&&(void 0===t.channelState||!o(t.channelState))},m=e=>{if(!Ir||p!==jo)return[];const t=e.filter(e=>u(e.conversationId));return t.length>0&&Xo.upsertMessages(t,"offline",{applyChannelLifecycleEffects:!0}),t};m(d.flatMap(e=>void 0===e.last?[]:[e.last])),await wa(d.filter(e=>void 0===e.last&&!o(e.channelState)).map(e=>({conversationType:"channel",conversationId:e.channelId})));const v=d.filter(e=>!c.has(e.channelId)&&!o(e.channelState)&&e.unreadCount>0&&""!==e.readCursor);hr.record("debug","sdk","sync","channel-offline-plan",()=>{const t={staleRead:0,historyBlocked:0,zeroUnread:0,emptyReadCursor:0};for(const e of d)c.has(e.channelId)?t.staleRead+=1:o(e.channelState)?t.historyBlocked+=1:e.unreadCount<=0?t.zeroUnread+=1:""===e.readCursor&&(t.emptyReadCursor+=1);return{operationId:e,data:{acceptedSessionCount:d.length,eligibleChannelCount:v.length,staleReadSkippedCount:t.staleRead,historyBlockedSkippedCount:t.historyBlocked,zeroUnreadSkippedCount:t.zeroUnread,emptyReadCursorSkippedCount:t.emptyReadCursor,direction:0,contain:0,count:dr}}});const y=[],g=new Map(v.map(e=>[e.channelId,e.readCursor])),f=[];for(const t of v){const r={conversationType:"channel",conversationId:t.channelId},o=!0!==Mr?.supportsChannelSyncCheckpoint?void 0:zt(await Mr.getMeta(Jt(r)),r);if(!u(t.channelId))continue;const n=o?.startIndex===t.readCursor;f.push({channelId:t.channelId,baseIndex:n?o.baseIndex:t.readCursor}),hr.record("debug","sdk","sync","channel-offline-resume",()=>({operationId:e,conversation:r,data:{resumed:n}}))}const h=[],I=[];let w;if(await $t({http:Sr,userId:t.userId,clientType:yr,operationId:e,pulls:f,messageCount:dr,signal:Io.signal,beforePage:()=>ho.waitForBackground(Io.signal),isChannelCurrent:u,yieldToEventLoop:Lt,decryptDeps:{...An("offline"),onDecryptRecovery:e=>I.push(e)},prepareKeys:e=>Pn(e,{recoverExistingMessages:!1}),onContentDecodeError:Qr,onReaction:e=>h.push(e),onPage:async(e,t)=>{const r=h.splice(0),o=I.splice(0),n=(async()=>{for(const n of t.pulls){const s={conversationType:"channel",conversationId:n.channelId},a=()=>u(n.channelId);if(!a())continue;const i=o.filter(e=>e.conversation.conversationId===n.channelId),c=()=>{y.push(...m(e.filter(e=>e.conversationId===n.channelId)));for(const e of r)a()&&e.conversation.conversationId===n.channelId&&as(e)};if(!0!==Mr?.supportsChannelSyncCheckpoint){c();for(const e of i)a()&&Nr(e);continue}if(!await Xo.commitChannelSyncPage([s],c,a,async()=>{if(i.length>0&&void 0===Mr.saveDecryptRecovery)throw new Error("CHANNEL 同步不能保存解密恢复记录");for(const e of i)await Mr.saveDecryptRecovery(e)})||!a())continue;const d=t.nextBaseIndexes[n.channelId];void 0!==d&&await Xo.saveChannelSyncCheckpoint({version:1,conversation:s,startIndex:g.get(n.channelId),baseIndex:d},a);for(const e of i)a()&&os(e).catch(e=>ur.emit({type:"error",error:{scope:"storage",message:"CHANNEL 解密恢复失败",cause:e}}))}})();wo.add(n);try{await n}finally{wo.delete(n)}}}).catch(e=>{w={cause:e}}),!Ir)return;const C=d.flatMap(e=>{const t=e.last;if(void 0===t||$n(t))return[];const r=t.extensions?.historyCursor;return[{summary:e,last:t,historyCursor:"string"==typeof r?r.trim():""}]}),b=(e,t)=>`${e}:${t}`,S=/* @__PURE__ */new Map,T=/* @__PURE__ */new Set;for(const{summary:e,last:t}of C){const r=Xo.getConversationMessage({conversationType:"channel",conversationId:e.channelId},t.id);if(void 0===r||!$n(r))continue;const o=b(e.channelId,t.id);S.set(o,r),T.add(o)}for(const e of y)$n(e)&&S.set(b(e.conversationId,e.id),e);const E=C.filter(({summary:e,last:t,historyCursor:r})=>!(""===r||c.has(e.channelId)||o(e.channelState)||S.has(b(t.conversationId,t.id))||Hn.has(b(t.conversationId,t.id)))),M=C.filter(({summary:e,last:t})=>!c.has(e.channelId)&&!o(e.channelState)&&!T.has(b(t.conversationId,t.id))&&S.has(b(t.conversationId,t.id))).length;hr.record("debug","sdk","sync","channel-session-last-recovery-plan",()=>({operationId:e,data:{unusableLastCount:C.length,decryptFailedLastCount:C.filter(({last:e})=>!0===e.encryption.decryptFailed).length,unknownContentLastCount:C.filter(({last:e})=>"unknown"===e.contentType&&!0!==e.encryption.decryptFailed).length,localRecoveredCount:T.size,offlineRecoveredCount:M,contextRecoveryCount:E.length,staleReadSkippedCount:C.filter(e=>c.has(e.summary.channelId)).length,historyBlockedSkippedCount:C.filter(e=>o(e.summary.channelState)).length,missingHistoryCursorCount:C.filter(e=>""===e.historyCursor).length}}));const R=async({summary:r,last:n,historyCursor:s})=>{try{if(await ho.waitForBackground(Io.signal),!u(r.channelId))return;const{message:a}=await Zs.loadMessageContext(r.channelId,s,t.userId,Io.signal),i=Xo.getConversationContext({conversationType:"channel",conversationId:r.channelId});if(!Ir||"channel"!==i?.type||void 0!==i.channelState&&o(i.channelState))return;if("channel"!==a.conversationType||a.conversationId!==r.channelId||a.id!==n.id)throw new Error(`CHANNEL sessions.last 精确恢复结果不匹配(channelId=${r.channelId}, messageId=${n.id})`);if(!$n(a)){if("unknown"===a.contentType&&!0!==a.encryption.decryptFailed)return Hn.add(b(a.conversationId,a.id)),void hr.record("info","sdk","sync","channel-session-last-unknown-confirmed",()=>({operationId:e,conversation:{conversationType:"channel",conversationId:r.channelId},data:{messageId:n.id,reason:a.body.unknown?.reason}}));throw new Error(`CHANNEL sessions.last 精确恢复未取得可用正文(channelId=${r.channelId}, messageId=${n.id})`)}return a}catch(t){return void hr.record("warn","sdk","sync","channel-session-last-recovery-failed",()=>({operationId:e,conversation:{conversationType:"channel",conversationId:r.channelId},error:{message:"CHANNEL sessions.last 精确恢复失败",data:t},data:{messageId:n.id}}))}},k=[];for(const e of E){if(!Ir)break;k.push(await R(e))}for(const e of k)void 0!==e&&S.set(b(e.conversationId,e.id),e);const x=k.filter(e=>{if(void 0===e)return!1;const t=Xo.getConversationMessage({conversationType:"channel",conversationId:e.conversationId},e.id);return void 0===t||!$n(t)});if(m(x),void 0!==w)throw w.cause;hr.record("info","sdk","sync","channel-sync-complete",()=>({operationId:e,data:{profileCount:r.length,terminalProfileCount:r.filter(e=>Yr(e.channelState)).length,sessionCount:i.length,acceptedSessionCount:d.length,sessionLastCount:d.filter(e=>void 0!==e.last).length,recoveredSessionLastCount:C.filter(({last:e})=>S.has(b(e.conversationId,e.id))).length,offlineMessageCount:y.length}}))}(e)}catch(t){throw hr.record("error","sdk","sync","channel-sync-failed",()=>({operationId:e,error:{message:"CHANNEL 同步失败",data:t}})),t}}let ba=null,Sa=!1;const Ta=Nt({commitBatch:async function(e,t=[]){if(!Ir)throw new Error("离线消息提交已取消");await Xo.commitReceivedMessages(e,"offline",void 0,{events:t??[],apply:e=>Ms.ingest(e,"offline")});const r=e.flatMap(e=>{const t=Rr.get(jr({conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id}));return void 0===t?[]:[t]});if(await Promise.all(r),!Ir)throw new Error("离线消息提交已取消")},pullers:[Ia("chat",bt),Ia("owner_chat",St),{endpoint:"group",pullBatch:async({deliveredMsgInfos:e,limit:t})=>{const r=fr,o=fa("background"),n=ya("group");try{o.assertCurrent?.();const s=await gr.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 Ot({http:Sr,userId:s.userId,clientType:yr,decryptDeps:{...Fn("offline"),onDecryptRecovery:e=>i.push(e)},asyncDecrypt:o,prepareKeys:Kn,deliveredMsgInfos:e,...void 0===t?{}:{limit:t},onReaction:e=>a.push(e)});return o.assertCurrent?.(),{...c,reactions:a,commit:async()=>{try{await ha(n.messages(c.messages),a,i.filter(n.acceptsRecovery),()=>o.assertCurrent?.(),o.publish)}finally{n.stop()}}}}catch(e){throw n.stop(),e}}}],domainState:Xo,emitter:ur,logger:qr,yieldToEventLoop:Lt});const Ea=V({domainState:Xo,storage:Mr,getSelfId:()=>fr,assertCurrent:()=>{if(!Ir||Io.signal.aborted)throw new DOMException("客服历史恢复所属账号已失效","AbortError")},hasPendingSend:e=>ia.getPendingOutbox().some(t=>t.conversationType===e.conversationType&&t.conversationId===e.conversationId),fetch:async e=>{const t=fr,r=()=>{if(!Ir||Io.signal.aborted||fr!==t)throw new DOMException("客服历史查询所属账号已失效","AbortError")},o=await va(t);r();const n=await kt({http:Sr,userId:t,clientType:yr,messageIds:e,decryptDeps:o,asyncDecrypt:ga("background",r)});if(r(),200!==n.code)throw new Error(`客服历史原文查询失败:${n.code}`);return n.messages}});async function Ma(){if(void 0!==oo&&(!oo.owned||vo))throw new Error("当前页面未持有 IM 连接,不能同步消息");const e=So.begin(),t=To.begin(),r=async function(){const e=fr,t=fa("background"),r=ya("group");try{t.assertCurrent?.();const o=await gr.getLoginContext();if(null===o)return;if(t.assertCurrent?.(),""!==e&&o.userId!==e)throw new DOMException("GROUP 会话同步的登录账号已改变","AbortError");const n=[],s=[],a=await At({http:Sr,userId:o.userId,clientType:yr,decryptDeps:{...Fn("offline"),onDecryptRecovery:e=>s.push(e)},asyncDecrypt:t,prepareKeys:Kn,onReaction:e=>n.push(e)});t.assertCurrent?.();for(const e of a.unreads)t.assertCurrent?.(),Xo.applyServerUnread({conversationType:"group",conversationId:e.groupId},e.unreadCount),On(e.groupId);await ha(r.messages(a.messages),n,s.filter(r.acceptsRecovery),()=>t.assertCurrent?.(),t.publish),t.assertCurrent?.(),await wa(a.unreads.map(e=>({conversationType:"group",conversationId:e.groupId}))),_t(a)}finally{r.stop()}}().catch(e=>{throw ur.emit({type:"error",error:{scope:"sync",message:"群会话摘要同步失败",cause:e}}),e}),o=(null!==ba?(Sa=!0,ba):(ba=(async()=>{let e;do{Sa=!1,e=void 0;try{await Ca()}catch(t){e=t}}while(Sa);if(void 0!==e)throw e})().finally(()=>{ba=null}),ba)).catch(e=>{throw ur.emit({type:"error",error:{scope:"sync",message:"CHANNEL 会话与离线消息同步失败",cause:e}}),e});Co+=1;try{const e=Ea.run().catch(e=>{throw ur.emit({type:"error",error:{scope:"sync",message:"旧客服消息恢复失败,已保留未恢复的本机记录,可刷新重试",cause:e}}),e}),t=(await Promise.allSettled([Ta.sync({rejectOnFailure:!0}),r,o,e])).find(e=>"rejected"===e.status);if("rejected"===t?.status)throw t.reason}finally{t(),e(),Co-=1,bo="authenticated"===ia.state,co?.notifySchedulingChanged()}}async function Ra(){if("ready"===Xr)return;Xr="preparing";const e=await gr.getLoginContext();if(Ir){if(null!==e){if(await async function(e){if(void 0!==oo&&Ir){if(!vo){no??(no=oo.start(mr.forAccount(e).name("ephemeral","connection",`client-${yr}`)));const t=await no;if(!Ir)return;if(Ir&&!vo&&t&&oo.owned)return void ia.setConnectionAllowed(!0)}if(ia.setConnectionAllowed(!1),await ia.connect(),void 0!==so)throw Object.assign(new Error("Browser IM coordination is unavailable"),{code:"IM_CONNECTION_OWNERSHIP_UNAVAILABLE",cause:so});throw Object.assign(new Error("Chat is active in another page; reload this page to continue here"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"})}}(e.userId),!Ir)return;fr=e.userId;try{await(wr?.prepare(e.userId))}catch{ur.emit({type:"error",error:{scope:"storage",message:"上传恢复记录不可用,本次上传仅支持当前页面内恢复"}})}if(!Ir)return;if(ln.start(),void 0!==Sn&&Sn.getUserPrivateKey(e.userId,{priority:"foreground"}).catch(gn),void 0!==Mr)try{if(await Mr.open({namespace:e.userId}),Lr=!0,!Ir)return;try{await Vr.hydrate()}catch(e){ur.emit({type:"error",error:{scope:"storage",message:"IM 设置初始化失败,已暂停发送 direct 已读回执",cause:e}})}if(!Ir)return;if(await Xo.hydrate(()=>Ir),!Ir)return;for(const e of Xo.getSessions())""===e.title&&"supergroup"!==e.type&&Xo.refreshConversationProfile(e.id,e.type);if(await ia.hydrateOutbox(()=>Ir),!Ir)return}catch(e){ur.emit({type:"error",error:{scope:"storage",message:"本地存储初始化失败",cause:e}})}if(!Ir)return;if(void 0!==En)for(const e of Xo.getSessions())"group"===e.type&&On(e.id)}Ir&&(Xr="ready",""!==fr&&la.start())}}function ka(){if(vo)return Promise.reject(Object.assign(new Error("Chat is active in another page"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"}));if("ready"===Xr)return Promise.resolve();if(null!==go)return go;const e=Date.now();return hr.record("info","sdk","session","prepare-start"),go=Ra().then(()=>hr.record("info","sdk","session","prepare-complete",()=>({durationMs:Date.now()-e}))).catch(t=>{throw hr.record("error","sdk","session","prepare-failed",()=>({durationMs:Date.now()-e,error:{message:"IM prepare 失败",data:t}})),t}).finally(()=>{go=null}),go}function xa(e){hr.record("info","sdk","connection","disconnect",()=>({data:{reason:e}})),uo=!1,mo+=1,Bs.stop(),ia.disconnect(e),ua.stop()}function Da(e,t={}){if(void 0!==ao)return ao;let r,o;return ao=new Promise((e,t)=>{r=e,o=t}),async function(e,t){const r=Date.now();let o;hr.record("info","sdk","session","teardown-start",()=>({data:{localData:e?.localData??"preserve",pendingMessages:e?.pendingMessages??"fail"}})),Ir=!1,Pr.clear(),_n(),Io.abort(),ho.dispose(),To.dispose(),So.dispose(),ta.dispose(),t.notifyReplacement&&ur.emit({type:"session:replaced"});const n=la.dispose(),s=co?.dispose();ls(),aa(),sa.dispose(),Bs.stop(),Ks.dispose(),Fs.dispose(),Ms.dispose(),ca.dispose(),pa.dispose(),hn.dispose(),an.dispose(),sn.dispose();const a=ia.disposeMediaTasks({preserveRecovery:!0===t.preserveUploadRecovery});for(const e of ro)e.close();ro.clear(),jo+=1,ia.markOutboxForLogout(e?.pendingMessages??"fail"),Ys.dispose(),Xs.dispose(),Zs.dispose(),Bo.dispose(),Vo.dispose(),$o.dispose(),Ur.dispose();const i=Vr.dispose();cn.dispose();const c=Xo.invalidateAndDrainDraftOperations();dn.dispose(),$s(),Ws(),Qs(),qs.dispose(),ra.reset(),Mn?.clearAll(),Gn.clear(),Vn.clear(),Hn.clear(),xa("im-logout"),(t.requireStorageClose||!0===oo?.owned)&&await(go?.catch(()=>{}));try{await a}catch{ur.emit({type:"error",error:{scope:"storage",message:"上传任务清理未完成,请检查本地数据与网络状态"}})}await n;try{await(wr?.dispose(!0===t.preserveUploadRecovery))}catch(e){o=e,ur.emit({type:"error",error:{scope:"storage",message:"上传恢复记录清理失败,请清除此站点的本地数据"}})}await c,await i,await s,await Promise.allSettled([...wo]),await Xo.waitForChannelSyncPersistence(),await Promise.allSettled([...Rr.values(),...Un.values()]),await Promise.all([...Ar.values()]),Xo.clearSession();const d="purge"===e?.localData?fr:"";let p,l=""===d?void 0:o,u=!0;if(void 0!==Mr)try{await Mr.close()}catch(e){u=!1,""!==d&&(l=e),!1!==t.reportStorageErrors&&ur.emit({type:"error",error:{scope:"storage",message:""===d?"关闭本地存储失败":"关闭本地存储失败,已跳过删除本账号本地库",cause:e}})}if(""!==d&&u)try{void 0!==Er?await Er.purgeCurrentAccount({namespaceFactory:mr,accountId:d}):await ae(d,{namespaceFactory:mr}),void 0===l&&(p=d)}catch(e){l=e,!1!==t.reportStorageErrors&&ur.emit({type:"error",error:{scope:"storage",message:"删除本账号本地库失败",cause:e}})}if(Xr="empty",hr.record("info","sdk","session","teardown-complete",()=>({durationMs:Date.now()-r,data:{purgedAccountId:p,purgeFailed:void 0!==l}})),nn(),Zr(),Gs(),ma(),vo=!0,(t.requireStorageClose||void 0!==oo)&&!u)throw new Error("Previous chat page could not close its account storage");return oo?.stop(),{...void 0===p?{}:{purgedAccountId:p},...void 0===l?{}:{purgeError:l}}}(e,t).then(r,o),ao}function Pa(e){const t=e.conversationId,r=fr,n=jo,s=Oo(t);let a,i;return async({readCursor:c,cursor:d,signal:p,isCurrent:l})=>{const u=ho.enterForeground();try{const u=()=>{const a=Xo.getConversationContext(e);return Ir&&fr===r&&l()&&n===jo&&s===Oo(t)&&"channel"===a?.type&&(void 0===a.channelState||!o(a.channelState))};if(Et(p),!u())return;if(void 0!==d&&(a!==c||void 0===i))return;const m=await gr.getLoginContext();if(Et(p),null===m||m.userId!==r||!u())return;const v=[],y=[],g=await Mt({http:Sr,userId:m.userId,clientType:yr,channelId:t,index:d??c,containAnchor:void 0===d,signal:p,decryptDeps:{...An("history"),onDecryptRecovery:e=>y.push({...e,source:"history"})},prepareKey:e=>Pn([e],{recoverExistingMessages:!1,priority:"foreground",signal:p}),onContentDecodeError:Qr,onReaction:e=>v.push(e)});if(Et(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&&Xo.upsertMessages(g.messages,"offline",{backfillOnly:!0}),!u())return;for(const e of v){if(!u())return;as(e)}for(const e of y){if(!u())return;Nr(e)}if(!u())return;return{messages:g.messages.map(t=>{const r=Xo.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 Aa(){const e=ya("direct");try{const t=[],r=[],o=fr,n=ga("background");n.assertCurrent?.();const s=await gr.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 va(s.userId),onDecryptRecovery:e=>t.push(e)},i=await wt({http:Sr,userId:s.userId,clientType:yr,decryptDeps:a,asyncDecrypt:n,onReaction:e=>r.push(e)}),c=await Ct({http:Sr,userId:s.userId,clientType:yr,decryptDeps:a,asyncDecrypt:ga("background",n.assertCurrent),onReaction:e=>r.push(e)});n.assertCurrent?.();const d=e.messages([...i,...c]);return await ha(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})=>{Et(s);const{conversationId:a}=e,i=Xo.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=fr,d=fa(!0===co?.hasForeground(e)?"foreground":"background",s);d.assertCurrent?.(o);const p=ya("group",o);try{const o=await gr.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:pr(r,a);if(void 0===i)throw new Error(`GROUP 向新分页缺少可信 baseTime(groupId=${a}, messageId=${t?.id??""})`);const l=[],u=[],m=await jt({asyncDecrypt:d,signal:s,http:Sr,userId:o.userId,clientType:yr,groupId:a,baseTime:i,direct:2,limit:n,decryptDeps:{...Fn("history"),onDecryptRecovery:e=>u.push(e)},prepareKeys:t=>Kn(t,{signal:s,priority:!0===co?.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],()=>Xo.upsertMessages([e],"offline",{backfillOnly:!0}));for(const e of l)d.publish([],()=>as(e));for(const e of u)d.publish([],()=>{p.acceptsRecovery(e)&&Nr(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=jo,d=Oo(a),p=await gr.getLoginContext();if(null===p)return{messages:[],exhausted:!0};const l=void 0===r?(await Zs.loadMessageContext(a,n,p.userId,s)).context:await Zs.loadNewerPage(a,n,p.userId,s);Et(s);const u=Xo.getConversationContext(e);return!Ir||c!==jo||d!==Oo(a)||"channel"!==u?.type||void 0!==u.channelState&&o(u.channelState)?{messages:[],exhausted:!0}:(l.messages.length>0&&Xo.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 ja(e){const t=_({...e,operation:"openConversation"});return Object.assign(new Error(t.code),t,{name:"ImConversationOpenError"})}function Oa(e){if(!Ir)throw ja({code:"IM_SDK_CONVERSATION_RUNTIME_RELEASED",category:"state",retryable:!1,conversation:e})}function _a(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 Na={...a({...void 0===br?{}:{coreClient:br},authProvider:gr,http:Sr,resolveInput:pn,domainState:Xo,operations:{list:function(){return Xo.getConversationList()},pullOffline:Aa,sync:async function(){await Ma()},prefetchRecent:(e,t)=>co.prefetchRecent(e,t)},beforeDeleteConversation:No,terminateConversationSending:(e,t)=>ia.terminateConversationSending(e,t),resetConversationBackground:e=>Ur.api.resetBackground(e),reportStorageError:(e,t)=>ur.emit({type:"error",error:{scope:"storage",message:e,cause:t}}),markChannelRead:(e,t)=>ia.markRead(e,t,"channel"),settleConversationRead:async e=>{const t=await Ka(e,{initialPosition:"latest"},"read");try{await t.markConversationRead()}finally{t.close()}}}),...Ur.api,ensureOpenableConversation:async function(e){const t=function(e){const t=e?.conversationType,r=e?.conversationId;if("supergroup"===t)throw ja({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 ja({code:"IM_SDK_CONVERSATION_INVALID",category:"validation",retryable:!1,...void 0===e?{}:{conversation:e}});return Object.freeze({conversationType:t,conversationId:r.trim()})}(e);if(Oa(t),void 0!==Xo.getSession(t))return t;const r=So.begin();let o=!1;const n=ur.subscribe(e=>{"session:removed"===e.type&&e.conversation.conversationType===t.conversationType&&e.conversation.conversationId===t.conversationId&&(o=!0)}),s=()=>{if(Oa(t),o)throw ja({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 Xo.prepareConversation(_a(t,{title:e.displayName||e.cardDisplayName,...void 0===e.avatarUrl?{}:{avatar:e.avatarUrl}})),t;const r=await sn.getRelationship(t.conversationId);if(s(),"friend"!==r)throw ja({code:"IM_SDK_DIRECT_CONTACT_REQUIRED",category:"permission",retryable:!1,conversation:t,details:Object.freeze({relationship:r})});const o=await sn.getProfile(t.conversationId);if(s(),null===o||o.id!==t.conversationId)throw ja({code:"IM_SDK_CONVERSATION_TARGET_NOT_FOUND",category:"state",retryable:!1,conversation:t});return Xo.prepareConversation(_a(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=Xo.isMembershipTerminated(t),r=Vo.peekItem("group",t.conversationId);if(void 0!==r&&!e)return Xo.prepareConversation(_a(t,{title:r.displayName||r.cardDisplayName,...void 0===r.avatarUrl?{}:{avatar:r.avatarUrl},groupState:"active"})),t;if(void 0===Lo)throw ja({code:"IM_SDK_CONVERSATION_PROFILE_UNAVAILABLE",category:"contract",retryable:!1,conversation:t});const o=await Lo.getGroupProfile(t.conversationId,e?{forceRefresh:!0}:void 0);if(s(),null===o||o.id!==t.conversationId)throw ja({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 ja({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 Xo.prepareConversation(_a(t,{title:o.name,...void 0===o.avatar?{}:{avatar:o.avatar},...void 0===o.muted?{}:{muted:o.muted},groupState:"active"}),{membershipConfirmed:e}),e&&(s(),Ts({conversationType:"group",conversationId:t.conversationId})),t}if("customerService"===t.conversationType){if("__customer_service__"!==t.conversationId||void 0===Xo.getConversationContext(t))throw new Error("客服会话只能由已接收消息创建");return t}if("robot"===t.conversationType){const e=$o.peek(t.conversationId);return Xo.prepareConversation(_a(t,{title:e?.displayName??t.conversationId,...void 0===e?.avatarUrl?{}:{avatar:e.avatarUrl}})),t}if(void 0===Ko)throw ja({code:"IM_SDK_CONVERSATION_PROFILE_UNAVAILABLE",category:"contract",retryable:!1,conversation:t});const e=Xo.isMembershipTerminated(t),r=await Ko.getProfile(t.conversationId,e?{forceRefresh:!0}:void 0);if(s(),null===r||r.id!==t.conversationId)throw ja({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 ja({code:"IM_SDK_CHANNEL_CONVERSATION_UNAVAILABLE",category:"permission",retryable:!1,conversation:t,details:Object.freeze({channelState:r.channelState,role:r.role,hiddenByAllMemberMute:n})});return Xo.prepareConversation(_a(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(),Ts({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 ja({...r,conversation:t,cause:e})}finally{n(),r()}},getContext:e=>Xo.getConversationContext(e)};function La(e,t,r=!0){if(!Ir)throw e.close(),new Error("IM SDK 账号运行时已释放,不能打开会话");return t?.aborted&&(e.close(),Et(t)),function(e,t=!0){const r=new AbortController,o={...e,resumeMedia(){t&&Ir&&!r.signal.aborted&&"authenticated"===ia.state&&"robot"!==e.ref.conversationType&&ia.resumePausedMediaUploads(e.ref,r.signal).catch(()=>{Ir&&!r.signal.aborted&&ur.emit({type:"error",error:{scope:"unknown",message:"当前会话上传恢复失败,请重新选择文件"}})})},close(){r.abort(),e.close(),ro.delete(o)}};return b(o,e),ro.add(o),t&&o.resumeMedia(),o}(e,r)}async function Ka(e,t={},r){if(!Ir)throw new Error("IM SDK 账号运行时已释放,不能打开会话");const o=co?.enterForeground(e),n=ho.enterForeground(),s=So.begin();try{const o={beginReceiving:So.begin,domainState:Xo,invalidateHistory:No,emitter:ur,drafts:cn.api,sendText:da.operations.sendText,sendContact:da.operations.sendContact,sendImage:da.operations.sendImage,sendVideo:da.operations.sendVideo,sendVoice:da.operations.sendVoice,sendFile:da.operations.sendFile,sendGif:da.operations.sendGif,sendMediaAlbum:da.operations.sendMediaAlbum,sendExpression:da.operations.sendExpression,sendGame:da.operations.sendGame,sendMiniProgram:da.operations.sendMiniProgram,sendTransfer:da.operations.sendTransfer,sendGift:da.operations.sendGift,sendLiveRoom:da.operations.sendLiveRoom,replaceVideo:da.operations.replaceInterruptedVideo,replaceFile:da.operations.replaceInterruptedFile,forwardMessages:da.operations.forwardMessages,recallMessage:da.operations.recallMessage,editMessage:da.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:da.operations.markRead,markConversationRead:da.operations.markConversationRead,markVisibleMessages:da.operations.markVisibleMessages,markDirectMediaConsumed:da.operations.markDirectMediaConsumed,prepareMediaPreview:wn,getSelfId:()=>fr,isOutboxOwned:e=>ia.getPendingOutbox().some(t=>t.id===e),hasOutboxForConversation:e=>ia.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:sn.getRelationship,shouldCheckRelationship:()=>"authenticated"===ia.state,appendContactRequiredTextFailure:e=>Xo.appendDirectContactRequiredTextFailure({conversationId:e.conversationId,senderId:fr,text:e.text,...void 0===e.refMessageId?{}:{refMessageId:e.refMessageId}}),setMuted:(e,t)=>Na.setMuted(e,t),fetchMessagesByIdBatch:e=>(async(e,t)=>{const r=ya("direct",e,t);try{const o=fr,n=Po(e),s=()=>{if(!Ir||fr!==o||n!==Po(e))throw new DOMException("DIRECT 消息查询所属账号或历史已失效","AbortError")};s();const{userId:a}=await vs();if(s(),a!==o)throw new DOMException("DIRECT 消息查询的登录账号已改变","AbortError");const i=await va(a,{priority:"foreground"});s();const c=[],d=[],p=await N(t,async t=>{s();const r=await kt({http:Sr,userId:a,clientType:yr,messageIds:t,asyncDecrypt:ga("foreground",s),decryptDeps:{...i,onDecryptRecovery:e=>d.push(e)},onPlaintextFallback:t=>hr.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(),ms([e]),s();for(const t of c)s(),t.conversation.conversationType===e.conversationType&&t.conversation.conversationId===e.conversationId&&as(t),s();for(const t of d)s(),r.acceptsRecovery(t)&&t.conversation.conversationType===e.conversationType&&t.conversation.conversationId===e.conversationId&&Nr(t),s();const u=l.map(t=>{const r=Xo.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=La(s,t.signal,"read"!==r);return ss(n),a}case"group":{const n={conversationType:"group",conversationId:e.conversationId},s=La(await w(n,{...o,getSendPermissionError:e=>{const t=Xo.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)=>Na.setMuted(e,t),fetchMessagesByIdBatch:e=>ys(n.conversationId,e)},t),t.signal,"read"!==r);return ss(n),s}case"channel":{const n={conversationType:"channel",conversationId:e.conversationId},s=La(await I(n,{...o,loadEntryUnreadPage:Pa(n),getSelfId:()=>fr,deleteMessageForEveryone:ia.deleteChannelMessageForEveryone,reconcilePage:ea.reconcilePage,getSendPermissionError:e=>{const t=Xo.getConversationContext(n),r="channel"===t?.type&&void 0!==t.channelState?t.channelState:"unknown_restricted",o=ct({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)=>Na.setMuted(e,t),fetchMessagesByIdBatch:e=>gs(n.conversationId,e)},t),t.signal,"read"!==r);return ss(n),s}case"customerService":{const n={conversationType:"customerService",conversationId:e.conversationId};return La(await h(n,{...o,setMuted:async()=>{throw new Error("客服会话不支持免打扰设置")}},t),t.signal,"read"!==r)}case"robot":{const n={conversationType:"robot",conversationId:e.conversationId};return La(await f(n,{...o,setMuted:(e,t)=>Na.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 da.operations.sendText({conversationId:e.peerId,conversationType:"direct",text:e.text,encrypted:e.encrypted})}},openConversation:Ka,localData:rn,directory:Vo.search,customerService:en,robots:$o.api,search:dn.api,applications:an.api,expressions:Wo.api,sessionFavorites:on.api,outbox:ca.api,drafts:cn.api,connection:u({operations:{prepare:ka,connect:function(e){if(vo)return Promise.reject(Object.assign(new Error("Chat is active in another page"),{code:"IM_CONNECTION_OWNED_ELSEWHERE"}));if(!Ir||vo)return Promise.reject(new Error("IM 连接已停止,请刷新页面后重试"));if(uo=!0,"authenticated"===ia.state)return Promise.resolve();if(null!==fo)return fo;po=e?.initialSync??"auto",lo=!1;const t=Date.now();hr.record("info","sdk","connection","connect-start",()=>({data:{initialSync:po}}));const r=mo;return fo=(async()=>{await ka(),Ir&&uo&&r===mo&&(ua.start(),await ia.connect())})().then(()=>hr.record("info","sdk","connection","connect-complete",()=>({durationMs:Date.now()-t}))).catch(e=>{throw hr.record("error","sdk","connection","connect-failed",()=>({durationMs:Date.now()-t,error:{message:"IM connect 失败",data:e}})),e}).finally(()=>{fo=null}),fo},disconnect:xa,subscribe:function(e){return ur.subscribe(e)},getSnapshot:function(){return{connectionState:ia.state,pendingOutbox:ia.getPendingOutbox()}},getLifecycle:function(){return{sessionState:Xr,connectionState:ia.state,...""!==fr?{userId:fr}:{},prepared:"ready"===Xr,connectionDesired:uo,authenticated:"authenticated"===ia.state,receiving:So.receiving,syncing:To.receiving}}},getState:()=>ia.state}),conversations:Na,settings:Vr.api,push:sa.api,contact:sn,group:d({directory:Vo.groups,...void 0===Lo?{}:{profile:{getGroupProfile:async(e,t)=>{const r=Xo.beginConversationProfileRead({conversationType:"group",conversationId:e},t);try{const o=await Lo.getGroupProfile(e,t);return null!==o&&r({id:o.id,title:o.name,avatar:o.avatar}),o}finally{r.finish()}},...void 0===Lo.getGroupMemberNames?{}:{getGroupMemberNames:Lo.getGroupMemberNames.bind(Lo)},...void 0===Lo.listGroupMembers?{}:{listGroupMembers:Lo.listGroupMembers.bind(Lo)},...void 0===Lo.peekGroupMembers?{}:{peekGroupMembers:Lo.peekGroupMembers.bind(Lo)},...void 0===Lo.peekGroupProfile?{}:{peekGroupProfile:Lo.peekGroupProfile.bind(Lo)},...void 0===Lo.peekGroupMemberNames?{}:{peekGroupMemberNames:Lo.peekGroupMemberNames.bind(Lo)}}},...void 0===br?{}:{coreClient:br},...void 0===fn?{}:{avatarTransfer:fn},domainState:{...Es,prepareConversation:e=>Xo.prepareConversation(e)},emitter:ur,pinned:Ys.operations}),channel:t({directory:Vo.channels,...void 0===Ko?{}:{channelProfile:{listProfiles:Ko.listProfiles.bind(Ko),getProfile:async(e,t)=>{const r=Xo.beginConversationProfileRead({conversationType:"channel",conversationId:e},t);try{const o=await Ko.getProfile(e,t);return null!==o&&r({id:o.id,title:o.name,avatar:o.avatar}),o}finally{r.finish()}}}},...void 0===Fo?{}:{channelMembers:Fo},...void 0===Uo?{}:{channelMentionMembers:Uo},mentionCandidates:Bo.api,applications:Zs.applications,pinned:Xs.operations,...void 0===br?{}:{coreClient:br},...void 0===fn?{}:{avatarTransfer:fn},crypto:vn,domainState:{prepareConversation:e=>Xo.prepareConversation(e),setChannelRestriction:Xo.setChannelRestriction,removeConversationForMembershipTermination:Es.removeConversationForMembershipTermination,updateConversationProfile:Xo.updateConversationProfile,refreshConversationProfile:Xo.refreshConversationProfile},emitter:ur,...void 0===Mn?{}:{cacheCreatedSecretKey:(e,t)=>Mn.primeChannelKey(e,t)},getSelfUserId:async()=>""!==fr?fr:(await gr.getLoginContext())?.userId??""}),media:pa.api,calls:v(Ks),groupCalls:P(Fs),teardown:Da}}export{lr as createSessionRuntime};
@@ -0,0 +1 @@
1
+ import{ImHttpRequestError as t}from"../../../im-core/src/ports/http-port.js";function e(e){let r,s,n=0;const o=/* @__PURE__ */new Set;function i(t){return r?.signal===t&&!t.aborted&&e.isActive()}function d(){const t=r;r=void 0,void 0!==s&&clearTimeout(s),s=void 0,t?.abort()}async function a(r){try{if(!i(r))return;const t=await e.getUserId();if(!i(r)||null===t)return;let s=[];const d=/* @__PURE__ */new Set;for(;i(r);){const n=await e.pull(t,s,r);if(!i(r))return;if(n.deliveredMsgIds.length>0&&n.deliveredMsgIds.every(t=>d.has(t)))throw new Error("音视频离线信令续批没有进展");e.onBatch(n);for(const t of n.items){if(!i(r))return;if(""===t.msgId||!o.has(t.msgId)){if(e.onItem(t),!i(r))return;""!==t.msgId&&o.add(t.msgId)}}if(0===n.deliveredMsgIds.length)break;s=n.deliveredMsgIds;for(const t of s)d.add(t)}n=0}catch(s){if(!i(r))return;n=Math.min(n+1,2),s instanceof t&&s.status>=400&&s.status<500&&408!==s.status&&429!==s.status&&d(),e.onError(s)}finally{if(i(r)){const t=Math.min(2e3*2**n,8e3);s=setTimeout(()=>{s=void 0,a(r)},t)}}}return{start(){void 0===r&&e.isActive()&&(n=0,r=new AbortController,a(r.signal))},stop:d}}export{e as createSignalOfflinePoller};
@@ -1 +1 @@
1
- import'./chunk-WOT6VMZA.js';async function o(){return (await import('./browser-RTCHWSQ2.js')).loadBrowserCryptoDriver()}export{o as loadBrowserCryptoDriver};
1
+ async function r(){return(await import("./modules/crypto/browser.js")).loadBrowserCryptoDriver()}export{r as loadBrowserCryptoDriver};