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{toWireMsgId as e}from"../../mapping/message-id.js";import{buildChannelAdminRecallFrame as o}from"./recall-frame.js";import{ErrCode as n}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";function r(r){const s=r.now??(()=>Date.now()),t=/* @__PURE__ */new Map;function i(e,o){const n=t.get(e);void 0!==n&&(void 0!==n.timer&&clearTimeout(n.timer),t.delete(e),n.resolve(o))}return{deleteForEveryone(n){const d=r.domainState.getConversationMessage(n,n.messageId);if(void 0===d||d.conversationId!==n.conversationId||d.id!==n.messageId)return Promise.resolve({ok:!1,reason:"not-found"});if("channel"!==d.conversationType)return Promise.resolve({ok:!1,reason:"unsupported"});if(r.domainState.getPinnedMessage(n)?.messageId===n.messageId)return Promise.resolve({ok:!1,reason:"pinned"});if(void 0!==d.deletedForEveryone)return Promise.resolve({ok:!0});if(void 0!==d.recalled)return Promise.resolve({ok:!1,reason:"unavailable"});if("sent"!==d.status)return Promise.resolve({ok:!1,reason:"not-sent"});if(!r.isAuthenticated())return Promise.resolve({ok:!1,reason:"disconnected"});let a;try{a=e(d.id)}catch{return Promise.resolve({ok:!1,reason:"unsupported"})}const m=t.get(a);if(void 0!==m)return m.promise;let l;const c=new Promise(e=>{l=e}),v={messageId:d.id,channelId:d.conversationId,deletedAt:s(),resolve:l,promise:c};return t.set(a,v),r.resolveProfile(d.conversationId).then(e=>{t.get(a)===v&&(null===e||"admin"!==e.role&&"owner"!==e.role?i(a,{ok:!1,reason:"forbidden"}):r.domainState.getPinnedMessage(n)?.messageId!==n.messageId?(v.timer=setTimeout(()=>i(a,{ok:!1,reason:"timeout"}),15e3),r.sendFrame(o({selfId:r.getSelfId(),channelId:d.conversationId,messageId:d.id,msgTime:d.serverTime??d.createdAt}))):i(a,{ok:!1,reason:"pinned"}))}).catch(()=>{t.get(a)===v&&i(a,{ok:!1,reason:"failed"})}),c},onDeleteAck({sMsgId:e,errcode:o}){const s=t.get(e);if(void 0!==s)return o===n.NON_ERR||0===o?(r.domainState.deleteChannelMessageForEveryone({conversationId:s.channelId,conversationType:"channel"},s.messageId,{by:r.getSelfId(),at:s.deletedAt,reason:"channel-moderation"}),void i(e,{ok:!0})):o===n.ERR_RADIO_ADMIN?(r.onPermissionDenied?.(s.channelId),void i(e,{ok:!1,reason:"forbidden",errcode:o})):void i(e,{ok:!1,reason:"failed",errcode:o})},reset(){for(const e of[...t.keys()])i(e,{ok:!1,reason:"disconnected"})}}}export{r as createChannelMessageDeletionManager};
@@ -0,0 +1 @@
1
+ import{toWireMsgId as e}from"../../mapping/message-id.js";import{radioAdminCancelChatCodec as n,mesChatCancelCodec as o,groupChatCancelCodec as m,radioCancelChatCodec as t}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as s}from"../../../../im-protocol/src/frame-codec.js";import{CmdId as r}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";function c(n){const m=o.create({sToId:BigInt(n.peerId),sFromId:BigInt(n.selfId),nCancelType:0,sMsgId:e(n.messageId),msgTime:BigInt(n.msgTime),cancelTime:BigInt(n.cancelTime)});return s({command:r.MES_CHATCANCEL,body:o.encode(m)})}function i(n){const o=m.create({sGroupId:BigInt(n.groupId),sFromId:BigInt(n.selfId),sMsgId:e(n.messageId),msgTime:BigInt(n.msgTime),cancelTime:BigInt(n.cancelTime)});return s({command:r.GROUP_CHATCANCEL,body:m.encode(o)})}function d(n){return{sFromId:BigInt(n.selfId),sRadioId:BigInt(n.channelId),sMsgId:e(n.messageId),msgTime:BigInt(n.msgTime),...void 0===n.extend||""===n.extend?{}:{extend:n.extend}}}function I(e){const n=t.create(d(e));return s({command:r.RADIO_CANCEL_CHAT,body:t.encode(n)})}function g(e){const o=n.create(d(e));return s({command:r.RADIO_ADMIN_CANCEL_CHAT,body:n.encode(o)})}export{g as buildChannelAdminRecallFrame,I as buildChannelRecallFrame,c as buildDirectRecallFrame,i as buildGroupRecallFrame};
@@ -0,0 +1 @@
1
+ import{toWireMsgId as e}from"../../mapping/message-id.js";import{createDefaultRecallStrategyRegistry as o}from"./recall-strategy.js";import{RECALL_WINDOW_MS as r}from"./recall-strategy.js";import{ErrCode as s}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";function n(r){const n=r.now??(()=>Date.now()),t=r.strategies??o(),i=/* @__PURE__ */new Map;function a(e,o){const r=i.get(e);void 0!==r&&(void 0!==r.timer&&clearTimeout(r.timer),i.delete(e),r.resolve(o))}return{recall(o){const s=r.domainState.getConversationMessage(o,o.messageId);if(void 0===s)return Promise.resolve({ok:!1,reason:"not-found"});if(("group"===o.conversationType||"channel"===o.conversationType)&&r.domainState.getPinnedMessage(o)?.messageId===o.messageId)return Promise.resolve({ok:!1,reason:"pinned"});if(void 0!==s.recalled)return Promise.resolve({ok:!0});if(void 0!==s.deletedForEveryone)return Promise.resolve({ok:!0});const c=t.resolve(o.conversationType);if(void 0===c)return Promise.resolve({ok:!1,reason:"unsupported"});const d=r.getSelfId();if(!0===c.ownMessageOnly&&s.senderId!==d)return Promise.resolve({ok:!1,reason:"not-own"});if("sent"!==s.status)return Promise.resolve({ok:!1,reason:"not-sent"});const m=n();if(void 0!==c.recallWindowMs&&m-(s.serverTime??s.createdAt)>c.recallWindowMs)return Promise.resolve({ok:!1,reason:"expired"});if(!r.isAuthenticated())return Promise.resolve({ok:!1,reason:"disconnected"});const l=e(o.messageId),v=i.get(l);if(void 0!==v)return v.promise;const p=c.prepare(o,s,{selfId:d,now:m});if(!(p instanceof Promise))return function(e){if(!e.ok)return Promise.resolve(e);let s;const n=new Promise(e=>{s=e}),t=setTimeout(()=>a(l,{ok:!1,reason:"timeout"}),15e3);return i.set(l,{messageId:o.messageId,conversationId:o.conversationId,conversationType:o.conversationType,cancelTime:e.recalledAt,resolve:s,timer:t,promise:n}),r.sendFrame(e.frame),n}(p);let g;const u=new Promise(e=>{g=e}),f={messageId:o.messageId,conversationId:o.conversationId,conversationType:o.conversationType,cancelTime:m,resolve:g,promise:u};return i.set(l,f),p.then(e=>{i.get(l)===f&&(e.ok?"group"!==o.conversationType&&"channel"!==o.conversationType||r.domainState.getPinnedMessage(o)?.messageId!==o.messageId?(f.cancelTime=e.recalledAt,f.timer=setTimeout(()=>a(l,{ok:!1,reason:"timeout"}),15e3),r.sendFrame(e.frame)):a(l,{ok:!1,reason:"pinned"}):a(l,e))}).catch(()=>{i.get(l)===f&&a(l,{ok:!1,reason:"failed"})}),u},onRecallAck({sMsgId:e,errcode:o}){const n=i.get(e);if(void 0===n)return;if(o===s.NON_ERR||0===o)return r.domainState.recallMessage({conversationId:n.conversationId,conversationType:n.conversationType},n.messageId,{by:r.getSelfId(),at:n.cancelTime}),void a(e,{ok:!0});const t=o===s.ERR_CHAT_CANCEL_OUTTIME?"server-expired":"failed";a(e,"channel"===n.conversationType?{ok:!1,reason:t,errcode:o}:{ok:!1,reason:t})},reset(){for(const e of[...i.keys()])a(e,{ok:!1,reason:"disconnected"})}}}export{r as RECALL_WINDOW_MS,n as createRecallManager};
@@ -0,0 +1 @@
1
+ import{CmdId as e,ErrCode as d}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{mesChatCancelAckCodec as o,groupChatCancelAckCodec as s,radioCancelChatAckCodec as r,radioAdminCancelChatAckCodec as n,mesChatCancelDeliverCodec as c,mesChatCancelDeliverAckCodec as I,radioAdminCancelChatDeliverCodec as a,radioCancelChatDeliverCodec as m,radioAdminCancelChatDeliverAckCodec as t,radioCancelChatDeliverAckCodec as A}from"../../../../im-protocol/src/protobuf/registry.js";import{buildRecalledPlaceholder as C,buildChannelDeletedPlaceholder as l,buildChannelRecalledPlaceholder as g}from"../../mapping/recall-mapper.js";import{encodeFrame as _}from"../../../../im-protocol/src/frame-codec.js";function i(i){function M(d,o){const s=(o?a:m).decode(d);if(s.sFromId<=0n||s.sRadioId<=0n||""===s.sMsgId.trim())return;const r=o?t:A,n=o?e.RADIO_ADMIN_CANCEL_CHAT_DELIVER_ACK:e.RADIO_CANCEL_CHAT_DELIVER_ACK,c=r.create({sFromId:s.sFromId,sRadioId:s.sRadioId,sMsgId:s.sMsgId,sIndex:s.sIndex});i.sendFrame(_({command:n,body:r.encode(c)})),i.domainState.upsertMessages([o?l(s):g(s)],"live"),i.logger?.(o?"channel-message-deleted-deliver":"channel-recall-deliver",{sMsgId:s.sMsgId,sFromId:s.sFromId.toString(),sRadioId:s.sRadioId.toString()})}return[{command:e.MES_CHATCANCEL_DELIVER,handler:(o,s)=>function(o){const s=c.decode(o);if(""===s.sMsgId)return;i.domainState.upsertMessages([C(s,i.getSelfId())],"live");const r=I.create({sUserId:BigInt(i.getSelfId()),sMsgId:s.sMsgId,errcode:d.NON_ERR});i.sendFrame(_({command:e.MES_CHATCANCEL_DELIVER_ACK,body:I.encode(r)})),i.logger?.("recall-deliver",{sMsgId:s.sMsgId,sFromId:String(s.sFromId),nCancelType:s.nCancelType})}(s)},{command:e.MES_CHATCANCEL_ACK,handler:(e,d)=>{const s=o.decode(d);i.onRecallAck({sMsgId:s.sMsgId,errcode:s.errcode})}},{command:e.GROUP_CHATCANCEL_ACK,handler:(e,d)=>{const o=s.decode(d);i.onRecallAck({sMsgId:o.sMsgId,errcode:o.errcode})}},{command:e.RADIO_CANCEL_CHAT_ACK,handler:(e,d)=>{const o=r.decode(d);i.onRecallAck({sMsgId:o.sMsgId,errcode:o.errcode})}},{command:e.RADIO_ADMIN_CANCEL_CHAT_ACK,handler:(e,d)=>{const o=n.decode(d);i.onChannelMessageDeletionAck({sMsgId:o.sMsgId,errcode:o.errcode})}},{command:e.RADIO_CANCEL_CHAT_DELIVER,handler:(e,d)=>M(d,!1)},{command:e.RADIO_ADMIN_CANCEL_CHAT_DELIVER,handler:(e,d)=>M(d,!0)}]}export{i as createRecallReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{buildDirectRecallFrame as e,buildGroupRecallFrame as n,buildChannelRecallFrame as r}from"./recall-frame.js";const o=3e5;function s(e=[]){const n=/* @__PURE__ */new Map;function r(e){if(n.has(e.conversationType))throw new Error(`撤回策略重复注册:${e.conversationType}`);n.set(e.conversationType,e)}for(const n of e)r(n);return{register:r,resolve:e=>n.get(e)}}function t(e,n){if(e.senderId!==n.selfId)return"not-own";const r=e.serverTime??e.createdAt;return n.now-r>o?"expired":void 0}function a(){return{conversationType:"direct",ownMessageOnly:!0,recallWindowMs:o,prepare(n,r,o){const s=t(r,o);if(void 0!==s)return{ok:!1,reason:s};const a=r.serverTime??r.createdAt;return{ok:!0,recalledAt:o.now,frame:e({selfId:o.selfId,peerId:n.conversationId,messageId:n.messageId,msgTime:a,cancelTime:o.now})}}}}function c(){return{conversationType:"group",ownMessageOnly:!0,recallWindowMs:o,prepare(e,r,o){const s=t(r,o);if(void 0!==s)return{ok:!1,reason:s};const a=r.serverTime??r.createdAt;return{ok:!0,recalledAt:o.now,frame:n({selfId:o.selfId,groupId:e.conversationId,messageId:e.messageId,msgTime:a,cancelTime:o.now})}}}}function i(e={}){return{conversationType:"channel",ownMessageOnly:!0,recallWindowMs:o,async prepare(n,s,t){if(n.conversationId!==s.conversationId||"channel"!==s.conversationType)return{ok:!1,reason:"not-found"};if(s.senderId!==t.selfId)return{ok:!1,reason:"not-own"};const a=s.serverTime??s.createdAt;if(t.now-a>o)return{ok:!1,reason:"expired"};const c=e.resolveSelfDisplayName?.();return{ok:!0,recalledAt:t.now,frame:r({selfId:t.selfId,channelId:s.conversationId,messageId:s.id,msgTime:a,...void 0===c||""===c?{}:{extend:c}})}}}}function d(){return s([a(),c()])}export{o as RECALL_WINDOW_MS,i as createChannelRecallStrategy,d as createDefaultRecallStrategyRegistry,a as createDirectRecallStrategy,c as createGroupRecallStrategy,s as createRecallStrategyRegistry};
@@ -0,0 +1 @@
1
+ import{CmdId as e}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{radioApplyDeliverCodec as n,radioApplyDeliverAckCodec as t}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as o}from"../../../../im-protocol/src/frame-codec.js";function r(e,n){if(e<=0n)throw new Error(`channel application: ${n} id 缺失或非法`);return e.toString()}function i(i){function c(c){const s=n.decode(c),a=function(e){const n=e.getSelfId().trim();if(!/^[1-9]\d*$/.test(n))throw new Error("channel application: 当前账号 id 缺失或非法");return BigInt(n).toString()}(i),d=function(e){const n=r(e.sFromId,"applicant"),t=r(e.sToId,"recipient"),o=r(e.sRadioId,"channel"),i=e.sMsgId.trim();if(""===i)throw new Error("channel application: message id 缺失");return{messageId:i,applicantId:n,recipientId:t,channelId:o,messageTime:e.msgTime.toString(),extend:e.extend,selfIntroduction:e.sSelfIntroduce,description:e.sDesc}}(s),m=t.create({sFromId:BigInt(a),sRadioId:s.sRadioId,sMsgId:d.messageId});try{i.sendFrame(o({command:e.RADIO_APPLY_DELIVER_ACK,body:t.encode(m)}))}catch(e){i.emitter.emit({type:"error",error:{scope:"transport",message:`CHANNEL 入群申请 ACK 发送失败(channelId=${d.channelId}, messageId=${d.messageId})`,cause:e}})}d.recipientId===a&&i.emitter.emit({type:"channel-join-application:received",conversation:{conversationType:"channel",conversationId:d.channelId},notification:d})}return[{command:e.RADIO_APPLY_DELIVER,handler:(e,n)=>c(n)}]}export{i as createChannelApplicationReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{CmdId as e}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{radioNotifyDeliverCodec as r,bMessageCodec as t,radioNotifyDeliverAckCodec as n,bContentCodec as o}from"../../../../im-protocol/src/protobuf/registry.js";import{mapIncomingChannelChat as c}from"../../mapping/channel-message-mapper.js";import{mapIncomingChannelNotify as s}from"../../mapping/channel-notify-mapper.js";import{encodeFrame as d}from"../../../../im-protocol/src/frame-codec.js";function i(i){function a(e,r,t,n="CHANNEL 通知处理失败"){i.emitter.emit({type:"error",error:{scope:e,message:`${n}(channelId=${r.sRadioId.toString()}, messageId=${r.sMsgId})`,cause:t}})}function p(p,y){const m=r.decode(y);!function(e){if(e.sFromId<0n)throw new Error("channel notify: sender id 非法");if(e.sRadioId<=0n)throw new Error("channel notify: channel id 缺失或非法");if(""===e.sMsgId.trim())throw new Error("channel notify: message id 缺失");if(""===e.sId.trim())throw new Error("channel notify: history cursor 缺失")}(m);try{!function(r){const t=n.create({sFromId:r.sFromId,sRadioId:r.sRadioId,sMsgId:r.sMsgId,sIndex:r.sId});i.sendFrame(d({command:e.RADIO_NOTIFY_DELIVER_ACK,body:n.encode(t)}))}(m)}catch(e){a("transport",m,e,"CHANNEL 通知 ACK 发送失败")}let I;try{I=function(e){if(0===e.encrypt)return t.decode(e.sContent);if(1===e.encrypt){if(void 0===i.decrypt)throw new Error("CHANNEL 通知缺少 Web 私钥解密依赖");const r=i.decrypt.resolveUserPrivateKey?.()??null;if(null===r)throw new Error("CHANNEL 通知 Web 私钥缺失");const n=o.decode(e.sContent);if(0===n.secretKey.length||0===n.cipherData.length)throw new Error("CHANNEL 通知 BContent.secretKey/cipherData 缺失");return t.decode(i.decrypt.crypto.decryptEndToEnd({secretKey:n.secretKey,cipherData:n.cipherData,privateKey:r}))}if(2!==e.encrypt)throw new Error(`CHANNEL 通知 encrypt=${e.encrypt} 不支持`);if(void 0===i.decrypt)throw new Error("CHANNEL 通知缺少 ChannelKeyService 解密依赖");const r=i.decrypt.resolveChannelKey(e.sRadioId.toString());if(null===r||16!==r.length)throw new Error("CHANNEL 通知 key 缺失或长度非法");const n=o.decode(e.sContent);if(0===n.cipherData.length)throw new Error("CHANNEL 通知 BContent.cipherData 缺失");return t.decode(i.decrypt.crypto.decryptSymmetric({teaKey:r,cipherData:n.cipherData}))}(m)}catch(e){a(0===m.encrypt?"protocol":"crypto",m,e);const r=c(m,t.create({contentType:1,content:""}),{selfId:i.getSelfId(),cmdId:p,keepRaw:i.keepRaw,decryptFailed:0!==m.encrypt});return i.domainState.upsertMessages([r],"live"),void(1!==m.encrypt&&2!==m.encrypt||i.decrypt?.onDecryptRecovery?.({conversation:{conversationType:"channel",conversationId:r.conversationId},messageId:r.id,wireEncrypt:m.encrypt,sContent:m.sContent.slice(),cmdId:p,source:"live",createdAt:Date.now()}))}try{const e=s({channelId:m.sRadioId,messageId:m.sMsgId,occurredAt:m.msgTime,notifyType:I.type,operatorId:I.oprUserId,targetUserIds:I.mnpledUserId,content:I.content,historyCursor:m.sId,sequence:m.nIncrId,encrypted:0!==m.encrypt,extend:m.extend},{cmdId:p,keepRaw:i.keepRaw});i.domainState.upsertMessages([e],"live"),i.logger?.("channel-notify-deliver",{channelId:m.sRadioId.toString(),messageId:m.sMsgId,notifyType:I.type})}catch(e){a("protocol",m,e)}}return[{command:e.RADIO_NOTIFY_DELIVER,handler:(e,r)=>p(e,r)}]}export{i as createChannelNotifyReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{CmdId as e,ErrCode as t}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{radioChatAckCodec as r,radioChatDeliverCodec as n,radioChatCodec as o,bMessageCodec as d,radioChatDeliverAckCodec as c,bContentCodec as a}from"../../../../im-protocol/src/protobuf/registry.js";import{fromWireMsgId as s}from"../../mapping/message-id.js";import{buildChannelOperationNotifyRemoval as i}from"../../mapping/recall-mapper.js";import{mapIncomingChannelChat as y}from"../../mapping/channel-message-mapper.js";import{encodeFrame as l}from"../../../../im-protocol/src/frame-codec.js";function p(e,t=!0){if(e.sFromId<=0n&&""===e.botId.trim())throw new Error("channel deliver: sender id 缺失或非法");if(e.sRadioId<=0n)throw new Error("channel deliver: channel id 缺失或非法");if(""===e.sMsgId.trim())throw new Error("channel deliver: message id 缺失");if(t&&""===e.sId.trim())throw new Error("channel deliver: history cursor 缺失")}function h(h){function g(e){const n=r.decode(e),o={...""===n.sIndex?{}:{historyCursor:n.sIndex},...0n===n.nIncrId?{}:{channelSequence:n.nIncrId.toString()}},d=function(e){const r=/* @__PURE__ */new Map([[t.ERR_RADIO_DISMISS,"channelDismissed"],[t.ERR_RADIO_NOSPEAK,"channelMuted"],[t.ERR_RADIO_ISDELETE,"channelNotMember"],[t.ERR_RADIO_ADMIN,"channelAdminRequired"]]).get(e);return void 0===r?void 0:{code:e,reason:"rejected",displayCode:r,retryable:!1}}(n.errcode);h.outbox.onChatAck({id:s(n.sMsgId),serverTime:Number(n.msgTime),errcode:n.errcode,...0===Object.keys(o).length?{}:{extensions:o},...void 0===d?{}:{failure:d}});const c=function(e){switch(e){case t.ERR_RADIO_DISMISS:return{state:"dismissed",reason:"channel_dismissed"};case t.ERR_RADIO_NOSPEAK:return{state:"muted",reason:"channel_muted"};case t.ERR_RADIO_ISDELETE:return{state:"unknown_restricted",reason:"channel_not_member"};default:return}}(n.errcode);void 0!==c&&n.sRadioId>0n&&h.domainState.setChannelRestriction(n.sRadioId.toString(),c.state,c.reason),h.logger?.("channel-chat-ack",{messageId:n.sMsgId,channelId:n.sRadioId.toString(),errcode:n.errcode})}function m(e,t,r){const n=e.sRadioId.toString();h.decrypt?.onDecryptError?.({endpoint:"live",surface:t,messageId:e.sMsgId,channelId:n,encrypt:e.encrypt,payloadByteLength:e.sContent.length,...r}),h.emitter.emit({type:"error",error:{scope:"crypto",message:`CHANNEL 实时消息处理失败(${r.reason}, channelId=${n})`,...void 0===r.cause?{}:{cause:r.cause}}})}function I(e,t){let r;if(0===e.encrypt)try{r=d.decode(e.sContent)}catch(t){return void h.emitter.emit({type:"error",error:{scope:"protocol",message:`CHANNEL 实时明文 BMessage 解码失败(channelId=${e.sRadioId.toString()})`,cause:t}})}else if(1===e.encrypt&&void 0!==h.decrypt){const n=h.decrypt.resolveUserPrivateKey?.()??null;if(null===n)return void m(e,t,{reason:"no-key",decryptStage:"key-resolve",keyByteLength:0,keySource:void 0===h.decrypt.resolveUserPrivateKey?"service-absent":"miss"});let o,c;try{if(o=a.decode(e.sContent),0===o.secretKey.length||0===o.cipherData.length)throw new Error("BContent.secretKey/cipherData 缺失")}catch(r){return void m(e,t,{reason:"decrypt-failed",decryptStage:"bcontent",keyByteLength:0,keySource:"user-private-key",cause:r})}try{c=h.decrypt.crypto.decryptEndToEnd({secretKey:o.secretKey,cipherData:o.cipherData,privateKey:n})}catch(r){return void m(e,t,{reason:"decrypt-failed",decryptStage:"tea",keyByteLength:0,keySource:"user-private-key",cipherDataByteLength:o.cipherData.length,cause:r})}try{r=d.decode(c)}catch(r){return void m(e,t,{reason:"decrypt-failed",decryptStage:"bmessage",keyByteLength:0,keySource:"user-private-key",cipherDataByteLength:o.cipherData.length,decryptedByteLength:c.length,cause:r})}}else{if(2!==e.encrypt||void 0===h.decrypt)return void m(e,t,{reason:"no-key",decryptStage:"key-resolve",keyByteLength:0,keySource:"service-absent"});{const n=h.decrypt.resolveChannelKey(e.sRadioId.toString());if(null===n||16!==n.length)return void m(e,t,{reason:"no-key",decryptStage:"key-resolve",keyByteLength:n?.length??0,keySource:null===n?"miss":"cache"});let o,c;try{const t=a.decode(e.sContent);if(0===t.cipherData.length)throw new Error("BContent.cipherData 缺失");o=t.cipherData}catch(r){return void m(e,t,{reason:"decrypt-failed",decryptStage:"bcontent",keyByteLength:n.length,keySource:"cache",cause:r})}try{c=h.decrypt.crypto.decryptSymmetric({teaKey:n,cipherData:o})}catch(r){return void m(e,t,{reason:"decrypt-failed",decryptStage:"tea",keyByteLength:n.length,keySource:"cache",cipherDataByteLength:o.length,cause:r})}try{r=d.decode(c)}catch(r){return void m(e,t,{reason:"decrypt-failed",decryptStage:"bmessage",keyByteLength:n.length,keySource:"cache",cipherDataByteLength:o.length,decryptedByteLength:c.length,cause:r})}}}return r}function v(e){const t=void 0===h.domainState.commitReceivedMessages?h.domainState.upsertMessages(e,"live"):h.domainState.commitReceivedMessages(e,"live");t instanceof Promise&&t.catch(e=>h.emitter.emit({type:"error",error:{scope:"storage",message:"CHANNEL 已确认的消息保存失败",cause:e}}))}function u(t,r){const o=n.decode(r);p(o),function(t){const r=c.create({sFromId:t.sFromId,sRadioId:t.sRadioId,sMsgId:t.sMsgId,sIndex:t.sId});h.sendFrame(l({command:e.RADIO_CHAT_DELIVER_ACK,body:c.encode(r)}))}(o);const a=I(o,"live-deliver");if(void 0===a)return void function(e,t){const r=y(e,d.create({contentType:1,content:""}),{selfId:h.getSelfId(),cmdId:t,keepRaw:h.keepRaw,decryptFailed:!0});v([r]),1!==e.encrypt&&2!==e.encrypt||h.decrypt?.onDecryptRecovery?.({conversation:{conversationType:"channel",conversationId:r.conversationId},messageId:r.id,wireEncrypt:e.encrypt,sContent:e.sContent.slice(),cmdId:t,source:"live",createdAt:Date.now()})}(o,t);const s=i({channelId:o.sRadioId,senderId:o.sFromId,msgTime:o.msgTime,encrypt:o.encrypt},a);if(null!==s)return v([s]),void h.logger?.("channel-operation-notify-deliver",{messageId:o.sMsgId,targetMessageId:s.id,channelId:o.sRadioId.toString(),operation:void 0!==s.deletedForEveryone?"admin-delete":"self-recall",command:t});v([y(o,a,{selfId:h.getSelfId(),cmdId:t,keepRaw:h.keepRaw})]),h.logger?.("channel-chat-deliver",{messageId:o.sMsgId,channelId:o.sRadioId.toString(),encrypt:o.encrypt,command:t})}return[{command:e.RADIO_CHAT_ACK,handler:(e,t)=>g(t)},{command:e.RADIO_CHAT_DELIVER,handler:(e,t)=>u(e,t)},{command:e.MES_RADIO_RED_PACKET_GRABBED,handler:(e,t)=>u(e,t)},{command:e.MES_RADIO_EDIT_MSG_C2C,handler:(e,t)=>function(e,t){const r=o.decode(t);if(p(r,!1),""===r.oldMsgId.trim())throw new Error("channel edit deliver: oldMsgId 缺失");if(""===r.isEdit||"0"===r.isEdit)throw new Error("channel edit deliver: isEdit 标记缺失");if(2!==r.encrypt)throw new Error("channel edit deliver: 必须使用 CHANNEL encrypt=2");const n=s(r.oldMsgId),c=I(r,"live-edit");if(void 0===c){const t={conversationType:"channel",conversationId:r.sRadioId.toString()};return void 0===h.domainState.getConversationMessage(t,n)&&v([{...y(r,d.create({contentType:1,content:""}),{selfId:h.getSelfId(),cmdId:e,keepRaw:h.keepRaw,decryptFailed:!0,edited:!0}),id:n}]),void h.decrypt?.onDecryptRecovery?.({conversation:t,messageId:n,wireEncrypt:2,sContent:r.sContent.slice(),cmdId:e,source:"live",createdAt:Date.now()})}const a=y(r,c,{selfId:h.getSelfId(),cmdId:e,keepRaw:h.keepRaw,edited:!0});if("text"!==a.contentType)throw new Error("channel edit deliver: 仅支持 text 消息");h.domainState.editMessage({conversationType:"channel",conversationId:a.conversationId},n,a.body,a.mention),void 0===h.domainState.getConversationMessage({conversationType:"channel",conversationId:a.conversationId},n)&&v([{...a,id:n,edited:!0,extensions:{...a.extensions,editOperationMessageId:a.id,previousMessageId:n}}])}(e,t)}]}export{h as createChannelReceiveHandlers};
@@ -0,0 +1 @@
1
+ function e(){const e=/* @__PURE__ */new Map;return{register(r,t){if(e.has(r))throw new Error(`收包命令处理器重复注册:cmdId=${r}`);e.set(r,t)},resolve:r=>e.get(r)}}export{e as createCommandHandlerRegistry};
@@ -0,0 +1 @@
1
+ import{CmdId as e,ErrCode as r}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{contactApplicationAnswerDeliverCodec as t,contactApplicationAnswerDeliverAckCodec as o}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as n}from"../../../../im-protocol/src/frame-codec.js";function i(i){return[{command:e.MES_ADDFRIEND_ANS_DELIVER,handler:(s,c)=>{const d=t.decode(c);if(d.sFromId<=0n||d.sToId<=0n||""===d.sMsgId.trim())throw new Error("contact application answer: 处理人、申请人或消息 id 非法");i.sendFrame(n({command:e.MES_ADDFRIEND_ANS_DELIVER_ACK,body:o.encode(o.create({sUserId:d.sFromId,sMsgId:d.sMsgId}))}));const m=d.sToId.toString();if(i.getSelfId()!==m)return;const a=d.sFromId.toString(),p=d.errcode===r.NON_ERR||d.errcode===r.ERR_CHAT_FRIEND_ADDED||function(e){if(""===e.extend.trim())return!1;try{const r=JSON.parse(e.extend);if(null===r||"object"!=typeof r)return!1;const t=r.friend_info;if(null===t||"object"!=typeof t)return!1;const o=t.user_id;return("string"==typeof o||"number"==typeof o||"bigint"==typeof o)&&String(o).trim()===e.sFromId.toString()}catch{return!1}}(d)?"accepted":d.errcode===r.ERR_CHAT_FRIEND_REFUSE?"rejected":"ambiguous";"accepted"===p&&(i.onRelationshipChanged?.(a,"friend"),i.domainState.reconcileDirectContactEstablishedNotice(a,d.sMsgId,Number(d.msgTime)).catch(e=>{i.emitter.emit({type:"error",error:{scope:"storage",message:"好友申请已通过,但本地系统提示更新失败",cause:e}})}),i.domainState.refreshConversationProfile(a,"direct")),i.emitter.emit({type:"contact-application:answered",notification:{responderId:d.sFromId.toString(),applicantId:m,messageId:d.sMsgId,result:p}})}}]}export{i as createContactApplicationAnswerReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{CmdId as o}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{contactApplicationDeliverCodec as r,contactApplicationDeliverAckCodec as t}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as e}from"../../../../im-protocol/src/frame-codec.js";function i(i){return[{command:o.MES_ADDFRIEND_DELIVER,handler:(c,n)=>{const s=r.decode(n);if(s.sFromId<=0n||s.sToId<=0n||""===s.sMsgId.trim())throw new Error("contact application: 申请人、接收人或消息 id 非法");i.sendFrame(e({command:o.MES_ADDFRIEND_DELIVER_ACK,body:t.encode(t.create({sUserId:s.sFromId,sMsgId:s.sMsgId}))}));const m=s.sToId.toString();if(i.getSelfId()!==m)return;const d=Number(s.msgTime);if(!Number.isSafeInteger(d)||d<=0)throw new Error("contact application: 消息时间非法");i.emitter.emit({type:"contact-application:received",notification:{applicantId:s.sFromId.toString(),recipientId:m,messageId:s.sMsgId,createdAt:d}})}}]}export{i as createContactApplicationReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{CmdId as e}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{mapChatAck as r,mapIncomingDirectChat as t}from"../../mapping/message-mapper.js";import{mesChatAckCodec as o,mesChatDeliverCodec as s,bMessageCodec as d,bContentCodec as n,mesChatDeliveredNotificationCodec as c,mesChatReadDeliverCodec as i,mesChatReadAckCodec as a,mesChatSyncReadMsgC2cAckCodec as m,mesChatSyncReadMsgDeliverC2cCodec as I,mesChatDeliverAckCodec as p,mesChatDeliveredNotificationAckCodec as g,mesChatReadDeliverAckCodec as y}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as l}from"../../../../im-protocol/src/frame-codec.js";import{fromWireMsgId as E}from"../../mapping/message-id.js";function _(_){function f(r){const t=p.create({sFromId:r.sFromId,sToId:r.sToId,sMsgId:r.sMsgId,msgTime:r.msgTime});_.sendFrame(l({command:e.MES_CHAT_DELIVER_ACK,body:p.encode(t)}))}function S(e,r,o){const s=t(e,d.create({contentType:1,content:""}),{selfId:_.getSelfId(),cmdId:r,keepRaw:_.keepRaw,decryptFailed:!0,edited:o});_.domainState.upsertMessages([s],"live"),1===e.encrypt&&_.decrypt?.onDecryptRecovery?.({conversation:{conversationType:"direct",conversationId:s.conversationId},messageId:s.id,wireEncrypt:1,sContent:e.sContent.slice(),...""===e.encryptVersion?{}:{encryptVersion:e.encryptVersion},cmdId:r,source:"live",createdAt:Date.now()})}function T(e,r,o=!1){const c=s.decode(r);let i;if(0===c.encrypt)i=d.decode(c.sContent);else{if(1!==c.encrypt||void 0===_.decrypt)return _.emitter.emit({type:"error",error:{scope:"crypto",message:`收到密文投递(encrypt=${c.encrypt}),消息加密 adapter 未接入,已保留占位且不回 ACK`}}),void S(c,e,o);{const r=_.decrypt.resolvePrivateKey({msgType:c.msgType,encrypt:c.encrypt,encryptVersion:c.encryptVersion});if(null===r)return _.decrypt.onDecryptError?.({msgId:c.sMsgId,fromId:String(c.sFromId),toId:String(c.sToId),msgType:c.msgType,cmdId:e,encrypt:c.encrypt,encryptVersion:c.encryptVersion,reason:"no-key"}),_.emitter.emit({type:"error",error:{scope:"crypto",message:`收到密文投递(encrypt=${c.encrypt}),但实时解密缺少私钥,已保留占位且不回 ACK`}}),void S(c,e,o);try{const e=n.decode(c.sContent);if(0===e.secretKey.length||0===e.cipherData.length)throw new Error(`BContent 字段缺失:secretKey=${e.secretKey.length}B cipherData=${e.cipherData.length}B`);const t=_.decrypt.crypto.decryptEndToEnd({secretKey:e.secretKey,cipherData:e.cipherData,privateKey:r});i=d.decode(t)}catch(r){return _.decrypt.onDecryptError?.({msgId:c.sMsgId,fromId:String(c.sFromId),toId:String(c.sToId),msgType:c.msgType,cmdId:e,encrypt:c.encrypt,encryptVersion:c.encryptVersion,reason:"decrypt-failed",cause:r}),_.emitter.emit({type:"error",error:{scope:"crypto",message:`实时密文投递解密失败(encrypt=${c.encrypt}),已保留占位且不回 ACK`,cause:r}}),void S(c,e,o)}}}const a=t(c,i,{selfId:_.getSelfId(),cmdId:e,keepRaw:_.keepRaw,edited:o}),m=_.getSelfId(),I=void 0===_.domainState.commitReceivedMessages?_.domainState.upsertMessages([a],"live"):_.domainState.commitReceivedMessages([a],"live");I instanceof Promise?I.then(()=>{!1!==_.isActive?.()&&_.getSelfId()===m&&f(c)}).catch(e=>_.emitter.emit({type:"error",error:{scope:"storage",message:"接收消息保存失败,未确认投递",cause:e}})):f(c),_.logger?.("chat-deliver",{sMsgId:c.sMsgId,sFromId:String(c.sFromId),sToId:String(c.sToId),encrypt:c.encrypt})}function M(r,t){const o=c.decode(t);_.logger?.("delivered-notif",{sMsgId:o.sMsgId,sFromId:String(o.sFromId),sToId:String(o.sToId)}),""!==o.sMsgId?(!function(r){const t=g.create({sUserId:r.sToId,sMsgId:r.sMsgId});_.sendFrame(l({command:e.MES_CHAT_DELIVERED_NOTIFICATION_ACK,body:g.encode(t)})),_.logger?.("delivered-notif-ack",{sUserId:String(t.sUserId),sMsgId:t.sMsgId})}(o),_.emitter.emit({type:"notification",cmdId:r,name:"MES_CHAT_DELIVERED_NOTIFICATION"})):_.emitter.emit({type:"error",error:{scope:"protocol",message:"MES_CHAT_DELIVERED_NOTIFICATION(4102) body 缺少 sMsgId,跳过 ACK"}})}function C(r,t){const o=i.decode(t);if(_.logger?.("read-deliver",{sMsgId:o.sMsgId,sFromId:String(o.sFromId),sToId:String(o.sToId),readResults:o.readResults.length,readReceiptOff:o.readReceiptOff}),""!==o.sMsgId){if(function(r){const t=y.create({sUserId:r.sToId,sMsgId:r.sMsgId});_.sendFrame(l({command:e.MES_CHAT_READ_DELIVER_ACK,body:y.encode(t)})),_.logger?.("read-deliver-ack",{sUserId:String(t.sUserId),sMsgId:t.sMsgId})}(o),1!==o.readReceiptOff){const e=_.getSelfId(),r=o.sFromId.toString(),t=o.sToId.toString();!function(e,r){const t=_.getSelfId(),o=[];for(const s of r){const r=_.domainState.getConversationMessage({conversationType:"direct",conversationId:e},E(s.sMsgId));void 0!==r&&r.senderId===t&&"read"!==r.receipt&&o.push({...r,receipt:"read"})}o.length>0&&_.domainState.upsertMessages(o,"live")}(r===e?t:r,o.readResults)}_.emitter.emit({type:"notification",cmdId:r,name:"MES_CHAT_READ_DELIVER"})}else _.emitter.emit({type:"error",error:{scope:"protocol",message:"MES_CHAT_READ_DELIVER(4106) body 缺少 sMsgId,跳过 ACK"}})}return[{command:e.MES_CHAT_ACK,handler:(e,t)=>function(e){const t=r(o.decode(e));_.logger?.("chat-ack",{id:t.id,errcode:t.errcode,serverTime:t.serverTime}),_.outbox.onChatAck(t)}(t)},{command:e.MES_CHAT_DELIVER,handler:(e,r)=>T(e,r)},{command:e.MES_CHAT_EDIT_MSG_C2C,handler:(e,r)=>T(e,r,!0)},{command:e.MES_CHAT_DELIVERED_NOTIFICATION,handler:(e,r)=>M(e,r)},{command:e.MES_CHAT_READ_DELIVER,handler:(e,r)=>C(e,r)},{command:e.MES_CHAT_READ_ACK,handler:(e,r)=>function(e){const r=a.decode(e);_.logger?.("read-report-ack",{notifyId:r.sMsgId,sUserId:String(r.sUserId),errcode:r.errcode}),_.onReadAck?.({notifyId:r.sMsgId,errcode:r.errcode})}(r)},{command:e.MES_CHAT_SYNC_READ_MSG_C2C_ACK,handler:(e,r)=>function(e){const r=m.decode(e);_.logger?.("direct-sync-read-ack",{errcode:r.errcode}),_.onSyncReadAck?.({errcode:r.errcode})}(r)},{command:e.MES_CHAT_SYNC_READ_MSG_DELIVER_C2C,handler:(e,r)=>function(e,r){const t=I.decode(r),o=t.sUserId.toString(),s=t.sFromId.toString();_.logger?.("direct-sync-read-deliver",{userId:o,peerId:s,msgIds:t.msgIdList.length}),_.onSyncReadDeliver?.({userId:o,peerId:s,msgIdList:t.msgIdList}),_.emitter.emit({type:"notification",cmdId:e,name:"MES_CHAT_SYNC_READ_MSG_DELIVER_C2C"})}(e,r)}]}export{_ as createDirectReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{CmdId as e}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{friendActionNotifyCodec as r,friendActionNotifyAckCodec as o}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as t}from"../../../../im-protocol/src/frame-codec.js";import{FriendNotifyType as i}from"../../../../im-protocol/src/protobuf/gen/im.msg_pb.js";function n(n){return[{command:e.MES_FRIEND_NOTIFY,handler:(d,c)=>function(d){const c=r.decode(d);if(c.uerId<=0n)throw new Error("friend action: user id 缺失或非法");const s=o.create({userId:c.uerId,msgId:c.sMsgId});if(n.sendFrame(t({command:e.MES_FRIEND_NOTIFY_ACK,body:o.encode(s)})),c.friendNotifyType===i.FRIEND_NOTIFY_BECOME_FRIEND&&n.getSelfId()===c.uerId.toString()){const e=c.friendId.toString();n.onRelationshipChanged?.(e,"friend"),n.domainState.reconcileDirectContactEstablishedNotice(e,c.sMsgId,Number(c.msgTime)).catch(e=>{n.emitter.emit({type:"error",error:{scope:"storage",message:"联系人关系已建立,但本地系统提示更新失败",cause:e}})})}if(n.getSelfId()===c.uerId.toString()&&c.friendId>0n){const e=c.friendId.toString(),r=c.friendNotifyType===i.FRIEND_NOTIFY_DELETE,o=c.friendNotifyType===i.FRIEND_NOTIFY_BLACKLIST_CHANGE&&2===c.blackStatus;(r||o)&&(n.onRelationshipChanged?.(e,r?"none":"blocked"),n.domainState.removeConversation({conversationType:"direct",conversationId:e}),Promise.resolve(n.resetDirectReadReceiptPreference?.(e)).catch(r=>{n.emitter.emit({type:"error",error:{scope:"storage",message:"direct 已读回执偏好重置失败",cause:{peerId:e,error:r}}})}),n.emitter.emit({type:"profile:updated",profileType:"user",id:e}))}n.emitter.emit({type:"notification",cmdId:e.MES_FRIEND_NOTIFY,name:"MES_FRIEND_NOTIFY"})}(c)}]}export{n as createFriendActionReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{CmdId as e}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{mesGrpNotifyDeliverCodec as d,mesGrpNotifyDeliverAckCodec as o,mesJoinGrpDeliverCodec as s,mesJoinGrpDeliverAckCodec as r,mesExchangeKeyDeliverCodec as n,mesExchangeKeyDeliverAckCodec as I,mesExchangeKeyDeliverNotifyCodec as t,mesExchangeKeyDeliverNotifyAckCodec as c}from"../../../../im-protocol/src/protobuf/registry.js";import{mapIncomingGroupNotify as m}from"../../mapping/group-notify-mapper.js";import{encodeFrame as g}from"../../../../im-protocol/src/frame-codec.js";function i(i){return[{command:e.MES_GRPNOTIFY_DELIVER,handler:(s,r)=>function(s,r){const n=d.decode(r),I=i.getSelfId(),t=m(n,{cmdId:s,keepRaw:i.keepRaw});i.domainState.upsertMessages([t],"live");const c=o.create({sUserId:BigInt(I),sGrpId:n.sGrpId,sMsgId:n.sMsgId});i.sendFrame(g({command:e.MES_GRPNOTIFY_DELIVER_ACK,body:o.encode(c)})),i.emitter.emit({type:"notification",cmdId:s,name:"MES_GRPNOTIFY_DELIVER"}),i.logger?.("grp-notify-deliver",{groupId:n.sGrpId.toString(),sMsgId:n.sMsgId,notifyType:n.notifyType})}(s,r)},{command:e.MES_JOINGRP_DELIVER,handler:(d,o)=>function(d,o){const n=s.decode(o),I=r.create({sUserId:BigInt(i.getSelfId()),sGrpId:n.sGrpId,sMsgId:n.sMsgId});i.sendFrame(g({command:e.MES_JOINGRP_DELIVER_ACK,body:r.encode(I)})),i.emitter.emit({type:"notification",cmdId:d,name:"MES_JOINGRP_DELIVER"}),i.logger?.("grp-join-deliver",{sGrpId:n.sGrpId.toString(),sMsgId:n.sMsgId})}(d,o)},{command:e.MES_EXCHANGE_KEY_DELIVER,handler:(d,o)=>function(d){const o=n.decode(d),s=I.create({sFromId:BigInt(i.getSelfId()),sToId:o.sFromId,sGrpId:o.sGrpId,sMsgId:o.sMsgId});i.sendFrame(g({command:e.MES_EXCHANGE_KEY_DELIVER_ACK,body:I.encode(s)})),i.logger?.("grp-exchange-key-deliver-noop-ack",{sMsgId:o.sMsgId})}(o)},{command:e.MES_EXCHANGE_KEY_DELIVERD_NOTIFY,handler:(d,o)=>function(d){const o=t.decode(d),s=c.create({sUserId:BigInt(i.getSelfId()),sMsgId:o.sMsgId});i.sendFrame(g({command:e.MES_EXCHANGE_KEY_DELIVERD_NOTIFY_ACK,body:c.encode(s)})),i.logger?.("grp-exchange-key-notify-noop-ack",{sMsgId:o.sMsgId})}(o)}]}export{i as createGroupEventReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{CmdId as e}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{groupChatAckCodec as r,mesGrpChatDeliverCodec as t,bMessageCodec as o,mesGroupSyncReadMsgC2cAckCodec as n,mesGroupSyncReadMsgDeliverC2cCodec as c,bContentCodec as s,mesGrpChatDeliverAckCodec as i}from"../../../../im-protocol/src/protobuf/registry.js";import{fromWireMsgId as d}from"../../mapping/message-id.js";import{mapIncomingGroupChat as p}from"../../mapping/group-message-mapper.js";import{isCryptoExecutionError as a}from"../../ports/crypto-task-executor.js";import{encodeFrame as y}from"../../../../im-protocol/src/frame-codec.js";function m(m){const g=/* @__PURE__ */new Map;function u(r){const t=i.create({sFromId:BigInt(m.getSelfId()),sGrpId:r.sGrpId,sMsgId:r.sMsgId});m.sendFrame(y({command:e.MES_GRPCHAT_DELIVER_ACK,body:i.encode(t)}))}function v(){return m.isActive?.()??!0}function I(e,r,t,n,c=!1){const s=e.sGrpId.toString(),i=p(e,o.create({contentType:1,content:""}),{selfId:m.getSelfId(),cmdId:r,keepRaw:m.keepRaw,decryptFailed:!0,edited:c});m.domainState.upsertMessages([i],"live"),1===e.encrypt&&m.decrypt?.onDecryptRecovery?.({conversation:{conversationType:"group",conversationId:s},messageId:i.id,wireEncrypt:1,sContent:e.sContent.slice(),...""===e.encryptVersion?{}:{encryptVersion:e.encryptVersion},cmdId:r,source:"live",createdAt:Date.now()}),m.decrypt?.onDecryptError?.({msgId:e.sMsgId,groupId:s,fromId:String(e.sFromId),msgType:e.msgType,cmdId:r,encrypt:e.encrypt,encryptVersion:e.encryptVersion,reason:t,...void 0===n?{}:{cause:n}}),m.emitter.emit({type:"error",error:{scope:"crypto",message:"no-key"===t?`收到群密文投递(encrypt=${e.encrypt}),但实时解密缺少群私钥,已保留占位且不回 ACK`:`实时群密文投递解密失败(encrypt=${e.encrypt}),已保留占位且不回 ACK`,...void 0===n?{}:{cause:n}}})}function l(e,r,t,o){const n=p(e,t,{selfId:m.getSelfId(),cmdId:r,keepRaw:m.keepRaw,edited:o}),c=m.getSelfId(),s=void 0===m.domainState.commitReceivedMessages?m.domainState.upsertMessages([n],"live"):m.domainState.commitReceivedMessages([n],"live");s instanceof Promise?s.then(()=>{!1!==m.isActive?.()&&m.getSelfId()===c&&u(e)}).catch(e=>m.emitter.emit({type:"error",error:{scope:"storage",message:"接收消息保存失败,未确认投递",cause:e}})):u(e),m.logger?.("grp-chat-deliver",{sMsgId:e.sMsgId,sGrpId:String(e.sGrpId),sFromId:String(e.sFromId),encrypt:e.encrypt})}function f(e,r){const t=s.decode(e.sContent);if(0===t.secretKey.length||0===t.cipherData.length)throw new Error(`BContent 字段缺失:secretKey=${t.secretKey.length}B cipherData=${t.cipherData.length}B`);const n=m.decrypt.crypto.decryptEndToEnd({secretKey:t.secretKey,cipherData:t.cipherData,privateKey:r});return o.decode(n)}function S(e,r,t){const n=e.sGrpId.toString(),c=(g.get(n)??Promise.resolve()).then(()=>async function(e,r,t){if(!v())return;if(0===e.encrypt){try{l(e,r,o.decode(e.sContent),t)}catch(e){v()&&m.emitter.emit({type:"error",error:{scope:"protocol",message:"异步群明文投递解析或提交失败",cause:e}})}return}if(1!==e.encrypt||void 0===m.decrypt)return void I(e,r,"no-key",void 0,t);const n={groupId:e.sGrpId.toString(),msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion};let c,s;try{c=m.decrypt.resolvePrivateKey(n),null===c&&void 0!==m.decrypt.preparePrivateKey&&(c=await m.decrypt.preparePrivateKey(n))}catch(o){if(!v()||o instanceof Error&&"AbortError"===o.name)return;return a(o)?void m.emitter.emit({type:"error",error:{scope:"crypto",message:"群密钥计算执行失败,未确认投递",cause:o}}):void I(e,r,"no-key",o,t)}if(v())if(null!==c){try{s=f(e,c)}catch(o){return void I(e,r,"decrypt-failed",o,t)}if(v())try{l(e,r,s,t)}catch(e){v()&&m.emitter.emit({type:"error",error:{scope:"protocol",message:"异步群投递落地或回 ACK 失败",cause:e}})}}else I(e,r,"no-key",void 0,t)}(e,r,t));g.set(n,c),c.finally(()=>{g.get(n)===c&&g.delete(n)})}function C(e,r,n=!1){const c=t.decode(r),s=c.sGrpId.toString();if(g.has(s))return void S(c,e,n);if(0===c.encrypt)return void l(c,e,o.decode(c.sContent),n);if(1!==c.encrypt||void 0===m.decrypt)return void I(c,e,"no-key",void 0,n);const i={groupId:s,msgType:c.msgType,encrypt:c.encrypt,encryptVersion:c.encryptVersion},d=m.decrypt.resolvePrivateKey(i);if(null===d)return void 0!==m.decrypt.preparePrivateKey?void S(c,e,n):void I(c,e,"no-key",void 0,n);let p;try{p=f(c,d)}catch(r){return void I(c,e,"decrypt-failed",r,n)}l(c,e,p,n)}function _(e,r){const t=c.decode(r),o=t.groupId.toString();if(t.sUserId.toString()!==m.getSelfId())return void m.logger?.("grp-sync-read-deliver-skip",{groupId:o,sUserId:String(t.sUserId)});m.logger?.("grp-sync-read-deliver",{groupId:o,sUserId:String(t.sUserId),msgIds:t.msgIdList.length});const n=function(e,r){for(let t=r.length-1;t>=0;t-=1){const o=r[t];if(void 0===o||""===o)continue;const n=d(o),c=m.domainState.getConversationMessage({conversationType:"group",conversationId:e},n);if(void 0!==c&&c.conversationId===e)return n}}(o,t.msgIdList);m.domainState.applyServerUnread({conversationType:"group",conversationId:o},0,n),m.emitter.emit({type:"notification",cmdId:e,name:"MES_GRPCHAT_SYNC_READ_MSG_DELIVER_C2C"})}return[{command:e.GROUP_CHAT_ACK,handler:(e,t)=>function(e){const t=r.decode(e),o={id:d(t.sMsgId),serverTime:Number(t.sendtime),errcode:t.errcode};m.logger?.("grp-chat-ack",{id:o.id,errcode:o.errcode,serverTime:o.serverTime}),m.outbox.onChatAck(o)}(t)},{command:e.MES_GRPCHAT_DELIVER,handler:(e,r)=>C(e,r)},{command:e.MES_GRPCHAT_EDIT_MSG_C2C,handler:(e,r)=>C(e,r,!0)},{command:e.MES_GRPCHAT_SYNC_READ_MSG_C2C_ACK,handler:(e,r)=>function(e){const r=n.decode(e);m.logger?.("grp-sync-read-ack",{errcode:r.errcode})}(r)},{command:e.MES_GRPCHAT_SYNC_READ_MSG_DELIVER_C2C,handler:(e,r)=>_(e,r)}]}export{m as createGroupReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{CUSTOMER_SERVICE_MESSAGE_TYPE as e,mapIncomingCustomerServiceChat as r}from"../../mapping/customer-service-message-mapper.js";import{createDirectReceiveHandlers as t}from"./direct-receive-handlers.js";import{CmdId as o}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{mesChatDeliverCodec as s,bMessageCodec as c,bContentCodec as m,mesChatDeliverAckCodec as i}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as n}from"../../../../im-protocol/src/frame-codec.js";function d(d){return t(d).map(t=>t.command!==o.MES_CHAT_DELIVER?t:{command:t.command,handler(p,a){const y=s.decode(a);if(y.msgType!==e)return void t.handler(p,a);const g=d.getSelfId();let f;try{if(0===y.encrypt)f=c.decode(y.sContent);else{if(1!==y.encrypt||void 0===d.decrypt)throw new Error(`客服消息加密类型暂不支持:${y.encrypt}`);{const e=d.decrypt.resolvePrivateKey({msgType:y.msgType,encrypt:y.encrypt,encryptVersion:y.encryptVersion});if(!e)throw new Error("客服消息解密密钥不可用");const r=m.decode(y.sContent);if(0===r.secretKey.length||0===r.cipherData.length)throw new Error("客服密文结构不完整");f=c.decode(d.decrypt.crypto.decryptEndToEnd({...r,privateKey:e}))}}}catch(e){return d.domainState.upsertMessages([r(y,c.create({contentType:1}),{selfId:g,decryptFailed:!0})],"live"),void d.emitter.emit({type:"error",error:{scope:"crypto",message:"客服消息解包失败,未确认投递",cause:e}})}const l=r(y,f,{selfId:g}),v=i.create({sFromId:y.sFromId,sToId:y.sToId,sMsgId:y.sMsgId,msgTime:y.msgTime}),h=()=>{!1!==d.isActive?.()&&d.getSelfId()===g&&d.sendFrame(n({command:o.MES_CHAT_DELIVER_ACK,body:i.encode(v)}))},u=void 0===d.domainState.commitReceivedMessages?d.domainState.upsertMessages([l],"live"):d.domainState.commitReceivedMessages([l],"live");u instanceof Promise?u.then(h).catch(e=>d.emitter.emit({type:"error",error:{scope:"storage",message:"客服消息保存失败,未确认投递",cause:e}})):h()}})}export{d as createMesChatReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{CmdId as e}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{mapRobotMsgAck as o,mapIncomingRobotChat as t}from"../../mapping/robot-message-mapper.js";import{robotMsgAckCodec as r,robotReplyUserMsgCodec as m,mesChatDeliverAckCodec as d,mesRobotDeleteNotifyCodec as i}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as s}from"../../../../im-protocol/src/frame-codec.js";function c(c){return[{command:e.MES_CHAT_MES_ROBOT_ACK,handler:(e,t)=>function(e){const t=o(r.decode(e));c.logger?.("robot-ack",{id:t.id,errcode:t.errcode}),c.outbox.onChatAck(t)}(t)},{command:e.MES_CHAT_MES_ROBOT_REPLY,handler:(o,r)=>function(o,r){const i=m.decode(r),n=t(i,{selfId:c.getSelfId(),cmdId:o,keepRaw:c.keepRaw}),a=d.create({sFromId:BigInt(i.robotId),sToId:i.userId,sMsgId:i.sMsgId,msgTime:i.msgTime}),_=s({command:e.MES_CHAT_DELIVER_ACK,body:d.encode(a)}),p=c.getSelfId(),E=void 0===c.domainState.commitReceivedMessages?c.domainState.upsertMessages([n],"live"):c.domainState.commitReceivedMessages([n],"live");E instanceof Promise?E.then(()=>{!1!==c.isActive?.()&&c.getSelfId()===p&&c.sendFrame(_)}).catch(e=>c.emitter.emit({type:"error",error:{scope:"storage",message:"机器人回复保存失败,未确认投递",cause:e}})):c.sendFrame(_)}(o,r)},{command:e.BOT_MSG_ROBOT_DELETE_SEND,handler:(o,t)=>function(o){const t=i.decode(o);if(""===t.robotId.trim())throw new Error("robot delete: robotId 缺失");c.domainState.removeConversation({conversationType:"robot",conversationId:t.robotId}),c.emitter.emit({type:"notification",cmdId:e.BOT_MSG_ROBOT_DELETE_SEND,name:"BOT_MSG_ROBOT_DELETE_SEND"})}(t)}]}export{c as createRobotReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{CmdId as o}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{userFavoriteListChangedNotifyCodec as r}from"../../../../im-protocol/src/protobuf/registry.js";function t(t){return[{command:o.MES_USER_FAVORITE_LIST_CHANGED_NOTIFY,handler:(o,e)=>function(o){const e=r.decode(o);if(e.userId<=0n)throw new Error("session favorite notify: user id 缺失或非法");t.getSelfId()===e.userId.toString()&&t.emitter.emit({type:"session-favorites:changed"})}(e)}]}export{t as createSessionFavoriteReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{CmdId as e}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{walletNotifyDeliverCodec as r,transferReturnNotifyCodec as o,walletNotifyDeliverAckCodec as t}from"../../../../im-protocol/src/protobuf/registry.js";import{WalletNotifyType as i}from"../../../../im-protocol/src/protobuf/gen/im.msg_pb.js";import{encodeFrame as m}from"../../../../im-protocol/src/frame-codec.js";function n(n){return[{command:e.MS_WALLETNOTIFY_DELIVER,handler:(s,c)=>function(s){const c=r.decode(s),a=()=>n.sendFrame(m({command:e.MS_WALLETNOTIFY_DELIVER_ACK,body:t.encode(t.create({sUserId:c.sToId,sMsgId:c.sMsgId}))}));if(c.notifyType===i.Notify_TransferReturnNotify){const r=o.decode(c.sContent),t=r.serialNumber.trim();if(""===t)throw new Error("wallet notify: serialNumber 缺失");const i=Number(r.occurredTime);return void n.domainState.applyTransferStatusBySerialNumber(t,3,Number.isFinite(i)&&i>0?i:void 0).then(()=>{a(),n.emitter.emit({type:"notification",cmdId:e.MS_WALLETNOTIFY_DELIVER,name:"MS_WALLETNOTIFY_DELIVER"})}).catch(e=>{n.emitter.emit({type:"error",error:{scope:"storage",message:"持久化钱包转账状态失败,未发送 ACK",cause:e}})})}a(),n.emitter.emit({type:"notification",cmdId:e.MS_WALLETNOTIFY_DELIVER,name:"MS_WALLETNOTIFY_DELIVER"})}(c)}]}export{n as createWalletNotifyReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{encodeFrame as e}from"../../../../im-protocol/src/frame-codec.js";import{CmdId as t}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{bMessageCodec as o,bContentCodec as r,radioChatCodec as n}from"../../../../im-protocol/src/protobuf/registry.js";function s(e,t,o=e.encrypt){return n.encode(n.create({sRadioId:e.sRadioId,sFromId:e.sFromId,sMsgId:e.sMsgId,msgTime:e.msgTime,encrypt:o,sContent:t,...void 0===e.nNotifyCount?{}:{nNotifyCount:e.nNotifyCount},...void 0===e.sNotifyUsers?{}:{sNotifyUsers:e.sNotifyUsers},...void 0===e.extend||""===e.extend?{}:{extend:e.extend},...void 0===e.parentMsgId||""===e.parentMsgId?{}:{parentMsgId:e.parentMsgId}}))}function i(e){return o.encode(o.create(e.bMessage))}function c(e,t,o){if(16!==o.length)throw new Error(`channel encrypt=2 key 必须为 16 bytes,实际 ${o.length}`);const n=t.encryptSymmetric({teaKey:o,plain:i(e)});return s(e,r.encode(r.create({cipherData:n})),2)}function d(o){return function(o,r,n){return e({command:t.RADIO_CHAT,body:s(o,r,n)})}(o,i(o),0)}function m(o,r,n){return e({command:t.RADIO_CHAT,body:c(o,r,n)})}export{s as buildChannelChatBytes,d as buildChannelChatFrame,c as buildEncryptedChannelChatBytes,m as buildEncryptedChannelChatFrame};
@@ -0,0 +1 @@
1
+ import{buildChannelChatFrame as e,buildEncryptedChannelChatFrame as o}from"./channel-outgoing-frame.js";import{buildChannelOutgoingChat as n}from"../../mapping/channel-message-mapper.js";function r(r={}){return{conversationType:"channel",buildOutgoingFrame(t,i){const d="sticker"===t.contentType&&(void 0!==(a=t.body).sticker&&void 0===a.text&&void 0===a.system&&void 0===a.image&&void 0===a.video&&void 0===a.voice&&void 0===a.file&&void 0===a.contact&&void 0===a.miniProgram&&void 0===a.robot&&void 0===a.game&&void 0===a.transfer&&void 0===a.unknown)&&!1===t.encryption.encrypted;var a;const c=n({id:t.id,conversationId:t.conversationId,body:t.body,mention:t.mention,refMessageId:t.refMessageId},{selfId:i.selfId,createdAt:t.createdAt});if(d)return e(c);const{crypto:s}=i,{resolveChannelKey:v}=r;return(async()=>{if(void 0===s||void 0===v)throw new Error("channel encrypt=2 发送未装配加密依赖(crypto / resolveChannelKey)");const e=await v(t.conversationId);if(null===e||16!==e.length)throw new Error(`channel encrypt=2 取频道 key 失败(conversationId=${t.conversationId})`);return o(c,s,e)})()}}}export{r as createChannelSendStrategy};
@@ -0,0 +1 @@
1
+ import{encodeFrame as n}from"../../../../im-protocol/src/frame-codec.js";import{CmdId as r}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{bMessageCodec as o,bContentCodec as t,mesChatCodec as e}from"../../../../im-protocol/src/protobuf/registry.js";function c(n,r,o){const t=e.create({sToId:n.sToId,sFromId:n.sFromId,sMsgId:n.sMsgId,msgType:n.msgType,encrypt:n.encrypt,sContent:r,...void 0===o||""===o?{}:{encryptVersion:o},...void 0!==n.parentMsgId&&""!==n.parentMsgId?{parentMsgId:n.parentMsgId}:{}});return e.encode(t)}function s(o,t){return n({command:r.MES_CHAT,body:c(o,t)})}function d(n){return o.encode(o.create(n.bMessage))}function i(n,r,o){const{secretKey:e,cipherData:c}=r.encryptEndToEnd({plain:d(n),publicKey:o});return t.encode(t.create({secretKey:e,cipherData:c}))}function p(n){return s(n,d(n))}function u(o){return function(o,t){const e=c(o,t);return[n({command:r.MES_CHAT,body:e}),n({command:r.MES_CHAT_OPPOSITE_END,body:e})]}(o,d(o))}function m(n,r,o){return s(n,i(n,r,o))}function a(o,t,e,s,d){const p=m(o,t,e),u=i(o,t,s);return[p,n({command:r.MES_CHAT_OPPOSITE_END,body:c(o,u,d)})]}function f(n,r,o){return c(n,i(n,r,o))}export{f as buildEncryptedMesChatBytes,m as buildEncryptedMesChatFrame,a as buildEncryptedMesChatFrames,c as buildMesChatBytes,p as buildMesChatFrame,u as buildMesChatFrames,i as encryptMesChatSContent};
@@ -0,0 +1 @@
1
+ import{buildMesChatFrames as r,buildEncryptedMesChatFrames as e,buildMesChatFrame as n,buildEncryptedMesChatFrame as o}from"./direct-outgoing-frame.js";import{buildDirectOutgoingChat as t}from"../../mapping/message-mapper.js";function i(r,e){return t({id:r.id,conversationId:r.conversationId,body:r.body,encryption:r.encryption,refMessageId:r.refMessageId},{selfId:e.selfId})}function c(t={}){const c={conversationType:"direct",buildOutgoingFrame(r,e){const t=i(r,e);if(1!==t.encrypt)return n(t);const{crypto:c,resolveEncryptionKey:s}=e;if(void 0===c||void 0===s)throw new Error("direct encrypt=1 发送未装配加密依赖(crypto / resolveEncryptionKey)");return(async()=>{const e=await s(r.conversationId);if(null===e||""===e)throw new Error(`direct encrypt=1 取对端公钥失败(conversationId=${r.conversationId})`);return o(t,c,e)})()}};return!0!==t.includeOppositeEnd?c:{...c,buildOutgoingFrames(n,o){const c=i(n,o);if(1!==c.encrypt)return r(c);const{crypto:s,resolveEncryptionKey:d}=o,{resolveOwnKey:y}=t;if(void 0===s||void 0===d||void 0===y)throw new Error("direct encrypt=1 多端发送未装配加密依赖(crypto / resolveEncryptionKey / resolveOwnKey)");return(async()=>{const[r,t]=await Promise.all([d(n.conversationId),y(o.selfId)]);if(null===r||""===r)throw new Error(`direct encrypt=1 取对端公钥失败(conversationId=${n.conversationId})`);if(null===t||""===t.publicKey.trim())throw new Error("direct encrypt=1 取当前账号多端同步公钥失败");return e(c,s,r,t.publicKey,t.version)})()}}}export{c as createDirectSendStrategy};
@@ -0,0 +1 @@
1
+ import{encodeFrame as e}from"../../../../im-protocol/src/frame-codec.js";import{CmdId as t}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{bMessageCodec as r,bContentCodec as o,mesGrpChatCodec as n}from"../../../../im-protocol/src/protobuf/registry.js";function s(e,t,r){const o=n.create({sGrpId:e.sGrpId,sFromId:e.sFromId,sMsgId:e.sMsgId,msgType:e.msgType,encrypt:e.encrypt,sContent:t,...void 0!==e.nNotifyCount?{nNotifyCount:e.nNotifyCount}:{},...void 0!==e.sNotifyUsers?{sNotifyUsers:e.sNotifyUsers}:{},...void 0!==e.extend&&""!==e.extend?{extend:e.extend}:{},...void 0!==e.parentMsgId&&""!==e.parentMsgId?{parentMsgId:e.parentMsgId}:{},...void 0!==r&&""!==r?{encryptVersion:r}:{}});return n.encode(o)}function c(r,o,n){return e({command:t.GROUP_CHAT,body:s(r,o,n)})}function i(e){return r.encode(r.create(e.bMessage))}function d(e,t,r){const{secretKey:n,cipherData:s}=t.encryptEndToEnd({plain:i(e),publicKey:r});return o.encode(o.create({secretKey:n,cipherData:s}))}function p(e){return c(e,i(e))}function u(e,t,r,o){return c(e,d(e,t,r),o)}function f(e,t,r,o){return s(e,d(e,t,r),o)}export{f as buildEncryptedGroupChatBytes,u as buildEncryptedGroupChatFrame,s as buildGroupChatBytes,p as buildGroupChatFrame,d as encryptGroupChatSContent};
@@ -0,0 +1 @@
1
+ import{buildGroupChatFrame as r,buildEncryptedGroupChatFrame as o}from"./group-outgoing-frame.js";import{buildGroupOutgoingChat as e}from"../../mapping/group-message-mapper.js";function n(n={}){return{conversationType:"group",buildOutgoingFrame(t,i){const p=e({id:t.id,conversationId:t.conversationId,body:t.body,encryption:t.encryption,mention:t.mention,refMessageId:t.refMessageId},{selfId:i.selfId});if(1!==p.encrypt)return r(p);const{crypto:s}=i,{resolveGroupKey:c}=n;if(void 0===s||void 0===c)throw new Error("group encrypt=1 发送未装配加密依赖(crypto / 群密钥服务 resolveGroupKey)");return(async()=>{const r=await c(t.conversationId);if(null===r||""===r.publicKey)throw new Error(`group encrypt=1 取群公钥失败(conversationId=${t.conversationId})`);return o(p,s,r.publicKey,r.version)})()}}}export{n as createGroupSendStrategy};
@@ -0,0 +1 @@
1
+ import{robotMsgCodec as o}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as r}from"../../../../im-protocol/src/frame-codec.js";import{CmdId as t}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";function m(m){const e=o.encode(o.create({userId:m.userId,robotId:m.robotId,content:m.content,msgTime:m.msgTime,sMsgId:m.sMsgId}));return r({command:t.MES_CHAT_MES_ROBOT,body:e})}export{m as buildRobotChatFrame};
@@ -0,0 +1 @@
1
+ import{buildRobotChatFrame as e}from"./robot-outgoing-frame.js";import{buildOutgoingRobotChat as o}from"../../mapping/robot-message-mapper.js";function r(){return{conversationType:"robot",buildOutgoingFrame:(r,t)=>e(o({id:r.id,conversationId:r.conversationId,body:r.body,createdAt:r.createdAt,encryption:r.encryption,refMessageId:r.refMessageId},{selfId:t.selfId}))}}export{r as createRobotSendStrategy};
@@ -0,0 +1 @@
1
+ import{createDirectSendStrategy as e}from"./direct-send-strategy.js";function r(e=[]){const r=/* @__PURE__ */new Map;function n(e){if(r.has(e.conversationType))throw new Error(`发送策略重复注册:${e.conversationType}`);r.set(e.conversationType,e)}for(const r of e)n(r);return{register:n,resolve:e=>r.get(e)}}function n(){return r([e()])}export{n as createDefaultSendStrategyRegistry,r as createSendStrategyRegistry};
@@ -0,0 +1 @@
1
+ import{isValidTransferBody as e}from"../../mapping/transfer-body.js";function r(r,n){if("channel"===n.conversationType)throw new Error("sendTransfer: CHANNEL 不发送转账");if(!e(n.transfer))throw new Error("sendTransfer: 转账正文非法");const{id:t,createdAt:o}=r.outbox.allocateMessageIdentity(n);return r.outbox.enqueueMedia({id:t,createdAt:o,conversationId:n.conversationId,conversationType:n.conversationType,contentType:"transfer",body:{transfer:n.transfer},encryption:{encrypted:!1},...void 0===n.refMessageId?{}:{refMessageId:n.refMessageId}})}export{r as sendTransferMessage};
@@ -0,0 +1 @@
1
+ import{encodeConversationKey as e}from"../conversation-identity.js";import{assertOutgoingContentBodyMatchesType as t}from"../mapping/content-body.js";import{normalizeStoredVideoBody as n}from"../mapping/video-body.js";import{createDefaultSendStrategyRegistry as o}from"../message-flow/send/send-strategy-registry.js";import{classifyAckFailure as s}from"../mapping/message-mapper.js";import{computeSortKey as r,computeMessageSortKey as a,resolveMessageTimestamp as i}from"../mapping/sort.js";import{describeUnsupportedConversation as d}from"../message-flow/conversation-support.js";import{newClientMessageId as c}from"../mapping/message-id.js";const u=/* @__PURE__ */new Set([32768,0]),p=/* @__PURE__ */new Set([33281,33299]),l=33298,y=/* @__PURE__ */new Set([...p,l]);function f(e){if(e instanceof Uint8Array)return e.slice();if(Array.isArray(e))return e.map(e=>f(e));if(null!==e&&"object"==typeof e){const t={};for(const[n,o]of Object.entries(e))t[n]=f(o);return t}return e}function v(e){return f(e)}function g(e){return f(e)}function m(m,b={}){const I=b.ackTimeoutMs??3e4,T=b.maxAttempts??5,h=m.now??(()=>Date.now()),M=m.sendStrategies??o(),w=/* @__PURE__ */new Map,S=/* @__PURE__ */new Map,A=/* @__PURE__ */new Map,x=/* @__PURE__ */new Map;let C=0;const E=/* @__PURE__ */new Set,k=/* @__PURE__ */new Map,q=/* @__PURE__ */new Set,O=/* @__PURE__ */new Set,F=/* @__PURE__ */new Set,j=/* @__PURE__ */new Map;function P(t){return e(t)}function R(e,t){return e.createdAt!==t.createdAt?e.createdAt-t.createdAt:e.id<t.id?-1:e.id>t.id?1:0}function U(e){const t=P(e),n=S.get(t);if(void 0!==n)return n;let o=0;for(const t of m.domainState.getMessagesByConversation({conversationType:e.conversationType,conversationId:e.conversationId}))o=Math.max(o,i(t));for(const e of w.values())P(e)===t&&(o=Math.max(o,e.createdAt));return S.set(t,o),o}function K(e,t){const n=P(e);t>(S.get(n)??U(e))&&S.set(n,t)}function D(e){const t=U(e),n=Math.max(h(),t+1);return S.set(P(e),n),{id:c(),createdAt:n}}function N(e,t){m.onUpdated?.({messageId:e.id,conversation:{conversationType:e.conversationType,conversationId:e.conversationId},state:t,...void 0===e.lastError?{}:{failure:{reason:e.lastError.reason,retryable:e.lastError.retryable}}})}function $(e){void 0!==m.storage&&m.storage.saveOutboxMessage(v(e)).catch(e=>m.onStorageError?.("Outbox 落盘失败",e))}function B(e){void 0!==m.storage&&m.storage.removeOutboxMessage(e).catch(e=>m.onStorageError?.("Outbox 删除失败",e))}function L(e){const t=A.get(e);void 0!==t&&(clearTimeout(t),A.delete(e))}function z(e,t,n){const o=!0===n?.authoritativeFailure?{authoritativeOutboxFailure:!0}:void 0,s=n?.entry??w.get(e);if(void 0===s)return;const i=m.domainState.getConversationMessage(s,e);if(void 0!==i)return void m.domainState.upsertMessages([{...i,...t}],"live",o);const d={...{id:s.id,conversationId:s.conversationId,conversationType:s.conversationType,senderId:m.getSelfId(),contentType:s.contentType,body:g(s.body),createdAt:s.createdAt,sortKey:r(s.createdAt,s.id),status:s.status,receipt:"unread",encryption:f(s.encryption),failure:void 0===s.lastError?void 0:f(s.lastError),...void 0!==s.mention?{mention:f(s.mention)}:{},...void 0!==s.refMessageId?{refMessageId:s.refMessageId}:{}},...t};m.domainState.upsertMessages([{...d,sortKey:a(d)}],"live",o)}function G(e,t){L(e);const n=w.get(e);void 0!==n&&(n.status="failed",n.lastError=t,z(e,{status:"failed",failure:t}),$(n),N(n,"failed"),J(e))}async function H(e){if(x.has(e.id))return;if(E.has(P(e)))return void G(e.id,{code:-4,reason:"unknown",displayCode:"unknown",message:"会话成员关系已终止,消息不会继续发送",retryable:!1});const t=/* @__PURE__ */Symbol("outbox-dispatch");x.set(e.id,t);const n=C;try{const t=M.resolve(e.conversationType);if(void 0===t)return void G(e.id,{code:-3,reason:"unsupported",displayCode:"conversationUnsupported",params:{type:e.conversationType},message:d(e.conversationType,"outbox.dispatch"),retryable:!1});let o;try{const s={selfId:m.getSelfId(),crypto:m.crypto,resolveEncryptionKey:m.resolvePublicKey},r=void 0===t.buildOutgoingFrames?t.buildOutgoingFrame(e,s):t.buildOutgoingFrames(e,s);if(r instanceof Uint8Array)o=[r];else if(Array.isArray(r))o=r;else{const e=await r;o=e instanceof Uint8Array?[e]:e}if(n!==C)return;if(0===o.length||o.some(e=>!(e instanceof Uint8Array)))throw new Error(`发送策略返回了非法帧序列(conversationType=${e.conversationType})`)}catch{if(n!==C)return;return e.attempts+=1,void G(e.id,{code:-2,reason:"unknown"})}if(E.has(P(e)))return void G(e.id,{code:-4,reason:"unknown",displayCode:"unknown",message:"会话成员关系已终止,消息不会继续发送",retryable:!1});if(!m.isAuthenticated())return e.status="pending",z(e.id,{status:"pending"}),$(e),void N(e,"queued");e.status="sending",e.attempts+=1,z(e.id,{status:"sending"}),$(e),N(e,"sending");for(const e of o)m.sendFrame(e);L(e.id),A.set(e.id,setTimeout(()=>G(e.id,{code:-1,reason:"timeout"}),I))}finally{x.get(e.id)===t&&x.delete(e.id)}}function J(e){const t=j.get(e);void 0!==t&&(j.delete(e),t())}function Q(e){const t=w.get(e);return void 0===t||"sending"!==t.status?Promise.resolve():new Promise(t=>j.set(e,t))}function V(e){return("pending"===e.status||"failed"===e.status)&&!("failed"===e.status&&!1===e.lastError?.retryable)&&"manual"!==e.resumePolicy&&(e.attempts<T||O.has(e.id))&&void 0!==M.resolve(e.conversationType)}function W(e,t){let n;for(const o of w.values())!t.has(o.id)&&P(o)===e&&V(o)&&(void 0===n||R(o,n)<0)&&(n=o);return n}function X(e,t=!1){const n=P(e);t&&F.add(n),k.has(n)?q.add(n):Y(n)}async function Y(e){const t=/* @__PURE__ */Symbol("outbox-drain"),n=C;k.set(e,t);try{do{q.delete(e);const t=/* @__PURE__ */new Set;for(;n===C&&m.isAuthenticated();){const o=W(e,t);if(void 0===o)break;if(t.add(o.id),O.delete(o.id),await H(o),n!==C)return;F.has(e)&&await Q(o.id)}}while(n===C&&q.has(e)&&m.isAuthenticated())}finally{k.get(e)===t&&(k.delete(e),F.delete(e))}}function Z(e,t=!1){t&&F.add(e),k.has(e)?q.add(e):Y(e)}function _(e){const t={code:-2,reason:"unknown",displayCode:"sendCanceled",retryable:!1};e.lastError=t,z(e.id,{status:"failed",failure:t}),O.delete(e.id),w.delete(e.id),B(e.id),N(e,"canceled"),J(e.id)}return{allocateMessageIdentity:D,enqueueText(e){const{id:t,createdAt:n}=D(e),o={encrypted:e.encrypted??!1},s=void 0!==M.resolve(e.conversationType),a=s&&m.isAuthenticated(),i={id:t,conversationId:e.conversationId,conversationType:e.conversationType,senderId:m.getSelfId(),contentType:"text",body:{text:e.text},createdAt:n,sortKey:r(n,t),status:"pending",receipt:"unread",encryption:f(o),...void 0!==e.mention?{mention:f(e.mention)}:{},...void 0!==e.refMessageId?{refMessageId:e.refMessageId}:{}},c={id:t,conversationId:e.conversationId,conversationType:e.conversationType,contentType:"text",body:{text:e.text},encryption:f(o),status:"pending",attempts:0,createdAt:n,...void 0!==e.mention?{mention:f(e.mention)}:{},...void 0!==e.refMessageId?{refMessageId:e.refMessageId}:{}};return w.set(t,c),$(c),N(c,"queued"),m.domainState.upsertMessages([i],"live",{newOutgoing:!0}),s?(a&&X(c),v(c)):(G(t,{code:-3,reason:"unsupported",displayCode:"conversationUnsupported",params:{type:e.conversationType},message:d(e.conversationType,"outbox.enqueueText"),retryable:!1}),v(c))},enqueueContact(e){const t=e.contact.targetId.trim(),n=e.contact.displayName.trim();if(""===t)throw new Error("outbox.enqueueContact: targetId 不能为空");if(""===n)throw new Error("outbox.enqueueContact: displayName 不能为空");if("individual"!==e.contact.kind&&"group"!==e.contact.kind&&"channel"!==e.contact.kind)throw new Error(`outbox.enqueueContact: 不支持发送 ${String(e.contact.kind)} 名片`);const{id:o,createdAt:s}=D(e),a={encrypted:e.encrypted??!1},i=void 0!==M.resolve(e.conversationType),c=i&&m.isAuthenticated(),u={contact:{...e.contact,targetId:t,displayName:n}},p={id:o,conversationId:e.conversationId,conversationType:e.conversationType,senderId:m.getSelfId(),contentType:"contact",body:g(u),createdAt:s,sortKey:r(s,o),status:"pending",receipt:"unread",encryption:f(a),...void 0===e.refMessageId?{}:{refMessageId:e.refMessageId}},l={id:o,conversationId:e.conversationId,conversationType:e.conversationType,contentType:"contact",body:g(u),encryption:f(a),status:"pending",attempts:0,createdAt:s,...void 0===e.refMessageId?{}:{refMessageId:e.refMessageId}};return w.set(o,l),$(l),N(l,"queued"),m.domainState.upsertMessages([p],"live",{newOutgoing:!0}),i?(c&&X(l),v(l)):(G(o,{code:-3,reason:"unsupported",displayCode:"conversationUnsupported",params:{type:e.conversationType},message:d(e.conversationType,"outbox.enqueueContact"),retryable:!1}),v(l))},enqueueMedia(e){const{id:n,createdAt:o}=e,s=g(e.body);t(e.contentType,s,"outbox.enqueueMedia"),K(e,o);const a=void 0!==M.resolve(e.conversationType),i=a&&m.isAuthenticated(),c={id:n,conversationId:e.conversationId,conversationType:e.conversationType,senderId:m.getSelfId(),contentType:e.contentType,body:g(s),createdAt:o,sortKey:r(o,n),status:"pending",receipt:"unread",encryption:f(e.encryption),...void 0!==e.mention?{mention:f(e.mention)}:{},...void 0!==e.refMessageId?{refMessageId:e.refMessageId}:{}},u={id:n,conversationId:e.conversationId,conversationType:e.conversationType,contentType:e.contentType,body:s,encryption:f(e.encryption),status:"pending",attempts:0,createdAt:o,...void 0!==e.mention?{mention:f(e.mention)}:{},...void 0!==e.refMessageId?{refMessageId:e.refMessageId}:{}};return w.set(n,u),$(u),N(u,"queued"),m.domainState.upsertMessages([c],"live",{newOutgoing:!0!==e.optimisticAlreadyCreated}),a?(i&&X(u),v(u)):(G(n,{code:-3,reason:"unsupported",displayCode:"conversationUnsupported",params:{type:e.conversationType},message:d(e.conversationType,"outbox.enqueueMedia"),retryable:!1}),X(u,!0),v(u))},onChatAck(e){L(e.id);const t=w.get(e.id);if(void 0!==t)if(u.has(e.errcode))w.delete(e.id),B(e.id),z(e.id,{status:"sent",serverTime:e.serverTime>0?e.serverTime:void 0,...void 0===e.extensions?{}:{extensions:{...m.domainState.getConversationMessage(t,e.id)?.extensions,...e.extensions}}},{entry:t}),N(t,"sent"),J(e.id);else{t.status="failed",t.lastError=e.failure??s(e.errcode);const n="direct"===t.conversationType&&p.has(e.errcode),o="direct"===t.conversationType&&e.errcode===l;n?t.lastError={...t.lastError,displayCode:"contactRequired",retryable:!1}:o&&(t.lastError={...t.lastError,displayCode:"messageRefused",retryable:!1}),z(e.id,{status:"failed",failure:t.lastError},{authoritativeFailure:!0}),n?m.domainState.appendDirectContactRequiredNotice(t.conversationId,t.id):o&&m.domainState.appendDirectMessageRefusedNotice(t.conversationId,t.id),$(t),N(t,"failed"),J(e.id)}else u.has(e.errcode)||function(e){if(!y.has(e.errcode))return;const t=m.getSelfId(),n=m.domainState.getMessagesById(e.id).filter(e=>"direct"===e.conversationType&&e.senderId===t);if(n.length>1)throw new Error(`DIRECT 终态 ACK 消息 ID 存在多会话歧义:${e.id}`);const o=n[0];if(void 0===o)return;const r=p.has(e.errcode),a=e.errcode===l;let i=e.failure??s(e.errcode);r?i={...i,displayCode:"contactRequired",retryable:!1}:a&&(i={...i,displayCode:"messageRefused",retryable:!1}),m.domainState.upsertMessages([{...o,status:"failed",failure:i}],"live",{authoritativeOutboxFailure:!0}),r?m.domainState.appendDirectContactRequiredNotice(o.conversationId,o.id):a&&m.domainState.appendDirectMessageRefusedNotice(o.conversationId,o.id)}(e)},onAuthenticated(){!function(){const e=/* @__PURE__ */new Set;for(const t of w.values())V(t)&&e.add(P(t));for(const t of e)Z(t,!0)}()},retry(e){const t=w.get(e);return void 0===t?{accepted:!1,reason:"not-found"}:"sending"===t.status||x.has(e)?{accepted:!1,reason:"in-flight"}:"failed"===t.status&&!1===t.lastError?.retryable?{accepted:!1,reason:"not-retryable"}:"failed"===t.status||"pending"===t.status&&"manual"===t.resumePolicy?("manual"===t.resumePolicy&&(t.resumePolicy="automatic",$(t)),O.add(t.id),X(t),{accepted:!0}):{accepted:!1,reason:"invalid-state"}},cancel(e){const t=w.get(e);return void 0===t?{accepted:!1,reason:"not-found"}:"sending"===t.status||x.has(e)?{accepted:!1,reason:"in-flight"}:"pending"!==t.status?{accepted:!1,reason:"invalid-state"}:t.attempts>0?{accepted:!1,reason:"delivery-uncertain"}:(_(t),{accepted:!0})},markConversationTerminated(e,t){const n=P(e);E.add(n);for(const e of[...w.values()])P(e)===n&&("pending"!==e.status||0!==e.attempts||x.has(e.id)?G(e.id,{code:-4,reason:"unknown",displayCode:"unknown",message:`会话成员关系已终止:${t}`,retryable:!1}):_(e))},clearConversationTerminated(e){const t=P(e);E.delete(t),Z(t)},markForLogout(e){for(const t of w.values())if("pending"===t.status||"sending"===t.status||"failed"===t.status){if(L(t.id),t.resumePolicy="manual","fail"===e.policy){const e={code:-2,reason:"unknown",displayCode:"sessionLoggedOut",retryable:!0};t.status="failed",t.lastError=e,z(t.id,{status:"failed",failure:e}),N(t,"failed")}$(t),J(t.id)}},getPending:()=>[...w.values()].map(v),reset(e){e?.discardInFlight&&(C+=1,x.clear(),k.clear(),q.clear(),F.clear());for(const e of[...A.keys()])L(e);for(const e of w.values())"sending"===e.status&&(e.status="pending",z(e.id,{status:"pending"}),$(e),N(e,"queued"),J(e.id))},async hydrate(e=()=>!0){if(void 0!==m.storage&&e())try{const o=await m.storage.getOutbox();if(!e())return;for(const s of o){if(!e())return;const o=v(s);if("sent"===o.status){B(o.id);continue}try{t(o.contentType,o.body,`outbox.hydrate(${o.id})`),void 0!==o.body.video&&(o.body={...o.body,video:n(o.body.video)})}catch(t){if(m.onStorageError?.(`Outbox 持久化条目正文损坏,已删除(id=${o.id})`,t),!e())return;if(B(o.id),void 0!==m.domainState.getConversationMessage(o,o.id)){const e={code:-2,reason:"unknown",displayCode:"unknown",message:"发送账本正文损坏,已停止重试",retryable:!1};z(o.id,{status:"failed",failure:e},{authoritativeFailure:!0,entry:o})}continue}const r="sending"===o.status?"pending":o.status,a={...o,status:r};if(w.set(o.id,a),K(a,a.createdAt),N(a,"pending"===r?"queued":r),!e())return;void 0!==m.domainState.getConversationMessage(o,o.id)&&z(o.id,{status:r,failure:void 0===o.lastError?void 0:f(o.lastError)})}}catch(t){e()&&m.onStorageError?.("Outbox 回读失败",t)}}}}export{m as createOutboxManager};
@@ -0,0 +1 @@
1
+ import{createMesChatReceiveHandlers as e}from"./message-flow/receive/mes-chat-receive-handlers.js";import{CmdId as r}from"../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{createCommandHandlerRegistry as o}from"./message-flow/receive/command-handler-registry.js";function t(t){function n(e,r){t.emitter.emit({type:"error",error:{scope:"protocol",message:e,cause:r}})}const c=o(),m={domainState:t.domainState,outbox:t.outbox,onReadAck:t.onReadAck,onSyncReadAck:t.onSyncReadAck,onSyncReadDeliver:t.onSyncReadDeliver,sendFrame:t.sendFrame,getSelfId:t.getSelfId,emitter:t.emitter,logger:t.logger,keepRaw:t.keepRaw,decrypt:t.decrypt,isActive:t.isActive};for(const{command:r,handler:o}of e(m))c.register(r,o);c.register(r.CM_DEVICE_ONLINE_STATUS_NOTIFY,e=>t.emitter.emit({type:"notification",cmdId:e,name:"CM_DEVICE_ONLINE_STATUS_NOTIFY"}));for(const e of t.commandHandlers??[])c.register(e.command,e.handler);return{route(e,r,o){const t=c.resolve(e);if(void 0===t)return n(`未路由的命令 cmdId=${e}`,{command:e,bodyLength:r.byteLength}),!1;try{return t(e,r,o),!0}catch(r){return n(`命令 ${e} 处理失败`,r),!1}}}}export{t as createPacketRouter};
@@ -0,0 +1 @@
1
+ const o=32;export{o as SIMPLE_ENCRYPT_HEAD_BYTES};
@@ -0,0 +1 @@
1
+ var e=Object.defineProperty,o=(o,r,t)=>((o,r,t)=>r in o?e(o,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[r]=t)(o,"symbol"!=typeof r?r+"":r,t);const r=262144,t=["unavailable","load-failed","messageerror","crashed","timeout","queue-full","disposed","protocol-mismatch"];class s extends Error{constructor(e){super(`IM crypto execution failed: ${e}`),o(this,"reason"),o(this,"code","IM_SDK_CRYPTO_EXECUTION_FAILED"),this.reason=e,this.name="CryptoExecutionError"}}function n(e){if(null===e||"object"!=typeof e)return!1;const o=e;return"IM_SDK_CRYPTO_EXECUTION_FAILED"===o.code&&"string"==typeof o.reason&&t.includes(o.reason)}export{r as CRYPTO_TEA_MAX_INPUT_BYTES,s as CryptoExecutionError,n as isCryptoExecutionError};
@@ -0,0 +1 @@
1
+ var t=Object.defineProperty,s=(s,e,a)=>((s,e,a)=>e in s?t(s,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):s[e]=a)(s,"symbol"!=typeof e?e+"":e,a);class e extends Error{constructor(t){super(`CmHttp.postProtobuf 失败:path=${t.path} status=${t.status} ${t.statusText}`),s(this,"status"),s(this,"path"),this.name="ImHttpRequestError",this.status=t.status,this.path=t.path}}export{e as ImHttpRequestError};
@@ -0,0 +1 @@
1
+ function e(e){const t=/* @__PURE__ */new Map;for(const r of e){if(t.has(r.kind))throw new Error(`媒体资产缓存策略重复注册:${r.kind}`);if(!Number.isSafeInteger(r.softMaxBytes)||r.softMaxBytes<=0||!Number.isSafeInteger(r.maxEntries)||r.maxEntries<=0||!Number.isSafeInteger(r.maxEntryBytes)||r.maxEntryBytes<=0||void 0!==r.maxIdleMs&&(!Number.isSafeInteger(r.maxIdleMs)||r.maxIdleMs<=0))throw new RangeError(`媒体资产缓存策略参数非法:${r.kind}`);t.set(r.kind,Object.freeze({...r}))}return Object.freeze({resolve:e=>t.get(e),list:()=>Object.freeze([...t.values()])})}function t(e,t){const r=void 0===t?e:JSON.stringify([t.conversation.conversationType,t.conversation.conversationId,t.itemIndex??null,e]);let n=2166136261,o=2654435761;for(let e=0;e<r.length;e+=1){const t=r.charCodeAt(e);n=Math.imul(n^t,16777619),o=Math.imul(o^t,2246822507)}return`${void 0===t?"":"v2:"}${(n>>>0).toString(16).padStart(8,"0")}${(o>>>0).toString(16).padStart(8,"0")}`}export{e as createMediaAssetCacheStrategyRegistry,t as mediaAssetResourceVersion};
@@ -0,0 +1 @@
1
+ import{createRequestTracker as e}from"../request-tracker.js";import{CmdId as t,ErrCode as r}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{cmPushTokenSyncAckCodec as o,cmPushTokenSyncCodec as s}from"../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as n}from"../../../im-protocol/src/frame-codec.js";function i(i){let d,u,c=!1,a=!1,m=!1;const p=e();let f,h,l={status:"idle"};const v=/* @__PURE__ */new Set;function S(e){try{e({...l})}catch{i.onListenerError()}}function b(e){l=e;for(const e of[...v])S(e)}function E(){h&&clearTimeout(h.timer),h=void 0}function g(e,t){E(),m="server-rejected"!==e;const r={status:"error",error:e,requiresReconnect:m,...void 0===t?{}:{serverCode:t}};d=m?r:void 0,b(u?r:{status:"idle"})}function w(){if(a||m||h||!u)return;if(!c)return void b({status:"pending"});if(u.token===f?.token)return void b(f.snapshot);const e=u,r=p.nextSeq(),o=n({command:t.CM_PUSHTOKENSYNC,msgSeq:r,body:s.encode(s.create({sUserId:BigInt(e.userId),nPushType:20,nPushTokenType:0,sPushToken:e.token}))}),d={...e,msgSeq:r,timer:setTimeout(()=>g("timeout"),i.timeoutMs??3e4)};if(h=d,b({status:"syncing"}),h===d&&!a&&c)if(u)try{i.sendFrame(o)}catch{h===d&&g("send-failed")}else E()}return{api:{setWebSubscription({userId:e,subscription:t}){if(a)throw new Error("推送绑定已销毁");if(!/^[1-9]\d*$/.test(e)||e!==i.getSelfId())throw new Error("推送订阅账号与当前会话不一致");const{endpoint:r,keys:o,expirationTime:s}=t;if(!r||!o?.p256dh||!o.auth)throw new Error("Web Push 订阅缺少 endpoint 或加密密钥");const n=new URL(r);if("https:"!==n.protocol||n.username||n.password)throw new Error("Web Push endpoint 必须是 HTTPS 地址");if(null!=s&&(!Number.isFinite(s)||s<=Date.now()))throw new Error("Web Push 订阅已过期");const c=JSON.stringify({endpoint:r,expirationTime:s??null,keys:{p256dh:o.p256dh,auth:o.auth}});u={userId:e,token:c},d?b(d):h&&b({status:"syncing"}),w()},clear(){a||(u=void 0,f=void 0,b({status:"idle"}))},snapshot:()=>({...l}),subscribe:e=>(a||v.add(e),S(e),()=>{v.delete(e)})},commandHandlers:[{command:t.CM_PUSHTOKENSYNC_ACK,handler(e,t,s){if(!h||!c||a||m||s?.msgSeq!==h.msgSeq)return;let n;try{n=o.decode(t)}catch{return void g("invalid-ack")}const i=n.nErr===r.EXCEPT_ERR&&(String(n.sUserId)===h.userId||"0"===String(n.sUserId));if(!i&&String(n.sUserId)!==h.userId)return;const d=h;E(),i||n.nErr===r.NON_ERR?(f={token:d.token,snapshot:i?{status:"unconfirmed",serverCode:Number(n.nErr)}:{status:"synced"}},u?w():b({status:"idle"})):g("server-rejected",Number(n.nErr))}}],setAuthenticated(e){a||c===e||(c=e,E(),f=void 0,m=!1,d=void 0,u&&w())},dispose(){a||(a=!0,E(),u=void 0,f=void 0,b({status:"disposed"}),v.clear())}}}export{i as createPushRegistration};
@@ -0,0 +1 @@
1
+ import{newClientMessageId as e,toWireMsgId as t,isWireMsgId as o}from"../mapping/message-id.js";import{encodeFrame as n}from"../../../im-protocol/src/frame-codec.js";import{mesChatReadCodec as r}from"../../../im-protocol/src/protobuf/registry.js";import{CmdId as s}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";const i=/* @__PURE__ */new Set([32768,0]);function d(d,c={}){const a=c.readReportDebounceMs??400,m=c.readAckTimeoutMs??3e4,u=c.readMaxAttempts??2,f=Math.max(1,c.readReportMaxBatch??200),v=/* @__PURE__ */new Map,p=/* @__PURE__ */new Map,g=/* @__PURE__ */new Map,l=/* @__PURE__ */new Set,I=/* @__PURE__ */new Map,y=/* @__PURE__ */new Map,T=/* @__PURE__ */new Map;function S(e,t){let o=T.get(e);void 0===o&&(o=/* @__PURE__ */new Set,T.set(e,o));for(const e of t)o.add(e)}function h(e,t){const n=d.domainState.getConversationMessage({conversationType:"direct",conversationId:e},t);return"direct"===n?.conversationType&&n.conversationId===e&&R(n.senderId)&&o(n.id)?n:void 0}function M(e,t,o){l.add(e);const n=/* @__PURE__ */new Map;for(const r of t){const t=h(e,r);void 0!==t&&!T.get(e)?.has(r)&&(o?"voice"===t.contentType||"video"===t.contentType:w(t))&&n.set(r,t.sortKey)}if(!1===d.canSendReadReceipt?.(e))return S(e,n.keys()),void A(e);let r=y.get(e);void 0===r&&(r=/* @__PURE__ */new Map,y.set(e,r));for(const[e,t]of n)r.set(e,t)}function R(e){return e!==d.getSelfId()}function w(e){const t=e.body.system?.eventType;return"voice"!==e.contentType&&"video"!==e.contentType&&!("direct"===e.conversationType&&("direct_contact_established"===t||"direct_contact_required"===t||"direct_message_refused"===t))}function _(e,t){if(""!==t)return d.domainState.getConversationMessage({conversationType:"direct",conversationId:e},t)?.sortKey}function b(e,t){const n=_(e,g.get(e)??""),r=/* @__PURE__ */new Set;for(const s of d.domainState.getLoadedMessagesByConversation({conversationType:"direct",conversationId:e}))w(s)&&R(s.senderId)&&o(s.id)&&!T.get(e)?.has(s.id)&&s.sortKey<=t&&(void 0===n||s.sortKey>n)&&r.add(s.id);return[...r].sort((t,o)=>{const n=_(e,t)??"",r=_(e,o)??"";return n<r?-1:n>r?1:0})}function k(e){const t=p.get(e);void 0!==t&&(clearTimeout(t.timer),p.delete(e))}function A(e){const t=v.get(e);void 0!==t&&(clearTimeout(t),v.delete(e));const o=I.get(e),n=void 0===o?void 0:_(e,o);void 0!==n&&S(e,b(e,n)),S(e,p.get(e)?.messageIds??[]),k(e),S(e,y.get(e)?.keys()??[]),y.delete(e),I.delete(e);const r=d.domainState.getReadState(e)?.readCursor??"";""!==r&&g.set(e,r)}function C(e,t){const o=p.get(e);if(void 0===o)return;clearTimeout(o.timer);const n=d.canSendReadReceipt?.(e);if(!1!==n)if(void 0!==n||void 0===d.canSendReadReceipt){if(o.attempts<u&&d.isAuthenticated())return o.attempts+=1,d.sendFrame(o.frame),void(o.timer=setTimeout(()=>C(e,"timeout"),m));p.delete(e),d.emitter.emit({type:"error",error:{scope:"protocol",message:`已读上报未确认(${t}),已达重试上限(${u})`,code:s.MES_CHAT_READ}})}else p.delete(e);else A(e)}function j(o){if(p.has(o))return;const i=I.get(o),c=void 0===i?void 0:_(o,i),a=void 0===c?[]:b(o,c);void 0!==i&&void 0!==c&&0===a.length&&(g.set(o,i),I.delete(o));const u=y.get(o),v=[...u?.keys()??[]],l=[.../* @__PURE__ */new Set([...a,...v])].sort((e,t)=>{const n=u?.get(e)??_(o,e)??"",r=u?.get(t)??_(o,t)??"";return n<r?-1:n>r?1:0});if(0===l.length)return;const T=d.canSendReadReceipt?.(o);if(!1===T)return void A(o);if(void 0===T&&void 0!==d.canSendReadReceipt)return;if(!d.isAuthenticated())return;const S=l.slice(0,f),h=new Set(a),M=S.filter(e=>h.has(e)),R=0===M.length?void 0:M.length===a.length?i:M[M.length-1],w=e();let k;try{k=n({command:s.MES_CHAT_READ,body:r.encode(r.create({sFromId:BigInt(d.getSelfId()),sToId:BigInt(o),sMsgId:w,readResults:S.map(e=>({sMsgId:t(e),errcode:0})),readReceiptOff:0}))})}catch(e){return void d.emitter.emit({type:"error",error:{scope:"protocol",message:"已读上报组帧失败(非法 id)",cause:e}})}d.sendFrame(k),d.logger?.("read-report",{conversationId:o,notifyId:w,count:S.length,remaining:l.length-S.length}),p.set(o,{conversationId:o,cursor:R,notifyId:w,frame:k,messageIds:S,attempts:1,timer:setTimeout(()=>C(o,"timeout"),m)})}return{report(e){l.add(e);const t=d.domainState.getReadState(e)?.readCursor;t&&I.set(e,t);const o=v.get(e);void 0!==o&&clearTimeout(o),!1!==d.canSendReadReceipt?.(e)?v.set(e,setTimeout(()=>{v.delete(e),j(e)},a)):A(e)},reportVisible(e,t){M(e,t,!1);const o=v.get(e);void 0!==o&&clearTimeout(o),v.set(e,setTimeout(()=>{v.delete(e),j(e)},a))},reportConsumedMedia(e,t){M(e,[t],!0),j(e)},onReadAck({notifyId:e,errcode:t}){let o;for(const t of p.values())if(t.notifyId===e){o=t;break}if(void 0!==o)if(d.logger?.("read-report-ack",{conversationId:o.conversationId,notifyId:e,errcode:t}),i.has(t)){clearTimeout(o.timer),p.delete(o.conversationId),void 0!==o.cursor&&g.set(o.conversationId,o.cursor),S(o.conversationId,o.messageIds);const e=y.get(o.conversationId);for(const t of o.messageIds)e?.delete(t);0===e?.size&&y.delete(o.conversationId),j(o.conversationId)}else C(o.conversationId,"rejected")},onAuthenticated(){for(const e of l)j(e)},suppress(e){if(void 0!==e)return void A(e);const t=/* @__PURE__ */new Set([...l,...v.keys(),...p.keys()]);for(const e of t)A(e)},resume(e){if(!l.has(e))return;const t=v.get(e);void 0!==t&&clearTimeout(t),v.set(e,setTimeout(()=>{v.delete(e),j(e)},a))},reset(){for(const e of v.values())clearTimeout(e);v.clear();for(const e of[...p.keys()])k(e)}}}export{d as createReadReporter};
@@ -0,0 +1 @@
1
+ function e(e={}){const t=e.defaultTimeoutMs??3e4,r=/* @__PURE__ */new Map;let o=0;function n(e){const t=r.get(e);if(void 0!==t)return clearTimeout(t.timer),r.delete(e),t}return{nextSeq:()=>(o=o>=4294967295?1:o+1,o),track(e,o){if(r.has(e))throw new Error(`重复登记在途请求 msgSeq=${e}(应由 nextSeq() 保证唯一)`);return new Promise((n,s)=>{const c=setTimeout(()=>{r.delete(e),s(new Error(`请求超时:msgSeq=${e},等待 ${o??t}ms 无响应`))},o??t);r.set(e,{resolve:n,reject:s,timer:c})})},resolve(e,t){const r=n(e);return r?.resolve(t),void 0!==r},reject(e,t){const r=n(e);return r?.reject(t),void 0!==r},rejectAll(e){for(const t of[...r.values()])clearTimeout(t.timer),t.reject(e);r.clear()},get pendingCount(){return r.size}}}export{e as createRequestTracker};
@@ -0,0 +1 @@
1
+ function t(t){return"string"==typeof t?t:null==t?"":String(t)}function r(r){const i="number"==typeof r?r:Number(t(r).trim());return Number.isFinite(i)?i:0}function i(t){if("string"!=typeof t)return"";const r=t.trim();return r.startsWith("data:image/")?r:r.includes("://")||r.length<32?"":`data:image/jpeg;base64,${r}`}function u(...r){for(const i of r){const r=t(i).trim();if(/^https?:\/\//i.test(r))return r}return""}function n(t){return""!==t.thumbDataUrl?t.thumbDataUrl:t.thumbUrl.startsWith("data:image/")||/^https?:\/\//i.test(t.thumbUrl)&&t.thumbUrl!==t.url?t.thumbUrl:""}function e(u){const e=u.items;return Array.isArray(e)?e.flatMap(u=>{if("object"!=typeof u||null===u)return[];const e=u,m=r(e.mediaType??e.media_type),a=t(e.kind).trim(),o={kind:2===m||"video"===a?"video":"image",width:r(e.width),height:r(e.height),url:t(e.url).trim(),thumbUrl:t(e.thumbUrl??e.thumb_url).trim(),thumbDataUrl:i(e.thumbData??e.thumb_data),durationMs:r(e.duration??e.durationMs),hd:!0===e.hd||1===e.hd||"1"===e.hd};return function(t){return""!==t.url||""!==n(t)}(o)?[o]:[]}):[]}function m(r){return"mediaAlbum"!==r.kind?"":r.text.trim()||t(r.body.caption).trim()}function a(r){return n({url:u(r.imageURL,r.imageUrl,r.videoURL,r.videoUrl,r.url),thumbUrl:t(r.thumbUrl??r.thumb_url).trim(),thumbDataUrl:i(r.thumbData??r.thumb_data??r.thumbBase64)})}function o(t,r){if("mediaAlbum"===t){const t=e(r)[0];return void 0===t?"":n(t)}return"image"===t||"video"===t?a(r):"liveRoom"===t?u(r.liveCover):""}export{e as parseSessionFavoriteAlbumItems,m as resolveSessionFavoriteAlbumCaption,n as resolveSessionFavoriteAlbumItemPreviewUrl,o as resolveSessionFavoriteListImageUrl,a as resolveSessionFavoriteMediaCoverUrl};
@@ -0,0 +1 @@
1
+ function e(e){return Array.isArray(e.items)?e.items.flatMap((e,t)=>{if("object"!=typeof e||null===e)return[];const i=e,n=i.fileName??i.fielName,r=i.fileSize??i.fileLength;return"string"!=typeof n||""===n.trim()||"string"!=typeof i.url||!/^https?:\/\//i.test(i.url)||"number"!=typeof r||!Number.isSafeInteger(r)||r<0?[]:[Object.freeze({itemIndex:t,url:i.url,fileName:n,size:r,extension:"string"==typeof i.extension?i.extension:""})]}):[]}function t(t){const i=new Map(e(t).map(e=>[e.itemIndex,e]));return Object.freeze({contentType:"29",..."string"==typeof t.caption?{caption:t.caption}:{},items:Object.freeze((Array.isArray(t.items)?t.items:[]).map((e,t)=>{const n=i.get(t);return void 0===n?null:Object.freeze({url:n.url,fileName:n.fileName,fileSize:n.size,extension:n.extension})}))})}export{e as parseSessionFavoriteFileItems,t as projectSessionFavoriteFilesBody};
@@ -0,0 +1 @@
1
+ function e(e,n){const t="admin"===e||"owner"===e,r="owner"===e;return{sendMessages:("member"===e||t)&&"active"===n,mentionAll:t,editProfile:t,manageMembers:t,manageAdmins:r,moderateMessages:t,manageMute:t,dismissChannel:r,transferOwnership:r}}function n(n){const{channelState:t,snapshot:r}=n;if(void 0===r)return{channelState:t,permissions:n.permissions??e("unknown",t)};if(t!==r.resolvedState)return{channelState:t,permissions:e(r.role,t)};let s,o=r.baseState;const a="owner"===r.role||"admin"===r.role;return"active"!==r.baseState||a||(r.currentUserMuted?(o="muted",s="current-user"):r.allMembersMuted&&(void 0===r.mutePeriod||function(e,n){const t=/^(\d{1,2}):(\d{2})_(\d{1,2}):(\d{2})$/.exec(e);if(null===t)return!1;const r=Number(t[1]),s=Number(t[2]),o=Number(t[3]),a=Number(t[4]);if(r>23||o>23||s>59||a>59)return!1;const i=new Date(n),u=60*i.getHours()+i.getMinutes(),m=60*r+s,d=60*o+a;return m<=d&&m<=u&&u<=d}(r.mutePeriod,n.nowMs))&&(o="muted",s="all-members")),{channelState:o,permissions:e(r.role,o),...void 0===s?{}:{muteReason:s}}}export{n as resolveChannelAccess,e as resolveChannelPermissions};
@@ -0,0 +1 @@
1
+ const e=/* @__PURE__ */new Set(["channel_name_changed","channel_avatar_changed","channel_announcement_changed","channel_private_chat_disabled","channel_private_chat_enabled","channel_member_renamed"]);function n(n){const a=/* @__PURE__ */new Set,t=/* @__PURE__ */new Map,r=/* @__PURE__ */new Map;let o=!0;function i(e,a,t,o){void 0!==o&&r.set(e,o),n.clearChannelKey(e),n.stopChannelHistory(e),n.domainState.removeConversationForMembershipTermination({conversationType:"channel",conversationId:e},t)}function s(e){const a=n.domainState.getSession(e);n.domainState.setChannelRestriction(e,a?.channelState??"unknown_restricted",void 0===a?.channelState?"channel_access_requires_refresh":a.sendDisabledReason)}return{handleMessage(c,d={source:"live"}){if(!o||"channel"!==c.conversationType||"system"!==c.contentType||void 0===c.body.system)return;if("live"!==d.source&&!0!==d.applyLifecycleEffects)return;if(l=c.id,a.has(l)||(a.add(l),a.size>2048&&a.delete(a.values().next().value),0))return;var l;const h=c.conversationId,v=c.body.system,m=v.targetUserIds?.includes(n.getSelfId())??!1,f=void 0===v.targetUserIds||0===v.targetUserIds.length,_=function(e){const n=e.extensions?.channelSequence,a="string"==typeof n?n:e.raw?.channelNotify?.sequence;if(void 0===a||!/^\d+$/.test(a))return;const t=BigInt(a);return t>0n?t:void 0}(c),u=t.get(h);if(void 0!==_){if(void 0!==u&&_<=u)return;t.set(h,_)}switch(v.eventType){case"channel_member_left":return void(m?i(h,0,"channel_left",_):n.domainState.refreshConversationProfile(h,"channel"));case"channel_member_removed":return void(m?i(h,0,"channel_removed",_):n.domainState.refreshConversationProfile(h,"channel"));case"channel_dismissed":return void i(h,0,"channel_dismissed",_);case"channel_member_joined":case"channel_member_invited":case"channel_created":{if(!m)return void n.domainState.refreshConversationProfile(h,"channel");const e=n.domainState.getSession(h)?.channelState;if("dismissed"===e)return;if("left"===e||"removed"===e){const e=r.get(h);if(!(void 0!==_&&void 0!==e&&_>e))return void n.domainState.recoverChannelFromProfile(h).then(e=>{o&&e&&(r.delete(h),n.clearConversationTermination?.({conversationType:"channel",conversationId:h}),n.prepareChannelKey(h))});r.delete(h)}if(!o)return;return n.domainState.setChannelRestriction(h,"active",void 0),n.clearConversationTermination?.({conversationType:"channel",conversationId:h}),n.prepareChannelKey(h),void n.domainState.refreshConversationProfile(h,"channel")}case"channel_all_muted":case"channel_all_unmuted":return s(h),void n.domainState.refreshConversationProfile(h,"channel");case"channel_member_muted":case"channel_member_unmuted":case"channel_admin_added":case"channel_admin_removed":return(m||f)&&s(h),void n.domainState.refreshConversationProfile(h,"channel");case"channel_owner_transferred":return(m||f||v.operatorId===n.getSelfId())&&s(h),void n.domainState.refreshConversationProfile(h,"channel");default:e.has(v.eventType)&&n.domainState.refreshConversationProfile(h,"channel")}},dispose(){o=!1,a.clear(),t.clear(),r.clear()}}}export{n as createChannelRestrictionCoordinator};
@@ -0,0 +1 @@
1
+ import{encodeConversationKey as e,conversationRefFromMessage as t,conversationRefFromPinnedMessage as n,conversationRefFromSession as o}from"../conversation-identity.js";import{compareChannelReadPosition as r,getChannelReadOrder as s}from"../mapping/channel-read-position.js";import{collectTransferStatusBySerialNumber as i,synchronizeTransferStatusMessages as a,applyTransferStatusToBody as c}from"../mapping/transfer-status.js";import{parseChannelSyncCheckpoint as d,channelSyncCheckpointKey as u}from"../sync/channel-sync-checkpoint.js";import{createDraftStore as l}from"./draft-store.js";import{rollbackMessageReaction as v,applyMessageReaction as f}from"./message-reactions.js";import{createMessageStore as p}from"./message-store.js";import{createMessageWindowStore as y}from"./message-window-store.js";import{createPinnedMessageStore as m}from"./pinned-message-store.js";import{createReadStore as g}from"./read-store.js";import{sortSessions as h}from"./session-sort.js";import{createSessionStore as C}from"./session-store.js";import{createImTextSearchMatcher as w,extractSearchText as I}from"../mapping/search-text.js";import{normalizeStoredMessageContent as T,LOCAL_MEDIA_ERROR_CODE as M,failInterruptedUpload as S}from"../mapping/stored-message.js";import{isMessageVisibleInTimeline as b,lastMessageSummaryEqual as U,sessionFromMessage as K}from"../mapping/session-mapper.js";import{isMessageEqual as E,dedupeById as A,mergeMessage as R}from"../mapping/merge.js";import{newClientMessageId as P}from"../mapping/message-id.js";import{computeSortKey as N,resolveMessageTimestamp as x,computeMessageSortKey as $}from"../mapping/sort.js";import{backfillGroupMention as D}from"../mapping/group-message-mapper.js";import{isConversationUnreadMessage as B}from"../mapping/unread-divider.js";function j(e){return"direct"===e||"robot"===e||"customerService"===e?"local":"server"}function F(e,t){const n=t?.includeMuted??!1;let o=0;for(const t of e)!n&&t.muted||(o+=t.unreadCount>0?t.unreadCount:!0===t.manuallyUnread?1:0);return o}const L="im:deleted-conversations",_="im:terminated-conversations",k="im:membership-reset-sort-keys",O="im:pending-message-reactions",H="im:transfer-status-records",z=["sendMessages","mentionAll","editProfile","manageMembers","manageAdmins","moderateMessages","manageMute","dismissChannel","transferOwnership"];function q(e,t){return e===t||void 0!==e&&void 0!==t&&z.every(n=>e[n]===t[n])}function G(e,t){return e===t||void 0!==e&&void 0!==t&&e.role===t.role&&e.baseState===t.baseState&&e.resolvedState===t.resolvedState&&e.allMembersMuted===t.allMembersMuted&&e.currentUserMuted===t.currentUserMuted&&e.mutePeriod===t.mutePeriod}function W(e,t){return e.id===t.id&&e.type===t.type&&e.title===t.title&&e.avatar===t.avatar&&U(e.lastMessageSummary,t.lastMessageSummary)&&e.timestamp===t.timestamp&&e.unreadCount===t.unreadCount&&(e.manuallyUnread??!1)===(t.manuallyUnread??!1)&&(e.mentionUnreadCount??0)===(t.mentionUnreadCount??0)&&e.pinned===t.pinned&&e.muted===t.muted&&e.topTime===t.topTime&&e.lastMessageSendState===t.lastMessageSendState&&e.lastMessageReceipt===t.lastMessageReceipt&&e.readCursor===t.readCursor&&e.groupState===t.groupState&&e.channelState===t.channelState&&q(e.channelPermissions,t.channelPermissions)&&G(e.channelAccessSnapshot,t.channelAccessSnapshot)&&e.sendDisabledReason===t.sendDisabledReason}function J(U){const z=p({getSelfId:U.getSelfId}),J=/* @__PURE__ */new Map,Q=/* @__PURE__ */new Map,V=C(),X=C(),Y=g(),Z=l(),ee=m(),te=/* @__PURE__ */new Map,ne=/* @__PURE__ */new Map;let oe=0;function re(e){ne.set(e,++oe)}let se=1;const ie=/* @__PURE__ */new Set,ae=/* @__PURE__ */new Set,ce=/* @__PURE__ */new Map,{storage:de}=U;let ue=Promise.resolve();const le=/* @__PURE__ */new Map,ve=/* @__PURE__ */new Map,fe=/* @__PURE__ */new Map;let pe=0;const ye=U.unreadMode??j,me=/* @__PURE__ */new Set;function ge(e={}){const t=y({storage:de,loadOlderFromRemote:U.loadOlderFromRemote,loadNewerFromRemote:U.loadNewerFromRemote,shouldIncludeMessage:qe,normalizeStoredUpload:qt,...e});return me.add(t),t}const he=ge();function Ce(e,t){let n;for(const o of me){const r=o.list().find(n=>n.id===e&&n.conversationId===t);if(void 0!==r){if(void 0!==n&&n.conversationType!==r.conversationType)throw new Error(`裸 conversationId 存在多类型消息歧义:${t}`);n=r}}return n}function we(e,t){const n=z.get(t,e);if(n?.conversationId===e.conversationId&&n.conversationType===e.conversationType)return n;for(const n of me){const o=n.list().find(n=>n.id===t&&n.conversationId===e.conversationId&&n.conversationType===e.conversationType);if(void 0!==o)return o}}function Ie(e,n){const o=we(t(e),e.id);void 0===o||z.has(e.id,e)||z.upsert(o);const r=z.upsert(e,n);return{...r,previous:o,changed:void 0===o?r.changed:!E(o,r.message)}}function Te(e){const t=new Map(z.getByConversation(e).map(e=>[e.id,e]));for(const n of me)if(Me(n,e))for(const o of n.list())o.conversationType!==e.conversationType||o.conversationId!==e.conversationId||t.has(o.id)||t.set(o.id,o);return[...t.values()].sort((e,t)=>e.sortKey.localeCompare(t.sortKey))}function Me(t,n){const o=t.info();return void 0===o.conversation?o.conversationId===n.conversationId:e(o.conversation)===e(n)}let Se=!1;function be(t){return`${e(t.conversation)}\0${t.parentMessageId}`}function Ue(){if(void 0===de||Se)return;const e=[...J.values()].flat();ft(()=>de.setMeta(O,e)).catch(e=>Je("保存待处理 Reaction 失败",e))}function Ke(e){const t=e.body.transfer;if("transfer"!==e.contentType||void 0===t)return e;const n=Q.get(t.serialNumber);if(void 0===n||0!==t.status&&0===n.status)return e;const o={...t,status:n.status,...1===n.status&&void 0!==n.occurredTime?{receiveTime:n.occurredTime}:{},...2===n.status||3===n.status?{returnTime:n.occurredTime??t.returnTime}:{}};return t.status===o.status&&t.receiveTime===o.receiveTime&&t.returnTime===o.returnTime&&t.isRead===o.isRead?e:{...e,body:{transfer:c(t,o)}}}function Ee(t,n){const o=`${e(t)}\0${n}`;return!!J.delete(o)&&(Ue(),!0)}function Ae(t){const n=`${e(t)}\0`;let o=!1;for(const e of J.keys())e.startsWith(n)&&(J.delete(e),o=!0);return o&&Ue(),o}function Re(e,t){const n=we(e.conversation,e.parentMessageId);if(void 0===n){const t=be(e),n=J.get(t)??[];return n.some(t=>t.id===e.id)?"duplicate":(J.set(t,[...n,e]),Ue(),"pending")}if(at(n),void 0!==n.recalled||void 0!==n.deletedForEveryone)return"duplicate";const o=f(n.reactions,e,U.getSelfId?.()??"");return o===n.reactions?"duplicate":(Jt([{...n,reactions:o}],t),"applied")}function Pe(n,o){const r=t(n),s=`${e(r)}\0${n.id}`,i=J.get(s);if(void 0!==i){J.delete(s),Ue();for(const e of i)Re(e,o)}}function Ne(e){for(const t of[...J.values()]){const n=t[0];if(void 0===n)continue;const o=we(n.conversation,n.parentMessageId);void 0!==o&&(void 0!==o.recalled||void 0!==o.deletedForEveryone?Ee(n.conversation,n.parentMessageId):Pe(o,e))}}let xe=0;const $e=/* @__PURE__ */new Map,De=/* @__PURE__ */new Map,Be=/* @__PURE__ */new Map,je=/* @__PURE__ */new Map,Fe=/* @__PURE__ */new Map;function Le(t){return e(t)}function _e(e){return ke(e)||ie.has(Le(e))||ie.has(e.conversationId)}function ke(e){return ae.has(Le(e))||ae.has(e.conversationId)}function Oe(e){const t=ie.delete(Le(e)),n=ie.delete(e.conversationId);return t||n}function He(e){const t=Oe(e),n=ae.delete(Le(e)),o=ae.delete(e.conversationId);return{deleted:t,terminal:n||o}}function ze(e,t){if(""===t||"system"!==e.contentType)return!1;const n=e.body.system;return!0===n?.targetUserIds?.includes(t)&&("group"===e.conversationType?"group_member_joined"===n.eventType||"group_member_invited"===n.eventType:"channel"===e.conversationType&&("channel_member_joined"===n.eventType||"channel_member_invited"===n.eventType||"channel_created"===n.eventType))}function qe(n){const o=t(n);if(ke(o)||_e(o)&&void 0===X.get(o))return!1;if("group"!==o.conversationType)return!0;const r=ce.get(e(o));return void 0===r||n.sortKey>=r}function Ge(t){const n=e(t),o=(De.get(n)??0)+1;return De.set(n,o),o}function We(t){const n=e(t),o=($e.get(n)??0)+1;return $e.set(n,o),o}function Je(e,t){U.emitter.emit({type:"error",error:{scope:"storage",message:e,cause:t}})}function Qe(e){U.emitter.emit({type:"session:updated",session:e,conversation:o(e)})}const Ve=/* @__PURE__ */new Set,Xe=/* @__PURE__ */new Set,Ye=/* @__PURE__ */new Map,Ze=/* @__PURE__ */new Map;let et=0,tt=Promise.resolve(),nt=0,ot=Promise.resolve(),rt=0;const st=/* @__PURE__ */new Map;let it;function at(n){const o=e(t(n));it?.keys.has(o)&&it.messages.set(`${o}\0${n.id}`,n)}function ct(t){const n=e(t);st.set(n,(st.get(n)??0)+1)}function dt(e){return it?.writes.push(e),void 0!==it&&e.catch(()=>{}),e}async function ut(e){const t=(await Promise.allSettled(e)).find(e=>"rejected"===e.status);if(void 0!==t)throw t.reason}function lt(e){const t=ot.then(e);return ot=t.then(()=>{},()=>{}),t}function vt(t,n){const o=rt,r=t.map(t=>[e(t),st.get(e(t))??0]);return()=>o===rt&&n()&&r.every(([e,t])=>(st.get(e)??0)===t)}function ft(e){const t=0===nt?(()=>{try{return e()}catch(e){return Promise.reject(e)}})():tt.then(e),n=t.then(()=>{},()=>{});Ve.add(n),n.finally(()=>Ve.delete(n));for(const e of Xe)e.writes.push(t);return dt(t)}function pt(e){nt+=1;const t=Promise.all([...Ve]),n=tt.then(()=>t).then(e);return tt=n.then(()=>{},()=>{}),tt.finally(()=>{nt-=1}),dt(n)}function yt(e){const t=e.body.system;if(void 0===t?.pinnedMessageAction)return e;const{pinnedMessageAction:n,...o}=t;return{...e,body:{...e.body,system:o}}}function mt(n){if(void 0!==de&&!Se&&0!==n.length){for(const o of Xe)for(const r of n)o.messages.add(`${e(t(r))}\0${r.id}`);ft(()=>de.saveMessages(n.map(yt))).catch(e=>Je("消息落盘失败",e))}}function gt(e){const{lastMessageSendState:t,manuallyUnread:n,...o}=e;return o}function ht(t){if(void 0!==de&&!Se){for(const n of Xe)n.sessions.add(e(o(t)));ft(()=>de.saveSessions([gt(t)])).catch(e=>Je("会话落盘失败",e))}}function Ct(e,t,n){if(void 0===de||Se)return;const o=++et;Ye.set(e,{version:o,persist:()=>Ct(e,t,n)});for(const t of Xe)t.metadata.add(e);const r=Ze.get(e),s=ft(()=>void 0===r?de.setMeta(e,t()):r.then(()=>de.setMeta(e,t()))),i=s.then(()=>{},()=>{});Ze.set(e,i),i.then(()=>{Ze.get(e)===i&&Ze.delete(e)}),s.then(()=>{Ye.get(e)?.version===o&&Ye.delete(e)},e=>Je(n,e))}function wt(){Ct(L,()=>[...ie],"删除会话标记保存失败")}function It(){Ct(_,()=>[...ae],"成员资格终止标记保存失败")}function Tt(){Ct(k,()=>[...ce.entries()],"重新入群的历史起点保存失败")}function Mt(t){if(void 0!==de&&!Se){for(const n of Xe)void 0!==t.conversationType&&n.reads.add(e({conversationType:t.conversationType,conversationId:t.conversationId}));ft(()=>de.saveReadState(t)).catch(e=>Je("已读态落盘失败",e))}}function St(t){if(e(t),"supergroup"===t.conversationType)throw new Error("supergroup 草稿未实现,不得 fallback 到其他会话类型")}function bt(e){return St(e),Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function Ut(e,t,n){if(St(e),"string"!=typeof t.text)throw new TypeError("草稿 text 必须是字符串");if(void 0!==t.attachments&&t.attachments.length>0)throw new Error("草稿附件尚未支持:attachments 只接受空集合");if(void 0!==t.mentions&&!Array.isArray(t.mentions))throw new TypeError("草稿 mentions 必须是数组");const o=(t.mentions??[]).map(e=>{if("string"!=typeof e.userId||""===e.userId.trim()||"string"!=typeof e.displayName)throw new TypeError("草稿 mention 必须包含非空 userId 与字符串 displayName");return Object.freeze({userId:e.userId,displayName:e.displayName})}),r=Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId});return Object.freeze({ref:r,text:t.text,mentions:Object.freeze(o),...void 0===t.replyToMessageId?{}:{replyToMessageId:t.replyToMessageId},attachments:Object.freeze([]),updatedAt:n})}function Kt(e,t){return e.text===t.text&&e.replyToMessageId===t.replyToMessageId&&e.mentions.length===t.mentions.length&&e.mentions.every((e,n)=>{const o=t.mentions[n];return void 0!==o&&e.userId===o.userId&&e.displayName===o.displayName})}function Et(t,n){St(t);const o=e(t),r=(le.get(o)??Promise.resolve()).catch(()=>{}).then(n),s=r.then(()=>{},()=>{});return le.set(o,s),s.finally(()=>{le.get(o)===s&&le.delete(o)}),r}async function At(t,n){const o=bt(t),r=e(o);if(void 0!==n&&(!Number.isFinite(n)||n<0))throw new Error(`草稿 expectedUpdatedAt 非法:${n}`);const s=pe,i=fe.get(r)??0;return await Et(o,async()=>{const e=Z.get(o);if(null===e||void 0!==n&&e.updatedAt!==n)return!1;if(void 0!==de&&await de.deleteDraft(o),s!==pe||i!==(fe.get(r)??0))throw new Error("草稿状态已失效,拒绝过期清理回灌内存");return Z.delete(o),U.emitter.emit({type:"draft:cleared",conversation:o}),!0})}function Rt(t,n,o,r,s){const i=cn(t);if(void 0===i)return;const a={...i,...void 0===s||s===De.get(e(t))?{title:n,avatar:o??i.avatar}:{},...void 0!==r?{muted:r}:{}};W(i,a)||dn(a)}function Pt(t,n){const o=U.profile;if(void 0===o)return Promise.resolve(null);const r={conversationType:"direct",conversationId:t},s=e(r),i=Fe.get(t);if(!0!==n?.forceRefresh&&void 0!==i&&i.revision===$e.get(s))return i.promise;const a=xe,c=We(r),d=Ge(r),u=(async()=>{const e=await o.getUserProfile(t,n);if(null!==e&&e.id===t&&a===xe&&c===$e.get(s)){const n=e.remark?.trim()?e.remark:e.nickname||t;Rt(r,n,e.avatar??"",e.muted,d)}return e})().finally(()=>{Fe.get(t)?.promise===u&&Fe.delete(t)});return Fe.set(t,{revision:c,promise:u}),u}async function Nt(t,n){const{conversationId:o,conversationType:r}=t;if("direct"===r){try{await Pt(o,!0===n?.force?{forceRefresh:!0}:void 0)}catch(e){U.emitter.emit({type:"error",error:{scope:"http",message:"会话资料补齐失败",cause:e}})}return!1}const s=e(t),i=!0===n?.force;if(!i&&(je.has(s)||Be.has(s)))return!1;const a=xe,c=We(t),d=Ge(t);i&&je.set(s,c);const{profile:u,channelProfile:l}=U,v=i?{forceRefresh:!0}:void 0;try{if("group"===r){if(void 0===u)return!1;const e=await u.getGroupProfile(o,v);if(a!==xe||c!==$e.get(s))return!1;null!==e&&(Rt(t,e.name,e.avatar??"",e.muted,d),3===e.status&&an({conversationType:"group",conversationId:o},"group_dismissed"),i&&U.emitter.emit({type:"profile:updated",profileType:"group",id:o}))}else if("channel"===r){if(void 0===l)return!1;const e=await l.getProfile(o,v);if(a!==xe||c!==$e.get(s))return!1;if(null!==e){Rt(t,e.name,e.avatar??"",e.muted,d);const r=cn(t)?.channelState,s="left"===r||"removed"===r||"dismissed"===r,a="left"===e.channelState||"removed"===e.channelState||"dismissed"===e.channelState;if(!0===n?.allowChannelRecovery&&s&&"dismissed"!==r&&"active"===e.channelState)return on(o,"active",void 0,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}}),i&&U.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}}),!0;const c=s&&(!a||"dismissed"===r||"dismissed"!==e.channelState);if(a&&!c)return an({conversationType:"channel",conversationId:o},`channel_${e.channelState}`),i&&U.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}}),!1;if(!c){const t=e.permissions.sendMessages?void 0:`channel_${e.channelState}`;on(o,e.channelState,t,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}})}i&&U.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}})}}return!1}catch(e){return U.emitter.emit({type:"error",error:{scope:"http",message:"会话资料补齐失败",cause:e}}),!1}finally{i&&a===xe&&je.get(s)===c&&je.delete(s)}}function xt(e){return B(e,U.getSelfId?.()??"")}function $t(e){const t=Y.get(e);if(void 0===t||""===t.readCursor)return;const n="string"==typeof e?t.conversationType:e.conversationType;if("channel"===n){const o={conversationType:n,conversationId:"string"==typeof e?e:e.conversationId};return Te(o).find(e=>e.extensions?.historyCursor===t.readCursor)?.sortKey??t.readCursorSortKey}const o="string"==typeof e?z.getByConversation(e).find(e=>e.id===t.readCursor):we(e,t.readCursor);return o?.sortKey??t.readCursorSortKey}function Dt(e,t){let n=0;for(const o of z.getByConversation(e))b(o)&&xt(o)&&(void 0===t||o.sortKey>t)&&(n+=1);return n}function Bt(e){const t=U.getSelfId?.();if(void 0===t||""===t||e.senderId===t)return!1;const{mention:n}=e;return void 0!==n&&(n.atAll||n.atUserIds.includes(t))}function jt(e,t){let n=0;for(const o of z.getByConversation(e))!0!==o.readBySelf&&Bt(o)&&(void 0===t||o.sortKey>t)&&(n+=1);return n}function Ft(e,t=!0){const n=void 0===e.conversationType?V.get(e.conversationId):void 0,o=void 0===e.conversationType&&void 0!==n?{...e,conversationType:n.type}:e,r=void 0===o.conversationType?o.conversationId:{conversationType:o.conversationType,conversationId:o.conversationId},s=Y.get(r);if("channel"===o.conversationType&&re(o.conversationId),Y.set(o),t&&Mt(o),void 0===s||s.readCursor!==o.readCursor||s.readCursorSortKey!==o.readCursorSortKey||s.unreadCount!==o.unreadCount||(s.manuallyUnread??!1)!==(o.manuallyUnread??!1)){if(void 0===o.conversationType)return void U.emitter.emit({type:"error",error:{scope:"storage",message:`已读状态缺少复合身份,拒绝发布 read:updated(conversationId=${o.conversationId})`}});U.emitter.emit({type:"read:updated",conversationId:o.conversationId,conversation:{conversationType:o.conversationType,conversationId:o.conversationId},readCursor:o.readCursor,unreadCount:o.unreadCount,...!0===o.manuallyUnread?{manuallyUnread:!0}:{}})}}function Lt(n,o){if(void 0===n||n.sortKey===o.sortKey)return;const r=t(o),s=Y.get(r),i="channel"===o.conversationType?o.extensions?.historyCursor:void 0,a="direct"===o.conversationType||"group"===o.conversationType||"robot"===o.conversationType||"customerService"===o.conversationType;void 0!==s&&(a&&s.readCursor===o.id||"string"==typeof i&&""!==i&&s.readCursor===i||s.readCursorSortKey===n.sortKey)&&Ft({...s,readCursorSortKey:o.sortKey});const c=e(r);"group"===o.conversationType&&ce.get(c)===n.sortKey&&(ce.set(c,o.sortKey),Tt())}function _t(e){const t=e?.channelAccessSnapshot?.role;return"owner"===t||"admin"===t}function kt(e,t,n,o,r=cn(e)){const s=o??Y.get(e);if(void 0===t){if(void 0===r){if("string"==typeof e||void 0===s||s.unreadCount<=0)return;return{id:e.conversationId,type:e.conversationType,title:"",lastMessagePreview:"",timestamp:0,unreadCount:s.unreadCount,mentionUnreadCount:s.mentionUnreadCount,readCursor:s.readCursor,pinned:!1,muted:!1}}const t={...r,..."clear"===n?{lastMessagePreview:"",timestamp:0}:{},...void 0===s?{}:{unreadCount:s.unreadCount,manuallyUnread:s.manuallyUnread,mentionUnreadCount:s.mentionUnreadCount,readCursor:s.readCursor||r.readCursor}};return"clear"===n&&(delete t.lastMessageSummary,delete t.lastMessageSenderId,delete t.lastMessageSystemEvent,delete t.lastMessageSystemTargetsSelf,delete t.lastMessageMention,delete t.lastMessageRecalled,delete t.lastMessageDeletedForEveryone,delete t.lastMessageSendState,delete t.lastMessageReceipt),t}const i=s?.unreadCount??r?.unreadCount??0,a=void 0===s?r?.manuallyUnread:s.manuallyUnread,c=K(t,{unreadCount:i,mentionUnreadCount:s?.mentionUnreadCount??r?.mentionUnreadCount??0,selfId:U.getSelfId?.(),showChannelModerationDeleted:_t(r)});return void 0===r?{...c,...void 0===a?{}:{manuallyUnread:a},readCursor:(s?.readCursor??"")||c.readCursor}:{...c,title:r.title||c.title,avatar:r.avatar??c.avatar,pinned:r.pinned,muted:r.muted,topTime:r.topTime,...void 0===a?{}:{manuallyUnread:a},readCursor:(s?.readCursor??"")||r.readCursor,groupState:r.groupState,channelState:r.channelState,channelPermissions:r.channelPermissions,channelAccessSnapshot:r.channelAccessSnapshot,sendDisabledReason:r.sendDisabledReason}}function Ot(e,t){if(void 0===e)return;const n=V.get({conversationType:e.type,conversationId:e.id});void 0!==n&&W(n,e)||(V.set(e),X.delete({conversationType:e.type,conversationId:e.id}),Qe(e),t&&ht(e),""===e.title&&Nt({conversationType:e.type,conversationId:e.id}))}function Ht(e,t,n="preserve",o=cn(e)){const r=t.findLast(e=>function(e,t){return!!b(e)&&("channel"!==e.conversationType||void 0===e.deletedForEveryone||_t(t))}(e,o)),s="string"==typeof e?o?.type:e.conversationType;return kt(e,r,void 0===r&&"channel"===s&&!_t(o)&&(t.some(e=>void 0!==e.deletedForEveryone)||"channel-moderation-deleted"===o?.lastMessageSummary?.kind||void 0!==o?.lastMessageDeletedForEveryone)?"clear":n,void 0,o)}function zt(e,t=!1){(t||void 0!==V.get(e))&&Ot(Ht(e,z.getByConversation(e)),!0)}function qt(e){if("uploading"!==e.status&&("failed"!==e.status||e.failure?.code!==M))return e;const t=z.get(e.id,e);return void 0!==t&&t.conversationType===e.conversationType&&t.conversationId===e.conversationId?t:S(T(e))}function Gt(n,o=()=>!0){const r=[],s=A(n,U.getSelfId?.()??"").map(e=>{const t=qt(e);let n={...t,sortKey:$(t)};if(n=T(n),"group"===n.conversationType&&"text"===n.contentType){const e=D(n.body.text??"",n.mention);void 0!==e&&(n.mention=e)}return Ke(n)}),i=/* @__PURE__ */new Map;for(const n of s){if("transfer"!==n.contentType||void 0===n.body.transfer)continue;const o=t(n);i.set(e(o),o)}const c=[...i.values()].flatMap(e=>Te(e)),d=a(c,s),u=new Set(s.map(e=>e.id));for(const e of d){if(!o())break;const{previous:n,message:s,isNew:i,changed:a}=Ie(e);if(Lt(n,s),void 0!==n&&a)for(const e of me){if(!o())return r;e.list().some(e=>e.id===s.id&&e.conversationType===s.conversationType&&e.conversationId===s.conversationId)&&e.applyIncoming([s])}if(!o())return r;i?U.emitter.emit({type:"message:received",message:s,conversation:t(s),source:"offline",channelLifecycleEffects:!1}):a&&U.emitter.emit({type:"message:updated",message:s,conversation:t(s),source:"offline",channelLifecycleEffects:!1}),u.has(s.id)&&r.push(s)}return r}function Wt(e){const t=qt(e);let n={...t,sortKey:$(t)};if(n=T(n),"group"===n.conversationType&&"text"===n.contentType){const e=D(n.body.text??"",n.mention);void 0!==e&&(n.mention=e)}return Ke(n)}function Jt(n,o,r={}){const s=U.getSelfId?.()??"";if("live"===o){let i=!1,a=!1;for(const c of n){const n=t(c);if(ze(c,s)){const t=He(n);t.deleted&&(i=!0),t.terminal&&("group"===n.conversationType?(ce.set(e(n),c.sortKey),Tt()):"channel"===n.conversationType&&ce.delete(e(n)),U.diagnostics?.record("info","core","conversation","membership-termination-cleared",()=>({conversation:n,data:{source:o,eventType:c.body.system?.eventType,groupHistoryLowerBoundApplied:"group"===n.conversationType}})),a=!0)}else""!==s&&c.senderId===s&&!0!==r.newOutgoing||ke(n)||!Oe(n)||(i=!0)}i&&wt(),a&&It()}const i=!0===U.diagnostics?.isEnabled("debug","conversation")?/* @__PURE__ */new Map:void 0,c=(n,o)=>{if(void 0===i)return;const r=t(n),s=e(r),a=i.get(s)??{ref:r,tombstone:0,groupLowerBound:0};"tombstone"===o?a.tombstone+=1:a.groupLowerBound+=1,i.set(s,a)},d=ie.size>0||ae.size>0?n.filter(e=>{const n=t(e),o=!_e(n)||!0===r.backfillOnly&&void 0!==X.get(n)&&!ke(n);return o||c(e,"tombstone"),o}):n,u=function(n){const o=/* @__PURE__ */new Map;if(0===ce.size)return o;for(const r of A(n,U.getSelfId?.()??"")){if("group"!==r.conversationType)continue;const n=t(r),s=e(n),i=ce.get(s);if(void 0===i)continue;const a=we(n,r.id);if(void 0===a||a.sortKey!==i)continue;const c=R(a,r,U.getSelfId?.()??"");c.sortKey!==i&&(ce.set(s,c.sortKey),o.set(s,c.id))}return o.size>0&&Tt(),o}(d),l=n=>u.get(e(t(n)))===n.id,v=ce.size>0?d.filter(e=>{const t=l(e)||qe(e);return t||c(e,"groupLowerBound"),t}):d,f=0===u.size?v:[...v.filter(l),...v.filter(e=>!l(e))];for(const e of i?.values()??[])U.diagnostics?.record("debug","core","conversation","membership-filter-dropped",()=>({conversation:e.ref,data:{source:o,tombstoneDroppedCount:e.tombstone,groupHistoryLowerBoundDroppedCount:e.groupLowerBound}}));const p=/* @__PURE__ */new Map,y=/* @__PURE__ */new Map,m=/* @__PURE__ */new Map,g=/* @__PURE__ */new Map,h=/* @__PURE__ */new Map,C=/* @__PURE__ */new Set,w=A(f,s).map(Ke),I=/* @__PURE__ */new Map;for(const n of w){if("transfer"!==n.contentType||void 0===n.body.transfer)continue;const o=t(n);I.set(e(o),o)}const T=[...I.values()].flatMap(e=>Te(e)),M=a(T,w),S=[],K=[];for(const n of M){if("channel"===n.conversationType&&it?.keys.has(e(t(n)))&&!it.current())continue;const{previous:s,message:i,isNew:a,changed:c}=Ie(n,{authoritativeFailure:!0===r.authoritativeOutboxFailure});if(at(i),!0===r.backfillOnly&&!0===r.refreshSessionSummary){const n=t(i);p.set(e(n),n)}if(!a&&!c)continue;Lt(s,i);for(const e of me)e.applyIncoming([i]);a?U.emitter.emit({type:"message:received",message:i,conversation:t(i),source:o,channelLifecycleEffects:!0===r.applyChannelLifecycleEffects}):U.emitter.emit({type:"message:updated",message:i,conversation:t(i),source:o,channelLifecycleEffects:!0===r.applyChannelLifecycleEffects});const d=t(i);if(!a&&void 0!==s&&!0!==s.readBySelf&&!0===i.readBySelf){const t=$t(d),n=void 0===t||s.sortKey>t,o=e(d);n&&b(s)&&xt(s)&&void 0===s.recalled&&void 0===s.deletedForEveryone&&m.set(o,(m.get(o)??0)-1),n&&Bt(s)&&void 0===s.recalled&&void 0===s.deletedForEveryone&&h.set(o,(h.get(o)??0)-1)}ke(d)||(S.push(i),p.set(e(d),d),a&&!0!==r.backfillOnly&&K.push(i))}const E=/* @__PURE__ */new Map;for(const n of K){const r=t(n),s=e(r);xt(n)&&C.add(s),E.has(s)||E.set(s,$t(r));const i=E.get(s),a=void 0===i||n.sortKey>i;if(b(n)&&a&&xt(n)&&!0!==n.readBySelf&&void 0===n.recalled&&void 0===n.deletedForEveryone){const e=ye(n.conversationType);("local"===e||"server"===e&&"live"===o)&&y.set(s,(y.get(s)??0)+1)}a&&!0!==n.readBySelf&&Bt(n)&&void 0===n.recalled&&void 0===n.deletedForEveryone&&g.set(s,(g.get(s)??0)+1)}for(const t of p.values()){if(!0===r.backfillOnly){!0===r.refreshSessionSummary&&zt(t);continue}const n=e(t),o=y.get(n)??0,s=g.get(n)??0,i=m.get(n)??0,a=h.get(n)??0,c=C.has(n),d=Y.get(t);if(o>0||s>0||c||void 0!==d&&(0!==i||0!==a)){const e=d??{...t,readCursor:"",unreadCount:0},n={...e,unreadCount:Math.max(0,e.unreadCount+o+i),mentionUnreadCount:Math.max(0,(e.mentionUnreadCount??0)+s+a)};c&&delete n.manuallyUnread,Ft(n)}zt(t,K.some(e=>e.conversationType===t.conversationType&&e.conversationId===t.conversationId&&b(e)))}mt(S.filter(e=>void 0!==we(t(e),e.id)));for(const e of S)void 0===e.recalled&&void 0===e.deletedForEveryone?Pe(e,o):Ee(t(e),e.id)}function Qt(e,t,n=Date.now()){const o={conversationType:"direct",conversationId:e},r=we(o,t),s=z.getByConversation(o).findLast(e=>"direct_contact_established"===e.body.system?.eventType);if(void 0!==r&&void 0!==s&&x(s)>=x(r))return;const i=`${t}:contact-required`;if(void 0!==z.get(i,o))return;Jt([{id:i,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_contact_required",targetUserIds:[e],action:{type:"request-contact",userId:e}}},createdAt:n,sortKey:N(n,i),status:"sent",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1}}],"live")}const Vt=/* @__PURE__ */new Map;let Xt=0;function Yt(e){const t=Y.get(e);if(!0!==t?.manuallyUnread)return!1;const n={...t};return delete n.manuallyUnread,Ft(n),zt(e),!0}function Zt(e,t,n,r,s){const i="string"==typeof e?e:e.conversationId,a=cn(e),c="string"==typeof e?void 0===a?void 0:o(a):e;if(void 0!==a&&"server"!==ye(a.type))return void U.emitter.emit({type:"error",error:{scope:"unknown",message:`applyServerUnread 不应用于本地未读会话(conversationId=${i}, type=${a.type}),已忽略`}});if(!Number.isFinite(t))return void U.emitter.emit({type:"error",error:{scope:"unknown",message:`applyServerUnread 收到非法未读数(conversationId=${i}, count=${t}),已忽略`}});"channel"===c?.conversationType&&te.delete(i);const d=Y.get(e);let u=d?.readCursor??"",l=d?.readCursorSortKey;const v=void 0===n||""===n?void 0:void 0===c?z.getByConversation(i).find(e=>e.id===n)??Ce(n,i):we(c,n);void 0!==v&&v.conversationId===i&&(void 0===l||v.sortKey>l)&&(u=v.id,l=v.sortKey),void 0!==r&&(u=r),Ft({...void 0===c?{conversationId:i}:c,readCursor:u,readCursorSortKey:l,unreadCount:Math.max(0,Math.floor(t)),...t>0?{}:{manuallyUnread:d?.manuallyUnread},mentionUnreadCount:0===t||!1===s?0:!0===s?Math.max(1,d?.mentionUnreadCount??0):d?.mentionUnreadCount}),zt(e,t>0&&void 0!==c&&!_e(c))}function en(e){const t=te.get(e.conversation.conversationId);return t?.handle.transactionId===e.transactionId?t:void 0}function tn(e,t,n,o=!1){const r=cn(e),s=we(e,t);if("channel"!==r?.type||"channel"!==s?.conversationType||s.conversationId!==e.conversationId||s.extensions?.historyCursor!==n)throw new Error(`CHANNEL 已读位置不可信(channelId=${e.conversationId}, messageId=${t})`);o||te.delete(e.conversationId);const i=Y.get(e),a=void 0===i?r.mentionUnreadCount:i.mentionUnreadCount;Ft({...e,readCursor:n,readCursorSortKey:s.sortKey,unreadCount:i?.unreadCount??r.unreadCount,...void 0===a?{}:{mentionUnreadCount:a}}),zt(e)}function nn(e,t,n){const o=e.conversation,r=o.conversationId,i=en(e);if(void 0===i)throw new Error(`CHANNEL 乐观已读事务已失效(channelId=${r})`);const a=we(o,t);if(void 0===a||a.conversationId!==r||"channel"!==a.conversationType)throw new Error(`CHANNEL 乐观已读消息不可信(channelId=${r}, messageId=${t})`);if(a.extensions?.historyCursor!==n)throw new Error(`CHANNEL 乐观已读 cursor 与消息不一致(channelId=${r}, messageId=${t})`);i.steps.at(-1)?.readCursor!==n&&(i.steps.push({readCursor:n,messageId:t,...s(a)}),tn(o,t,n,!0))}function on(t,n,o,r){const s={conversationType:"channel",conversationId:t},i=e(s);if(_e(s)&&void 0===X.get(s))return;const a=cn(s);if(void 0===a){We(s),je.delete(i);return void dn({id:t,type:"channel",title:"",lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:!1,channelState:n,channelPermissions:r?.permissions,channelAccessSnapshot:r?.snapshot,sendDisabledReason:o})}if("channel"!==a.type)throw new Error(`setChannelRestriction: 会话 ${t} 类型为 ${a.type},拒绝写入 CHANNEL 状态`);We(s),je.delete(i);const c=r?.permissions,d=r?.snapshot;if(a.channelState===n&&a.sendDisabledReason===o&&q(a.channelPermissions,c)&&G(a.channelAccessSnapshot,d))return void(void 0!==V.get(s)&&zt(s));const u={...a,channelState:n,channelPermissions:c,channelAccessSnapshot:d,sendDisabledReason:o};void 0!==V.get(s)?dn(Ht(s,z.getByConversation(s),"preserve",u)):dn(u)}async function rn(e,t){if(""===t.trim())throw new Error("本机删除消息需要非空 messageId");const n=()=>{if(ee.isPinnedMessage(e,t))throw Object.assign(new Error("置顶消息必须先取消置顶才能删除"),{code:"IM_MESSAGE_PINNED"})};n();const o=we(e,t),r=z.get(t,e),s=void 0!==r&&r.conversationType===e.conversationType&&r.conversationId===e.conversationId,i=z.getByConversation(e).filter(e=>e.id!==t),a=void 0===V.get(e)?void 0:Ht(e,i,"clear"),c=void 0===a?void 0:gt(a);function d(e){return void 0!==e&&(void 0===r||!E(r,e))}const u=void 0===de?{deleted:!1,superseded:!1}:await pt(async()=>{n();const r=we(e,t)??o??await de.getMessage(e,t)??void 0;if(n(),d(z.get(t,e)))return{deleted:!1,superseded:!0};const s=await de.deleteMessage(e,t,c);if(ee.isPinnedMessage(e,t)){const o=we(e,t)??r;void 0!==o&&await de.saveMessages([yt(o)]);const s=V.get(e);return void 0!==s&&await de.saveSessions([gt(s)]),n(),{deleted:!1,superseded:!0}}return{deleted:s,superseded:!1}});if(u.superseded||d(z.get(t,e)))return!1;const l=s&&z.delete(e,t);let v=!1;for(const n of me)v=n.removeMessage(e,t)||v;if(!u.deleted&&!l&&!v)return!1;const f=void 0===V.get(e)?void 0:Ht(e,z.getByConversation(e),"clear");return Ot(f,!1),void 0===f||void 0!==a&&W(a,f)||ht(f),Ee(e,t),U.emitter.emit({type:"message:removed",conversation:{...e},messageId:t,scope:"local-only"}),!0}function sn(t,o={}){const r="string"==typeof t?t:t.conversationId,s=V.get(t),i=ee.get(t),a="string"==typeof t?void 0!==s?{conversationType:s.type,conversationId:r}:void 0===i?void 0:n(i):t;if(void 0===a)throw new Error(`裸 conversationId 无法确定删除类型:${r}`);Ge(a),Be.delete(e(a)),"direct"===a.conversationType&&(We(a),Fe.delete(a.conversationId)),ct(a);const c=z.getByConversation(a).length;!function(t){const n=bt(t),o=e(n);fe.set(o,(fe.get(o)??0)+1),null!==Z.get(n)&&(Z.delete(n),U.emitter.emit({type:"draft:cleared",conversation:n})),Et(n,async()=>{void 0!==de&&await de.deleteDraft(n)}).catch(e=>Je("删会话草稿失败",e))}(a),Ae(a),V.delete(t),X.delete(t),"channel"===a.conversationType&&(re(a.conversationId),te.delete(a.conversationId)),Y.delete(t),z.deleteByConversation(t),ee.clear(t);const d=Le(a);if(!0===o.terminal){ae.add(d);const e=ce.delete(d);ie.delete(d),ie.delete(r),e&&Tt(),U.diagnostics?.record("info","core","conversation","membership-terminated",()=>({conversation:a,data:{reason:o.terminalReason??"membership-terminated",removedMessageCount:c}}))}else ie.add(d);for(const e of me)Me(e,a)&&e.reset();U.emitter.emit({type:"session:removed",conversationId:r,conversation:a}),wt(),!0===o.terminal&&It(),void 0!==de&&pt(async()=>{await ut([de.deleteConversationMessages(a),de.deleteSession(a),de.deleteReadState(a),de.removePinnedMessage(a)])}).catch(e=>Je("删除会话持久数据失败",e))}function an(e,t){sn(e,{terminal:!0,terminalReason:t})}function cn(e){if("string"==typeof e){const t=[...V.getAll(),...X.getAll()].filter(t=>t.id===e);if(t.length>1)throw new Error(`裸 conversationId 存在多类型歧义:${e}`);return t[0]}return V.get(e)??X.get(e)}function dn(e){const t=o(e);void 0!==V.get(t)?(V.set(e),Qe(e),ht(e)):(X.set(e),U.emitter.emit({type:"conversation-context:updated",conversation:t}))}return{upsertMessages:Jt,commitReceivedMessages:function(n,o,r,s){if(void 0===de){for(const e of s?.events??[])s.apply(e);return void Jt(n,o,r)}const i={writes:[],messages:/* @__PURE__ */new Set,sessions:/* @__PURE__ */new Set,reads:/* @__PURE__ */new Set,metadata:/* @__PURE__ */new Set};Xe.add(i);try{const a=(s?.events??[]).filter(e=>"ignored"!==s.apply(e));Jt(n,o,r);const c=a.flatMap(e=>{const t=we(e.conversation,e.parentMessageId);return void 0===t?[]:[t]});a.length>0&&Ue();const d=/* @__PURE__ */new Map,u=[];for(const o of[...n,...c]){const n=t(o),r=e(n),s=we(n,o.id);void 0!==s&&(d.set(r,n),i.messages.has(`${r}\0${s.id}`)||u.push(s))}mt(u);for(const[e,t]of d){const n=V.get(t),o=Y.get(t);void 0===n||i.sessions.has(e)||ht(n),void 0===o||i.reads.has(e)||Mt(o)}for(const[e,t]of Ye)i.metadata.has(e)||t.persist()}finally{Xe.delete(i)}return ut(i.writes)},applyReaction:Re,rollbackReaction:function(t,n,o){const r=we(t,n);if(void 0===r){const r=`${e(t)}\0${n}`,s=J.get(r);if(void 0===s)return!1;const i=s.filter(e=>e.id!==o);return i.length!==s.length&&(0===i.length?J.delete(r):J.set(r,i),Ue(),!0)}const s=v(r.reactions,o,U.getSelfId?.()??"");if(s===r.reactions)return!1;const i={...r};return void 0===s?delete i.reactions:i.reactions=s,Jt([i],"live"),!0},appendDirectContactRequiredNotice:Qt,appendDirectMessageRefusedNotice:function(e,t,n=Date.now()){const o={conversationType:"direct",conversationId:e},r=`${t}:message-refused`;if(void 0!==z.get(r,o))return;const s=z.get(t,o),i="direct"===s?.conversationType&&s.conversationId===e?x(s):n;Jt([{id:r,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_message_refused",targetUserIds:[e]}},createdAt:i,sortKey:N(i,r),status:"sent",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1}}],"live")},appendDirectContactRequiredTextFailure:function(e,t=Date.now()){const n=P(),o={id:n,conversationId:e.conversationId,conversationType:"direct",senderId:e.senderId,contentType:"text",body:{text:e.text},createdAt:t,sortKey:N(t,n),status:"failed",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1},failure:{code:33281,reason:"rejected",displayCode:"contactRequired",retryable:!1},...void 0===e.refMessageId?{}:{refMessageId:e.refMessageId}};return Jt([o],"live"),Qt(e.conversationId,n,t+1),o},reconcileDirectContactEstablishedNotice:function(e,t,n=Date.now()){const o=Vt.get(e);if(void 0!==o)return o;const r={conversationType:"direct",conversationId:e},s=Xt,i=(async()=>{const o=z.getByConversation(r).filter(e=>{const t=e.body.system?.eventType;return"direct_contact_required"===t||"direct_contact_established"===t}),i=o.filter(e=>"direct_contact_required"===e.body.system?.eventType),a=i.at(-1)?.createdAt??0,c=o.findLast(e=>"direct_contact_established"===e.body.system?.eventType)?.createdAt??0,d=c>=a&&c>0;if(0===i.length&&d)return;const u=$t(r);for(const e of i)try{const t=await rn(r,e.id),n=we(r,e.id);t||"direct_contact_required"!==n?.body.system?.eventType||U.emitter.emit({type:"error",error:{scope:"storage",message:"联系人关系已建立,但旧的申请添加提示未能删除",cause:{conversation:r,messageId:e.id}}})}catch(t){U.emitter.emit({type:"error",error:{scope:"storage",message:"联系人关系已建立,但删除旧的申请添加提示失败",cause:{conversation:r,messageId:e.id,error:t}}})}if(s!==Xt)return;const l=Y.get(r);if(void 0!==l&&(Ft({...l,...void 0===l.readCursorSortKey&&void 0!==u?{readCursorSortKey:u}:{},unreadCount:Dt(r,u)}),zt(r)),d)return;const v=Number.isFinite(n)&&n>0?n:Date.now(),f=Math.max(v,a+1);!function(e,t,n=Date.now(),o=n){const r=function(e,t){return`${""===e.trim()?`contact-established:${t}`:e}:contact-established`}(t,o);if(void 0!==z.get(r,{conversationType:"direct",conversationId:e}))return;Jt([{id:r,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_contact_established",targetUserIds:[e]}},createdAt:n,sortKey:N(n,r),status:"sent",receipt:"unread",encryption:{encrypted:!1}}],"live")}(e,t,f,v)})().finally(()=>{Vt.get(e)===i&&Vt.delete(e)});return Vt.set(e,i),i},recallMessage:function(e,t,n){const o=we(e,t);void 0!==o&&Jt([{...o,recalled:n,body:{}}],"live")},deleteChannelMessageForEveryone:function(e,t,n){const o=we(e,t);void 0!==o&&"channel"===o.conversationType&&Jt([{...o,recalled:void 0,deletedForEveryone:n,body:{}}],"live")},editMessage:function(e,t,n,o){const r=we(e,t);if(void 0===r)return;const s={...r,body:n,edited:!0};void 0!==o?s.mention=o:delete s.mention,Jt([s],"live")},applyTransferStatusBySerialNumber:async function(e,t,n){const o=function(e,t){if(void 0===e)return t;if(0===e.status&&0!==t.status)return t;if(0===t.status&&0!==e.status)return e;const n=e.occurredTime??0,o=t.occurredTime??0;return n!==o?o>n?t:e:t.status>e.status?t:e}(Q.get(e),{serialNumber:e,status:t,...void 0===n?{}:{occurredTime:n}});Q.set(o.serialNumber,o),await async function(){if(void 0===de)return;const e=[...Q.values()],t=ue.then(()=>de.setMeta(H,e));dt(t),ue=t.catch(()=>{});try{await t}catch(e){throw Je("保存转账状态记录失败",e),e}}();const r=/* @__PURE__ */new Map;for(const t of i(z.getAll(),e,o.status,o.occurredTime))r.set(t.id,t);for(const t of V.getAll()){const n=Te({conversationType:t.type,conversationId:t.id});for(const t of i(n,e,o.status,o.occurredTime))r.set(t.id,t)}0!==r.size&&Jt([...r.values()],"live")},getMessage:e=>z.get(e),getMessagesById:e=>z.getById(e),getConversationMessage:we,getLoadedMessagesByConversation:Te,resolveConversationMessage:async function(n,o,r={}){const s=we(n,o);if(void 0!==s||void 0===de)return s;try{const r=await de.getMessage(n,o);if(null===r||e(t(r))!==e(n))return;return Wt(r)}catch(e){if(Je("按消息 ID 读取本地历史失败",e),!0===r.throwOnStorageError)throw e;return}},getMessages:()=>z.getAll(),getMessagesByConversation:e=>z.getByConversation(e),deleteLocalMessage:rn,clearLocalConversationHistory:async function(e){ct(e);const t={...e},n=new Map(z.getByConversation(t).map(e=>[e.id,e])),o=V.get(t),r=Y.get(t),s=void 0===r&&void 0===o?void 0:{...t,readCursor:r?.readCursor??o?.readCursor??"",...void 0===r?.readCursorSortKey?{}:{readCursorSortKey:r.readCursorSortKey},unreadCount:0,mentionUnreadCount:0},i=void 0===o?void 0:kt(t,void 0,"clear",s);if(void 0!==de){if(void 0===de.clearConversationHistory)throw new Error("当前 storage 未实现 clearConversationHistory,拒绝非原子清空本机会话历史");await pt(()=>de.clearConversationHistory(t,void 0===i?void 0:gt(i),s))}const a=Y.get(t);void 0!==s&&(a?.conversationType===r?.conversationType&&a?.conversationId===r?.conversationId&&a?.readCursor===r?.readCursor&&a?.readCursorSortKey===r?.readCursorSortKey&&a?.unreadCount===r?.unreadCount&&a?.mentionUnreadCount===r?.mentionUnreadCount)&&Ft(s,!1);for(const[e,o]of n){const n=z.get(e,t);void 0!==n&&E(o,n)&&z.delete(t,e)}const c=z.getByConversation(t);for(const e of me)e.clearConversation(t)&&e.applyIncoming(c);Ae(t),void 0!==V.get(t)&&Ot(Ht(t,c,"clear"),!1),U.emitter.emit({type:"conversation-history:cleared",conversation:t,scope:"local-only"})},commitChannelSyncPage:function(n,o,r,s){const i=vt(n,r);return lt(async()=>{if(!i())return!1;if(void 0===de)throw new Error("CHANNEL 严格同步提交需要 storage");const r={writes:[],messages:/* @__PURE__ */new Map,keys:new Set(n.map(e)),current:i};let a;it=r;try{const e=o();if(e instanceof Promise)throw e.catch(()=>{}),new Error("CHANNEL 页 mutation 必须同步执行")}catch(e){a={cause:e}}finally{it=void 0}if(await ut(r.writes),void 0!==a)throw a.cause;if(!i())return!1;const c=[...r.messages.values()].flatMap(e=>{const n=we(t(e),e.id);return void 0===n?[]:[yt(n)]}),d=[];c.length>0&&d.push(ft(()=>de.saveMessages(c)));for(const e of n){const t=V.get(e),n=Y.get(e),o=ee.get(e);void 0!==t&&d.push(ft(()=>de.saveSessions([gt(t)]))),void 0!==n&&d.push(ft(()=>de.saveReadState(n))),d.push(ft(()=>void 0===o?de.removePinnedMessage(e):de.savePinnedMessage(o)))}const u=[[O,[...J.values()].flat()],[H,[...Q.values()]],[L,[...ie]],[_,[...ae]],[k,[...ce.entries()]]];for(const[e,t]of u)d.push(ft(()=>de.setMeta(e,t)));return void 0!==s&&d.push(ft(async()=>{i()&&await s()})),await ut(d),i()})},saveChannelSyncCheckpoint:function(e,t){const n=d(e,e.conversation);if(void 0===n)return Promise.reject(new Error("CHANNEL 同步位置无效"));const o=vt([n.conversation],t);return lt(async()=>{if(!o())return!1;if(void 0===de)throw new Error("CHANNEL 同步位置保存需要 storage");let e=!1;return await ft(async()=>{o()&&(await de.setMeta(u(n.conversation),n),e=!0)}),e&&o()})},waitForChannelSyncPersistence:async function(){for(;;){const e=ot,t=tt;if(await Promise.all([e,t,...Ve]),e===ot&&t===tt&&0===Ve.size)return}},getSession:e=>V.get(e),getConversationContext:cn,isMembershipTerminated:ke,prepareConversation:function(e,t={}){const n=o(e);if("supergroup"===n.conversationType)throw new Error("prepareConversation:supergroup 未实现");const r=cn(n);if(void 0!==r){const t=r.title||e.title,n=r.avatar??e.avatar;return void(t===r.title&&n===r.avatar||dn({...r,title:t,avatar:n}))}if(ke(n)){if(!0!==t.membershipConfirmed)throw new Error("准备聊天失败:需要重新确认成员资格");ae.delete(Le(n)),ae.delete(n.conversationId),It()}dn({...e,...void 0===e.channelPermissions?{}:{channelPermissions:{...e.channelPermissions}},...void 0===e.channelAccessSnapshot?{}:{channelAccessSnapshot:{...e.channelAccessSnapshot}}}),(Y.get(n)?.unreadCount??0)>0&&!_e(n)&&zt(n,!0)},ensureConversation:function(t){const n=o(t);if(e(n),"supergroup"===n.conversationType)throw new Error("ensureConversation:supergroup 未实现");const r=V.get(n);if(void 0!==r)return r;const s={...t,id:n.conversationId,type:n.conversationType,...void 0===t.channelPermissions?{}:{channelPermissions:{...t.channelPermissions}},...void 0===t.channelAccessSnapshot?{}:{channelAccessSnapshot:{...t.channelAccessSnapshot}},...void 0===t.extensions?{}:{extensions:{...t.extensions}}},i=He(n);return i.deleted&&wt(),i.terminal&&It(),V.set(s),X.delete(n),Qe(s),ht(s),s},getSessions:()=>V.getAll(),getConversationList:function(){const e=[];for(const t of V.getAll()){const n=o(t);e.push({...t,draft:Z.get(n)})}return h(e)},getReadState:e=>Y.get(e),getPinnedMessage:e=>ee.get(e),setPinnedMessage:function(e,t){const o=function(e){const t=we(n(e),e.messageId);return void 0===t?e:{...e,preview:{state:"ready",message:t}}}(e);ee.set(o)&&(U.emitter.emit({type:"pinned-message:updated",conversationId:o.conversationId,conversation:{conversationType:o.conversationType,conversationId:o.conversationId},pinnedMessage:o,reason:t}),function(e){void 0===de||Se||ft(()=>de.savePinnedMessage(e)).catch(e=>Je("置顶消息落盘失败",e))}(o))},clearPinnedMessage:function(e,t){const o="string"==typeof e?e:e.conversationId,r=ee.get(e);if(!ee.clear(e))return;const s="string"==typeof e?void 0===r?void 0:n(r):e;if(void 0===s)throw new Error(`置顶消息清理缺少复合身份:${o}`);U.emitter.emit({type:"pinned-message:updated",conversationId:o,conversation:s,pinnedMessage:null,reason:t}),function(e){void 0===de||Se||ft(()=>de.removePinnedMessage(e)).catch(e=>Je("置顶消息删除失败",e))}(e)},isPinnedMessage:(e,t)=>ee.isPinnedMessage(e,t),setReadState:e=>{const t=void 0===e.conversationType?V.get(e.conversationId):void 0,n=void 0===e.conversationType&&void 0!==t?{...e,conversationType:t.type}:e;"channel"===n.conversationType&&re(n.conversationId),Y.set(n),Mt(n)},markConversationUnread:function(e){const t=V.get(e);if(void 0===t)return!1;const n=Y.get(e)??{...e,readCursor:t.readCursor??"",unreadCount:t.unreadCount,mentionUnreadCount:t.mentionUnreadCount};return!(n.unreadCount>0||!0===n.manuallyUnread)&&(Ft({...n,manuallyUnread:!0}),zt(e),!0)},clearConversationManualUnread:Yt,advanceRead:function(e,n){const o="string"==typeof e?z.getByConversation(e).find(e=>e.id===n)??Ce(n,e):we(e,n);if(void 0===o)return;const r="string"==typeof e?t(o):e,s="string"==typeof e?e:e.conversationId;if(o.conversationId!==s||o.conversationType!==r.conversationType)return;const i=$t(r);if(void 0!==i&&i>=o.sortKey)return void("string"!=typeof e&&Yt(e));const a={...r,readCursor:n,readCursorSortKey:o.sortKey,unreadCount:Dt(r,o.sortKey),mentionUnreadCount:jt(r,o.sortKey)};return Ft(a),zt(r),a},applyServerUnread:Zt,applyChannelReadPosition:tn,getChannelReadRevision:e=>ne.get(e.conversationId)??oe,hasPendingChannelRead:e=>te.has(e.conversationId),applyChannelReadSummary:(e,t)=>Zt(e,t.unreadCount,void 0,t.readCursor,t.hasUnreadMention),beginChannelReadTransaction:function(e){const t=e.conversationId,n=cn(e);if(void 0===n||"channel"!==n.type)throw new Error(`CHANNEL 乐观已读事务要求 channel 会话(conversationId=${t}, type=${n?.type??"missing"})`);if(te.has(t))throw new Error(`CHANNEL 乐观已读事务已存在(channelId=${t})`);const o={conversation:e,transactionId:se++},r=Y.get(e)??{conversationId:t,readCursor:n.readCursor??"",unreadCount:n.unreadCount,...void 0===n.mentionUnreadCount?{}:{mentionUnreadCount:n.mentionUnreadCount}};return te.set(t,{handle:o,baseReadState:{...r},steps:[],committedThrough:-1}),re(t),o},applyChannelReadOptimistically:nn,applyChannelConversationReadOptimistically:function(e,t,n){nn(e,t,n);const o=en(e).steps.at(-1);if(void 0!==o.clearedCounts)return;const i=Y.get(e.conversation),a=Te(e.conversation).filter(e=>r(s(e),o)>0&&xt(e)&&b(e)&&!0!==e.readBySelf&&void 0===e.recalled&&void 0===e.deletedForEveryone),c=Math.min(i.unreadCount,a.length),d=Math.min(i.mentionUnreadCount??0,a.filter(Bt).length);o.clearedCounts={unread:i.unreadCount-c,mention:(i.mentionUnreadCount??0)-d},Ft({...i,unreadCount:c,mentionUnreadCount:d}),zt(e.conversation)},commitChannelReadTransaction:function(e,t){const n=en(e);if(void 0===n)return!1;const o=n.steps.findLastIndex(e=>e.readCursor===t);if(o<0)throw new Error(`CHANNEL 已确认 cursor 不属于乐观事务(channelId=${e.conversation.conversationId}, cursor=${t})`);return n.committedThrough=Math.max(n.committedThrough,o),re(e.conversation.conversationId),n.committedThrough===n.steps.length-1&&te.delete(e.conversation.conversationId),!0},rollbackChannelReadTransaction:function(e){const t=en(e);if(void 0===t)return!1;const n=e.conversation,o=n.conversationId,r=Y.get(n),s=t.committedThrough>=0?t.steps[t.committedThrough]:void 0,i=void 0===s?t.baseReadState:void 0;let a=r?.unreadCount??i?.unreadCount??0,c=r?.mentionUnreadCount??i?.mentionUnreadCount??0;for(const e of t.steps.slice(t.committedThrough+1))a+=e.clearedCounts?.unread??0,c+=e.clearedCounts?.mention??0;const d=void 0!==i?.mentionUnreadCount||void 0!==r?.mentionUnreadCount,u={conversationId:o,conversationType:"channel",readCursor:s?.readCursor??i?.readCursor??"",readCursorSortKey:s?.sortKey??i?.readCursorSortKey,unreadCount:a,...d?{mentionUnreadCount:c}:{}};return te.delete(o),Ft(u),zt(n),!0},setGroupRestriction:function(e,t,n){const o=cn({conversationType:"group",conversationId:e});if(void 0===o){return void dn({id:e,type:"group",title:"",lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:!1,groupState:t,sendDisabledReason:n})}if(o.groupState===t&&o.sendDisabledReason===n)return;dn({...o,groupState:t,sendDisabledReason:n})},setChannelRestriction:on,setPinned:function(e,t){const n=V.get(e);if(void 0===n||n.pinned===t)return;const o={...n,pinned:t,topTime:t?Date.now():void 0};V.set(o),Qe(o),ht(o)},setMuted:function(e,t){const n=cn(e);if(void 0===n||n.muted===t)return;dn({...n,muted:t})},removeConversation:function(e){sn(e)},removeConversationForMembershipTermination:an,refreshConversationProfile:function(e,t){Nt({conversationType:t,conversationId:e},{force:!0})},readDirectProfile:Pt,beginConversationProfileRead:function(t,n){const o={...t},r=e(o),s=xe,i=!0!==n?.forceRefresh&&(je.has(r)||Be.has(r))?void 0:Ge(o);void 0!==i&&!0===n?.forceRefresh&&Be.set(r,i);const a=()=>{s===xe&&void 0!==i&&Be.get(r)===i&&Be.delete(r)};return Object.assign(e=>{try{if(void 0===i||e.id!==o.conversationId||s!==xe)return;Rt(o,e.title,e.avatar??"",void 0,i)}finally{a()}},{finish:a})},recoverChannelFromProfile:function(e){return Nt({conversationType:"channel",conversationId:e},{force:!0,allowChannelRecovery:!0})},updateConversationProfile:function(e,t){const n=cn(e);if(void 0===n)return;Ge(o(n));const r={...n,...void 0!==t.title?{title:t.title}:{},...void 0!==t.avatar?{avatar:t.avatar}:{}};W(n,r)||dn(r)},getTotalUnread:function(e){return F(V.getAll(),e)},getDraft:function(e){return Z.get(bt(e))},saveDraft:async function(t,n){const o=bt(t),r=e(o),s=Ut(o,n,0),i=pe,a=fe.get(r)??0;return await Et(o,async()=>{const e=Z.get(o),t=Math.max(Date.now(),(ve.get(r)??e?.updatedAt??0)+1),n=Ut(o,s,t);if(null!==e&&Kt(e,n))return e;if(void 0!==de&&await de.saveDraft(n),i!==pe||a!==(fe.get(r)??0))throw new Error("草稿状态已失效,拒绝过期写入回灌内存");return Z.set(n),ve.set(r,t),U.emitter.emit({type:"draft:updated",conversation:n.ref,draft:n}),n})},clearDraft:async function(e){await At(e)},clearDraftIfUnchanged:async function(e,t){return await At(e,t)},invalidateAndDrainDraftOperations:async function(){for(pe+=1;le.size>0;)await Promise.all([...le.values()])},clearSession(){rt+=1,xe+=1,pe+=1,Xt+=1,Vt.clear(),$e.clear(),De.clear(),Be.clear(),je.clear(),Fe.clear(),z.clear(),V.clear(),X.clear(),Y.clear(),Z.clear(),le.clear(),ve.clear(),fe.clear(),te.clear(),ne.clear(),oe+=1,ee.clearAll(),ie.clear(),ae.clear(),ce.clear(),Ye.clear(),J.clear();for(const e of me)e.reset()},hydrate:async function(r=()=>!0){if(void 0!==de&&r()){Se=!0;try{const s=await de.getMeta(L);if(!r())return;if(null!==s)for(const e of s)ie.add(e);const i=await de.getMeta(_);if(!r())return;if(null!==i)for(const e of i)ae.add(e);const a=await de.getMeta(k);if(!r())return;if(null!==a)for(const[e,t]of a)"string"==typeof e&&"string"==typeof t&&ce.set(e,t);const c=await de.getMeta(O);if(!r())return;if(null!==c)for(const e of c){const t=be(e);J.set(t,[...J.get(t)??[],e])}const d=await de.getMeta(H);if(!r())return;if(Array.isArray(d))for(const e of d){if("object"!=typeof e||null===e)continue;const t=Reflect.get(e,"serialNumber"),n=Reflect.get(e,"status"),o=Reflect.get(e,"occurredTime");"string"!=typeof t||""===t.trim()||0!==n&&1!==n&&2!==n&&3!==n||void 0!==o&&("number"!=typeof o||!Number.isFinite(o)||o<=0)||Q.set(t,{serialNumber:t,status:n,...void 0===o?{}:{occurredTime:o}})}const u=await de.getPinnedMessages();if(!r())return;for(const e of u){if(!r())return;_e({conversationType:e.conversationType,conversationId:e.conversationId})||ee.set(e)&&U.emitter.emit({type:"pinned-message:updated",conversationId:e.conversationId,conversation:n(e),pinnedMessage:e,reason:"hydrate"})}const l=(await de.getSessions()).filter(e=>!_e({conversationType:e.type,conversationId:e.id}));if(!r())return;for(const e of l){if(!r())return;const t=Ht(o(e),[],"preserve",e),n=o(t),s=V.get(n);V.set(t),X.delete(n),void 0!==s&&W(s,t)||Qe(t)}const v=await de.getReadStates();if(!r())return;for(const e of v)"channel"===e.conversationType&&re(e.conversationId),Y.set(e);const f=pe,p=await de.getDrafts();if(!r())return;if(f!==pe)return;for(const t of p){if(!r())return;if(!Number.isFinite(t.updatedAt)||t.updatedAt<0)throw new Error(`草稿 updatedAt 非法:${t.updatedAt}`);const n=Ut(t.ref,t,t.updatedAt);if(_e(n.ref)){try{if(await de.deleteDraft(n.ref),!r())return}catch(e){if(!r())return;Je("清理已删会话残留草稿失败",e)}continue}const o=e(n.ref);ve.set(o,Math.max(ve.get(o)??0,n.updatedAt));const s=Z.get(n.ref);null!==s&&s.updatedAt===n.updatedAt&&Kt(s,n)||(Z.set(n),U.emitter.emit({type:"draft:updated",conversation:n.ref,draft:n}))}for(const n of l){if(!r())return;const s=o(n),i=(await de.getMessages(s,{limit:50})).filter(n=>e(t(n))===e(s)).filter(qe);if(!r())return;const a=[];if(Gt(i.map(e=>{const t=qt(T(e));return t!==e&&a.push(t),t}),r),!r())return;if(a.length>0)try{if(await de.saveMessages(a),!r())return}catch(e){if(!r())return;Je("本地消息修复态落盘失败",e)}if(!r())return;zt(s)}}catch(e){r()&&Je("本地历史回读失败",e)}finally{Se=!1,r()&&Ne("offline")}}},loadOlderMessages:async function(n,o){if(void 0===de)return[];try{const r=await de.getMessages(n,o),s="string"==typeof n?r.filter(qe):r.filter(o=>e(t(o))===e(n)).filter(qe),i=Se;let a;Se=!0;try{a=Gt(s)}finally{Se=i}return Se||Ne("offline"),a.map(e=>we(t(e),e.id)??e)}catch(e){return Je("加载更早消息失败",e),[]}},searchMessages:async function(n,o){const r=o.keyword?.trim()??"",s=o.contentTypes;if(""===r&&(void 0===s||0===s.length))return{results:[],exhausted:!0};const i=""===r?void 0:await w(r),a=e=>{const t=void 0===s||s.includes(e.contentType),n=void 0===i||null!==i.match(I(e));return t&&n},c=(e,t)=>e.sortKey<t.sortKey?1:e.sortKey>t.sortKey?-1:0,d=e=>function(e,t){const n=t?.match(I(e));return{message:e,ranges:n?.ranges.map(({start:e,end:t})=>[e,t])??[]}}(e,i);if(void 0===de)return(()=>{const e=z.getByConversation(n).filter(a).sort(c),t=(void 0===o.beforeSortKey?e:e.filter(e=>e.sortKey<o.beforeSortKey)).slice(0,o.limit),r=t.length<o.limit;return{results:t.map(d),exhausted:r,...r?{}:{nextBeforeSortKey:t.at(-1)?.sortKey}}})();let u;try{u=await de.searchMessages(n,{...void 0!==o.keyword?{keyword:o.keyword}:{},...void 0!==s?{contentTypes:s}:{},limit:o.limit,...void 0!==o.beforeSortKey?{beforeSortKey:o.beforeSortKey}:{}})}catch(e){throw Je("会话内搜索失败",e),e}const l=u.exhausted?void 0:u.nextBeforeSortKey,v=new Map(z.getByConversation(n).map(e=>[e.id,e])),f=/* @__PURE__ */new Map;for(const o of u.items){const r=Wt(o);e(t(r))===e(n)&&f.set(r.id,v.get(r.id)??r)}for(const e of v.values()){const t=void 0===o.beforeSortKey||e.sortKey<o.beforeSortKey,n=void 0===l||e.sortKey>=l;t&&n&&a(e)&&f.set(e.id,e)}return{results:[...f.values()].filter(a).sort(c).map(d),exhausted:u.exhausted,...u.exhausted?{}:{nextBeforeSortKey:u.nextBeforeSortKey}}},messageWindow:he,createMessageWindow:function(e={}){const t=ge(e);let n=!1;return{window:t,dispose(){n||(n=!0,t.reset(),me.delete(t))}}}}}export{J as createDomainState,j as defaultConversationUnreadMode,F as sumSessionsUnread};
@@ -0,0 +1 @@
1
+ import{encodeConversationKey as e}from"../conversation-identity.js";function t(){const t=/* @__PURE__ */new Map;return{get:l=>t.get(e(l))??null,getAll:()=>[...t.values()],set:l=>t.set(e(l.ref),l),delete:l=>t.delete(e(l)),clear:()=>t.clear()}}export{t as createDraftStore};
@@ -0,0 +1 @@
1
+ import{resolveGroupRestriction as e,resolveAckFailureRestriction as o}from"../mapping/group-notify-mapper.js";import{ErrCode as n}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";function r(r){const{domainState:t,getSelfId:i,prefetchGroupKey:s,clearGroupKeys:a}=r;return{handleMessage(c){const p=c.body.system;if("system"===c.contentType&&void 0!==p){if("group_info_changed"===p.eventType||"group_master_changed"===p.eventType)return void t.refreshConversationProfile(c.conversationId,"group");const o=e(p,i());if(null===o)return;return void("active"===o.state?(t.setGroupRestriction(c.conversationId,o.state,o.reason),r.clearConversationTermination?.({conversationType:"group",conversationId:c.conversationId}),s(c.conversationId)):(a(c.conversationId),t.removeConversationForMembershipTermination({conversationType:"group",conversationId:c.conversationId},o.reason)))}if("group"===c.conversationType&&c.senderId===i()&&"failed"===c.status){const e=o(c.failure?.code);return void(null!==e?(a(c.conversationId),"dismissed"===e.state?t.removeConversationForMembershipTermination({conversationType:"group",conversationId:c.conversationId},e.reason):t.setGroupRestriction(c.conversationId,e.state,e.reason)):c.failure?.code===n.ERR_GROUP_NETWORKEXCEPTION&&t.refreshConversationProfile(c.conversationId,"group"))}"group"===c.conversationType&&"system"!==c.contentType&&c.senderId!==i()&&!0!==c.encryption.decryptFailed&&("removed"===t.getSession(c.conversationId)?.groupState&&t.setGroupRestriction(c.conversationId,"active",""),"active"===t.getSession(c.conversationId)?.groupState&&r.clearConversationTermination?.({conversationType:"group",conversationId:c.conversationId}))}}}export{r as createGroupRestrictionCoordinator};
@@ -0,0 +1 @@
1
+ class r extends Error{constructor(r){super(r instanceof Error?r.message:"本地消息窗口读取失败",{cause:r}),this.name="LocalMessageWindowReadError"}}export{r as LocalMessageWindowReadError};
@@ -0,0 +1 @@
1
+ function e(e){return/^\[[^[\]\s]+\]$/.test(e)}function t(e){const t=e.slice(1,-1).toLowerCase();return"game_dice"===t||"game_rock"===t}function n(e,t){return e.createdAt-t.createdAt||e.id.localeCompare(t.id)}function r(e){return Object.freeze({...e,conversation:Object.freeze({...e.conversation})})}function i(e,t,i){const o=/* @__PURE__ */new Map;for(const t of e){const e=o.get(t.senderId);(void 0===e||n(e,t)<0)&&o.set(t.senderId,t)}const a=/* @__PURE__ */new Map;let s;for(const e of o.values()){if(1===e.action)continue;const n=a.get(e.emoji)??{participants:[],latestAt:0};n.participants.push(e.senderId),n.latestAt=Math.max(n.latestAt,e.createdAt),a.set(e.emoji,n),e.senderId===t&&(s=e.emoji)}const c=[...a.entries()].map(([e,n])=>Object.freeze({emoji:e,count:n.participants.length,mine:n.participants.includes(t),latestAt:n.latestAt,participantIds:Object.freeze([...n.participants].sort())})).sort((e,t)=>Number(t.mine)-Number(e.mine)||t.latestAt-e.latestAt||e.emoji.localeCompare(t.emoji));return Object.freeze({version:i,total:[...a.values()].reduce((e,t)=>e+t.participants.length,0),...void 0===s?{}:{currentUserEmoji:s},events:Object.freeze(e.map(r)),aggregates:Object.freeze(c)})}function o(n,r,o){if(!e(r.emoji))throw new Error(`Reaction emoji 必须是 [face_name]:${r.emoji}`);if(t(r.emoji))throw new Error(`游戏贴图不能作为 Reaction:${r.emoji}`);if(""===r.id.trim()||""===r.parentMessageId.trim()||""===r.senderId.trim())throw new Error("Reaction 事件缺少 id、parentMessageId 或 senderId");if(0!==r.action&&1!==r.action)throw new Error(`Reaction action 非法:${r.action}`);if(!Number.isSafeInteger(r.createdAt)||r.createdAt<0)throw new Error(`Reaction createdAt 非法:${r.createdAt}`);return n?.events.some(e=>e.id===r.id)?n:i([...n?.events??[],r],o,(n?.version??0)+1)}function a(e,t,n){if(void 0===e)return;const r=e.events.filter(e=>e.id!==t);return r.length===e.events.length?e:0!==r.length?i(r,n,e.version+1):void 0}function s(e,t,n){if(void 0===e)return t;if(void 0===t)return e;const r=new Map(e.events.map(e=>[e.id,e]));for(const e of t.events)r.set(e.id,e);return i([...r.values()],n,Math.max(e.version,t.version))}export{o as applyMessageReaction,t as isGameReactionEmoji,e as isReactionEmojiToken,s as mergeMessageReactions,a as rollbackMessageReaction};
@@ -0,0 +1 @@
1
+ import{encodeConversationKey as e,decodeConversationKey as t,conversationRefFromMessage as n}from"../conversation-identity.js";import{computeMessageSortKey as o,compareBySortKey as r}from"../mapping/sort.js";import{mergeMessage as i,isMessageEqual as s}from"../mapping/merge.js";function d(d){const a=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map,g=/* @__PURE__ */new Map;function u(t,n){return JSON.stringify([e(t),n])}function f(e,t){if(void 0!==t)return a.get(u(t,e));const n=g.get(e);if(void 0!==n){if(n.size>1)throw new Error(`裸 messageId 存在多会话歧义:${e}`);return a.get(n.values().next().value)}}function l(n){if("string"!=typeof n)return e(n);const o=[...c.keys()].filter(e=>t(e).conversationId===n);if(o.length>1)throw new Error(`裸 conversationId 存在多类型歧义:${n}`);return o[0]}function v(t){const n=a.get(t);a.delete(t);const o=e(n),r=c.get(o);r.delete(t),0===r.size&&c.delete(o);const i=g.get(n.id);i.delete(t),0===i.size&&g.delete(n.id)}return{get:f,getById(e){const t=g.get(e);return void 0===t?[]:[...t].map(e=>a.get(e))},getAll:()=>[...a.values()],getByConversation(e){const t=l(e),n=void 0===t?void 0:c.get(t);if(void 0===n)return[];const o=[];for(const e of n){const t=a.get(e);void 0!==t&&o.push(t)}return o.sort(r)},has:(e,t)=>void 0!==f(e,t),get size(){return a.size},upsert(t,r){const f=u(t,t.id),l=a.get(f);if(void 0===l){const r={...t,sortKey:o(t)};return a.set(f,r),function(t,o){const r=e(n(t));let i=c.get(r);void 0===i&&(i=/* @__PURE__ */new Set,c.set(r,i)),i.add(o);const s=g.get(t.id)??/* @__PURE__ */new Set;s.add(o),g.set(t.id,s)}(r,f),{message:r,isNew:!0,changed:!0}}const v=i(l,t,d?.getSelfId?.()??""),p=!0===r?.authoritativeFailure&&"failed"===t.status?{...v,status:"failed",failure:t.failure}:v;return a.set(f,p),{message:p,isNew:!1,changed:!s(l,p)}},delete(e,t){const n=u(e,t);return!!a.has(n)&&(v(n),!0)},deleteByConversation(e){const t=l(e);if(void 0===t)return;const n=c.get(t);if(void 0!==n)for(const e of[...n])v(e)},clear(){a.clear(),c.clear(),g.clear()}}}export{d as createMessageStore};
@@ -0,0 +1 @@
1
+ import{LocalMessageWindowReadError as e}from"./local-message-window-read-error.js";import{compareBySortKey as o}from"../mapping/sort.js";import{normalizeStoredMessageContent as t}from"../mapping/stored-message.js";import{backfillGroupMention as s}from"../mapping/group-message-mapper.js";function n(e){const o=t(e);if("group"!==o.conversationType||"text"!==o.contentType)return o;const n=s(o.body.text??"",o.mention);return n===o.mention?o:{...o,mention:n}}function r(...e){const o=/* @__PURE__ */new Set,t=[];for(const s of e)for(const e of s)o.has(e.id)||(o.add(e.id),t.push(e));return t}function i(t){const s=t.retention?.maxMessages,i="remote"===t.historySource&&void 0!==t.loadOlderFromRemote;if(void 0!==s&&(!Number.isSafeInteger(s)||s<=0))throw new Error("消息窗口 maxMessages 必须是大于 0 的安全整数");let a=0,l=new AbortController;function d(){return l.abort(),l=new AbortController,++a}let c,v,u=null,m=null,f=[],g=!1,y=!1;async function h(o,s){if(void 0===t.storage)return[];try{const e=await t.storage.getMessages(o,s);return void 0===t.normalizeStoredUpload?e:e.map(t.normalizeStoredUpload)}catch(o){throw new e(o)}}let p,w,I=!1,K=!1,M=!0,R=!1,S=null;function x(){c=f[0],v=f.at(-1)}function T(){const e=f[0],o=f.at(-1);(!g||void 0===c||void 0!==e&&e.sortKey>=c.sortKey)&&(c=e),(!y||void 0===v||void 0!==o&&o.sortKey<=v.sortKey)&&(v=o)}function F(e){const o=f.filter(e=>(void 0===c||e.sortKey>=c.sortKey)&&(void 0===v||e.sortKey<=v.sortKey));if(0===o.length){const o="start"===e?f.at(-1):f[0];return c=o,void(v=o)}"start"===e?c=o[0]:v=o.at(-1)}function O(e){if(!(void 0===s||f.length<=s)){if("start"===e)return f=f.slice(-s),g=!0,F(e),p=void 0,void(R&&(I=!1));f=f.slice(0,s),y=!0,F(e),M=!1,w=void 0}}function b(e){if(void 0===s||f.length<=s)return;const o=f.findIndex(o=>o.sortKey===e);if(o<0)throw new Error("消息窗口裁剪前缺少定位目标");const t=f.length-s,n=o-Math.floor((s-1)/2),r=Math.min(t,Math.max(0,n)),i=r+s,a=i<f.length;r>0&&(g=!0,p=void 0,R&&(I=!1)),a&&(y=!0,M=!1,w=void 0),f=f.slice(r,i),r>0&&F("start"),a&&F("end")}function C(e,o,t){return e.conversationId===o&&(null===t||e.conversationType===t)}function N(e,o,t){const s=e.filter(e=>C(e,o,t));if(null===t&&new Set(s.map(e=>e.conversationType)).size>1)throw new Error(`裸 conversationId 窗口存在多类型歧义:${o}`);return s}function E(e,o){return null===o?e:{conversationType:o,conversationId:e}}function A(e,t=!0){if(null!==u){for(const t of e){if(!C(t,u,m))continue;if(null!==S){S.push(t);continue}const e=f.findIndex(e=>e.id===t.id);if(e>=0){const s=f[e].sortKey!==t.sortKey;f[e]=t,s&&(f.sort(o),T()),c?.id===t.id&&c.sortKey===t.sortKey&&(c=t),v?.id===t.id&&v.sortKey===t.sortKey&&(v=t);continue}const s=v;void 0===s||t.sortKey>s.sortKey?y||(f.push(t),f.sort(o),T()):void 0!==c&&t.sortKey>=c.sortKey&&(f.push(t),f.sort(o))}t&&O(y?"end":"start")}}const $={async open(e,{limit:s}){const r="string"==typeof e?e:e.conversationId,l="string"==typeof e?null:e.conversationType,c=d();u=r,m=l,f=[],x(),g=!1,y=!1,I=!1,p=void 0,K=!1,M=!0,w=void 0,R=!1,S=[];try{const e=void 0===t.storage?[]:await h(E(r,l),{limit:s}),d=N(e,r,l).map(n).filter(e=>t.shouldIncludeMessage?.(e)??!0);if(c!==a)return{conversationId:r,messages:d,stale:!0};const v=S??[];return f=[...d].sort(o),x(),g=d.length===s||void 0!==t.loadOlderFromRemote,K=void 0!==t.loadOlderFromRemote&&(i||d.length<s||null!==l&&!0===t.shouldEstablishRemoteLatest?.({conversationType:l,conversationId:r},d)),y=!1,M=!0,w=void 0,S=null,A(v,!1),O("start"),{conversationId:r,messages:f,stale:!1}}finally{c===a&&(S=null)}},async openAt(e,{anchorSortKey:s,limit:l,seedMessages:T,seedHasNewer:F,seedHasOlder:O,seedRemotePagination:$}){const j="string"==typeof e?e:e.conversationId,L="string"==typeof e?null:e.conversationType,P=u===j&&m===L&&null===S,z=d();u=j,m=L;const W=()=>{c=void 0,v=void 0,g=!1,y=!1,I=!1,p=void 0,K=!1,M=!0,w=void 0,R=!1};P||(f=[],W()),S=[];try{if(void 0!==T&&T.length>0){if(T.some(e=>!C(e,j,L)))throw new Error(`messageWindow.openAt seedMessages 会话归属不一致(conversationId=${j})`);const e=r(T).map(n).filter(e=>t.shouldIncludeMessage?.(e)??!0).sort(o);if(!e.some(e=>e.sortKey===s))throw new Error(`messageWindow.openAt seedMessages 缺少 anchor(conversationId=${j})`);const d=S??[];return W(),f=i&&void 0===$?e.filter(e=>e.sortKey===s):e,x(),g=O??void 0!==t.loadOlderFromRemote,y=i&&void 0===$?void 0!==t.loadNewerFromRemote:F??e.length===l,M=!y,w=$?.newerCursor,R=i||void 0!==$,S=null,A(d,!1),b(s),{conversationId:j,messages:f,stale:z!==a}}if(void 0===t.storage)return f=[],W(),{conversationId:j,messages:[],stale:z!==a};const[e,d]=await Promise.all([h(E(j,L),{beforeSortKey:s,limit:l}),h(E(j,L),{afterSortKey:s,limit:l})]),c=N(e,j,L).map(n).filter(e=>t.shouldIncludeMessage?.(e)??!0),v=N(d,j,L).map(n).filter(e=>t.shouldIncludeMessage?.(e)??!0);if(z!==a)return{conversationId:j,messages:r(c,v).map(n),stale:!0};const u=r(c,v).sort(o);if(i&&!u.some(e=>e.sortKey===s))return{conversationId:j,messages:[...f],stale:!1};const m=S??[];return W(),f=i?u.filter(e=>e.sortKey===s):u,x(),R=i,g=c.length===l||void 0!==t.loadOlderFromRemote,y=i?void 0!==t.loadNewerFromRemote:v.length===l,M=!y,w=void 0,S=null,A(m,!1),b(s),{conversationId:j,messages:f,stale:!1}}finally{if(z===a){const e=S;S=null,P&&null!==e&&A(e)}}},async loadOlder({limit:e,establishLatestOnly:s=!1}){const d=u,y=m;if(null===d||!g)return{conversationId:d??"",messages:[],stale:!1};const w=a,M=N(void 0===t.storage||void 0!==p||R||K?[]:await h(E(d,y),{beforeSortKey:c?.sortKey,limit:e}),d,y).map(n).filter(e=>t.shouldIncludeMessage?.(e)??!0);if(w!==a||u!==d||m!==y)return{conversationId:d,messages:M,stale:!0};const S=M.length===e,T=[...M];let F=!1;if(M.length>0&&(p=void 0),!S&&void 0!==t.loadOlderFromRemote&&!I){if(null===y)throw new Error("远端历史加载需要完整会话身份 ConversationRef,旧裸 conversationId 只支持本地兼容分页");const v=await t.loadOlderFromRemote({conversation:{conversationType:y,conversationId:d},signal:l.signal,oldestLoaded:M[0]??c,...void 0===p?{}:{cursor:p},intent:K?"establish-latest":"older",limit:e});if(w!==a||u!==d||m!==y)return{conversationId:d,messages:[],stale:!0};K=!1,I=v.exhausted,p=v.nextCursor;const h=N(v.messages,d,y),S=h.map(n).filter(e=>t.shouldIncludeMessage?.(e)??!0);if(v.replaceWindow){if(!v.exhausted&&(void 0===v.nextCursor||""===v.nextCursor.trim()))throw new Error(`远端最新连续页缺少向旧 cursor(conversationType=${y}, conversationId=${d})`);const t=new Set(f.map(e=>e.id)),n=r(S).sort(o),a=n.at(-1)?.sortKey,l=void 0===a?f:f.filter(e=>e.sortKey>a);f=r(n,l).sort(o),x(),R=i,g=!I;const c=n.filter(e=>!t.has(e.id));if(O("start"),i&&g&&!s){const t=await $.loadOlder({limit:e});return{...t,messages:r(c,t.messages).sort(o)}}return{conversationId:d,messages:c,stale:!1}}F=h.length>0&&0===S.length,F&&(I=!0,p=void 0),T.push(...S)}const b=new Set(f.map(e=>e.id)),C=/* @__PURE__ */new Set,A=T.filter(e=>!b.has(e.id)&&!C.has(e.id)&&(C.add(e.id),!0)).sort(o);A.length>0&&(f=[...A,...f].sort(o));const j=[...T].sort(o),L=j[0];return void 0!==L&&(void 0===c||L.sortKey<c.sortKey)&&(c=L),v??(v=j.at(-1)),g=S||void 0!==t.loadOlderFromRemote&&!I&&!F,g||(c=f[0]),O("end"),{conversationId:d,messages:A,stale:!1}},async loadNewer({limit:e}){const s=u,r=m;if(null===s||!y)return{conversationId:s??"",messages:[],stale:!1};const i=a,d=v,g=d?.sortKey,p=N(void 0===t.storage||void 0===g||R?[]:await h(E(s,r),{afterSortKey:g,limit:e+1}),s,r).map(n).filter(e=>t.shouldIncludeMessage?.(e)??!0);if(i!==a||u!==s||m!==r)return{conversationId:s,messages:[],stale:!0};const I=p.filter(e=>void 0===g||e.sortKey>g).slice(0,e),K=I.length===e,S=[...I];if(I.length>0&&(w=void 0),!K&&void 0!==t.loadNewerFromRemote&&!M){if(null===r)throw new Error("远端向新加载需要完整会话身份 ConversationRef,旧裸 conversationId 只支持本地兼容分页");const o=await t.loadNewerFromRemote({conversation:{conversationType:r,conversationId:s},signal:l.signal,newestLoaded:I.at(-1)??d,...void 0===w?{}:{cursor:w},limit:e});if(i!==a||u!==s||m!==r)return{conversationId:s,messages:[],stale:!0};M=o.exhausted,w=o.nextCursor,S.push(...N(o.messages,s,r).filter(e=>t.shouldIncludeMessage?.(e)??!0))}const x=new Set(f.map(e=>e.id)),T=/* @__PURE__ */new Set,F=S.filter(e=>!(void 0!==g&&e.sortKey<=g||x.has(e.id)||T.has(e.id))&&(T.add(e.id),!0)).sort(o);F.length>0&&(f=[...f,...F].sort(o));const b=[...S].sort(o),C=b.at(-1);return void 0!==C&&(void 0===v||C.sortKey>v.sortKey)&&(v=C),c??(c=b[0]),y=K||void 0!==t.loadNewerFromRemote&&!M,y||(v=f.at(-1)),O("start"),{conversationId:s,messages:F,stale:!1}},applyIncoming:A,removeMessage(e,o){if(u!==e.conversationId||m!==e.conversationType)return!1;const t=f.findIndex(e=>e.id===o);return!(t<0)&&(d(),f.splice(t,1),T(),p=void 0,w=void 0,S=null,!0)},clearConversation:e=>u===e.conversationId&&m===e.conversationType&&(d(),f=[],x(),g=!1,y=!1,I=!1,p=void 0,K=!1,M=!0,w=void 0,R=!1,S=null,!0),list:()=>[...f],info:()=>({conversationId:u,...null===u||null===m?{}:{conversation:{conversationType:m,conversationId:u}},hasMore:g,hasNewer:y,...i?{remotePagination:!0}:{}}),getPaginationKey:()=>JSON.stringify([c?.sortKey,v?.sortKey,p,w,g,y]),getRevision:()=>a,reset(){d(),u=null,m=null,f=[],x(),g=!1,y=!1,I=!1,p=void 0,K=!1,M=!0,w=void 0,R=!1,S=null}};return $}export{i as createMessageWindowStore};
@@ -0,0 +1 @@
1
+ function e(e){return{handleMessage(n){const t={conversationType:n.conversationType,conversationId:n.conversationId},o=n.body.system?.pinnedMessageAction;if(void 0!==o)return"pin"===o.type?void e.domainState.setPinnedMessage(o.pinnedMessage,"notify:pin"):"unpin"===o.type?void e.domainState.clearPinnedMessage(t,"notify:unpin"):(e.emitter.emit({type:"error",error:{scope:"protocol",message:"置顶消息通知 payload 解析失败",cause:{conversationId:n.conversationId,notifyMessageId:n.id,code:o.code}}}),void e.requestReconcile(n.conversationId));if("system"!==n.contentType&&e.domainState.isPinnedMessage(t,n.id)){const o=e.domainState.getPinnedMessage(t);void 0!==o&&e.domainState.setPinnedMessage({...o,preview:{state:"ready",message:n}},"message:updated")}}}}export{e as createPinnedMessageCoordinator};