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{defineComponent as e,ref as t,provide as o,watch as n,nextTick as i,onMounted as l,onBeforeUnmount as r,computed as s,h as a}from"vue";import{resolveImThreadActiveDate as c}from"../../thread/active-date.js";import{createNewMessageBadgeController as d}from"../../thread/new-message-badge.js";import{refreshPrependMessageAnchorPosition as u,isMessageVisibleForNewMessageBadge as v,resolvePrependMessageAnchorPosition as f,resolveCenteredMessageScrollTop as p,shouldPrefetchOlderHistory as h,shouldLoadNewerHistoryPage as g,resolvePrependMessageAnchorAdjustment as m}from"../../thread/viewport-rules.js";import{createThreadIdleTask as b}from"./thread-idle-task.js";import{createThreadLayoutMeasurements as y}from"./thread-layout-measurements.js";import{THREAD_VIEWPORT_REGISTRATION_KEY as T}from"./thread-viewport-context.js";const w=.5;function M(e){const t=e.ownerDocument.defaultView?.devicePixelRatio;return 1+1/(void 0!==t&&Number.isFinite(t)&&t>0?t:1)}const O=e({name:"ImThreadViewport",props:{messageIds:{type:Array,required:!0},contentKey:{type:String,default:""},loadingOlder:{type:Boolean,default:!1},hasNewer:{type:Boolean,default:!1},loadingNewer:{type:Boolean,default:!1},followThreshold:{type:Number,default:120},olderPrefetchThreshold:{type:Number,default:120},followNewMessages:{type:Boolean,default:!0},shouldFollowAppendedMessage:{type:Function,default:void 0},pendingSendMessageIds:{type:Array,default:()=>[]},visibleMargin:{type:Number,default:8},resizeFollowEnabled:{type:Boolean,default:!0},activeDateOffset:{type:Number,default:16},activeDateEnabled:{type:Boolean,default:!1}},emits:{"reach-start":()=>!0,"reach-end":()=>!0,"visible-range":e=>!0,settled:e=>!0,"new-message-count":e=>!0,"user-scroll":()=>!0,"active-date-change":e=>!0},setup(e,{emit:O,expose:H,slots:x}){const E=t(null),N=t(null),L=/* @__PURE__ */new Map;let B;const P=/* @__PURE__ */new Map,A=/* @__PURE__ */new Set,R=/* @__PURE__ */new Map;let S,C,F,I,k=0,D=[];const Y=y({requestFrame:xe,observe:e=>F?.observe(e),unobserve:e=>{e===E.value||e===N.value||P.has(e)||F?.unobserve(e)}});let j,z,U=!1;const V=/* @__PURE__ */new Set;let q,K=!1,W=0,$="",G=1,J=!1,Q=!1,X=!0,Z=!1,_=!1,ee=!0,te=!1,oe=0,ne=-1,ie=-1;const le=b();let re,se,ae,ce;const de=t(!0),ue=t(0),ve=d(e=>{ue.value=e,O("new-message-count",e)});function fe(t){const o=Number.isFinite(e.followThreshold)?Math.max(0,e.followThreshold):0;return t.scrollHeight-t.clientHeight-t.scrollTop<=o}function pe(t=e.messageIds){return t.flatMap(e=>{const t=L.get(e);if(void 0===t)return[];const o=t.getBoundingClientRect(),n=t.querySelector("[data-im-thread-anchor-point]");return[{id:e,top:o.top,bottom:o.bottom,anchorTop:n?.getBoundingClientRect().top??o.top}]})}function he(e="",t=1){const o=Math.min(1,Math.max(0,t));""!==$&&$!==e&&R.get($)?.element.style.removeProperty("opacity"),$=e,G=o,""!==e&&R.get(e)?.element.style.setProperty("opacity",String(o))}function ge(){he()}function me(){const t=E.value;if(K||null===t||!e.activeDateEnabled)return;const o=[...R.entries()].filter(([,e])=>t.contains(e.element)).map(([e,t])=>{const o=t.element.getBoundingClientRect();return{key:e,label:t.label,top:o.top,height:o.height}}).sort((e,t)=>e.top-t.top),n=t.getBoundingClientRect(),i=o.find(e=>e.height>0)?.height??28,l=c({markers:o,viewportTop:n.top,overlayTop:Number.isFinite(e.activeDateOffset)?Math.max(0,e.activeDateOffset):0,overlayHeight:i});if(null===l)return ge(),void O("active-date-change",null);he(l.inlineDateKey,l.inlineOpacity),O("active-date-change",l)}function be(e){C={scrollTop:e.scrollTop,scrollHeight:e.scrollHeight,width:e.clientWidth,height:e.clientHeight}}function ye(e){const t=C;if(void 0===t)return!1;const o=Math.max(0,e.scrollHeight-e.clientHeight);return o<t.scrollHeight-t.height&&t.scrollTop>o&&Math.abs(e.scrollTop-o)<=M(e)}function Te(e){return e.scrollTop<0||e.scrollTop>Math.max(0,e.scrollHeight-e.clientHeight)+M(e)}function we(e){return ye(e)||void 0!==q&&("smooth"===q.behavior||Math.abs(e.scrollTop-q.targetTop)<=M(e))?0:e.scrollTop-k}function Me(e,t){0!==t&&(k=e.scrollTop-t,q=void 0,Se(!0))}function Oe(t,o){const n=we(t);if(void 0!==ae)return ae.expectedOffset-=n,Ye(),Me(t,n),Z||Ue(),!1;const i=C;if(void 0===i)return!1;const l=S,r=void 0===l?void 0:pe([l.id])[0],s=t.scrollTop-i.scrollTop,a=ye(t)?0:s,c=void 0===l||void 0===r?0:(r.anchorTop??r.top)-o.top-l.offset+s;return(i.scrollHeight!==t.scrollHeight||i.width!==t.clientWidth||i.height!==t.clientHeight||Math.abs(c)>w)&&(C=void 0,!(J||Q||e.loadingOlder||e.loadingNewer||e.hasNewer||!e.resizeFollowEnabled||Te(t))&&de.value&&Math.abs(a)<=w?(lt(),!0):(void 0!==l&&function(e){const t=E.value;if(null===t||void 0===e)return;if(Te(t))return void Ve(e);const o=t.getBoundingClientRect(),n=m(e,pe([e.id]),{top:o.top,bottom:o.bottom});if(void 0!==n){const e=Math.max(0,t.scrollHeight-t.clientHeight),o=Math.min(e,Math.max(0,t.scrollTop+n));Fe(o),t.scrollTop=o,k=t.scrollTop,C=void 0}}({...l,offset:l.offset-a}),Me(t,n),!1))}function He(){const t=E.value;if(K||null===t)return;const o=t.getBoundingClientRect();if(Oe(t,o))return;const n=pe(void 0!==j&&U?e.messageIds.filter(e=>A.has(e)):e.messageIds);if(void 0!==j&&U&&0===n.length)return void(de.value=fe(t));const i=n.filter(t=>v({viewportTop:o.top,viewportBottom:o.bottom,messageTop:t.top,messageBottom:t.bottom,margin:e.visibleMargin})).map(e=>e.id),l=i.length!==D.length||i.some((e,t)=>D[t]!==e);D=Object.freeze(i),S=f(n,{top:o.top,bottom:o.bottom}),be(t),ve.acknowledgeVisible(i),de.value=fe(t),l&&O("visible-range",D),O("settled",{visibleMessageIds:D,...0===D.length?{}:{newestVisibleMessageId:D[D.length-1]},isAtBottom:de.value,newMessageCount:ue.value})}function xe(e){if(V.add(e),void 0!==z)return;const t=()=>{z=void 0;const e=[...V];V.clear(),e.forEach(e=>e())};z="function"==typeof globalThis.requestAnimationFrame?globalThis.requestAnimationFrame(t):globalThis.setTimeout(t,0)}function Ee(){xe(He)}function Ne(){const e=E.value;if(null===e)return;const t=e.getBoundingClientRect(),o=f(pe(),{top:t.top,bottom:t.bottom});void 0!==o&&(S=o,be(e))}function Le(){return X&&void 0===ae&&!Q&&!e.loadingOlder}function Be(){Ne(),X=!1,ne=oe,Q=!0,de.value=!1,O("reach-start"),xe(()=>{e.loadingOlder||(Q=!1)})}function Pe(t){return e.hasNewer&&!J&&!e.loadingOlder&&!e.loadingNewer&&fe(t)}function Ae(){Ne(),J=!0,de.value=!1,ie=oe,O("reach-end"),xe(()=>{e.loadingNewer||(J=!1)})}function Re(){const e=E.value;null!==e&&oe!==ie&&Pe(e)&&Ae()}function Se(t=!1){const o=E.value;if(K||null===o)return;const n=o.scrollTop,i=Math.max(0,o.scrollHeight-o.clientHeight),l=Math.min(i,Math.max(0,k)),r=Math.min(i,Math.max(0,n)),s=ye(o),a=q;let c=!1;if(void 0!==a){const e=Math.abs(n-a.targetTop)<=M(o);c="smooth"===a.behavior||e,("smooth"!==a.behavior||e)&&(q=void 0)}c||s||Z||!ee||void 0!==ae||n===k||(Z=!0,_=!0,oe+=1);const d=Z&&!c&&!s&&n!==k;d&&(W+=1,O("user-scroll"),xe(me)),Z&&!te&&Je(),!X&&_&&oe!==ne&&n<k&&n>qe()&&We(),void 0===ae||c||(Z?s||t||(ae.expectedOffset-=n-k):(Ye(),Ue())),Le()&&d&&h({previousScrollTop:l,currentScrollTop:r,topThreshold:e.olderPrefetchThreshold})&&Be(),d&&Pe(o)&&g({previousScrollTop:l,currentScrollTop:r,isAtBottom:fe(o),isHistoryWindow:e.hasNewer,isPageSettling:c})&&Ae(),k=n,Ee()}function Ce(){Se()}function Fe(e,t="auto"){q={targetTop:e,behavior:t}}function Ie(e){const t=ae,o=N.value;if(void 0!==t&&null!==o){if(t.visualOffset=Math.abs(e)<=w?0:e,0===t.visualOffset)return o.style.removeProperty("transform"),void o.style.removeProperty("will-change");o.style.setProperty("transform",`translate3d(0, ${t.visualOffset}px, 0)`),o.style.setProperty("will-change","transform")}}function ke(){void 0!==ce&&(clearTimeout(ce),ce=void 0),void 0!==ae&&0!==ae.visualOffset&&(S=void 0,C=void 0);const e=N.value;e?.style.removeProperty("transform"),e?.style.removeProperty("will-change"),ae=void 0,q=void 0}function De(){const e=E.value,t=ae;if(null===e||void 0===t)return;const o=L.get(t.anchor.id);if(void 0===o)return;return(o.querySelector("[data-im-thread-anchor-point]")??o).getBoundingClientRect().top-e.getBoundingClientRect().top}function Ye(){const e=ae,t=De();if(void 0===e||void 0===t)return;const o=e.expectedOffset-t;if(Math.abs(o)<=w)return;const n=E.value;null!==n&&ye(n)&&(k=n.scrollTop),Ie(e.visualOffset+o),e.committed=!1,e.attempts=0}function je(){void 0!==ce&&clearTimeout(ce),ce=setTimeout(()=>{ce=void 0,Z||!0!==ae?.committed||ke()},500)}function ze(e,t=!1){const o=E.value,n=ae;if(K||null===o||void 0===n||Te(o)||Z&&!t)return;if(t){const e=we(o);n.expectedOffset-=e,Ye(),Me(o,e)}const i=e?.visualOffset??n.visualOffset;if(Math.abs(i)<=w)return n.committed=!0,void je();const l=Math.max(0,o.scrollHeight-o.clientHeight),r=o.scrollTop,s=Math.min(l,Math.max(0,r-i));Fe(s),o.scrollTop=s;const a=o.scrollTop,c=i+a-r,d=M(o),u=(r-i<0||r-i>l)&&Math.abs(a-s)<=d;if(k=a,Math.abs(c)>d&&!u)return Ie(c),Fe(a),n.committed=!1,n.attempts+=1,void(n.attempts<8&&!Z&&Ue());0!==n.visualOffset&&Ie(0),k=a,n.expectedOffset=void 0===e?De()??n.expectedOffset:e.currentOffset-(a-r),S={...n.anchor,offset:n.expectedOffset},be(o),n.committed=!0,n.attempts=0,je()}function Ue(){void 0===ae||ae.attempts>=8||(void 0!==ce&&clearTimeout(ce),ce=setTimeout(()=>{ce=void 0,ze()},120))}function Ve(e){if(void 0===e)return;void 0===ae&&(ae={anchor:e,expectedOffset:e.offset,visualOffset:0,committed:!1,attempts:0});const t=E.value;if(!Z&&null!==t&&!Te(t)&&0===ae.visualOffset){const e=De();if(void 0!==e)return void ze({visualOffset:ae.expectedOffset-e,currentOffset:e})}Ye(),Z||ze()}function qe(){return Number.isFinite(e.olderPrefetchThreshold)?Math.max(0,e.olderPrefetchThreshold):0}function Ke(e=!1){W+=1,"smooth"===q?.behavior&&(q=void 0),_=!1,Z&&!e||(Z=!0,oe+=1),te&&le.cancel()}function We(){const t=E.value;if(null!==t&&oe!==ne&&!Q&&!e.loadingOlder){if(void 0!==ae){if(ze(void 0,!0),!ae.committed)return;ke()}X=!0,Le()&&t.scrollTop<=qe()&&Be()}}function $e(){W+=1,S=void 0,C=void 0,le.cancel(),ke(),Z=!1,_=!1,te=!1,re=void 0,se=void 0,oe+=1,ne=-1,ie=-1,X=!0,Q=!1,J=!1,q=void 0}function Ge(){te||null!==E.value&&Te(E.value)||(le.cancel(),Z=!1,_=!1,void 0!==ae&&(ae.attempts=0),ze())}function Je(){te||le.schedule(Ge,120)}function Qe(){q=void 0,Ge()}function Xe(e){ee=!1;const t=!te;te=!0,Ke(t),re=e.touches?.[0]?.clientY}function Ze(e){const t=e.touches?.[0]?.clientY;void 0!==t&&(void 0!==re&&t!==re&&(W+=1),void 0!==re&&t>re?We():void 0!==re&&t<re&&Re(),re=t)}function _e(){te=!1,re=void 0,Je()}function et(e){ee=!0,Ke(),e.deltaY<0?We():e.deltaY>0&&Re(),Je()}function tt(e){"touch"!==e.pointerType&&(ee=!0,Ke(),se=e.clientY,Je())}function ot(e){"touch"!==e.pointerType&&Z&&void 0!==se&&(e.clientY!==se&&(W+=1),e.clientY<se?We():e.clientY>se&&Re(),se=e.clientY,Je())}function nt(e){"touch"!==e.pointerType&&(se=void 0,Je())}function it(e){["ArrowUp","ArrowDown","PageUp","PageDown","Home","End"," "].includes(e.key)&&(ee=!0,Ke(),"ArrowUp"===e.key||"PageUp"===e.key||"Home"===e.key||" "===e.key&&e.shiftKey?We():Re(),Je())}function lt(e="auto"){const t=E.value;if(null===t)return;W+=1,C=void 0,ke();const o=Math.max(0,t.scrollHeight-t.clientHeight);Fe(o,e),t.scrollTo?.({top:o,behavior:e}),t.scrollTop!==o&&(t.scrollTop=o),k=t.scrollTop,ve.clear(),U=!1,He()}function rt(){const e=E.value;return null!==e&&e.clientWidth>0&&e.clientHeight>0}function st(e,t){const o=E.value;if(null===o||void 0===e||!o.contains(e)||o.clientHeight<=0)return!1;W+=1,ke();const n=o.getBoundingClientRect(),i=e.getBoundingClientRect(),l=t.block??"center";let r;r="start"===l?o.scrollTop+i.top-n.top:"end"===l?o.scrollTop+i.bottom-n.bottom:"nearest"===l?i.top>=n.top&&i.bottom<=n.bottom?o.scrollTop:i.top<n.top?o.scrollTop+i.top-n.top:o.scrollTop+i.bottom-n.bottom:p({currentScrollTop:o.scrollTop,scrollHeight:o.scrollHeight,targetHeight:i.height,targetTop:i.top,viewportHeight:o.clientHeight,viewportTop:n.top});const s=Math.max(0,o.scrollHeight-o.clientHeight),a=Math.min(s,Math.max(0,r));C=void 0;const c=t.behavior??"auto";return Fe(a,c),o.scrollTo?.({top:a,behavior:c}),o.scrollTop!==a&&(o.scrollTop=a),k=o.scrollTop,U=!1,He(),!0}function at(e){const t=E.value;if(null===t||void 0===e||!t.contains(e)||t.clientHeight<=0)return null;const o=e.getBoundingClientRect(),n=t.scrollTop+o.top-t.getBoundingClientRect().top+o.height/2,i=t.clientHeight/2;return{older:n<i-1,newer:t.scrollHeight-n<i-1}}return o(T,{registerLayoutMeasurement:Y.register,registerMessageNode:function(e,t){const o=L.get(e);if(o!==t){if(void 0!==o&&(j?.unobserve(o),o.style.removeProperty("--im-thread-placeholder-play-state"),Y.hasTarget(o)||F?.unobserve?.(o),P.delete(o),A.delete(e)),null===t)return L.delete(e),void A.delete(e);L.set(e,t),P.set(t,e),"function"==typeof globalThis.IntersectionObserver&&t.style.setProperty("--im-thread-placeholder-play-state","paused"),j?.observe(t),F?.observe(t),Ee()}},registerDateNode:function(e,t,o){const n=R.get(e);null!==o?(R.set(e,{element:o,label:t}),$===e&&o.style.setProperty("opacity",String(G)),n?.element!==o&&(o.dataset.imThreadDateSeparator=e)):R.delete(e)},registerEntryUnreadNode:e=>{B=e??void 0}}),n(()=>e.contentKey,(e,t)=>{if(e===t)return;$e();const o=E.value;null!==o&&(k=o.scrollTop)},{flush:"sync"}),n(()=>e.messageIds,async(t,o)=>{if(t.length===o.length&&t.every((e,t)=>e===o[t]))return;const n=E.value;if(null===n)return;const l=new Set(o);o.length>0&&t.length>0&&!t.some(e=>l.has(e))&&$e();const r=e.contentKey,s=de.value,a=o[o.length-1],c=void 0===a?-1:t.indexOf(a),d=c<0?[]:t.slice(c+1).filter(e=>!l.has(e)),v=d.some(t=>e.pendingSendMessageIds.includes(t)),f=J||e.loadingNewer||Q||e.loadingOlder,p=t.length===o.length&&t.every(e=>l.has(e))&&t.some((e,t)=>e!==o[t]),h=o[0],g=void 0!==h&&t.indexOf(h)>0;let m;if(void 0!==S&&(g||d.length>0&&f)){Z&&0!==we(n)&&Se();const e=n.getBoundingClientRect(),o=t.includes(S.id)?pe([S.id]):[],i=o[0],r=void 0!==i&&i.bottom>e.top&&i.top<e.bottom?o:pe(t.filter(e=>l.has(e)));m=u(S,r,{top:e.top,bottom:e.bottom}),void 0===m||void 0===ae||t.includes(ae.anchor.id)||(ae.anchor=m,ae.expectedOffset=m.offset)}const b=W;if(await i(),!K&&e.contentKey===r&&W===b)if(v&&e.followNewMessages)lt();else if(p&&s&&e.followNewMessages&&e.resizeFollowEnabled&&!e.hasNewer&&!f)lt();else{if(g&&(Q=!1,Ve(m)),d.length>0){if(f)return J=!1,Ve(m),de.value=!1,void Ee();(s||d.some(t=>!0===e.shouldFollowAppendedMessage?.(t)))&&e.followNewMessages?lt():ve.add(d)}Ee()}},{flush:"pre"}),n(()=>e.loadingNewer,(t,o)=>{!t&&o&&J&&xe(()=>{e.loadingNewer||(J=!1)})},{flush:"pre"}),n(()=>e.loadingOlder,(e,t)=>{e?Q=!0:t&&Q&&(Q=!1)},{flush:"post"}),l(()=>{const t=E.value;if(null!==t){if(k=t.scrollTop,t.addEventListener("scroll",Ce,{passive:!0}),t.addEventListener("scrollend",Qe,{passive:!0}),t.addEventListener("touchstart",Xe,{passive:!0}),t.addEventListener("touchmove",Ze,{passive:!0}),t.addEventListener("touchend",_e,{passive:!0}),t.addEventListener("touchcancel",_e,{passive:!0}),t.addEventListener("wheel",et,{passive:!0}),t.addEventListener("pointerdown",tt,{passive:!0}),t.addEventListener("pointermove",ot,{passive:!0}),t.addEventListener("pointerup",nt,{passive:!0}),t.addEventListener("pointercancel",nt,{passive:!0}),t.addEventListener("keydown",it),"function"==typeof globalThis.ResizeObserver){F=new globalThis.ResizeObserver(e=>{if(K||null===E.value)return;Y.resized(e.map(e=>e.target));e.some(({target:e})=>e===t||e===N.value||P.has(e))&&He()}),F.observe(t),null!==N.value&&F.observe(N.value);for(const e of L.values())F.observe(e);Y.observeTargets()}if(I=t.ownerDocument.fonts,I?.addEventListener("loadingdone",Y.invalidateAll),"function"==typeof globalThis.IntersectionObserver){j=new globalThis.IntersectionObserver(e=>{for(const t of e){const e=P.get(t.target);if(void 0===e)continue;const o=t.target,n=t.isIntersecting?"running":"paused";o.style.getPropertyValue("--im-thread-placeholder-play-state")!==n&&o.style.setProperty("--im-thread-placeholder-play-state",n),t.isIntersecting?A.add(e):A.delete(e)}U=!0,Ee()},{root:t,rootMargin:`${Number.isFinite(e.visibleMargin)?Math.max(0,e.visibleMargin):0}px 0px`});for(const e of L.values())j.observe(e)}Ee()}}),r(()=>{K=!0;const e=E.value;null!==e&&e.removeEventListener("scroll",Ce),null!==e&&(e.removeEventListener("scrollend",Qe),e.removeEventListener("touchstart",Xe),e.removeEventListener("touchmove",Ze),e.removeEventListener("touchend",_e),e.removeEventListener("touchcancel",_e),e.removeEventListener("wheel",et),e.removeEventListener("pointerdown",tt),e.removeEventListener("pointermove",ot),e.removeEventListener("pointerup",nt),e.removeEventListener("pointercancel",nt),e.removeEventListener("keydown",it)),le.cancel(),ke(),void 0!==z&&("number"==typeof z&&"function"==typeof globalThis.cancelAnimationFrame?globalThis.cancelAnimationFrame(z):globalThis.clearTimeout(z),z=void 0,V.clear()),I?.removeEventListener("loadingdone",Y.invalidateAll),Y.dispose(),F?.disconnect(),j?.disconnect(),ge(),B=void 0;for(const e of L.values())e.style.removeProperty("--im-thread-placeholder-play-state");L.clear(),P.clear(),A.clear(),R.clear(),ve.clear()}),H({getViewportElement:()=>E.value,clearNewMessageBadge:function(){ve.clear()},clearActiveDate:ge,isAtBottom:s(()=>de.value),isMeasurable:rt,isScrollable:function(){const e=E.value;return rt()&&null!==e&&e.scrollHeight>e.clientHeight+1},getMessageCenteringNeeds:function(e){return at(L.get(e))},newMessageCount:s(()=>ue.value),prepareHistoryPageAppend:function(){J=!0,de.value=!1},cancelHistoryPageAppend:function(){J=!1,Ee()},trackRemoteMessageIds:(e,t)=>ve.trackRemote(e,t),scrollToLatest:lt,scrollToMessage:function(e,t={}){return st(L.get(e),t)},scrollToEntryUnread:()=>st(B,{block:"center",behavior:"auto"}),getEntryUnreadCenteringNeeds:function(){return at(B)},focusViewport:()=>E.value?.focus({preventScroll:!0})}),()=>a("div",{ref:E,"data-im-thread-viewport":"",role:"log",tabindex:-1},[a("div",{ref:N,"data-im-thread-viewport-content":""},x.default?.())])}});export{O as ImThreadViewport};
@@ -0,0 +1 @@
1
+ function e(e){const n=/* @__PURE__ */new Map;for(const r of e){if(n.has(r.kind))throw new Error(`消息 renderer kind 重复注册:${r.kind}`);n.set(r.kind,r.component)}const r=Object.freeze([...n.keys()]);return Object.freeze({kinds:r,resolve:e=>n.get(e)})}export{e as createMessageRendererRegistry};
@@ -0,0 +1 @@
1
+ function o(){let o,e,i=0,n=0;function t(){o=void 0;const c=i-performance.now();if(c>0)return n=i,void(o=setTimeout(t,c));const r=e;e=void 0,r?.()}return{schedule:function(c,r){i=performance.now()+r,e=c,void 0!==o&&i>=n||(void 0!==o&&clearTimeout(o),n=i,o=setTimeout(t,r))},cancel:function(){void 0!==o&&clearTimeout(o),o=void 0,e=void 0}}}export{o as createThreadIdleTask};
@@ -0,0 +1 @@
1
+ function e(e){const t=/* @__PURE__ */new Set,o=/* @__PURE__ */new Map,s=/* @__PURE__ */new Set;function n(){const e=[...s];s.clear();const t=[],o=[];for(const s of e)if(s.active)try{t.push({job:s,commit:s.read()})}catch(e){o.push(e)}for(const{job:e,commit:s}of t)if(e.active)try{s?.()}catch(e){o.push(e)}o.length>0&&queueMicrotask(()=>{throw new AggregateError(o,"Thread layout measurement failed")})}function r(t){t.active&&(s.add(t),e.requestFrame(n))}function a(t,s){const n=o.get(s);n?.delete(t),0===n?.size&&(o.delete(s),e.unobserve(s))}return{register:function(n){const c={read:n,elements:/* @__PURE__ */new Set,active:!0};return t.add(c),{observe(t){if(!c.active)return;const s=new Set(t),n=s.size!==c.elements.size||[...s].some(e=>!c.elements.has(e));for(const e of c.elements)s.has(e)||a(c,e);for(const t of s){if(c.elements.has(t))continue;let s=o.get(t);void 0===s&&(s=/* @__PURE__ */new Set,o.set(t,s),e.observe(t)),s.add(c)}c.elements=s,n&&s.size>0&&r(c)},invalidate:()=>r(c),dispose(){c.active=!1,s.delete(c),t.delete(c);for(const e of c.elements)a(c,e);c.elements.clear()}}},hasTarget:e=>o.has(e),observeTargets:()=>o.forEach((t,o)=>e.observe(o)),resized:e=>e.forEach(e=>o.get(e)?.forEach(r)),invalidateAll:()=>t.forEach(r),dispose(){for(const e of t)e.active=!1;t.clear(),s.clear(),o.clear()}}}export{e as createThreadLayoutMeasurements};
@@ -0,0 +1 @@
1
+ import{inject as o,provide as n}from"vue";const t=/* @__PURE__ */Symbol("ImThreadReadActions");function r(o){n(t,o)}function e(){return o(t,void 0)}export{r as provideImThreadReadActions,e as useOptionalImThreadReadActions};
@@ -0,0 +1 @@
1
+ import{provide as e,inject as t}from"vue";const r=/* @__PURE__ */Symbol("ImThreadSurfaceContext");function o(e){if("function"!=typeof e.getState)throw new TypeError("ImThreadSurfaceContext.getState 必须是函数");if("function"!=typeof e.actions?.loadOlder)throw new TypeError("ImThreadSurfaceContext.actions.loadOlder 必须是函数");if("function"!=typeof e.formatDate)throw new TypeError("ImThreadSurfaceContext.formatDate 必须是函数");return Object.freeze({...e,actions:Object.freeze({...e.actions})})}function n(t){e(r,t)}function a(){const e=t(r);if(void 0===e)throw new Error("ImThreadSurface 需要显式 context prop 或 provideImThreadSurfaceContext");return e}export{o as createImThreadSurfaceContext,n as provideImThreadSurfaceContext,a as useImThreadSurfaceContext};
@@ -0,0 +1 @@
1
+ import{inject as o}from"vue";const r=/* @__PURE__ */Symbol("ImThreadViewportRegistration");function t(){return o(r,void 0)}export{r as THREAD_VIEWPORT_REGISTRATION_KEY,t as useOptionalImThreadViewportRegistration};
@@ -0,0 +1 @@
1
+ import{shallowReactive as e}from"vue";import{createThreadVisibilityTargets as t}from"./thread-visibility-targets.js";function n(n){const i=/* @__PURE__ */new Map,o=/* @__PURE__ */new Map,l=e(/* @__PURE__ */new Map),r=/* @__PURE__ */new Map,s=/* @__PURE__ */new Map;let a=[],c=!1;const g=e=>{const t=i.get(e.channel);return void 0===t?e.channel:`${e.channel}\0${t.getKey(e.item)}`},d=t({getRoot:n.getRoot,batchRegistration:n.batchRegistration,getKey:e=>e.key,revealMarginPx:n.revealMarginPx,preloadMarginPx:n.preloadMarginPx,minimumIntersectionRatio:n.minimumIntersectionRatio,scrollIdleMs:n.scrollIdleMs,visibilityDwellMs:n.visibilityDwellMs,onScrollingChange:e=>{for(const t of i.values())t.onScrollingChange?.(e)},onRevealed:e=>e.targets.forEach(e=>i.get(e.channel)?.onRevealed?.(e.item)),onActivated:e=>e.targets.forEach(e=>i.get(e.channel)?.onActivated?.(e.item)),onSettledPreloadChange:e=>{const t=e.flatMap(e=>e.targets);for(const[e,n]of i){const i=t.filter(t=>t.channel===e).map(e=>e.item);n.onSettledPreloadChange?.(i.slice(0,Math.max(0,n.maxPreloadTargets??Number.POSITIVE_INFINITY)))}},onSettledVisibleChange:e=>{f(e.flatMap(e=>e.targets))}});function f(e){a=e;for(const[t,n]of i){const i=e.filter(e=>e.channel===t).map(e=>e.item),o=void 0===n.maxSettledVisible?i:i.slice(0,n.maxSettledVisible);n.onSettledVisibleChange?.(o)}}function h(e){const t=r.get(e),n=[];for(const e of i.keys()){const i=t?.get(e);void 0!==i&&n.push(i)}const c=l.get(e);if(void 0!==c&&n.length===c.targets.length&&n.every((e,t)=>e===c.targets[t]))return;if(0===n.length)void 0!==c&&(l.delete(e),s.get(c.key)===e&&(s.delete(c.key),d.register(c,null)));else{const t={key:JSON.stringify(n.map(g)),targets:n};void 0!==c&&c.key!==t.key&&s.get(c.key)===e&&s.delete(c.key),l.set(e,t),s.set(t.key,e),d.register(t,e)}const h=a.flatMap(e=>{const t=o.get(e.channel)?.get(i.get(e.channel).getKey(e.item));return void 0===t?[]:[t.target]});(h.length!==a.length||h.some((e,t)=>e!==a[t]))&&f(h)}return{createFactory:function(t){return n=>{if(c)throw new Error("Thread visibility target group 已释放");if(i.has(t))throw new Error(`Thread visibility channel 已存在: ${t}`);i.set(t,n);const s=e(/* @__PURE__ */new Map);o.set(t,s);const a=/* @__PURE__ */new Map;let g=!1;function f(e){a.delete(e);const n=r.get(e);n?.delete(t),0===n?.size&&r.delete(e)}function v(){const e=[...a.keys()];s.clear();for(const t of e)f(t);for(const t of e)h(t);n.onScrollingChange?.(!1),n.onSettledVisibleChange?.([]),n.onSettledPreloadChange?.([])}function m(e,t){const i=s.get(n.getKey(e)),o=void 0===i?void 0:l.get(i.element);return void 0!==o&&t(o)}return{register(e,i){if(g||c)return;const o=n.getKey(e),v=s.get(o);if(null===i)return void(void 0!==v&&(s.delete(o),f(v.element),h(v.element)));if(v?.target.item===e&&v.element===i){const e=l.get(i);return void(void 0!==e&&d.register(e,i))}const m=v?.target.item===e?v.target:(e=>({channel:t,item:e}))(e),u=a.get(i);void 0!==u&&u!==o&&s.delete(u),void 0!==v&&v.element!==i&&f(v.element),s.set(o,{target:m,element:i}),a.set(i,o);let y=r.get(i);void 0===y&&(y=/* @__PURE__ */new Map,r.set(i,y)),y.set(t,m),h(i),void 0!==v&&v.element!==i&&h(v.element)},isRevealed:e=>m(e,d.isRevealed),isActivated:e=>m(e,d.isActivated),isSettledVisible:e=>m(e,d.isSettledVisible),isScrolling:d.isScrolling,notifyScroll:d.notifyScroll,refresh:d.refresh,reset:v,dispose(){g||(v(),g=!0,i.delete(t),o.delete(t))}}}},refresh:d.refresh,dispose(){if(!c){for(const e of l.values())d.register(e,null);l.clear(),r.clear(),s.clear();for(const e of i.values())e.onSettledPreloadChange?.([]);o.clear(),i.clear(),d.dispose(),c=!0}}}}export{n as createThreadVisibilityTargetGroup};
@@ -0,0 +1 @@
1
+ import{reactive as e,nextTick as t}from"vue";function n(e,t){if(e.width<=0||e.height<=0)return 0;const n=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left)),o=Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top));return Math.min(1,n*o/(e.width*e.height))}function o(e,t){return{x:e.x,y:e.top-t,top:e.top-t,bottom:e.bottom+t,left:e.left,right:e.right,width:e.width,height:e.height+2*t,toJSON:()=>({})}}function i(i){const r=Math.max(0,i.scrollIdleMs??140),s=Math.max(0,i.visibilityDwellMs??120),c=Math.min(1,Math.max(0,i.minimumIntersectionRatio??.01)),l=Math.max(0,i.revealMarginPx??0),a=Math.max(0,i.preloadMarginPx??0),f=Math.max(l,a),u=Math.max(0,i.maxPreloadTargets??Number.POSITIVE_INFINITY),g=Math.max(1,i.maxSettledVisible??Number.POSITIVE_INFINITY),d=/* @__PURE__ */new Map,m=/* @__PURE__ */new Map,h=e(/* @__PURE__ */new Set),v=/* @__PURE__ */new Set,b=/* @__PURE__ */new Set;let p=[],y=null,M=null,I=null,R=!1,x=!1,k=!1,w=!1;const S=/* @__PURE__ */new Map;let E,N,T=0,P=!1;function C(){T+=1,P=!1,S.clear()}function O(e){const t=[...e].filter(([e,t])=>d.get(e)===t);if(0===t.length)return;const n=z();B(!0,n,t),Y(n,t)}function V(e){if(!i.batchRegistration)return void O(e);for(const[t,n]of e)S.set(t,n);if(P)return;P=!0;const n=T;t(()=>{if(k||n!==T)return;P=!1;const e=[...S];S.clear(),O(e),J()})}function K(){void 0!==E&&clearTimeout(E),E=void 0}function A(){void 0!==N&&clearTimeout(N),N=void 0}function z(){let e;const t=/* @__PURE__ */new Map;return{getRootRect:()=>(void 0===e&&(e=y?.getBoundingClientRect()??null),e),getElementRect(e){let n=t.get(e);return void 0===n&&(n=e.getBoundingClientRect(),t.set(e,n)),n}}}function B(e=!1,t=z(),i=d){if(!e&&null!==M||null===y)return;const r=t.getRootRect();if(null===r)return;const s=o(r,f);for(const[e,o]of i){const i=t.getElementRect(e);o.ratio=n(i,r),o.intersecting=o.ratio>0,o.revealIntersecting=f>0?n(i,s)>0:o.intersecting&&o.ratio>=c}}function F(e){return e.intersecting&&e.ratio>=c}function L(e){const t=m.get(e.key);return void 0!==t&&d.get(t)===e}function Y(e=z(),t=d){const r=[];for(const[i,s]of t)if(s.revealIntersecting&&!h.has(s.key)){if(f>l){if(0===l&&!F(s))continue;if(l>0){const t=e.getRootRect();if(null===t||n(e.getElementRect(i),o(t,l))<=0)continue}}r.push(s)}for(const e of r)L(e)&&!h.has(e.key)&&(h.add(e.key),i.onRevealed?.(e.item))}function _(e,t=!1){const n=new Set(e.map(e=>e.key));if(n.size!==b.size||[...n].some(e=>!b.has(e))||t){b.clear();for(const e of n)b.add(e);i.onSettledVisibleChange?.(e.map(e=>e.item))}}function D(e,t=!1){!t&&e.length===p.length&&e.every((e,t)=>e.key===p[t]?.key&&e.item===p[t]?.item)||(p=e,i.onSettledPreloadChange?.(e.map(e=>e.item)))}function J(){k||R||(A(),N=setTimeout(()=>{N=void 0,function(){if(k||R)return;const e=x;x=!1;const t=T,r=y,s=()=>!k&&!R&&t===T&&y===r,c=z();B(!1,c);const l=c.getRootRect(),f=null===l?0:(l.top+l.bottom)/2,m=[...d.entries()].filter(([,e])=>F(e)).map(([e,t])=>({target:t,rect:c.getElementRect(e)})).sort((e,t)=>Math.abs((e.rect.top+e.rect.bottom)/2-f)-Math.abs((t.rect.top+t.rect.bottom)/2-f)).slice(0,g).map(({target:e})=>e);let h;if(void 0!==i.onSettledPreloadChange&&null!==l){const e=o(l,a);h=[...d.entries()].filter(([,e])=>e.revealIntersecting).map(([e,t])=>({target:t,rect:c.getElementRect(e)})).filter(({target:t,rect:o})=>F(t)||a>0&&n(o,e)>0).sort((e,t)=>Number(F(t.target))-Number(F(e.target))||Math.abs((e.rect.top+e.rect.bottom)/2-f)-Math.abs((t.rect.top+t.rect.bottom)/2-f)).slice(0,u).map(({target:e})=>e)}if(Y(c),s()&&(_(m.filter(L),e),s())){void 0!==h&&D(h.filter(L),e);for(const e of m){if(!s())return;L(e)&&!v.has(e.key)&&(v.add(e.key),i.onActivated?.(e.item))}}}()},s))}function $(){k||(x=!0,j(!0),D([]),B(),Y(),_([]),A(),K(),E=setTimeout(()=>{E=void 0,j(!1),J()},r))}function j(e){R!==e&&(R=e,i.onScrollingChange?.(e))}function q(){y?.removeEventListener("scroll",$),M?.disconnect(),I?.disconnect(),M=null,I=null,y=null}function G(e=!0){if(k)return;const t=i.getRoot();if(t!==y||null===y)if(D([]),q(),y=t,null!==y){if(y.addEventListener("scroll",$,{passive:!0}),"undefined"!=typeof IntersectionObserver){M=new IntersectionObserver(e=>{for(const t of e){const e=d.get(t.target);void 0!==e&&(e.intersecting=t.isIntersecting,e.ratio=t.intersectionRatio,0===f&&(e.revealIntersecting=t.isIntersecting&&t.intersectionRatio>=c))}Y(),J()},{root:y,threshold:[0,c,1]}),f>0&&(I=new IntersectionObserver(e=>{for(const t of e){const e=d.get(t.target);void 0!==e&&(e.revealIntersecting=t.isIntersecting)}Y(),J()},{root:y,rootMargin:`${f}px 0px`,threshold:0}));for(const e of d.keys())M.observe(e);for(const e of d.keys())I?.observe(e)}V(d)}else e&&!w&&(w=!0,Promise.resolve().then(()=>{w=!1,k||(G(!1),J())}))}function H(e){D(p.filter(t=>t.key!==e)),h.delete(e),v.delete(e),b.delete(e)}return{register(e,t){if(k)return;const n=i.getKey(e),o=h.has(n),r=v.has(n),s=null===t?void 0:d.get(t);void 0!==s&&s.key!==n&&(m.delete(s.key),d.delete(t),H(s.key));const c=m.get(n);if(void 0!==c&&c!==t&&(M?.unobserve(c),I?.unobserve(c),d.delete(c),m.delete(n)),null===t)return void 0!==c&&(M?.unobserve(c),I?.unobserve(c),d.delete(c),m.delete(n)),void H(n);const l=d.get(t);if(l?.key===n&&l.item===e){const e=y;return G(),void(y!==e&&J())}const a={item:e,key:n,intersecting:l?.key===n&&l.intersecting,ratio:l?.key===n?l.ratio:0,revealIntersecting:l?.key===n&&l.revealIntersecting};d.set(t,a),m.set(n,t);const f=y;G(),y===f&&(M?.observe(t),I?.observe(t),V([[t,a]])),o&&i.onRevealed?.(e),r&&L(a)&&i.onActivated?.(e),J()},isRevealed:e=>h.has(i.getKey(e)),isActivated:e=>v.has(i.getKey(e)),isSettledVisible:e=>b.has(i.getKey(e)),isScrolling:()=>R,notifyScroll:$,refresh(){G(),C(),O(d),J()},reset(){C(),K(),A(),j(!1),x=!1,_([]),D([]),q(),d.clear(),m.clear(),h.clear(),v.clear()},dispose(){k||(C(),K(),A(),j(!1),x=!1,_([]),D([]),q(),d.clear(),m.clear(),h.clear(),v.clear(),k=!0)}}}export{i as createThreadVisibilityTargets};
@@ -0,0 +1 @@
1
+ import{onBeforeUnmount as e}from"vue";import{useOptionalImThreadViewportRegistration as r}from"./thread-viewport-context.js";function t(t){const o=r();if(void 0===o)throw new Error("useImThreadLayoutMeasurement requires an ImThreadViewport");const i=o.registerLayoutMeasurement(t);return e(i.dispose),i}export{t as useImThreadLayoutMeasurement};
@@ -0,0 +1 @@
1
+ function r(r){if(!0!==r?.aborted)return;if(void 0!==r.reason)throw r.reason;const o=new Error("The operation was aborted");throw o.name="AbortError",o}export{r as throwIfAborted};
@@ -0,0 +1 @@
1
+ const e=/^[a-z0-9][a-z0-9._-]*[a-z0-9]$/,r=/^[a-z0-9][a-z0-9._-]{0,63}$/,t=/* @__PURE__ */new Set(["durable","rebuildable","ephemeral"]);function n(r){if("string"!=typeof r||r!==r.trim()||r.length<3||r.length>64||!e.test(r))throw new Error("cache.prefix 非法:必须为 3-64 位小写字母、数字、点、下划线或连字符,且首尾为字母或数字");return r}function o(e,t){if(!r.test(e))throw new Error(`cache namespace ${t} 非法:必须为 1-64 位小写字母、数字、点、下划线或连字符`)}function c(e){const r=n(e);return{hostPrefix:r,forAccount(e){if("string"!=typeof e||""===e||e!==e.trim())throw new Error("cache namespace accountId 非法:必须为非空且无首尾空白的字符串");const n=encodeURIComponent(e);return{hostPrefix:r,accountScope:n,name(c,a,i){if(!t.has(c))throw new Error(`cache namespace category 非法:${String(c)}`);return o(a,"domain"),o(i,"resource"),"durable"===c&&"storage"===a&&"indexed-db"===i?`${r}:${e}`:`${r}:im-sdk:v1:${n}:${c}:${a}:${i}`}}}}}export{c as createImCacheNamespaceFactory,n as validateCachePrefix};
@@ -0,0 +1 @@
1
+ function t(t,a){const n=Math.min(a.maxDelayMs,a.baseDelayMs*2**t);return a.jitter?Math.round(n/2+Math.random()*(n/2)):n}export{t as computeBackoffDelay};
@@ -0,0 +1 @@
1
+ import{createLoginHandler as e}from"../login/login-handler.js";import{sendExpressionMessage as t}from"../message-flow/expression/expression-message.js";import{sendGameMessage as n}from"../message-flow/game/game-message.js";import{sendGiftMessage as o}from"../message-flow/gift/gift-message.js";import{sendLiveRoomMessage as r}from"../message-flow/live-room/live-room-message.js";import{sendMiniProgramMessage as i}from"../message-flow/mini-program/mini-program-message.js";import{sendTransferMessage as a}from"../message-flow/transfer/transfer-message.js";import{createPacketRouter as s}from"../packet-router.js";import{computeBackoffDelay as d}from"./backoff.js";import{createHeartbeatManager as c}from"./heartbeat-manager.js";import{createDefaultSendStrategyRegistry as l}from"../message-flow/send/send-strategy-registry.js";import{createOutboxManager as m}from"../outbox/outbox-manager.js";import{createReadReporter as u}from"../read/read-reporter.js";import{createRecallManager as f}from"../message-flow/recall/recall-manager.js";import{createChannelMessageDeletionManager as g}from"../message-flow/recall/channel-message-deletion-manager.js";import{createRecallReceiveHandlers as p}from"../message-flow/recall/recall-receive-handlers.js";import{createEditManager as v}from"../message-flow/edit/edit-manager.js";import{createEditReceiveHandlers as h}from"../message-flow/edit/edit-receive-handlers.js";import{createMediaSender as w}from"../message-flow/media/media-sender.js";import{createDirectReadSyncCoordinator as y}from"../message-flow/read/direct-read-sync.js";import{encodeFrame as S,decodeFrameStream as I}from"../../../im-protocol/src/frame-codec.js";import{CmdId as M,ErrCode as A}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{cmKickoutNotificationCodec as C}from"../../../im-protocol/src/protobuf/registry.js";import{forwardMessages as b}from"../message-flow/forward/forward-messages.js";function E(E,T={}){const{transport:k,authProvider:x,endpointProvider:P,emitter:R}=E,U=T.heartbeatIntervalMs??1e4,j=T.heartbeatMaxMissed??3,F=T.foregroundProbeTimeoutMs??5e3,O=T.loginTimeoutMs??T.readTimeoutMs??3e4,D={baseDelayMs:T.reconnect?.baseDelayMs??1e3,maxDelayMs:T.reconnect?.maxDelayMs??3e4,jitter:T.reconnect?.jitter??!0};let _,L="idle",V=!0,K=0,G=!1,$=new Uint8Array(0),B=!1,N=0,H="";function q(e){L!==e&&(E.logger?.("connection:state-transition",{from:L,to:e,selfId:H}),L=e,R.emit({type:"connection:changed",state:e}))}function Y(e){R.emit({type:"error",error:e})}function z(e,t){const n=N;e?.catch(e=>{n===N&&Y({scope:"unknown",message:t,cause:e})})}function W(e){var t;k.send((t=e,t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength))).catch(e=>{Y({scope:"transport",message:"发送失败",cause:e})})}const J=c({sendPing:()=>W(S({command:M.SYSTEM_HEARTBEAT})),onUnhealthy:()=>{E.logger?.("connection:heartbeat-unhealthy",{stateBefore:L,selfId:H}),Y({scope:"transport",message:"心跳连续未 ACK,链路判定不健康"}),pe()}},{intervalMs:U,maxMissed:j,probeTimeoutMs:F}),Q=e({authProvider:x,sendFrame:W,logger:E.logger},{timeoutMs:O}),X=E.sendStrategies??l(),Z=E.domainState?m({domainState:E.domainState,sendFrame:W,getSelfId:()=>H,isAuthenticated:()=>"authenticated"===L,sendStrategies:X,crypto:E.encryptSend?.crypto,resolvePublicKey:E.encryptSend?.resolvePublicKey,storage:E.storage,onStorageError:(e,t)=>Y({scope:"storage",message:e,cause:t}),onUpdated:e=>E.emitter.emit({type:"outbox:updated",conversation:e.conversation,item:e})},{ackTimeoutMs:T.readTimeoutMs??3e4}):void 0,ee=E.domainState?u({domainState:E.domainState,sendFrame:W,getSelfId:()=>H,isAuthenticated:()=>"authenticated"===L,emitter:R,logger:E.logger,canSendReadReceipt:E.canSendDirectReadReceipt},{readAckTimeoutMs:T.readTimeoutMs??3e4}):void 0,te=E.domainState?y({domainState:E.domainState,sendFrame:W,getSelfId:()=>H,isAuthenticated:()=>"authenticated"===L,emitter:R,logger:E.logger}):void 0,ne=E.domainState?f({domainState:E.domainState,sendFrame:W,getSelfId:()=>H,isAuthenticated:()=>"authenticated"===L,strategies:E.recallStrategies}):void 0,oe=void 0!==E.domainState&&void 0!==E.channelMessageDeletion?g({domainState:E.domainState,sendFrame:W,getSelfId:()=>H,isAuthenticated:()=>"authenticated"===L,resolveProfile:E.channelMessageDeletion.resolveProfile,onPermissionDenied:E.channelMessageDeletion.onPermissionDenied}):void 0,re=void 0!==E.domainState&&void 0!==ne?p({domainState:E.domainState,sendFrame:W,getSelfId:()=>H,onRecallAck:ne.onRecallAck,onChannelMessageDeletionAck:e=>oe?.onDeleteAck(e),logger:E.logger}):[],ie=E.domainState?v({getSelfId:()=>H,sendFrame:W,isAuthenticated:()=>"authenticated"===L,domainState:E.domainState,crypto:E.encryptSend?.crypto,resolvePublicKey:E.encryptSend?.resolvePublicKey,resolveGroupKey:E.encryptSend?.resolveGroupKey,strategies:E.editStrategies}):void 0,ae=void 0!==E.domainState&&void 0!==ie?h({onEditAck:ie.onEditAck}):[],se=void 0!==E.domainState&&void 0!==Z&&void 0!==E.media?w({getSelfId:()=>H,domainState:E.domainState,outbox:Z,mediaTransfer:E.media.transfer,mediaPreview:E.media.preview,mediaAssetCache:E.media.assetCache,onMediaAssetCacheError:E.media.onAssetCacheError,onMediaTransferError:E.media.onTransferError,onMediaAlbumContentSize:E.media.onAlbumContentSize,emitter:R,crypto:E.encryptSend?.crypto,maxConcurrentUploads:E.media.maxConcurrentUploads,recoveryPort:E.media.recoveryPort,retainFailedUploads:E.media.retainFailedUploads,shouldPersistUpload:E.media.shouldPersistUpload,waitUntilOnline:E.media.waitUntilOnline,isOnline:E.isOnline}):void 0;function de(e,t){return void 0===se?Promise.reject(new Error(`${e} 不可用:createImConnection 未注入 domainState 或 media 端口`)):""===H?Promise.reject(new Error(`${e} 需先成功登录一次以获取本端 id(尚未鉴权过)`)):t(se)}function ce(e,t,n,o){const r=E.domainState?.getConversationMessage({conversationId:n.conversationId,conversationType:n.conversationType},t);if(void 0===r||r.conversationId!==n.conversationId||r.conversationType!==n.conversationType||r.contentType!==o&&("file"!==o||"filesAlbum"!==r.contentType||1!==r.body.filesAlbum?.items.length)||"failed"!==r.status||void 0!==r.recalled||void 0!==r.deletedForEveryone||r.senderId!==H||"media.uploadInterrupted"!==r.failure?.displayCode&&"media.cancelled"!==r.failure?.displayCode&&("media.uploadTimeout"!==r.failure?.displayCode||!1!==r.failure.retryable))throw new Error(`${e} 只允许替换当前精确会话中源文件已释放的${"video"===o?"视频":"文件"}消息`);return r}const le=E.domainState&&Z?s({isActive:()=>V&&"authenticated"===L,domainState:E.domainState,outbox:Z,onReadAck:ee?.onReadAck,onSyncReadAck:te?.onAck,onSyncReadDeliver:te?.onDeliver,sendFrame:W,getSelfId:()=>H,emitter:R,logger:E.logger,decrypt:E.decrypt,commandHandlers:[...E.commandHandlers??[],...re,...ae]}):void 0;function me(){"open"!==k.state&&"connecting"!==k.state&&"closing"!==k.state||k.close().catch(()=>{})}function ue(){void 0!==_&&(clearTimeout(_),_=void 0)}async function fe(){try{return null!==(e=await x.getLoginContext())&&""!==e.userId.trim()&&""!==e.token.trim()?"available":"missing"}catch(e){return Y({scope:"login",message:"检查登录上下文失败",cause:e}),"unavailable"}var e}function ge(e,t){Y({scope:"transport",message:e,cause:t}),J.stop(),q("disconnected")}function pe(){if("reconnecting"===L||"suspended"===L)return;const e=++N;J.stop(),Q.cancel(),Z?.reset(),ee?.reset(),ne?.reset(),oe?.reset(),ie?.reset(),q("reconnecting"),me(),fe().then(t=>{"reconnecting"===L&&e===N&&("missing"!==t?function(){if(void 0!==_)return;const e=d(K,D);K+=1,_=setTimeout(()=>{_=void 0,Se()},e)}():we({code:0,reason:"token_expired"}))})}function ve(e="offline"){const t="idle"===L||"disconnected"===L||"disconnecting"===L;"offline"!==e||!t&&"suspended"!==L?(ue(),N+=1,"offline"===e&&z(se?.pauseAll(),"页面离开时暂停上传失败"),J.stop(),Q.cancel(),"session-ended"===e&&se?.cancelAll("session-ended"),Z?.reset({discardInFlight:"session-ended"===e}),ee?.reset(),ne?.reset(),oe?.reset(),ie?.reset(),t||q("suspended"),me()):z(se?.pauseAll(),"页面离开时暂停上传失败")}function he(){"suspended"===L&&V&&(!1!==E.isOnline?.()?(K=0,Se()):q("offline"))}function we(e){"idle"!==L&&"disconnected"!==L&&(E.logger?.("connection:auth-invalid-terminal",{reason:e.reason,code:`0x${e.code.toString(16)}`,stateBefore:L,selfId:H}),ue(),N+=1,J.stop(),Q.cancel(),q("disconnected"),me(),se?.cancelAll("session-ended"),Z?.reset({discardInFlight:!0}),ee?.reset(),ne?.reset(),oe?.reset(),ie?.reset(),R.emit({type:"auth:invalid",issue:e}),Promise.resolve().then(()=>x.onAuthInvalid?.(e)).catch(e=>Y({scope:"login",message:"onAuthInvalid 回调异常",cause:e})))}async function ye(){const e=await Q.login();"canceled"!==e.type&&"authenticating"===L&&function(e){switch(e.type){case"success":K=0,B=!1,e.selfId&&(H=e.selfId),q("authenticated"),J.start(),Z?.onAuthenticated(),z(se?.resumePaused(),"网络恢复后继续上传失败"),ee?.onAuthenticated(),te?.onAuthenticated(),E.readStrategies?.onAuthenticated(),E.onAuthenticated?.();break;case"auth-invalid":if("token_expired"===e.issue.reason&&0!==e.issue.code&&!B)return B=!0,Y({scope:"login",message:"token 失效,自动重试登录一次"}),void pe();we(e.issue);break;case"retry":Y(e.error),pe()}}(e)}async function Se(){if(!V)return ue(),void q("suspended");if(!1===E.isOnline?.())return ue(),J.stop(),z(se?.pauseAll("offline"),"离线探针暂停上传失败"),void q("offline");const e=++N;q("connecting"),G=!1,$=new Uint8Array(0);const t=await fe();if(e!==N)return;if("missing"===t)return void we({code:0,reason:"token_expired"});if("unavailable"===t)return void pe();let n;try{n=await P.getEndpoints()}catch(t){if(e!==N)return;return void ge("获取连接端点失败",t)}if(e!==N)return;const o=n[0];if(void 0!==o)if(function(e){try{const t=new URL(e);return"ws:"===t.protocol||"wss:"===t.protocol}catch{return!1}}(o.url)){try{await k.connect([o])}catch(t){if(e!==N)return;return Y({scope:"transport",message:"连接失败",cause:t}),void pe()}e!==N&&me()}else ge(`连接端点 URL 非法:${o.url}`);else ge("无可用连接端点(getEndpoints 返回空数组)")}function Ie(e,t,n){switch(e){case M.CM_LOGIN_ACK:Q.onLoginAck(t);break;case M.SYSTEM_HEARTBEAT_ACK:J.onAck();break;case M.CM_KICKOUT_NOTIFICATION:if(void 0!==E.logger)try{const e=C.decode(t);E.logger("connection:kickout-received",{kickedUserId:String(e.sUserId),selfId:H,matchesSelf:String(e.sUserId)===H,entryIp:e.ip,entryPort:e.port,stateBefore:L})}catch(e){E.logger("connection:kickout-decode-failed",{message:e?.message,stateBefore:L})}we({code:A.ERR_CM_AUTH_KICKEDOUT,reason:"kicked"});break;default:le?.route(e,t,{msgSeq:n})}}function Me(){return"authenticating"===L||"authenticated"===L}function Ae(e){if(!Me())return;const t=N;let n;$=function(e,t){if(0===e.length)return t;const n=new Uint8Array(e.length+t.length);return n.set(e,0),n.set(t,e.length),n}($,new Uint8Array(e));try{const e=I($);n=e.frames,$=e.remainder}catch(e){return Y({scope:"protocol",message:"帧解析失败,连接重置",cause:e}),void pe()}for(const e of n){if(!Me()||t!==N)return;Ie(e.header.command,e.body,e.header.msgSeq)}}return k.on("open",()=>{"connecting"===L&&(q("authenticating"),ye())}),k.on("message",({data:e})=>Ae(e)),k.on("error",({error:e})=>{Y({scope:"transport",message:"transport 错误",cause:e})}),k.on("close",({code:e,reason:t,wasClean:n})=>{if(J.stop(),E.logger?.("connection:transport-closed",{code:e,reason:t,wasClean:n,stateBefore:L,intentionalClose:G,nextPath:G||"disconnecting"===L?"disconnected":"idle"===L||"disconnected"===L||"reconnecting"===L||"suspended"===L||"offline"===L?"ignored":"reconnect"}),G||"disconnecting"===L)return G=!1,void q("disconnected");"idle"!==L&&"disconnected"!==L&&"reconnecting"!==L&&"suspended"!==L&&"offline"!==L&&pe()}),{get state(){return L},setConnectionAllowed(e){V!==e&&(V=e,e||ve("session-ended"))},async connect(){"connecting"!==L&&"authenticating"!==L&&"authenticated"!==L&&(ue(),K=0,await Se())},disconnect(){ue(),N+=1,J.stop(),Q.cancel(),Z?.reset(),ee?.reset(),ne?.reset(),oe?.reset(),ie?.reset(),G=!0,"idle"!==L&&"disconnected"!==L?(q("disconnecting"),"open"!==k.state&&"connecting"!==k.state&&"closing"!==k.state||k.close().catch(()=>{}),"closed"!==k.state&&"idle"!==k.state||q("disconnected")):q("disconnected")},notifyOnline(){if("offline"===L)return K=0,void Se();"reconnecting"===L&&(ue(),Se())},notifyOffline(){z(se?.pauseAll("offline"),"网络离线时暂停上传失败"),"idle"!==L&&"disconnected"!==L&&"disconnecting"!==L&&"suspended"!==L&&"offline"!==L&&(ue(),N+=1,J.stop(),Q.cancel(),Z?.reset(),ee?.reset(),ne?.reset(),oe?.reset(),ie?.reset(),q("offline"),me())},notifyVisible(){if("suspended"!==L){if("offline"===L&&!0===E.isOnline?.())return K=0,void Se();if("reconnecting"===L)return ue(),void Se();if("authenticated"===L){const e=N;fe().then(t=>{"authenticated"===L&&e===N&&("missing"!==t?J.probe():we({code:0,reason:"token_expired"}))})}}else he()},suspendForPageLifecycle:ve,resumeFromPageLifecycle:he,suppressDirectReadReceipts(e){ee?.suppress(e)},resumeDirectReadReceipts(e){ee?.resume(e)},reportDirectMediaConsumed(e,t){ee?.reportConsumedMedia(e,t),te?.reportConsumedMedia?.(e,t)},sendText(e){if(void 0===Z)throw new Error("sendText 不可用:createImConnection 未注入 domainState(仅连接模式)");if(""===H)throw new Error("sendText 需先成功登录一次以获取本端 id(尚未鉴权过)");return Z.enqueueText(e)},sendContact(e){if(void 0===Z)throw new Error("sendContact 不可用:createImConnection 未注入 domainState(仅连接模式)");if(""===H)throw new Error("sendContact 需先成功登录一次以获取本端 id(尚未鉴权过)");return Z.enqueueContact(e)},forwardMessages(e){if(void 0===Z)throw new Error("forwardMessages 不可用:createImConnection 未注入 domainState(仅连接模式)");const t=E.domainState;if(void 0===t)throw new Error("forwardMessages 不可用:createImConnection 未注入 domainState(仅连接模式)");if(""===H)throw new Error("forwardMessages 需先成功登录一次以获取本端 id(尚未鉴权过)");return b({outbox:Z,sendStrategies:X,resolveCurrentMessage:e=>t.getConversationMessage(e,e.id)},e)},recallMessage:e=>void 0===ne?Promise.reject(new Error("recallMessage 不可用:createImConnection 未注入 domainState(仅连接模式)")):ne.recall(e),deleteChannelMessageForEveryone:e=>void 0===oe?Promise.reject(new Error("deleteChannelMessageForEveryone 不可用:未装配 CHANNEL 管理员删除依赖")):oe.deleteForEveryone(e),editMessage:e=>void 0===ie?Promise.reject(new Error("editMessage 不可用:createImConnection 未注入 domainState(仅连接模式)")):ie.edit(e),sendImage:e=>de("sendImage",t=>t.sendImage(e)),sendVideo:e=>de("sendVideo",t=>t.sendVideo(e)),sendVoice:e=>de("sendVoice",t=>t.sendVoice(e)),sendFile:e=>de("sendFile",t=>t.sendFile(e)),sendGif:e=>de("sendGif",t=>t.sendGif(e)),sendMediaAlbum:e=>de("sendMediaAlbum",t=>t.sendMediaAlbum(e)),sendExpression(e){if(void 0===Z)throw new Error("sendExpression 不可用:createImConnection 未注入 domainState(仅连接模式)");if(""===H)throw new Error("sendExpression 需先成功登录一次以获取本端 id(尚未鉴权过)");return t({outbox:Z},e)},sendGame(e){if(void 0===Z)throw new Error("sendGame 不可用:createImConnection 未注入 domainState(仅连接模式)");if(""===H)throw new Error("sendGame 需先成功登录一次以获取本端 id(尚未鉴权过)");return n({outbox:Z,randomUint32:E.randomUint32},e)},sendMiniProgram(e){if(void 0===Z)throw new Error("sendMiniProgram 不可用:createImConnection 未注入 domainState(仅连接模式)");if(""===H)throw new Error("sendMiniProgram 需先成功登录一次以获取本端 id(尚未鉴权过)");return i({outbox:Z},e)},sendTransfer(e){if(void 0===Z)throw new Error("sendTransfer 不可用:createImConnection 未注入 domainState(仅连接模式)");if(""===H)throw new Error("sendTransfer 需先成功登录一次以获取本端 id(尚未鉴权过)");return a({outbox:Z},e)},sendGift(e){if(void 0===Z)throw new Error("sendGift 不可用:createImConnection 未注入 domainState(仅连接模式)");if(""===H)throw new Error("sendGift 需先成功登录一次以获取本端 id(尚未鉴权过)");return o({outbox:Z},e)},sendLiveRoom(e){if(void 0===Z)throw new Error("sendLiveRoom 不可用:createImConnection 未注入 domainState(仅连接模式)");if(""===H)throw new Error("sendLiveRoom 需先成功登录一次以获取本端 id(尚未鉴权过)");return r({outbox:Z},e)},replaceInterruptedVideo:(e,t)=>de("replaceInterruptedVideo",n=>{const o=ce("replaceInterruptedVideo",e,t,"video");return n.replaceVideo(e,o.createdAt,{...t,...void 0===t.caption&&void 0!==o.body.video?.describe?{caption:o.body.video.describe}:{},...void 0===t.refMessageId&&void 0!==o.refMessageId?{refMessageId:o.refMessageId}:{}})}),replaceInterruptedFile:(e,t)=>de("replaceInterruptedFile",n=>{const o=ce("replaceInterruptedFile",e,t,"file");return n.replaceFile(e,o.createdAt,{...t,..."filesAlbum"===o.contentType?{filesAlbum:!0,caption:o.body.filesAlbum?.caption}:{},...void 0===t.refMessageId&&void 0!==o.refMessageId?{refMessageId:o.refMessageId}:{}})}),cancelMedia(e){se?.cancel(e)},cancelMediaUpload:(e,t)=>se?.cancel(e,t)??!1,pauseMediaUpload:e=>se?.pause(e)??Promise.resolve(!1),resumeMediaUpload:e=>se?.resume(e)??!1,resumePausedMediaUploads:(e,t)=>se?.resumePaused(e,t)??Promise.resolve(),retryMediaUpload:(e,t)=>se?.retry(e,t)??!1,expireRetainedUploads(){se?.expireRetainedUploads()},invalidateMediaAssetCacheWrites(){se?.invalidateAssetCacheWrites()},async disposeMediaTasks(e){await(se?.dispose(e))},recoverMediaUpload:(e,t,n)=>void 0===se?Promise.reject(new Error("IM_MEDIA_RECOVERY_UNAVAILABLE")):de("recoverMediaUpload",o=>o.recoverUpload(e,t,n)),retryMessage(e){!0!==se?.retry(e)&&Z?.retry(e)},retryOutboxMessage:e=>Z?.retry(e)??{accepted:!1,reason:"not-found"},cancelOutboxMessage:e=>Z?.cancel(e)??{accepted:!1,reason:"not-found"},markOutboxConversationTerminated(e,t){Z?.markConversationTerminated(e,t)},clearOutboxConversationTerminated(e){Z?.clearConversationTerminated(e)},terminateConversationSending(e,t){se?.cancelConversation(e),Z?.markConversationTerminated(e,t)},settleConversationRead(e,t){if(void 0===E.domainState)throw new Error("会话已读不可用:未注入 domainState");if("direct"===e.conversationType)return E.domainState.advanceRead(e,t),void te?.report(e.conversationId);const n=E.readStrategies?.resolve(e.conversationType);if(void 0===n)throw new Error(`会话已读未支持类型:${e.conversationType}`);const o={conversationId:e.conversationId,readCursor:t};if("channel"===e.conversationType){if(void 0===n.settleConversationRead)throw new Error("CHANNEL 整会话已读尚未装配");return n.settleConversationRead(o)}return n.markRead(o)},reportVisibleMessages(e,t){if("group"!==e.conversationType&&"channel"!==e.conversationType){if("direct"!==e.conversationType)throw new Error(`可见消息回执未支持类型:${e.conversationType}`);if(void 0===ee)throw new Error("可见消息回执不可用:未注入 domainState");ee.reportVisible(e.conversationId,t)}},markRead(e,t,n){if(void 0===E.domainState)throw new Error("markRead 不可用:createImConnection 未注入 domainState(仅连接模式)");const o=n??E.domainState.getSession(e)?.type;if(void 0===o)throw new Error(`markRead 无法确定会话类型(conversationId=${e}),禁止默认 direct`);if("direct"===o){if(void 0===ee)throw new Error("markRead 不可用:createImConnection 未注入 domainState(仅连接模式)");return E.domainState.advanceRead(e,t),ee.report(e),void te?.report(e)}const r=E.readStrategies?.resolve(o);if(void 0===r)throw new Error(`markRead 暂不支持会话类型「${o}」:未注册对应已读策略,禁止 fallthrough direct`);return r.markRead({conversationId:e,readCursor:t})},sendFrame(e){W(e)},onChatAck(e){Z?.onChatAck(e)},getPendingOutbox:()=>Z?.getPending()??[],async hydrateOutbox(e){await(Z?.hydrate(e))},markOutboxForLogout(e){Z?.markForLogout({policy:e})}}}export{E as createImConnection};
@@ -0,0 +1 @@
1
+ function e(e,n={}){const t=n.intervalMs??1e4,o=n.maxMissed??3,i=n.probeTimeoutMs;let r,v,d=!1,s=0;function u(){void 0!==v&&(clearTimeout(v),v=void 0)}function a(){void 0!==r&&(clearInterval(r),r=void 0),u(),d=!1,s=0}function l(){if(s>=o)return a(),void e.onUnhealthy();e.sendPing(),s+=1}return{start(){void 0===r&&(s=0,r=setInterval(l,t))},stop:a,onAck(){u(),d=!1,s=0},probe(){void 0!==r&&(d||(d=!0,e.sendPing(),s=1,clearInterval(r),r=setInterval(l,t),void 0!==i&&(v=setTimeout(()=>{v=void 0,a(),e.onUnhealthy()},i))))},get running(){return void 0!==r},get missedCount(){return s}}}export{e as createHeartbeatManager};
@@ -0,0 +1 @@
1
+ const n=/* @__PURE__ */new Set(["direct","group","channel","supergroup","robot","customerService"]);function o(n){return{conversationType:n.conversationType,conversationId:n.conversationId}}function e(n){return{conversationType:n.type,conversationId:n.id}}function r(n){return{conversationType:n.conversationType,conversationId:n.conversationId}}function t(o){if(!n.has(o.conversationType)||0===o.conversationId.length)throw new Error(`非法会话身份(type=${o.conversationType}, id=${o.conversationId})`);return`v1:${o.conversationType}:${encodeURIComponent(o.conversationId)}`}function c(n){const o=/^v1:(direct|group|channel|supergroup|robot|customerService):(.+)$/.exec(n);if(null===o)throw new Error(`非法会话主键:${n}`);const[,e,r]=o;if(void 0===e||void 0===r)throw new Error(`非法会话主键:${n}`);try{const n=decodeURIComponent(r);if(0===n.length||encodeURIComponent(n)!==r)throw new Error("会话 id 不是 canonical 编码");return{conversationType:e,conversationId:n}}catch(o){throw new Error(`非法会话主键:${n}`,{cause:o})}}export{o as conversationRefFromMessage,r as conversationRefFromPinnedMessage,e as conversationRefFromSession,c as decodeConversationKey,t as encodeConversationKey};
@@ -0,0 +1 @@
1
+ const e={error:0,warn:1,info:2,debug:3,trace:4},t=/https?:\/\/[^\s<>"'`,。;!)\])}]+/gi,n=/\b(authorization|cookie|set-cookie)(\s*[:=]\s*)[^\r\n]*/gi,r=/(["'])(authorization|cookie|set[_-]?cookie|password|passwd|api[_-]?key|access[_-]?key|(?:access|refresh|device)?[_-]?token|secret(?:[_-]?key)?|private[_-]?key|session[_-]?key|tea[_-]?key|signature|credential)\1(\s*:\s*)(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|[^\s,;}]+)/gi,s=/\b(password|passwd|api[_-]?key|access[_-]?key|(?:access|refresh|device)?[_-]?token|secret(?:[_-]?key)?|private[_-]?key|session[_-]?key|tea[_-]?key|signature|credential)(\s*[:=]\s*)(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|[^\s,;]+)/gi,i=/-----BEGIN ([A-Z ]*PRIVATE KEY)-----[\s\S]*?-----END \1-----/gi;function o(e){return e.replace(t,e=>function(e){try{const t=new URL(e);return("http:"===t.protocol||"https:"===t.protocol)&&[...t.searchParams.keys()].some(e=>{const t=e.toLowerCase();return"signature"===t||"sig"===t||"token"===t||/^x-(?:amz|goog)-(?:signature|credential|security-token)$/.test(t)})}catch{return!1}}(e)?"[SIGNED_URL_REDACTED]":e)}function a(e){return o(e).replace(i,"[REDACTED_PRIVATE_KEY]").replace(n,"$1$2[REDACTED]").replace(r,"$1$2$1$3[REDACTED]").replace(s,"$1$2[REDACTED]")}function c(e){const t=/* @__PURE__ */new WeakSet;return function e(n,r,s){if(void 0!==s&&function(e){const t=function(e){return e.toLowerCase().replace(/[^a-z0-9]/g,"")}(e);return"authorization"===t||"cookie"===t||"setcookie"===t||"password"===t||"passwd"===t||t.includes("apikey")||t.includes("accesskey")||"token"===t||t.endsWith("token")||t.includes("secret")||t.includes("privatekey")||t.includes("secretkey")||t.includes("sessionkey")||t.includes("teakey")||t.includes("signature")||t.includes("credential")}(s))return"[REDACTED]";if(null==n||"number"==typeof n||"boolean"==typeof n)return n;if("bigint"==typeof n)return n.toString();if("string"==typeof n)return a(n);if("function"==typeof n)return`[Function ${n.name||"anonymous"}]`;if("symbol"==typeof n)return n.toString();if(r>=8)return"[MAX_DEPTH]";const i=function(e){if(e instanceof ArrayBuffer)return{type:"ArrayBuffer",byteLength:e.byteLength};if(ArrayBuffer.isView(e))return{type:e.constructor.name,byteLength:e.byteLength};if("undefined"!=typeof Blob&&e instanceof Blob){const t={type:e.constructor.name,byteLength:e.size,mimeType:e.type};return"undefined"!=typeof File&&e instanceof File&&(t.name=e.name,t.lastModified=e.lastModified),t}}(n);if(void 0!==i)return i;if(n instanceof Date)return n.toISOString();if(n instanceof Error){const t=n;return{name:t.name,message:a(t.message),...void 0===t.code?{}:{code:t.code},...void 0===t.category?{}:{category:t.category},...void 0===t.retryable?{}:{retryable:t.retryable},...void 0===t.stack?{}:{stack:a(t.stack)},...void 0===t.data?{}:{data:e(t.data,r+1,"data")}}}if("object"!=typeof n)return String(n);if(t.has(n))return"[CIRCULAR]";if(t.add(n),Array.isArray(n)){const t=n.slice(0,50).map(t=>e(t,r+1));return n.length>50&&t.push({omittedItems:n.length-50}),t}const o=Object.entries(n),c={};for(const[t,n]of o.slice(0,100))c[t]=e(n,r+1,t);return o.length>100&&(c.omittedKeys=o.length-100),c}(e,0)}function u(t){const n=new Set(t.categories),r=t.now??Date.now;let s=0,i=t.sink,o=!1;function a(r,s){return t.enabled&&void 0!==i&&e[r]<=e[t.level]&&n.has(s)}return{isEnabled:a,record(e,n,u,d,l){if(!a(e,u))return;let y,f;try{y={...t.getRuntimeContext?.(),...l?.()}}catch(e){y={error:{message:"diagnostic-payload-factory-failed",data:e}}}try{f=r()}catch{f=Date.now()}const g=++s;let p;try{p=c({timestamp:f,sequence:g,level:e,layer:n,category:u,event:d,...y})}catch{p={timestamp:f,sequence:g,level:e,layer:n,category:u,event:d,error:{message:"diagnostic-sanitization-failed"}}}try{i?.write(Object.freeze(p))}catch(e){i=void 0,function(e){if(o||void 0===t.fallbackSink)return;o=!0;let n={message:"diagnostic-sink-failed"};try{n={message:"diagnostic-sink-failed",data:c(e)}}catch{}try{t.fallbackSink.write(Object.freeze({timestamp:r(),sequence:++s,level:"error",layer:"sdk",category:"session",event:"diagnostic-sink-failed",error:n}))}catch{}}(e)}}}}function d(e){return(t,n)=>{const r=t.includes("crypto")?"crypto":t.includes("sync")?"sync":t.includes("read")?"message":t.includes("outbox")?"outbox":t.includes("chat")||t.includes("message")||t.includes("deliver")?"message":"protocol";e.record("trace","core",r,t,()=>({data:n}))}}export{d as createImDiagnosticLogger,u as createImDiagnosticWriter,c as sanitizeImDiagnosticValue};
@@ -0,0 +1 @@
1
+ function e(){const e=/* @__PURE__ */new Set;return{emit:function r(t){for(const o of[...e])try{o(t)}catch(e){"error"!==t.type&&r({type:"error",error:{scope:"unknown",message:"事件订阅者回调异常",cause:e}})}},subscribe:r=>(e.add(r),()=>{e.delete(r)}),clear(){e.clear()}}}export{e as createImEventEmitter};
@@ -0,0 +1 @@
1
+ import{cmLoginCodec as e,cmLoginAckCodec as r}from"../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as n}from"../../../im-protocol/src/frame-codec.js";import{CmdId as t,ErrCode as o}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";function i(e){return e===o.NON_ERR||0===e}function s(e,r){if(i(e))return{type:"success"};switch(e){case o.ERR_LOGIN_AUTH:return{type:"auth-invalid",issue:{code:e,reason:"token_expired"}};case o.ERR_CM_AUTH_KICKEDOUT:return{type:"auth-invalid",issue:{code:e,reason:"kicked",...void 0===r||r<=0?{}:{lastLoginTime:r}}};case o.ERR_LOGIN_FORBIDDEN:case o.ERR_CM_USER_FREEZE:return{type:"auth-invalid",issue:{code:e,reason:"banned"}};default:return{type:"retry",error:{scope:"login",code:e,message:`未知登录错误码:${e}`}}}}function c(i,c={}){const a=c.timeoutMs??3e4;let u,d=0;function l(e,r){if(void 0===u||u.generation!==e)return;clearTimeout(u.timer);const{resolve:n}=u;u=void 0,n(r)}function p(){if(void 0===u)return;clearTimeout(u.timer);const{resolve:e}=u;u=void 0,e({type:"canceled"})}return{async login(){const r=++d;let o,s;p();try{o=await i.authProvider.getLoginContext()}catch(e){return{type:"retry",error:{scope:"login",message:"获取登录上下文失败",cause:e}}}if(r!==d)return{type:"canceled"};if(null===o)return{type:"auth-invalid",issue:{code:0,reason:"token_expired"}};try{s=function(r){const o=e.create({sUserId:BigInt(r.userId),sLoginToken:r.token,sDeviceToken:r.deviceToken,clientType:r.clientType,channelType:r.channelType,sPushToken:r.pushToken??"",sVersionCode:r.versionCode??""});return n({command:t.CM_LOGIN,body:e.encode(o)})}(o)}catch(e){return{type:"retry",error:{scope:"login",message:"组装 CM_LOGIN 失败",cause:e}}}return new Promise(e=>{const n=setTimeout(()=>{l(r,{type:"retry",error:{scope:"login",message:`登录超时(${a}ms 未收到 CMLoginAck)`}})},a);var t;u={generation:r,resolve:e,timer:n,selfId:o.userId},i.logger?.("connection:login-frame-sent",{userId:o.userId,deviceToken:(t=o.deviceToken,""===t?"(empty)":`...${t.slice(-6)}(len=${t.length})`),clientType:o.clientType,channelType:o.channelType,tokenLength:o.token.length,generation:r}),i.sendFrame(s)})},onLoginAck(e){if(void 0===u)return;const{generation:n,selfId:t}=u;let c;try{const n=r.decode(e),a=Number(n.nErr);i.logger?.("connection:login-ack-received",{ackUserId:String(n.sUserId),requestUserId:t,errCode:`0x${a.toString(16)}`,isKickedOut:a===o.ERR_CM_AUTH_KICKEDOUT,lastLoginTime:String(n.nLastLoginTime)}),c=s(a,Number(n.nLastLoginTime)),"success"===c.type&&(c={type:"success",selfId:t})}catch(e){c={type:"retry",error:{scope:"protocol",message:"CMLoginAck 解析失败",cause:e}}}l(n,c)},cancel(){d+=1,p()},get awaitingAck(){return void 0!==u}}}export{s as classifyLoginAck,c as createLoginHandler,i as isLoginSuccess};
@@ -0,0 +1 @@
1
+ function t(t,n){const r=n.trim();return""===r?t.toString():r}function n(t){const n=t.trim();return""!==n&&"0"!==n}export{n as isUsableWireSenderId,t as resolveBotAwareSenderId};
@@ -0,0 +1 @@
1
+ const r=10,e=/* @__PURE__ */new Set(["audio","video"]),t=/* @__PURE__ */new Set(["missed","rejected","cancelled","completed","busy","no-permission","interrupted","unknown"]);function n(r){if("number"==typeof r&&Number.isFinite(r))return r;if("string"==typeof r&&""!==r.trim()){const e=Number(r);if(Number.isFinite(e))return e}}function o(r){return"boolean"==typeof r?r:1===r||"1"===r||0!==r&&"0"!==r&&void 0}function c(r,e){return void 0===e?r:{...r,outgoing:e}}function i(r,e){const t=n(r);if(void 0===t)return 0;if(!Number.isFinite(t)||t<0)throw new Error(`call record: 时长非法(${String(r)})`);const o="s"===e?Math.round(1e3*t):Math.round(t);if(!Number.isSafeInteger(o)||o<0)throw new Error(`call record: 时长非法(${String(r)})`);return o}function u(r){if(0===r)return"video";if(1===r)return"audio";throw new Error(`call record: Android 本地 callType 非法(${String(r)})`)}function l(r,e){if(0===r)return"audio";if(1===r)return"video";throw new Error(`call record: ${e} 非法(${String(r)})`)}function a(r){switch(r){case 0:return"missed";case 1:return"rejected";case 2:return"completed";case 3:return"cancelled";default:return"unknown"}}function s(r){switch(r){case 0:return"missed";case 1:return"completed";case 2:return"rejected";default:return"unknown"}}function d(r,e){switch(r){case 0:case 5:return"missed";case 1:return e>0?"completed":"cancelled";case 2:return e>0?"completed":"missed";case 3:case 4:return"rejected";case 6:return"busy";case 7:return"no-permission";case 8:return"interrupted";default:return"unknown"}}function f(r){if(null===r||"object"!=typeof r)return!1;const n=r;return!!e.has(n.callKind)&&(!!t.has(n.outcome)&&(!("number"!=typeof n.durationMs||!Number.isSafeInteger(n.durationMs)||n.durationMs<0)&&(void 0===n.outgoing||"boolean"==typeof n.outgoing)))}function w(r){const e=function(r){const e=r.trim();if(""===e)throw new Error("call record: content 为空");let t;try{t=JSON.parse(e)}catch{throw new Error("call record: content 不是 JSON")}if(null===t||"object"!=typeof t||Array.isArray(t))throw new Error("call record: content 不是对象");return t}(r.content);if("callDuration"in e)return function(r){const e=n(r.callType);if(void 0===e)throw new Error("call record: Android 同步缺少 callType");const t=n(r.callStatus);if(void 0===t)throw new Error("call record: Android 同步缺少 callStatus");return c({callKind:l(e,"Android 同步 callType"),outcome:s(t),durationMs:i(r.callDuration,"ms")},o(r.isCaller))}(e);if(void 0!==n(e.callType)&&void 0!==n(e.callStatus))return function(r){const e=n(r.callType);if(void 0===e)throw new Error("call record: Android 本地缺少 callType");const t=n(r.callStatus);if(void 0===t)throw new Error("call record: Android 本地缺少 callStatus");return c({callKind:u(e),outcome:a(t),durationMs:i(r.duration,"ms")},o(r.isCaller))}(e);if(void 0!==n(e.type)&&void 0!==n(e.status))return function(r){const e=n(r.type);if(void 0===e)throw new Error("call record: iOS 缺少 type");const t=n(r.status);if(void 0===t)throw new Error("call record: iOS 缺少 status");const u=i(r.content,"s");return c({callKind:l(e,"iOS type"),outcome:d(t,u),durationMs:u},o(r.isCaller))}(e);throw new Error("call record: 无法识别 JSON 形态")}function p(r){throw new Error("call record 不可作为出站聊天消息")}export{r as CALL_RECORD_CONTENT_TYPE,p as callRecordBMessageFields,f as isValidCallRecordBody,w as parseCallRecordBody};
@@ -0,0 +1 @@
1
+ import{resolveBotAwareSenderId as e,isUsableWireSenderId as t}from"./bot-sender.js";import{buildContentBMessageFields as n,parseContentBody as r}from"./content-body.js";import{toWireMsgId as s,toWireRefMsgId as o,fromWireMsgId as d}from"./message-id.js";import{computeSortKey as i}from"./sort.js";function a(e,t){const r=BigInt(e.conversationId),d=BigInt(t.selfId);if(r<=0n)throw new Error("channel outgoing: channel id 缺失或非法");if(d<=0n)throw new Error("channel outgoing: sender id 缺失或非法");if(!Number.isFinite(t.createdAt)||t.createdAt<0)throw new Error("channel outgoing: createdAt 非法");const i={sRadioId:r,sFromId:d,sMsgId:s(e.id),msgTime:BigInt(Math.floor(t.createdAt)),msgType:9,encrypt:2,bMessage:n(e.body)};return void 0!==e.mention&&Object.assign(i,function(e){const t={nNotifyCount:e.atAll?-1:e.atUserIds.length};e.atUserIds.length>0&&(t.sNotifyUsers=e.atUserIds.map(BigInt));const n=void 0!==e.ranges&&e.ranges.length>0,r=void 0!==e.atUsersName&&Object.keys(e.atUsersName).length>0;(n||r)&&(t.extend=JSON.stringify({sendType:0,...r?{atUsersName:e.atUsersName}:{},...n?{atRange:e.ranges.map(e=>({user_id:e.userId,start:e.start,end:e.end}))}:{}}));return t}(e.mention)),void 0!==e.refMessageId&&""!==e.refMessageId&&(i.parentMsgId=o(e.refMessageId)),i}function c(e,t,n){return y(u(e),t,n)}function g(e,t,n){return y({...u(e),historyCursor:""},t,n,void 0,!0)}function u(t){return{senderId:e(t.sFromId,t.botId),channelId:t.sRadioId,messageId:t.sMsgId,msgTime:t.msgTime,encrypt:t.encrypt,historyCursor:t.sId,sequence:t.nIncrId,notifyCount:t.nNotifyCount,notifyUsers:t.sNotifyUsers.map(String),extend:t.extend,parentMessageId:t.parentMsgId,edited:""!==t.isEdit&&"0"!==t.isEdit,oldMessageId:t.oldMsgId}}function I(e,t,n){return y(f(e),t,n)}function m(e,t,n){return y(f(e),void 0,n,t)}function f(t){return{senderId:e(t.sFromId,t.botId),channelId:t.sChnnId,messageId:t.sMsgId,msgTime:t.msgTime,encrypt:t.encrypt,historyCursor:t.sIndex,sequence:t.sIncrId,notifyCount:t.nNotifyCount,notifyUsers:p(t.sNotifyUsers),extend:t.extend,parentMessageId:t.parentMsgId,edited:0!==t.isEdit,oldMessageId:t.oldMsgId}}function y(e,n,s,o,a=!1){!function(e,n=!1){if(e.channelId<=0n)throw new Error("channel message: channel id 缺失或非法");if(!t(e.senderId))throw new Error("channel message: sender id 缺失或非法");if(""===e.messageId.trim())throw new Error("channel message: message id 缺失");if(""===e.historyCursor.trim()&&!n)throw new Error("channel message: history cursor 缺失")}(e,a||!0===s.edited&&""!==e.oldMessageId.trim());const c=d(e.messageId),g=e.senderId,u=e.channelId.toString(),I=Number(e.msgTime),m=I>0?I:s.receivedAt??Date.now(),f=void 0===n?{contentType:"unknown",body:{unknown:{reason:"malformed-content"}}}:r(n,s.selfId),y=function(e,t){const n=-1===e.notifyCount||4294967295===e.notifyCount,r=(d=e.notifyUsers.filter(l),i=function(e){return[...e.matchAll(/\[(\d{17,20})\]/g)].flatMap(e=>void 0===e[1]?[]:[e[1]])}(t),[.../* @__PURE__ */new Set([...d,...i])]),{ranges:s,atUsersName:o}=function(e){if(""===e)return{};try{const t=JSON.parse(e),n=function(e){if(!Array.isArray(e))return;const t=[];for(const n of e){if("object"!=typeof n||null===n)continue;const e=n;("string"==typeof e.user_id||"number"==typeof e.user_id)&&"number"==typeof e.start&&Number.isInteger(e.start)&&e.start>=0&&"number"==typeof e.end&&Number.isInteger(e.end)&&e.end>=e.start&&t.push({userId:String(e.user_id),start:e.start,end:e.end})}return 0===t.length?void 0:t}(t.atRange),r=function(e){if("object"!=typeof e||null===e)return;const t={};for(const[n,r]of Object.entries(e))l(n)&&"string"==typeof r&&""!==r&&(t[n]=r);return 0===Object.keys(t).length?void 0:t}(t.atUsersName);return{...void 0===n?{}:{ranges:n},...void 0===r?{}:{atUsersName:r}}}catch{return{}}}(e.extend);var d,i;return n||0!==r.length||void 0!==s||void 0!==o?{atAll:n,atUserIds:r,...void 0===s?{}:{ranges:s},...void 0===o?{}:{atUsersName:o}}:void 0}(e,f.body.text??""),p=e.sequence.toString(),h={channelMessageType:9,channelSequence:p,...a?{}:{historyCursor:e.historyCursor}};""!==e.oldMessageId&&(h.previousMessageId=d(e.oldMessageId));const v={id:c,conversationId:u,conversationType:"channel",senderId:g,contentType:f.contentType,body:f.body,createdAt:m,sortKey:i(m,`${p.padStart(20,"0")}:${c}`),status:"sent",receipt:"unread",encryption:{encrypted:0!==e.encrypt},extensions:h};return!0===s.decryptFailed&&(v.encryption.decryptFailed=!0),I>0&&(v.serverTime=I),""!==e.parentMessageId&&(v.refMessageId=d(e.parentMessageId)),(e.edited||!0===s.edited)&&(v.edited=!0),void 0!==y&&(v.mention=y),s.keepRaw&&(v.raw=function(e,t,n,r){return{cmdId:n,chat:{sMsgId:e.messageId,sFromId:e.senderId,sToId:e.channelId.toString(),msgType:9,encrypt:e.encrypt,msgTime:e.msgTime.toString(),extend:e.extend||void 0,parentMsgId:e.parentMessageId||void 0},...void 0===t?{}:{content:{contentType:t.contentType,text:t.content||void 0}},...void 0===r?{}:{contentDecodeFailure:{codec:"BMessage",byteLength:r}}}}(e,n,s.cmdId,o)),v}function p(e){const t=e.trim();if(""===t)return[];try{const e=JSON.parse(t);if(Array.isArray(e))return e.map(String).filter(l)}catch{}return t.split(/[\s,;]+/).filter(l)}function l(e){return/^[1-9]\d*$/.test(e)}export{a as buildChannelOutgoingChat,g as mapChannelPinnedChat,c as mapIncomingChannelChat,I as mapIncomingChannelHistoryChat,m as mapMalformedChannelHistoryChat};
@@ -0,0 +1 @@
1
+ import{mapChannelBoardPinnedMessage as e}from"./channel-pinned-message-mapper.js";import{fromWireMsgId as n}from"./message-id.js";import{resolvePinnedMessageActionErrorCode as t}from"./pinned-message-mapper.js";import{computeSortKey as o}from"./sort.js";import{normalizeSystemEventTimelineVisibility as r}from"./system-event-timeline-policy.js";const i={1:"channel_name_changed",2:"channel_avatar_changed",3:"channel_announcement_changed",4:"channel_member_left",5:"channel_member_removed",6:"channel_member_joined",7:"channel_member_invited",8:"channel_owner_transferred",9:"channel_admin_added",10:"channel_admin_removed",11:"channel_dismissed",12:"channel_all_muted",13:"channel_all_unmuted",14:"channel_created",15:"channel_private_chat_disabled",16:"channel_private_chat_enabled",19:"channel_member_renamed",20:"channel_member_muted",21:"channel_member_unmuted",23:"channel_message_pinned",24:"channel_message_unpinned"},s=/* @__PURE__ */new Set([17,18,22,23,24]);function a(e){const n=e.body.system;if("channel"!==e.conversationType||"system"!==e.contentType||void 0===n)return e;const t="channel_unknown"===n.eventType&&void 0!==n.rawNotifyType?y(n.rawNotifyType):n.eventType,o=t!==n.eventType,i=void 0!==n.rawNotifyType&&s.has(n.rawNotifyType)&&void 0!==n.fallbackText,a=n.operatorId,d="channel_member_left"===t&&(void 0===n.targetUserIds||0===n.targetUserIds.length)&&void 0!==a&&""!==a;if(!o&&!i&&!d)return r(e);const c={...n,eventType:t};return i&&delete c.fallbackText,d&&void 0!==a&&(c.targetUserIds=[a]),r({...e,body:{...e.body,system:c}})}function d(e){return"channel"===e.conversationType&&101===e.extensions?.unsupportedContentType&&("text"===e.contentType||"system"===e.contentType&&"channel_unknown"===e.body.system?.eventType&&void 0===e.body.system.rawNotifyType)}function c(e){if(!d(e))return e;if("system"===e.contentType)return e;const n=e.body.text??e.raw?.content?.text;return a({...e,senderId:"system",contentType:"system",body:{system:{eventType:"channel_unknown",...void 0===n||""===n?{}:{fallbackText:n}}},receipt:"read"})}function y(e){return i[e]??"channel_unknown"}function p(r,i={}){if(r.channelId<=0n)throw new Error("channel notify: channel id 缺失或非法");if(""===r.messageId.trim())throw new Error("channel notify: message id 缺失");if(void 0!==r.historyCursor&&""===r.historyCursor.trim())throw new Error("channel notify: history cursor 缺失");if(!Number.isInteger(r.notifyType)||r.notifyType<=0)throw new Error("channel notify: notify type 缺失或非法");const d=n(r.messageId),c=Number(r.occurredAt),p=c>0?c:i.receivedAt??Date.now(),m=void 0!==r.sequence&&r.sequence>0n?r.sequence.toString():void 0,l={eventType:y(r.notifyType),rawNotifyType:r.notifyType};void 0!==r.operatorId&&r.operatorId>0n&&(l.operatorId=r.operatorId.toString());const h=r.targetUserIds?.filter(e=>e>0n).map(e=>e.toString())??[];if(h.length>0&&(l.targetUserIds=h),void 0===r.content||""===r.content||s.has(r.notifyType)||(l.fallbackText=r.content),23===r.notifyType)try{l.pinnedMessageAction={type:"pin",pinnedMessage:e(r.content??"",{conversationId:r.channelId.toString(),...void 0===l.operatorId?{}:{operatorId:l.operatorId}})}}catch(e){l.pinnedMessageAction={type:"invalid",code:t(e)}}else 24===r.notifyType&&(l.pinnedMessageAction={type:"unpin"});return a({id:d,conversationId:r.channelId.toString(),conversationType:"channel",senderId:"system",contentType:"system",body:{system:l},createdAt:p,...c>0?{serverTime:c}:{},sortKey:o(p,void 0===m?d:`${m.padStart(20,"0")}:${d}`),status:"sent",receipt:"read",encryption:{encrypted:r.encrypted??!1},extensions:{...void 0===r.historyCursor?{}:{historyCursor:r.historyCursor},...void 0===m?{}:{channelSequence:m}},...i.keepRaw?{raw:{...void 0===i.cmdId?{}:{cmdId:i.cmdId},channelNotify:{notifyType:r.notifyType,...void 0===r.historyCursor?{}:{historyCursor:r.historyCursor},...void 0===r.sequence?{}:{sequence:r.sequence.toString()},...void 0===r.extend||""===r.extend?{}:{extend:r.extend}}}}:{}})}export{c as backfillLegacyChannelNotify,d as isLegacyChannelNotifyPlaceholder,y as mapChannelNotifyTypeToEvent,p as mapIncomingChannelNotify,a as normalizeChannelNotifyTimelineVisibility};
@@ -0,0 +1 @@
1
+ import{throwIfAborted as e}from"../abort.js";import{mapMalformedChannelHistoryChat as n,mapIncomingChannelHistoryChat as t}from"./channel-message-mapper.js";import{mapIncomingChannelNotify as r}from"./channel-notify-mapper.js";import{dedupeById as s}from"./merge.js";import{toWireMessageIds as o,fromWireMissingMessageIds as c}from"./messages-by-id.js";import{isChannelOfflineReaction as a,mapIncomingChannelOfflineReaction as i}from"./reaction-mapper.js";import{buildChannelHistoryRemovalPlaceholder as d,buildChannelOperationNotifyRemoval as l}from"./recall-mapper.js";import{compareBySortKey as h}from"./sort.js";import{pullChannelMessagesReqCodec as u,pullChannelMessagesRespCodec as y,pullChannelMessagesByIdReqCodec as p,pullChannelMessagesByIdRespCodec as g,bMessageCodec as I,bContentCodec as f,pullChannelSessionsReqCodec as m,pullChannelSessionsRespCodec as C}from"../../../im-protocol/src/protobuf/registry.js";const S=I.create({contentType:1,content:""});function v(e){if(e.sChnnId<=0n)throw new Error("channel session: channel id 缺失或非法");const n=0===e.uStatus||1===e.uStatus,t=1===e.uExistAt||2===e.uExistAt,r=0===e.uStatus&&t?"active":"unknown_restricted",s=1!==e.uExistAt&&(2===e.uExistAt||void 0),o={channelId:e.sChnnId.toString(),readCursor:e.sReadIndex,unreadCount:e.uUnread,channelState:r,hasUnreadMention:s};return"active"!==r&&(o.sendDisabledReason=n&&t?"channel_membership_unknown":"channel_state_requires_calibration"),n&&t||(o.raw={status:e.uStatus,mentionStatus:e.uExistAt}),o}function w(e){return m.encode(m.create({sUserId:$(e.userId,"user"),clientType:e.clientType,lsChnnInfo:e.channels.map(e=>({sChnnId:$(e.channelId,"channel"),sReadIndex:e.readCursor}))}))}function k(e){return u.encode(u.create({sUserId:$(e.userId,"user"),clientType:e.clientType,lsPull:e.pulls.map(e=>{if(!Number.isInteger(e.count)||e.count<=0)throw new Error("channel offline request: count 缺失或非法");return{sChnnId:$(e.channelId,"channel"),sBaseIndex:e.baseIndex,uDirection:e.direction,uCount:e.count,uIsContain:e.contain}})}))}function x(e){return k({userId:e.userId,clientType:e.clientType,pulls:[{channelId:e.channelId,baseIndex:e.baseIndex,direction:1,count:e.count??20,contain:e.contain??0}]})}function E(e,n,t){const r=C.decode(e);U(r.errcode,"sessions");const s=j(n.expectedChannelIds);return{sessions:r.lsSession.map(e=>{K(e.sChnnId.toString(),s,"sessions");const r=v(e);if(void 0!==e.last){if(e.last.sChnnId!==e.sChnnId)throw new Error(`channel sessions: last 频道归属不一致(session=${e.sChnnId}, last=${e.last.sChnnId})`);const s=A(e.last,{...n,diagnostic:{endpoint:"sessions",surface:"session-last",...n.diagnostic}},t);null!==s&&(r.last=s)}return r})}}function D(e,n,t){const r=y.decode(e);U(r.errcode,"offlineMessages");const o=j(n.expectedChannelIds),c={},a={},i=[];for(const e of r.lsMessage){const r=e.sChnnId.toString();K(r,o,"offlineMessages"),c[r]=e.sIndex,a[r]=(a[r]??0)+1;const s=A(e,n,t);null!==s&&i.push(s)}return{messages:s(i,n.selfId).sort(h),batchSize:r.lsMessage.length,messageCounts:a,nextBaseIndexes:c}}async function B(n,t,r,o){e(o.signal);const c=y.decode(n);U(c.errcode,"offlineMessages");const a=j(t.expectedChannelIds),i={},d={},l=[];let u=0;for(const n of c.lsMessage){e(o.signal),u>0&&u%5==0&&(await o.yieldToEventLoop(),e(o.signal));const s=n.sChnnId.toString();K(s,a,"offlineMessages"),i[s]=n.sIndex,d[s]=(d[s]??0)+1;const c=A(n,t,r);null!==c&&l.push(c),u+=1}e(o.signal);const p=c.lsMessage[0]?.sIndex;return{messages:s(l,t.selfId).sort(h),batchSize:c.lsMessage.length,messageCounts:d,nextBaseIndexes:i,firstBaseIndex:p}}function b(e,n,t,r="specificMsgs"){const o=j(n.expectedChannelIds),c=[];for(const s of e){K(s.sChnnId.toString(),o,r);const e=A(s,n,t);null!==e&&c.push(e)}return s(c,n.selfId).sort(h)}function M(e){return p.encode(p.create({sUserId:BigInt(e.userId),sChnnId:$(e.channelId,"channel"),lsMsgId:o(e.messageIds),clientType:e.clientType??0}))}function L(e,n,t,r){const s=g.decode(e);return{messages:b(s.lsMessage,n,t,"msg/by_id"),missingMessageIds:c(s.lsMissingMsgId,r),code:s.errcode}}function T(e,n,t){if(!Number.isInteger(n.requestedCount)||n.requestedCount<=0)throw new Error("channel history: requestedCount 必须为正整数");const r=y.decode(e),s=D(e,{selfId:n.selfId,receivedAt:n.receivedAt,keepRaw:n.keepRaw,expectedChannelIds:[n.channelId],...void 0===n.diagnostic?{}:{diagnostic:n.diagnostic},onContentDecodeError:n.onContentDecodeError,onReaction:n.onReaction},t),o=r.lsMessage[0]?.sIndex;if(void 0!==o&&o===n.requestedBaseIndex)throw new Error(`channel history cursor 循环(channelId=${n.channelId}, baseIndex=${o})`);return{messages:s.messages,...void 0===o?{}:{nextBaseIndex:o},batchSize:s.batchSize,exhausted:s.batchSize<n.requestedCount}}function A(e,s,o){if(a(e)){try{s.onReaction?.(i(e))}catch(n){s.onContentDecodeError?.({...s.diagnostic,messageId:e.sMsgId,channelId:e.sChnnId.toString(),encrypt:e.encrypt,contentLength:e.sContent.length,cause:n})}return null}if(1===e.uOperationType||2===e.uOperationType)return d(e);let c=S,h=!1;if(0===e.encrypt)try{c=I.decode(e.sContent)}catch(t){return s.onContentDecodeError?.({...s.diagnostic,messageId:e.sMsgId,channelId:e.sChnnId.toString(),encrypt:e.encrypt,contentLength:e.sContent.length,cause:t}),n(e,e.sContent.length,{selfId:s.selfId,receivedAt:s.receivedAt,keepRaw:!0})}else if(1===e.encrypt&&void 0!==o){const n=o.resolveUserPrivateKey?.()??null;if(null===n)h=!0,o.onDecryptError?.(R(e,s,{reason:"no-key",decryptStage:"key-resolve",keyByteLength:0,keySource:void 0===o.resolveUserPrivateKey?"service-absent":"miss"}));else{let t;try{if(t=f.decode(e.sContent),0===t.secretKey.length||0===t.cipherData.length)throw new Error("BContent.secretKey/cipherData 缺失")}catch(n){h=!0,o.onDecryptError?.(R(e,s,{reason:"decrypt-failed",decryptStage:"bcontent",keyByteLength:0,keySource:"user-private-key",cause:n})),t=f.create()}if(!h){let r;try{r=o.crypto.decryptEndToEnd({secretKey:t.secretKey,cipherData:t.cipherData,privateKey:n})}catch(n){h=!0,o.onDecryptError?.(R(e,s,{reason:"decrypt-failed",decryptStage:"tea",keyByteLength:0,keySource:"user-private-key",cipherDataByteLength:t.cipherData.length,cause:n})),r=new Uint8Array}if(!h)try{c=I.decode(r)}catch(n){h=!0,o.onDecryptError?.(R(e,s,{reason:"decrypt-failed",decryptStage:"bmessage",keyByteLength:0,keySource:"user-private-key",cipherDataByteLength:t.cipherData.length,decryptedByteLength:r.length,cause:n}))}}}}else if(2===e.encrypt&&void 0!==o){const n=e.sChnnId.toString(),t=o.resolveChannelKey(n);if(null===t||16!==t.length)h=!0,o.onDecryptError?.(R(e,s,{reason:"no-key",decryptStage:"key-resolve",keyByteLength:t?.length??0,keySource:null===t?"miss":"cache"}));else{let n;try{const t=f.decode(e.sContent);if(0===t.cipherData.length)throw new Error("BContent.cipherData 缺失");n=t.cipherData}catch(r){h=!0,o.onDecryptError?.(R(e,s,{reason:"decrypt-failed",decryptStage:"bcontent",keyByteLength:t.length,keySource:"cache",cause:r})),n=new Uint8Array}if(!h){let r;try{r=o.crypto.decryptSymmetric({teaKey:t,cipherData:n})}catch(c){h=!0,o.onDecryptError?.(R(e,s,{reason:"decrypt-failed",decryptStage:"tea",keyByteLength:t.length,keySource:"cache",cipherDataByteLength:n.length,cause:c})),r=new Uint8Array}if(!h)try{c=I.decode(r)}catch(c){h=!0,o.onDecryptError?.(R(e,s,{reason:"decrypt-failed",decryptStage:"bmessage",keyByteLength:t.length,keySource:"cache",cipherDataByteLength:n.length,decryptedByteLength:r.length,cause:c}))}}}}else h=!0,o?.onDecryptError?.(R(e,s,{reason:"no-key",decryptStage:"key-resolve",keyByteLength:0,keySource:"service-absent"}));if(!h){const n=l({channelId:e.sChnnId,senderId:e.sFromId,msgTime:e.msgTime,encrypt:e.encrypt},c);if(null!==n)return n}if(!h&&101===c.contentType)return r({channelId:e.sChnnId,messageId:e.sMsgId,occurredAt:e.msgTime,notifyType:c.type,operatorId:c.oprUserId,targetUserIds:c.mnpledUserId,content:c.content,extend:e.extend,historyCursor:e.sIndex,sequence:e.sIncrId,encrypted:0!==e.encrypt},{keepRaw:s.keepRaw});const u=t(e,c,{selfId:s.selfId,receivedAt:s.receivedAt,keepRaw:!0===s.keepRaw||h,decryptFailed:h});return!h||1!==e.encrypt&&2!==e.encrypt||o?.onDecryptRecovery?.({conversation:{conversationType:"channel",conversationId:u.conversationId},messageId:u.id,wireEncrypt:e.encrypt,sContent:e.sContent.slice(),source:"history"===s.diagnostic?.endpoint?"history":"offline",createdAt:Date.now()}),u}function R(e,n,t){return{...n.diagnostic??{endpoint:"unknown",surface:"unknown"},messageId:e.sMsgId,channelId:e.sChnnId.toString(),encrypt:e.encrypt,payloadByteLength:e.sContent.length,...t}}function U(e,n){if(0!==e)throw new Error(`channel ${n}: errcode=${e}`)}function j(e){return void 0===e?void 0:new Set(e)}function K(e,n,t){if(void 0!==n&&!n.has(e))throw new Error(`channel ${t}: 响应频道不属于请求批次(channelId=${e})`)}function $(e,n){const t=BigInt(e);if(t<=0n)throw new Error(`channel ${n} id 缺失或非法`);return t}export{b as decodeChannelChatList,T as decodeChannelHistoryResponse,L as decodeChannelMessagesByIdResponse,D as decodeChannelMessagesResponse,B as decodeChannelMessagesResponseAsync,E as decodeChannelSessionsResponse,x as encodeChannelHistoryRequest,M as encodeChannelMessagesByIdRequest,k as encodeChannelMessagesRequest,w as encodeChannelSessionsRequest,v as mapChannelSessionInfo};
@@ -0,0 +1 @@
1
+ import{mapChannelPinnedChat as e}from"./channel-message-mapper.js";import{buildContentBMessageFields as n}from"./content-body.js";import{toWireRefMsgId as s,toWireMsgId as r}from"./message-id.js";import{PinnedMessageMappingError as t}from"./pinned-message-mapper.js";import{bMessageCodec as o,radioChatCodec as d}from"../../../im-protocol/src/protobuf/registry.js";import{encodeBoardPinnedMessage as i,decodeBoardPinnedMessage as a}from"../../../im-protocol/src/board-pinned-message.js";function I(n,s){const r=a(n),{envelope:o}=r;if(3!==o.convType)throw new t("INVALID_SNAPSHOT","channel board pinned message convType 必须为 3");if(o.receiverId!==s.conversationId)throw new t("CONVERSATION_MISMATCH","channel board pinned message receiverId 与通知会话不一致");const i=Number(o.msgTime);if(!Number.isSafeInteger(i)||i<=0)throw new t("INVALID_SNAPSHOT","channel board pinned message msgTime 超出领域时间范围");let I;try{const n=o.nIncrId??"0";I=e(d.create({sRadioId:BigInt(o.receiverId),sFromId:BigInt(o.senderId),sMsgId:o.msgId,msgTime:BigInt(o.msgTime),encrypt:0,nIncrId:BigInt(n),parentMsgId:o.parentMsgId??"",isEdit:1===o.isEdit?"1":""}),r.message,{selfId:"",edited:1===o.isEdit})}catch(e){throw new t("INVALID_SNAPSHOT","channel board pinned message 无法映射为 CHANNEL 消息",{cause:e})}const c="unknown"!==I.contentType?{state:"ready",message:I}:{state:"partial",senderId:I.senderId,createdAt:I.createdAt,reason:"unsupported-content"};return{conversationId:s.conversationId,conversationType:"channel",messageId:I.id,preview:c,...void 0===s.operatorId?{}:{operatorId:s.operatorId}}}function c(e){if("channel"!==e.conversationType||""===e.conversationId||""===e.senderId)throw new t("INVALID_SNAPSHOT","仅支持归属明确的 CHANNEL 消息置顶");const d=e.serverTime??e.createdAt;if(!Number.isSafeInteger(d)||d<=0)throw new t("INVALID_SNAPSHOT","CHANNEL 置顶消息时间非法");const a=o.create(n(e.body)),c=e.extensions?.channelSequence,m="string"==typeof c&&/^\d+$/.test(c)?c:"0",p=i({envelope:{convType:3,msgContent:"",msgId:r(e.id),msgTime:String(d),msgType:a.contentType,receiverId:e.conversationId,senderId:e.senderId,isBrowse:1,isCancel:0,isEdit:!0===e.edited?1:0,isNotifyAll:!0===e.mention?.atAll?1:0,nIncrId:m,notifyUsersName:"",parentMsgId:void 0===e.refMessageId?"":s(e.refMessageId),readStatus:"read"===e.receipt?1:0,sendStatus:1},message:a});return{messageContent:p,pinnedMessage:I(p,{conversationId:e.conversationId})}}export{c as buildChannelBoardPinnedMessage,I as mapChannelBoardPinnedMessage};
@@ -0,0 +1 @@
1
+ function e(e){const t=e.extensions?.channelSequence;return{sortKey:e.sortKey,..."string"==typeof t&&/^\d+$/.test(t)?{sequence:BigInt(t)}:{}}}function t(e,t){return e.sortKey<t.sortKey?-1:e.sortKey>t.sortKey?1:0}export{t as compareChannelReadPosition,e as getChannelReadOrder};
@@ -0,0 +1 @@
1
+ const n=8;function e(n){switch(n){case 0:return{kind:"individual"};case 1:return{kind:"group"};case 2:return{kind:"channel"};case 3:return{kind:"robot"};default:return{kind:"unknown",rawKind:n}}}function r(n,e){switch(n){case"individual":return 0;case"group":return 1;case"channel":return 2;case"robot":return 3;case"unknown":if(void 0===e||!Number.isInteger(e)||e<0||e>4294967295||e<=3)throw new Error("contact body: unknown 名片必须提供合法 rawKind/visitCardKey");return e}}function a(n){return{targetId:n.id,...""===n.icon?{}:{avatar:n.icon},displayName:n.name,...""===n.username?{}:{username:n.username},gender:n.gender,...e(n.visitCardKey)}}function t(n){return{contentType:8,content:"",id:n.targetId,...void 0===n.avatar||""===n.avatar?{}:{icon:n.avatar},name:n.displayName,...void 0===n.username||""===n.username?{}:{username:n.username},gender:n.gender,visitCardKey:r(n.kind,n.rawKind)}}export{n as CONTACT_CONTENT_TYPE,t as contactBMessageFields,a as parseContactBody};
@@ -0,0 +1 @@
1
+ import{CALL_RECORD_CONTENT_TYPE as e,callRecordBMessageFields as o,parseCallRecordBody as t}from"./call-record-body.js";import{CONTACT_CONTENT_TYPE as n,contactBMessageFields as i,parseContactBody as r}from"./contact-body.js";import{CUSTOMER_SERVICE_CONTENT_TYPE as d,parseCustomerServiceBody as m}from"./customer-service-body.js";import{FILE_CONTENT_TYPE as a,fileBMessageFields as p,parseFileBody as c}from"./file-body.js";import{FILES_ALBUM_CONTENT_TYPE as y,filesAlbumBMessageFields as s,parseFilesAlbumBody as l}from"./files-album-body.js";import{GAME_CONTENT_TYPE as T,gameBMessageFields as b,parseGameBody as v}from"./game-body.js";import{GIFT_CONTENT_TYPE as u,giftBMessageFields as f,parseGiftBody as g}from"./gift-body.js";import{IMAGE_CONTENT_TYPE as w,imageBMessageFields as C,parseImageBody as k}from"./image-body.js";import{LIVE_ROOM_CONTENT_TYPE as j,liveRoomBMessageFields as A,parseLiveRoomBody as P}from"./live-room-body.js";import{MEDIA_ALBUM_CONTENT_TYPE as h,mediaAlbumBMessageFields as x,parseMediaAlbumBody as R}from"./media-album-body.js";import{MINI_PROGRAM_CONTENT_TYPE as S,miniProgramBMessageFields as E,parseMiniProgramBody as $}from"./mini-program-body.js";import{RED_PACKET_CONTENT_TYPE as q,redPacketBMessageFields as z,parseRedPacketBody as B,RED_PACKET_CLAIM_CONTENT_TYPE as D,applyRedPacketClaimVisibility as F,parseRedPacketClaimSystem as G}from"./red-packet-body.js";import{ROBOT_CONTENT_TYPE as H,isValidRobotBody as I,robotBMessageFields as J,parseRobotBody as K}from"./robot-body.js";import{STICKER_CONTENT_TYPE as L,stickerBMessageFields as M,parseStickerBody as N}from"./sticker-body.js";import{TRANSFER_CONTENT_TYPE as O,transferBMessageFields as Q,parseTransferBody as U}from"./transfer-body.js";import{VIDEO_CONTENT_TYPE as V,videoBMessageFields as W,parseVideoBody as X}from"./video-body.js";import{VOICE_CONTENT_TYPE as Y,voiceBMessageFields as Z,parseVoiceBody as _}from"./voice-body.js";const ee=1,oe=[{wireContentType:d,domainContentType:"customerService",parse:e=>({customerService:m(e)}),build:e=>{if(void 0!==e.customerService)throw new Error("客服正文仅支持接收")}},{wireContentType:y,domainContentType:"filesAlbum",parse:e=>({filesAlbum:l(e)}),build:e=>void 0===e.filesAlbum?void 0:s(e.filesAlbum)},{wireContentType:w,domainContentType:"image",parse:e=>({image:k(e)}),build:e=>void 0!==e.image?C(e.image):void 0},{wireContentType:V,domainContentType:"video",parse:e=>({video:X(e)}),build:e=>void 0!==e.video?W(e.video):void 0},{wireContentType:Y,domainContentType:"voice",parse:e=>({voice:_(e)}),build:e=>void 0!==e.voice?Z(e.voice):void 0},{wireContentType:a,domainContentType:"file",parse:e=>({file:c(e)}),build:e=>void 0!==e.file?p(e.file):void 0},{wireContentType:L,domainContentType:"sticker",parse:e=>({sticker:N(e)}),build:e=>void 0!==e.sticker?M(e.sticker):void 0},{wireContentType:n,domainContentType:"contact",parse:e=>({contact:r(e)}),build:e=>void 0!==e.contact?i(e.contact):void 0},{wireContentType:S,domainContentType:"miniProgram",parse:e=>({miniProgram:$(e)}),build:e=>void 0!==e.miniProgram?E(e.miniProgram):void 0},{wireContentType:T,domainContentType:"game",parse:e=>({game:v(e)}),build:e=>void 0!==e.game?b(e.game):void 0},{wireContentType:O,domainContentType:"transfer",parse:e=>({transfer:U(e)}),build:e=>void 0!==e.transfer?Q(e.transfer):void 0},{wireContentType:u,domainContentType:"gift",parse:e=>({gift:g(e)}),build:e=>void 0!==e.gift?f(e.gift):void 0},{wireContentType:e,domainContentType:"call",parse:e=>({call:t(e)}),build:e=>void 0!==e.call?o(e.call):void 0},{wireContentType:q,domainContentType:"redPacket",parse:e=>({redPacket:B(e)}),build:e=>void 0!==e.redPacket?z(e.redPacket):void 0},{wireContentType:h,domainContentType:"mediaAlbum",parse:e=>({mediaAlbum:R(e)}),build:e=>void 0!==e.mediaAlbum?x(e.mediaAlbum):void 0},{wireContentType:H,domainContentType:"robot",parse:e=>({robot:K(e)}),build:e=>void 0!==e.robot&&I(e.robot)?J(e.robot):void 0},{wireContentType:j,domainContentType:"liveRoom",parse:e=>({liveRoom:P(e)}),build:e=>void 0!==e.liveRoom?A(e.liveRoom):void 0}],te=[{contentType:"customerService",read:e=>e.customerService},{contentType:"text",read:e=>e.text},{contentType:"system",read:e=>e.system},{contentType:"image",read:e=>e.image},{contentType:"video",read:e=>e.video},{contentType:"voice",read:e=>e.voice},{contentType:"file",read:e=>e.file},{contentType:"filesAlbum",read:e=>e.filesAlbum},{contentType:"sticker",read:e=>e.sticker},{contentType:"contact",read:e=>e.contact},{contentType:"miniProgram",read:e=>e.miniProgram},{contentType:"game",read:e=>e.game},{contentType:"transfer",read:e=>e.transfer},{contentType:"gift",read:e=>e.gift},{contentType:"call",read:e=>e.call},{contentType:"redPacket",read:e=>e.redPacket},{contentType:"mediaAlbum",read:e=>e.mediaAlbum},{contentType:"robot",read:e=>e.robot},{contentType:"liveRoom",read:e=>e.liveRoom},{contentType:"unknown",read:e=>e.unknown}];function ne(e,o){if(1===e.contentType)return{contentType:"text",body:{text:e.content}};if(e.contentType===D)try{return{contentType:"system",body:{system:F(G(e),o)}}}catch{return{contentType:"unknown",body:{unknown:{reason:"malformed-content"}}}}const t=oe.find(o=>o.wireContentType===e.contentType);if(void 0===t)return{contentType:"unknown",body:{unknown:{reason:"unsupported-content-type"}}};try{return{contentType:t.domainContentType,body:t.parse(e)}}catch{return{contentType:"unknown",body:{unknown:{reason:"malformed-content"}}}}}function ie(e,o,t="outgoing message"){const n=te.filter(e=>void 0!==e.read(o)).map(e=>e.contentType);if(1!==n.length||n[0]!==e){const o=0===n.length?"empty":n.join(",");throw new Error(`${t}: contentType/body 不一致(contentType=${e}, body=${o})`)}re(o)}function re(e){if(void 0!==e.unknown)throw new Error("unknown message body 不可编码为出站消息");for(const o of oe){const t=o.build(e);if(void 0!==t)return t}if(void 0!==e.text)return{contentType:1,content:e.text};throw new Error("outgoing message body 缺少可发送的正文槽位")}export{ee as TEXT_CONTENT_TYPE,ie as assertOutgoingContentBodyMatchesType,re as buildContentBMessageFields,ne as parseContentBody};
@@ -0,0 +1 @@
1
+ function n(n,r,t){return r===n?t:r}export{n as resolveDirectConversationId};
@@ -0,0 +1 @@
1
+ import{CryptoExecutionError as t}from"../ports/crypto-task-executor.js";function e(e,n){let r=[],i=0;const a=/* @__PURE__ */new Set;let o=0;const s=async()=>{if(0===r.length)return;e.assertCurrent();const s=await e.executor.decryptBatch({operationId:`${e.operationId}:${o++}`,generation:e.generation,items:r,priority:e.priority,signal:e.signal});e.assertCurrent();const p=new Set(r.map(t=>t.itemIndex));if(!Array.isArray(s)||s.length!==p.size)throw new t("protocol-mismatch");for(const e of s){if(null===e||"object"!=typeof e||!p.delete(e.itemIndex))throw new t("protocol-mismatch");const n=e.result;if(!(!0===n?.ok&&n.plain instanceof Uint8Array)&&(!1!==n?.ok||"rsa"!==n.stage&&"tea"!==n.stage))throw new t("protocol-mismatch")}for(const{itemIndex:t,result:e}of s)n(t,e.ok?{kind:"plain",plain:e.plain}:{kind:"failed",cause:Object.assign(new Error("IM end-to-end decryption failed"),{name:"CryptoComputationError",stage:e.stage})});r=[],i=0,a.clear()};return{async add(t){const e=t.input.secretKey.byteLength+t.input.cipherData.byteLength,n=a.has(t.input.privateKey)?0:2*t.input.privateKey.length;r.length>0&&(8===r.length||i+e+n>262144)&&await s(),i+=e+(a.has(t.input.privateKey)?0:2*t.input.privateKey.length),a.add(t.input.privateKey),r.push(t),(8===r.length||i>=262144)&&await s()},finish:s}}export{e as createCryptoBatchPreparation};
@@ -0,0 +1 @@
1
+ const e=1e3;function s(e){try{const s=new URL(e).pathname.split("/").pop()??"";return decodeURIComponent(s)}catch{return""}}function t(e){if(1e3!==e.contentType)throw new Error("客服正文类型不匹配");return{text:e.sysMessageContent,images:[...e.sysMessageImages],files:e.sysMessageFiles.map((t,n)=>({url:t,name:e.sysMessageFileNameList[n]||s(t),...e.sysMessageFileSizeList[n]?{sizeLabel:e.sysMessageFileSizeList[n]}:{}}))}}export{e as CUSTOMER_SERVICE_CONTENT_TYPE,t as parseCustomerServiceBody};
@@ -0,0 +1 @@
1
+ import{parseContentBody as e}from"./content-body.js";import{fromWireMsgId as r}from"./message-id.js";import{computeSortKey as t}from"./sort.js";const o="__customer_service__",s=1e3;function n(s,n,d){if(1e3!==s.msgType)throw new Error("客服投递的外层类型不匹配");const c=s.sFromId.toString(),i=s.sToId.toString();if(""===s.sMsgId||c!==d.selfId&&i!==d.selfId)throw new Error("客服投递缺少消息 ID 或不属于当前账号");const m=r(s.sMsgId),y=Number(s.msgTime),p=y>0?y:d.receivedAt??Date.now(),f=e(n,d.selfId);return{id:m,conversationId:o,conversationType:"customerService",senderId:c===d.selfId?i:c,contentType:f.contentType,body:f.body,createdAt:p,...y>0?{serverTime:y}:{},sortKey:t(p,m),status:"sent",receipt:"unread",...!0===d.readBySelf?{readBySelf:!0}:{},encryption:{encrypted:0!==s.encrypt,...!0===d.decryptFailed?{decryptFailed:!0}:{}}}}export{o as CUSTOMER_SERVICE_CONVERSATION_ID,s as CUSTOMER_SERVICE_MESSAGE_TYPE,n as mapIncomingCustomerServiceChat};
@@ -0,0 +1 @@
1
+ import{parseContentBody as n}from"./content-body.js";function t(t,o,e){const c=n(o,e),{decryptFailed:r,...y}=t.encryption;return{...t,contentType:c.contentType,body:c.body,encryption:y}}export{t as recoverDecryptedMessage};
@@ -0,0 +1 @@
1
+ const e=11;function n(e){const n={url:e.content,fileName:e.fielName};return""!==e.extension&&(n.extension=e.extension),0!==e.fileType&&(n.fileType=e.fileType),e.fileLength>0n&&(n.size=Number(e.fileLength)),""!==e.MD5&&(n.md5=e.MD5),e.teaKey.length>0&&(n.teaKey=e.teaKey),0!==e.fileEncryptType&&(n.fileEncryptType=e.fileEncryptType),n}function i(e){return{contentType:11,content:e.url,...""!==e.fileName?{fielName:e.fileName}:{},...void 0!==e.extension&&""!==e.extension?{extension:e.extension}:{},...void 0!==e.fileType&&0!==e.fileType?{fileType:e.fileType}:{},...void 0!==e.size&&e.size>0?{fileLength:BigInt(Math.round(e.size))}:{},...void 0!==e.md5&&""!==e.md5?{MD5:e.md5}:{},...void 0!==e.teaKey&&e.teaKey.length>0?{teaKey:e.teaKey}:{},...void 0!==e.fileEncryptType&&0!==e.fileEncryptType?{fileEncryptType:e.fileEncryptType}:{}}}export{e as FILE_CONTENT_TYPE,i as fileBMessageFields,n as parseFileBody};
@@ -0,0 +1 @@
1
+ import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as e}from"./media-album-body.js";const t=29;function i(e){if("object"!=typeof e||null===e||Array.isArray(e))throw new Error("Invalid FILES_ALBUM object");return e}function n(e){const t=i(e),n=t.fileName??t.fielName,r=t.md5??t.MD5,o=t.fileSize??t.fileLength;if("string"!=typeof t.url||!/^https?:\/\//i.test(t.url)||"string"!=typeof n||""===n||"string"!=typeof t.extension||"string"!=typeof r||""===r||"number"!=typeof o||!Number.isSafeInteger(o)||o<0||"number"!=typeof t.fileType||!Number.isInteger(t.fileType)||t.fileType<0||t.fileType>5||"number"!=typeof t.fileEncryptType||![0,1,2,3].includes(t.fileEncryptType)||"string"!=typeof t.teaKey)throw new Error("Invalid FILES_ALBUM item");const p=t.extension.replace(/^\./,"").toLowerCase(),f=Uint8Array.from(globalThis.atob(t.teaKey),e=>e.charCodeAt(0));if(1!==t.fileEncryptType&&0===f.length)throw new Error("Missing FILES_ALBUM item key");return{url:t.url,fileName:n,extension:p,md5:r,size:o,fileType:["zip","rar","torrent"].includes(p)?5:t.fileType,fileEncryptType:t.fileEncryptType,...0===f.length?{}:{teaKey:f}}}function r(e){const t=i(JSON.parse(e.content));if("29"!==t.contentType||!Array.isArray(t.items)||0===t.items.length||void 0!==t.caption&&"string"!=typeof t.caption)throw new Error("Invalid FILES_ALBUM body");return{items:t.items.map(n),..."string"==typeof t.caption&&""!==t.caption.trim()?{caption:t.caption}:{}}}function o(t){if(1!==t.items.length||Array.from(t.caption??"").length>e)throw new Error("Invalid outgoing FILES_ALBUM size");return{contentType:29,content:JSON.stringify(p(t))}}function p(e){if(0===e.items.length)throw new Error("Invalid FILES_ALBUM items");const t=e.items.map(e=>{let t="";for(const i of e.teaKey??[])t+=String.fromCharCode(i);const i={url:e.url,fileName:e.fileName,extension:e.extension,fileType:e.fileType,md5:e.md5,fileSize:e.size,fileEncryptType:e.fileEncryptType,teaKey:globalThis.btoa(t)};return n(i),i});return{contentType:"29",...e.caption?.trim()?{caption:e.caption}:{},items:t}}export{t as FILES_ALBUM_CONTENT_TYPE,p as buildFilesAlbumSnapshotBody,o as filesAlbumBMessageFields,r as parseFilesAlbumBody};
@@ -0,0 +1 @@
1
+ const e=27;function r(e){if(null===e||"object"!=typeof e)return!1;const r=e;return!("number"!=typeof r.value||!Number.isInteger(r.value))&&("rock-paper-scissors"===r.gameType?r.value>=1&&r.value<=3:"dice"===r.gameType&&r.value>=1&&r.value<=6)}function a(e){const r=Number(e.gameType),a=Number(e.gameValue);if(0===r){if(1!==a&&2!==a&&3!==a)throw new Error(`game body: 石头剪刀布结果非法(${String(e.gameValue)})`);return{gameType:"rock-paper-scissors",value:a}}if(1===r){if(1!==a&&2!==a&&3!==a&&4!==a&&5!==a&&6!==a)throw new Error(`game body: 骰子结果非法(${String(e.gameValue)})`);return{gameType:"dice",value:a}}throw new Error(`game body: gameType 非法(${String(e.gameType)})`)}function n(e){const a=e;if(!r(e))throw new Error(`game body: 出站结果非法(${String(a.gameType)}/${String(a.value)})`);return{contentType:27,content:"",gameType:"dice"===e.gameType?1n:0n,gameValue:BigInt(e.value)}}export{e as GAME_CONTENT_TYPE,n as gameBMessageFields,r as isValidGameBody,a as parseGameBody};
@@ -0,0 +1 @@
1
+ const i=17;function e(i){const e=i?.trim();return void 0===e||""===e?void 0:e}function t(i,e){if(i<0n)throw new Error(`gift body: ${e} 非法`);return i.toString()}function n(i,e){const t=i.trim();if(!/^\d+$/.test(t))throw new Error(`gift body: ${e} 必须为十进制数字`);return BigInt(t)}function o(i){return 0===i||1===i||2===i}function r(i){return 0===i||1===i||2===i||3===i}function m(i){return 1===i||2===i}function s(i){return"string"==typeof i&&/^\d+$/.test(i.trim())}function u(i){if(null===i||"object"!=typeof i)return!1;const e=i;return!(!s(e.fromUid)||!s(e.toUid))&&(!!s(e.serialNumber)&&("string"==typeof e.giftName&&""!==e.giftName.trim()&&(!!o(e.giftType)&&(!!r(e.state)&&(!!m(e.sessionType)&&(!("number"!=typeof e.initiateTime||!Number.isSafeInteger(e.initiateTime)||e.initiateTime<0)&&(!(void 0!==e.amount&&!s(e.amount))&&(!(void 0!==e.zhangCount&&!s(e.zhangCount))&&(!(void 0!==e.benCount&&!s(e.benCount))&&!(void 0!==e.fissionNumber&&!s(e.fissionNumber)))))))))))}function a(i){const n=i.giftType;if(!o(n))throw new Error(`gift body: giftType 非法(${String(n)})`);const s=i.state;if(!r(s))throw new Error(`gift body: state 非法(${String(s)})`);const u=i.sessionType;if(!m(u))throw new Error(`gift body: sessionType 非法(${String(u)})`);return{fromUid:t(i.fromUid,"fromUid"),toUid:t(i.toUid,"toUid"),giftType:n,state:s,serialNumber:t(i.serialNumber,"serialNumber"),sessionType:u,initiateTime:Number(i.initiateTime),giftName:i.giftName.trim(),...0n===i.amount?{}:{amount:t(i.amount,"amount")},...void 0===e(i.fromUserName)?{}:{fromUserName:i.fromUserName.trim()},...void 0===e(i.toUserName)?{}:{toUserName:i.toUserName.trim()},...void 0===e(i.explain)?{}:{explain:i.explain.trim()},...void 0===e(i.giftIcon)?{}:{giftIcon:i.giftIcon.trim()},...0n===i.receiveTime?{}:{receiveTime:Number(i.receiveTime)},...0n===i.returnTime?{}:{returnTime:Number(i.returnTime)},...0===i.isRead?{}:{isRead:1===i.isRead},...0n===i.zhangCount?{}:{zhangCount:t(i.zhangCount,"zhangCount")},...0n===i.benCount?{}:{benCount:t(i.benCount,"benCount")},...0n===i.fissionNumber?{}:{fissionNumber:t(i.fissionNumber,"fissionNumber")}}}function f(i){const e=i;if(!u(i))throw new Error(`gift body: 出站字段非法(${String(e.serialNumber)}/${String(e.giftType)})`);return{contentType:17,content:"",fromUid:n(i.fromUid,"fromUid"),toUid:n(i.toUid,"toUid"),giftType:i.giftType,state:i.state,serialNumber:n(i.serialNumber,"serialNumber"),sessionType:i.sessionType,initiateTime:BigInt(i.initiateTime),giftName:i.giftName,...void 0===i.amount?{}:{amount:n(i.amount,"amount")},...void 0===i.fromUserName?{}:{fromUserName:i.fromUserName},...void 0===i.toUserName?{}:{toUserName:i.toUserName},...void 0===i.explain?{}:{explain:i.explain},...void 0===i.giftIcon?{}:{giftIcon:i.giftIcon},...void 0===i.receiveTime?{}:{receiveTime:BigInt(i.receiveTime)},...void 0===i.returnTime?{}:{returnTime:BigInt(i.returnTime)},...void 0===i.isRead?{}:{isRead:i.isRead?1:0},...void 0===i.zhangCount?{}:{zhangCount:n(i.zhangCount,"zhangCount")},...void 0===i.benCount?{}:{benCount:n(i.benCount,"benCount")},...void 0===i.fissionNumber?{}:{fissionNumber:n(i.fissionNumber,"fissionNumber")}}}export{i as GIFT_CONTENT_TYPE,f as giftBMessageFields,u as isValidGiftBody,a as parseGiftBody};
@@ -0,0 +1 @@
1
+ import{resolveBotAwareSenderId as e}from"./bot-sender.js";import{buildContentBMessageFields as t,parseContentBody as n}from"./content-body.js";import{toWireMsgId as r,toWireRefMsgId as s,fromWireMsgId as o}from"./message-id.js";import{computeSortKey as d}from"./sort.js";function i(t,r,s){const i=e(t.sFromId,t.botId),a=Number(t.msgTime),u=o(t.sMsgId),p=n(r,s.selfId),f="text"===p.contentType,m=a>0?a:s.receivedAt??Date.now(),y={id:u,conversationId:t.sGrpId.toString(),conversationType:"group",senderId:i,contentType:p.contentType,body:p.body,createdAt:m,sortKey:d(m,u),status:"sent",receipt:"unread",encryption:{encrypted:0!==t.encrypt}};!0===s.decryptFailed&&(y.encryption.decryptFailed=!0),a>0&&(y.serverTime=a),t.parentMsgId&&(y.refMessageId=o(t.parentMsgId)),!0===s.edited&&(y.edited=!0);const I=function(e,t){const n=-1===e.nNotifyCount||4294967295===e.nNotifyCount,r=g(e.sNotifyUsers.map(e=>e.toString()),c(t)),{ranges:s,atUsersName:o}=function(e){if(""===e)return{};try{const t=JSON.parse(e),n=function(e){if(!Array.isArray(e))return;const t=[];for(const n of e){if("object"!=typeof n||null===n)continue;const e=n,{user_id:r,start:s,end:o}=e;("string"==typeof r||"number"==typeof r)&&"number"==typeof s&&Number.isInteger(s)&&s>=0&&"number"==typeof o&&Number.isInteger(o)&&o>=s&&t.push({userId:String(r),start:s,end:o})}return t.length>0?t:void 0}(t.atRange),r=function(e){if("object"!=typeof e||null===e)return;const t={};for(const[n,r]of Object.entries(e))"string"==typeof r&&""!==r&&(t[n]=r);return Object.keys(t).length>0?t:void 0}(t.atUsersName);return{...void 0===n?{}:{ranges:n},...void 0===r?{}:{atUsersName:r}}}catch{return{}}}(e.extend);if(!n&&0===r.length&&void 0===s&&void 0===o)return;const d={atAll:n,atUserIds:r};void 0!==s&&(d.ranges=s);void 0!==o&&(d.atUsersName=o);return d}(t,f?r.content:"");return void 0!==I&&(y.mention=I),s.keepRaw&&(y.raw=function(e,t,n){return{cmdId:n,chat:{sMsgId:e.sMsgId,sFromId:e.sFromId.toString(),sToId:e.sGrpId.toString(),msgType:e.msgType,encrypt:e.encrypt,msgTime:e.msgTime.toString(),extend:e.extend||void 0,encryptVersion:e.encryptVersion||void 0,parentMsgId:e.parentMsgId||void 0},content:{contentType:t.contentType,text:t.content||void 0}}}(t,r,s.cmdId)),y}function a(e,t){const n=c(e);if(0===n.length)return t;const r=t?.atUserIds??[],s=g(r,n);return s.length===r.length?t:void 0===t?{atAll:!1,atUserIds:s}:{...t,atUserIds:s}}function c(e){if(""===e)return[];const t=[];for(const n of e.matchAll(/\[(\d{17,20})\]/g))void 0!==n[1]&&t.push(n[1]);return t}function g(e,t){if(0===t.length)return e;const n=new Set(e),r=[...e];for(const e of t)n.has(e)||(n.add(e),r.push(e));return r}function u(e,n){const o={sGrpId:BigInt(e.conversationId),sFromId:BigInt(n.selfId),sMsgId:r(e.id),msgType:5,encrypt:e.encryption.encrypted?1:0,bMessage:t(e.body)};return void 0!==e.mention&&Object.assign(o,function(e){const t={nNotifyCount:e.atAll?4294967295:e.atUserIds.length};e.atUserIds.length>0&&(t.sNotifyUsers=e.atUserIds.map(e=>BigInt(e)));const n=function(e){const t=void 0!==e.ranges&&e.ranges.length>0,n=void 0!==e.atUsersName&&Object.keys(e.atUsersName).length>0;if(!t&&!n)return;const r={sendType:0};n&&(r.atUsersName=e.atUsersName);t&&(r.atRange=e.ranges.map(e=>({user_id:e.userId,start:e.start,end:e.end})));return JSON.stringify(r)}(e);void 0!==n&&(t.extend=n);return t}(e.mention)),void 0!==e.refMessageId&&""!==e.refMessageId&&(o.parentMsgId=s(e.refMessageId)),o}export{a as backfillGroupMention,u as buildGroupOutgoingChat,i as mapIncomingGroupChat};
@@ -0,0 +1 @@
1
+ import{fromWireMsgId as e}from"./message-id.js";import{mapBoardPinnedMessage as r,resolvePinnedMessageActionErrorCode as t}from"./pinned-message-mapper.js";import{computeSortKey as n}from"./sort.js";import{normalizeSystemEventTimelineVisibility as s}from"./system-event-timeline-policy.js";import{NotifyType as o}from"../../../im-protocol/src/protobuf/gen/im.group_pb.js";import{ErrCode as i}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";const d="system";function p(e){switch(e){case o.GRP_ACTIVE:return"group_activated";case o.GRP_INFO_CHANGED:return"group_info_changed";case o.GRPMEM_QUIT:return"group_member_left";case o.GRPMEM_REMOVE:return"group_member_removed";case o.GRPAPPLY_RESULT:return"group_member_joined";case o.GRPINVITE_RESULT:return"group_member_invited";case o.GRPMASTER_CHANGED:return"group_master_changed";case o.MEMBER_NAME_CHANGED:return"group_member_renamed";case o.GRP_DISMISS:return"group_dismissed";case o.GRP_MSG_PINNED:return"group_message_pinned";case o.GRP_MSG_CANCEL_PINNED:return"group_message_unpinned";default:return"unknown"}}function u(e){const r="group"===e.conversationType&&"system"===e.contentType?e.body.system:void 0;return"group_member_joined"!==r?.eventType||r.rawNotifyType!==o.GRPINVITE_RESULT?s(e):s({...e,body:{...e.body,system:{...r,eventType:"group_member_invited"}}})}function a(s,i){const a=e(s.sMsgId),c=Number(s.msgTime),m=c>0?c:i.receivedAt??Date.now(),_=0n===s.sOprUserId?void 0:s.sOprUserId.toString(),g=s.sMnpledUserId.map(e=>e.toString()),y={eventType:p(s.notifyType),rawNotifyType:s.notifyType},f=Number(s.errcode);0!==f&&(y.errcode=f),void 0!==_&&(y.operatorId=_),g.length>0&&(y.targetUserIds=g);const l=s.notifyType===o.GRP_MSG_PINNED,I=s.notifyType===o.GRP_MSG_CANCEL_PINNED;l||I||""===s.sContent||(y.fallbackText=s.sContent);const v=l||I?void 0:function(e){const r=e.trim();if(""!==r&&(r.startsWith("{")||r.startsWith("[")))try{const e=JSON.parse(r);return"object"==typeof e&&null!==e?e:void 0}catch{return}}(s.sContent);if(void 0!==v&&(y.payload=v),l)try{y.pinnedMessageAction={type:"pin",pinnedMessage:r(s.sContent,{conversationId:s.sGrpId.toString(),...void 0===_?{}:{operatorId:_}})}}catch(e){y.pinnedMessageAction={type:"invalid",code:t(e)}}else I&&(y.pinnedMessageAction={type:"unpin"});const E={id:a,conversationId:s.sGrpId.toString(),conversationType:"group",senderId:d,contentType:"system",body:{system:y},createdAt:m,sortKey:n(m,a),status:"sent",receipt:"read",encryption:{encrypted:!1}};return c>0&&(E.serverTime=c),i.keepRaw&&(E.raw={cmdId:i.cmdId}),u(E)}function c(e,r){const t=e.targetUserIds?.includes(r)??!1;switch(e.eventType){case"group_member_left":return t?{state:"left",reason:"you_left_group"}:null;case"group_member_removed":return t?{state:"removed",reason:"you_were_removed"}:null;case"group_dismissed":return{state:"dismissed",reason:"group_dismissed"};case"group_member_joined":case"group_member_invited":{if(!t)return null;const r=e.errcode;return void 0!==r&&32768!==r?null:{state:"active",reason:""}}default:return null}}function m(e){switch(e){case i.ERR_GROUP_DISMISSED:return{state:"dismissed",reason:"group_dismissed"};case i.ERR_CHAT_FORBIDDEN:return{state:"unknown_restricted",reason:"send_forbidden"};default:return null}}export{d as SYSTEM_SENDER_ID,a as mapIncomingGroupNotify,p as mapNotifyTypeToEvent,u as normalizeGroupNotifySemantics,m as resolveAckFailureRestriction,c as resolveGroupRestriction};
@@ -0,0 +1 @@
1
+ import{throwIfAborted as e}from"../abort.js";import{createCryptoBatchPreparation as t}from"./crypto-batch-preparation.js";import{mapIncomingGroupChat as s}from"./group-message-mapper.js";import{mapIncomingGroupNotify as r}from"./group-notify-mapper.js";import{fromWireMsgId as o}from"./message-id.js";import{toWireMessageIds as n,fromWireMissingMessageIds as d}from"./messages-by-id.js";import{mapIncomingGroupReaction as c}from"./reaction-mapper.js";import{groupReadAllMsgReqCodec as i,groupReadAllMsgRespCodec as a,getGroupMsgByIdReqCodec as p,getGroupMsgByIdRespCodec as m,offlineGroupSessionReqCodec as g,offlineGroupSessionRespCodec as u,mesGrpChatCodec as I,mesGrpNotifyDeliverCodec as y,bMessageCodec as l,bContentCodec as f,getGroupHistoryMsgReqCodec as h,getGroupHistoryMsgRespCodec as T,offlineGroupMsgReqCodec as E,offlineGroupMsgRespCodec as M}from"../../../im-protocol/src/protobuf/registry.js";import{CmdId as v}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{isCryptoExecutionError as w}from"../ports/crypto-task-executor.js";const G=/* @__PURE__ */new Set([v.MES_GRPCHAT_DELIVER,v.MES_GRPCHAT_EDIT_MSG_C2C]),C=l.create({contentType:1,content:""});function L(e){return E.encode(E.create({userId:BigInt(e.userId),msgId:"",deliveredMsgIds:e.deliveredMsgIds??[],limit:e.limit??50,clientType:e.clientType??0}))}function D(e){return g.encode(g.create({userId:BigInt(e.userId),clientType:String(e.clientType??0),size:BigInt(e.size??21)}))}function b(e,t,n,d){if(R(e.sGroupId,t.expectedGroupId),e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER){const s=d?.chat??I.decode(e.sMsgData),r={...s,sMsgId:s.sMsgId||e.sMsgId,sFromId:0n===s.sFromId?e.sFromId:s.sFromId,sGrpId:0n===s.sGrpId?e.sGroupId:s.sGrpId,sToId:0n===s.sToId?e.sGroupId:s.sToId,msgTime:0n===s.msgTime?e.msgTime:s.msgTime,parentMsgId:s.parentMsgId||e.parentMsgId};return R(r.sGrpId,t.expectedGroupId),t.onReaction?.(c(r)),null}if(e.cmdId===v.MES_GRPNOTIFY_DELIVER){const s=d?.notify??y.decode(e.sMsgData);return R(s.sGrpId,t.expectedGroupId),r(s,{selfId:t.selfId,cmdId:e.cmdId,receivedAt:t.receivedAt,keepRaw:t.keepRaw})}if(!G.has(e.cmdId))return null;const i=d?.chat??I.decode(e.sMsgData);R(i.sGrpId,t.expectedGroupId);let a=C,p=!1,m=!1;if(0===i.encrypt)try{a=l.decode(i.sContent)}catch{m=!0}else if(1===i.encrypt&&void 0!==n){const e=function(e,t,s,r){const o=void 0===r?s.resolvePrivateKey({groupId:t,msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion}):null;if("no-key"===r?.kind||void 0===r&&null===o)return s.onDecryptError?.({msgId:e.sMsgId,groupId:t,fromId:String(e.sFromId),msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion,reason:"no-key"}),null;try{if("plain"===r?.kind)return l.decode(r.plain);if("failed"===r?.kind)throw r.cause;const t=f.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=s.crypto.decryptEndToEnd({secretKey:t.secretKey,cipherData:t.cipherData,privateKey:o});return l.decode(n)}catch(r){return s.onDecryptError?.({msgId:e.sMsgId,groupId:t,fromId:String(e.sFromId),msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion,reason:"decrypt-failed",cause:r}),null}}(i,i.sGrpId.toString(),n,d?.content);a=e??C,p=null===e}else p=!0;const g=s(i,a,{selfId:t.selfId,cmdId:e.cmdId,receivedAt:t.receivedAt,keepRaw:t.keepRaw,decryptFailed:p});return m&&(g.contentType="unknown",g.body={unknown:{reason:"malformed-content"}},g.raw={...g.raw,contentDecodeFailure:{codec:"BMessage",byteLength:i.sContent.length}}),p&&1===i.encrypt&&n?.onDecryptRecovery?.({conversation:{conversationType:"group",conversationId:g.conversationId},messageId:g.id,wireEncrypt:1,sContent:i.sContent.slice(),...""===i.encryptVersion?{}:{encryptVersion:i.encryptVersion},cmdId:e.cmdId,source:t.source??"offline",createdAt:Date.now()}),void 0===g.refMessageId&&e.parentMsgId&&(g.refMessageId=o(e.parentMsgId)),1===e.isEdit&&(g.edited=!0),g}function R(e,t){if(void 0!==t&&e.toString()!==t)throw new Error(`group history: 响应群不属于请求(groupId=${e})`)}function S(t,s){e(t.signal),t.assertCurrent?.(void 0===s?void 0:{conversationType:"group",conversationId:s})}async function _(e){S(e),await e.yieldToEventLoop(),S(e)}function x(e,t){R(e.sGroupId,t);if((G.has(e.cmdId)||e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER||e.cmdId===v.MES_GRPNOTIFY_DELIVER)&&e.sGroupId<=0n)throw new Error("group response: 消息缺少有效群身份");const s={...e.sGroupId>0n?{groupId:e.sGroupId.toString()}:{}};if(G.has(e.cmdId)||e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER){s.chat=I.decode(e.sMsgData);R(e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER&&0n===s.chat.sGrpId?e.sGroupId:s.chat.sGrpId,s.groupId)}else e.cmdId===v.MES_GRPNOTIFY_DELIVER&&(s.notify=y.decode(e.sMsgData),R(s.notify.sGrpId,s.groupId));return s}async function A(e,s,r,o,n,d=[],c=!1){const i=await async function(e,s,r,o=[],n=!0){const d=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map,i=new Set(o);for(const e of o)S(r,e);for(const[t,{item:s,expectedGroupId:o}]of e.entries()){let e;S(r),t>0&&t%5==0&&await _(r);try{e=x(s,o)}catch(e){if(!n)throw e;c.set(t,e);continue}S(r,e.groupId),d.set(t,e),void 0===e.groupId||void 0===e.chat&&void 0===e.notify||i.add(e.groupId)}S(r),void 0!==s&&i.size>0&&void 0!==r.prepareKeys&&(await r.prepareKeys([...i]),S(r));const a=t({...r,assertCurrent:()=>S(r)},(e,t)=>{d.get(e).content=t});for(const[t,{item:o}]of e.entries()){S(r),t>0&&t%5==0&&await _(r);const e=d.get(t);if(void 0===e)continue;S(r,e.groupId);const n=e.chat;if(!G.has(o.cmdId)||1!==n?.encrypt||void 0===s)continue;let i;try{const r=s.resolvePrivateKey({groupId:e.groupId,msgType:n.msgType,encrypt:n.encrypt,encryptVersion:n.encryptVersion});if(null===r)e.content={kind:"no-key"};else try{const e=f.decode(n.sContent);if(0===e.secretKey.length||0===e.cipherData.length)throw new Error("BContent secretKey/cipherData missing");i={itemIndex:t,input:{secretKey:e.secretKey,cipherData:e.cipherData,privateKey:r}}}catch(t){e.content={kind:"failed",cause:t}}}catch(e){if(w(e)||e instanceof Error&&"AbortError"===e.name)throw e;c.set(t,e)}void 0!==i&&await a.add(i),S(r,e.groupId)}return await a.finish(),S(r),{rows:d,errors:c}}(e,r,o,d,n),a=[],p=[],m=[];for(const[t,{item:d,expectedGroupId:g}]of e.entries()){S(o),t>0&&t%5==0&&await _(o);const e=i.rows.get(t);S(o,e?.groupId);try{if(i.errors.has(t))throw i.errors.get(t);const o=b(d,{...s,expectedGroupId:g},r,e);null!==o&&(c&&1===d.isCancel&&(o.recalled={by:o.senderId,at:o.serverTime??o.createdAt},o.body={}),a.push(o)),p.push({msgId:d.sMsgId,msgTime:d.msgTime,cmdId:d.cmdId})}catch(e){if(!n||w(e)||e instanceof Error&&"AbortError"===e.name)throw e;m.push({msgId:d.sMsgId,cmdId:d.cmdId,cause:e})}S(o,e?.groupId)}return S(o),{messages:a,deliveredMsgInfos:p,...0===m.length?{}:{itemErrors:m}}}async function V(e,t,s,r){S(r);const o=M.decode(e);return{...await A(o.msgList.map(e=>({item:e,expectedGroupId:t.expectedGroupId})),t,s,r,!0),batchSize:o.msgList.length,responseBytes:e.length}}function B(e,t,s){const r=M.decode(e),o=[],n=[],d=[];for(const e of r.msgList)try{const r=b(e,t,s);null!==r&&o.push(r),n.push({msgId:e.sMsgId,msgTime:e.msgTime,cmdId:e.cmdId})}catch(t){d.push({msgId:e.sMsgId,cmdId:e.cmdId,cause:t})}return{messages:o,deliveredMsgInfos:n,batchSize:r.msgList.length,responseBytes:e.length,...0===d.length?{}:{itemErrors:d}}}function k(e,t,s){const r=u.decode(e),o=[],n=[],d=[];for(const e of r.sessionList){o.push({groupId:e.groupId.toString(),unreadCount:Number(e.unreadCount)});for(const r of e.msgList)try{const e=b(r,t,s);null!==e&&n.push(e)}catch(e){d.push({msgId:r.sMsgId,cmdId:r.cmdId,cause:e})}}return{unreads:o,messages:n,...0===d.length?{}:{itemErrors:d}}}async function K(e,t,s,r){S(r);const o=u.decode(e),n=[],d=[];for(const e of o.sessionList){R(e.groupId,t.expectedGroupId);const s=e.groupId.toString();S(r,s),n.push({groupId:s,unreadCount:Number(e.unreadCount)}),d.push(...e.msgList.map(e=>({item:e,expectedGroupId:s})))}const{messages:c,itemErrors:i}=await A(d,t,s,r,!0,n.map(e=>e.groupId));return{unreads:n,messages:c,...void 0===i?{}:{itemErrors:i}}}function N(e){return h.encode(h.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId),baseTime:BigInt(e.baseTime),direct:e.direct??1,limit:e.limit??50,clientType:e.clientType??0}))}function F(e,t,s){const r=T.decode(e),o=[];for(const e of r.msgList){const r=b(e,t,s);null!==r&&o.push(r)}const n=r.msgList.map(e=>Number(e.msgTime));return{messages:o,batchSize:r.msgList.length,...0===n.length?{}:{oldestEntryTime:Math.min(...n),newestEntryTime:Math.max(...n)}}}async function P(t,s,r,o,n){e(o.signal);const d=T.decode(t);if(200!==d.code)throw new Error(`group history: code=${d.code}`);if(void 0!==n){const t={...n,assertCurrent:t=>{e(o.signal),n.assertCurrent?.(t)}},{messages:c}=await A(d.msgList.map(e=>({item:e,expectedGroupId:s.expectedGroupId})),s,r,t,!1);let i,a;for(const e of d.msgList){const t=Number(e.msgTime);i=void 0===i?t:Math.min(i,t),a=void 0===a?t:Math.max(a,t)}return{messages:c,batchSize:d.msgList.length,...void 0===i?{}:{oldestEntryTime:i,newestEntryTime:a}}}const c=[];let i,a,p=0;for(const t of d.msgList){e(o.signal),p>0&&p%5==0&&(await o.yieldToEventLoop(),e(o.signal));const n=b(t,s,r);null!==n&&c.push(n);const d=Number(t.msgTime);i=void 0===i?d:Math.min(i,d),a=void 0===a?d:Math.max(a,d),p+=1}return e(o.signal),{messages:c,batchSize:d.msgList.length,...void 0===i?{}:{oldestEntryTime:i,newestEntryTime:a}}}function j(e){return p.encode(p.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId),msgIds:n(e.messageIds),clientType:e.clientType??0}))}function z(e,t,s,r){const o=m.decode(e),n=[];for(const e of o.msgList){const r=b(e,t,s);null!==r&&(1===e.isCancel&&(r.recalled={by:r.senderId,at:r.serverTime??r.createdAt},r.body={}),n.push(r))}return{messages:n,missingMessageIds:d(o.missingMsgIds,r),code:o.code}}async function O(e,t,s,r,o){S(o);const n=m.decode(e),c=d(n.missingMsgIds,r);if(200!==n.code)return{messages:[],missingMessageIds:c,code:n.code};const{messages:i}=await A(n.msgList.map(e=>({item:e,expectedGroupId:t.expectedGroupId})),t,s,o,!1,[],!0);return{messages:i,missingMessageIds:c,code:n.code}}function H(e){return i.encode(i.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId)}))}function $(e){return{code:a.decode(e).code}}export{F as decodeGroupHistoryBatch,P as decodeGroupHistoryBatchAsync,z as decodeGroupMessagesByIdResponse,O as decodeGroupMessagesByIdResponseAsync,B as decodeGroupOfflineBatch,V as decodeGroupOfflineBatchAsync,k as decodeGroupOfflineSession,K as decodeGroupOfflineSessionAsync,$ as decodeGroupReadAllResponse,N as encodeGroupHistoryRequest,j as encodeGroupMessagesByIdRequest,L as encodeGroupOfflinePullRequest,D as encodeGroupOfflineSessionRequest,H as encodeGroupReadAllRequest};
@@ -0,0 +1 @@
1
+ const e=2;function t(e){const t={url:e.content,width:e.width,height:e.height};return e.thumbData.length>0&&(t.thumbData=e.thumbData),""!==e.MD5&&(t.md5=e.MD5),0!==e.imageType&&(t.imageType=e.imageType),e.fileLength>0n&&(t.size=1024*Number(e.fileLength)),e.teaKey.length>0&&(t.teaKey=e.teaKey),0!==e.fileEncryptType&&(t.fileEncryptType=e.fileEncryptType),t}function i(e){return{contentType:2,content:e.url,width:e.width,height:e.height,...void 0!==e.thumbData&&e.thumbData.length>0?{thumbData:e.thumbData}:{},...void 0!==e.md5&&""!==e.md5?{MD5:e.md5}:{},...void 0!==e.imageType&&0!==e.imageType?{imageType:e.imageType}:{},...void 0!==e.size&&e.size>0?{fileLength:BigInt(Math.round(e.size/1024))}:{},...void 0!==e.teaKey&&e.teaKey.length>0?{teaKey:e.teaKey}:{},...void 0!==e.fileEncryptType&&0!==e.fileEncryptType?{fileEncryptType:e.fileEncryptType}:{}}}export{e as IMAGE_CONTENT_TYPE,i as imageBMessageFields,t as parseImageBody};
@@ -0,0 +1 @@
1
+ const e=30,i={1:"video",2:"voice",3:"dual-phone",4:"screen-record",5:"voice-chat"},o={video:1,voice:2,"dual-phone":3,"screen-record":4,"voice-chat":5},r={1:"preview",2:"live",3:"ended"},v={preview:1,live:2,ended:3};function t(e){const i=e?.trim();return void 0===i||""===i?void 0:i}function d(e){if(0===e)return"";const o=i[e];if(void 0===o)throw new Error(`live room body: liveType 非法(${String(e)})`);return o}function s(e){const i=r[e];if(void 0===i)throw new Error(`live room body: liveRoomStatus 非法(${String(e)})`);return i}function l(e){if(null===e||"object"!=typeof e)return!1;const i=e;if("string"!=typeof i.liveRoomId)return!1;if(""!==i.liveType&&("video"!==(o=i.liveType)&&"voice"!==o&&"dual-phone"!==o&&"screen-record"!==o&&"voice-chat"!==o)||!function(e){return"preview"===e||"live"===e||"ended"===e}(i.liveRoomStatus))return!1;var o;if("boolean"!=typeof i.isFocus||"boolean"!=typeof i.isReservation)return!1;return[i.liveRecordId,i.screenRatio,i.broadcasterUserId,i.broadcasterUserName,i.uid,i.liveCover,i.liveRoomName,i.livePreviewTime,i.livePreviewId,i.liveRoomViewers,i.liveRoomLikes].every(e=>void 0===e||"string"==typeof e)}function m(e){return{liveRoomId:e.liveRoomId.trim(),liveType:d(e.liveType),liveRoomStatus:s(e.liveRoomStatus),isFocus:e.isFocus,isReservation:e.isReservation,...void 0===t(e.liveRecordId)?{}:{liveRecordId:e.liveRecordId.trim()},...void 0===t(e.screenRatio)?{}:{screenRatio:e.screenRatio.trim()},...void 0===t(e.broadcasterUserId)?{}:{broadcasterUserId:e.broadcasterUserId.trim()},...void 0===t(e.broadcasterUserName)?{}:{broadcasterUserName:e.broadcasterUserName.trim()},...void 0===t(e.uid)?{}:{uid:e.uid.trim()},...void 0===t(e.liveCover)?{}:{liveCover:e.liveCover.trim()},...void 0===t(e.liveRoomName)?{}:{liveRoomName:e.liveRoomName.trim()},...void 0===t(e.livePreviewTime)?{}:{livePreviewTime:e.livePreviewTime.trim()},...void 0===t(e.livePreviewId)?{}:{livePreviewId:e.livePreviewId.trim()},...void 0===t(e.liveRoomViewers)?{}:{liveRoomViewers:e.liveRoomViewers.trim()},...void 0===t(e.liveRoomLikes)?{}:{liveRoomLikes:e.liveRoomLikes.trim()}}}function a(e){if(!l(e))throw new Error(`live room body: 出站字段非法(${String(e.liveRoomId)})`);return{contentType:30,content:"",liveRoomId:e.liveRoomId.trim(),liveType:""===e.liveType?0:o[e.liveType],liveRoomStatus:v[e.liveRoomStatus],isFocus:e.isFocus,isReservation:e.isReservation,...void 0===e.liveRecordId?{}:{liveRecordId:e.liveRecordId.trim()},...void 0===e.screenRatio?{}:{screenRatio:e.screenRatio.trim()},...void 0===e.broadcasterUserId?{}:{broadcasterUserId:e.broadcasterUserId.trim()},...void 0===e.broadcasterUserName?{}:{broadcasterUserName:e.broadcasterUserName.trim()},...void 0===e.uid?{}:{uid:e.uid.trim()},...void 0===e.liveCover?{}:{liveCover:e.liveCover.trim()},...void 0===e.liveRoomName?{}:{liveRoomName:e.liveRoomName.trim()},...void 0===e.livePreviewTime?{}:{livePreviewTime:e.livePreviewTime.trim()},...void 0===e.livePreviewId?{}:{livePreviewId:e.livePreviewId.trim()},...void 0===e.liveRoomViewers?{}:{liveRoomViewers:e.liveRoomViewers.trim()},...void 0===e.liveRoomLikes?{}:{liveRoomLikes:e.liveRoomLikes.trim()}}}export{e as LIVE_ROOM_CONTENT_TYPE,l as isValidLiveRoomBody,a as liveRoomBMessageFields,m as parseLiveRoomBody};
@@ -0,0 +1 @@
1
+ const t=28,n=1200,i=9;function e(t){const n=void 0!==t.caption&&""!==t.caption.trim(),i=1===t.items.length?t.items[0]:void 0;return n||void 0===i?"mediaAlbum":i.kind}const o=524288,r=262144;function u(t,n){for(const i of n){const n=t[i];if("string"==typeof n&&""!==n)return n}}function c(t,n){for(const i of n){const n=t[i];if("number"==typeof n&&Number.isFinite(n))return n;if("string"==typeof n&&""!==n.trim()){const t=Number(n);if(Number.isFinite(t))return t}}}function a(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}function s(t){const n=t.replace(/\s+/g,"");if(""!==n&&n.length%4==0&&/^[A-Z0-9+/]*={0,2}$/i.test(n))try{const t=globalThis.atob(n),i=new Uint8Array(t.length);for(let n=0;n<t.length;n+=1)i[n]=t.charCodeAt(n);return i}catch{return}}function d(t){let n="";for(const i of t)n+=String.fromCharCode(i);return globalThis.btoa(n)}function h(t){if(!a(t))return;const n=c(t,["mediaType","type"]);if(1!==n&&2!==n)return;const i=u(t,["url","content"]);if(void 0===i)return;const e=c(t,["fileEncryptType"]);let o;const r=u(t,["teaKey"]);if(void 0!==r&&(o=s(r)),function(t){return void 0!==t&&1!==t}(e)&&(void 0===o||0===o.length))return;const d=c(t,["width","imageWidth"])??0,h=c(t,["height","imageHeight"])??0,f={kind:2===n?"video":"image",url:i,width:Number.isInteger(d)&&d>0?d:0,height:Number.isInteger(h)&&h>0?h:0},m=c(t,["duration"]);"video"===f.kind&&void 0!==m&&m>0&&(f.durationMs=m);const l=u(t,["thumbUrl","thumbURL","thumbnailUrl","thumbnailURL"]);void 0!==l&&(f.thumbUrl=l);const p=u(t,["thumbData"]);if(void 0!==p){const t=s(p);void 0!==t&&t.length>0&&(f.thumbData=t)}const y=u(t,["md5","MD5"]);void 0!==y&&(f.md5=y);const g=c(t,["fileSize","fileLength"]);void 0!==g&&g>0&&(f.size=g),void 0!==o&&o.length>0&&(f.teaKey=o),void 0!==e&&(f.fileEncryptType=e);const v=function(t,n){for(const i of n){const n=t[i];if("boolean"==typeof n)return n;if("number"==typeof n&&(0===n||1===n))return 1===n;if("true"===n||"false"===n)return"true"===n}}(t,["hd","isHd","isHD"]);return void 0!==v&&(f.hd=v),f}function f(t){const n=JSON.parse(t.content);if(!a(n))throw new Error("媒体合集正文顶层不是对象");let i=n;const e=n.content;if("string"==typeof e&&""!==e){const t=JSON.parse(e);if(!a(t))throw new Error("媒体合集嵌套正文不是对象");i=t}const o=i.items,r=[];if(Array.isArray(o))for(const t of o){const n=h(t);void 0!==n&&r.push(n)}const c={items:r},s=u(i,["caption"]);return void 0!==s&&""!==s.trim()&&(c.caption=s),c}function m(t){return{mediaType:"video"===t.kind?2:1,url:t.url,width:t.width,height:t.height,...void 0!==t.durationMs&&t.durationMs>0?{duration:t.durationMs}:{},...void 0!==t.thumbUrl&&""!==t.thumbUrl?{thumbUrl:t.thumbUrl}:{},...void 0!==t.thumbData&&t.thumbData.length>0?{thumbData:d(t.thumbData)}:{},...void 0!==t.md5&&""!==t.md5?{md5:t.md5}:{},...void 0!==t.size&&t.size>0?{fileSize:t.size}:{},...void 0!==t.teaKey&&t.teaKey.length>0?{teaKey:d(t.teaKey)}:{},...void 0!==t.fileEncryptType?{fileEncryptType:t.fileEncryptType}:{},...void 0!==t.hd?{hd:t.hd}:{}}}function l(t){return(new TextEncoder).encode(t).length}function p(t){if(0===t.items.length)throw new Error("媒体合集正文没有可发送的项");if(t.items.length>9)throw new Error(`媒体合集项数超过上限:${t.items.length} > 9`);if(void 0!==t.caption&&Array.from(t.caption).length>n)throw new Error(`媒体合集配文超过 1200 字符上限:${Array.from(t.caption).length}`);const i=void 0!==t.caption&&""!==t.caption.trim()?t.caption:void 0,e=JSON.stringify({...void 0===i?{}:{caption:i},items:t.items.map(m)}),r=l(e);if(r>=o)throw new Error(`媒体合集正文达到 524288 字节上限:${r}`);const u=t.items.find(t=>void 0!==t.thumbData&&t.thumbData.length>0)?.thumbData;return{contentType:28,content:e,...void 0===u?{}:{thumbData:u}}}export{n as MEDIA_ALBUM_CAPTION_MAX_LENGTH,o as MEDIA_ALBUM_CONTENT_MAX_BYTES,t as MEDIA_ALBUM_CONTENT_TYPE,r as MEDIA_ALBUM_CONTENT_WARN_BYTES,i as MEDIA_ALBUM_MAX_ITEMS,l as measureMediaAlbumContentBytes,p as mediaAlbumBMessageFields,f as parseMediaAlbumBody,e as resolveMediaAlbumSendContentType};
@@ -0,0 +1 @@
1
+ import{encodeConversationKey as e}from"../conversation-identity.js";import{mergeMessageReactions as t}from"../state/message-reactions.js";import{resolveMessageServerTime as i,computeMessageSortKey as o}from"./sort.js";const n={unread:0,delivered:1,read:2};function r(e,t){return n[t]>n[e]?t:e}function d(e,t){return"sent"===e||"sent"===t?"sent":t}function a(e,n,a=""){const s=i(e)??0,c=i(n)??0,y=c>=s,u=y?{...e,...n}:{...n,...e},l=!0===e.readBySelf||!0===n.readBySelf,v=Math.max(s,c),f=Math.min(e.createdAt,n.createdAt),p=void 0===e.extensions&&void 0===n.extensions?void 0:y?{...e.extensions,...n.extensions}:{...n.extensions,...e.extensions},b=o({...u,createdAt:f,serverTime:v,extensions:p}),g="failed"===e.status&&!1===e.failure?.retryable&&"sent"===n.status?"failed":d(e.status,n.status),h="failed"===g?n.failure??e.failure:void 0,T=t(e.reactions,n.reactions,a),N=!0===e.encryption.decryptFailed,U=!0===n.encryption.decryptFailed;let w=u.contentType,I=u.body,A=u.encryption,x=u.mention;N&&!U?(w=n.contentType,I=n.body,A=n.encryption,x=n.mention):!N&&U&&(w=e.contentType,I=e.body,A=e.encryption,x=e.mention),!0!==n.edited||U||(w=n.contentType,I=n.body,A=n.encryption,x=n.mention);const z=e.body.voice?.waveform??n.body.voice?.waveform;if(void 0!==I.voice&&void 0===I.voice.waveform&&void 0!==z&&(I={...I,voice:{...I.voice,waveform:z}}),void 0!==I.video&&void 0===I.video.size){const t=I.video,i=[e.body.video,n.body.video].find(e=>"bytes"===e?.sizeUnit&&void 0!==e.size&&e.url===t.url&&e.fileEncryptType===t.fileEncryptType&&e.md5===t.md5&&m(e.teaKey,t.teaKey)&&(void 0===t.unverifiedFileLength||t.unverifiedFileLength===String(e.size)));void 0!==i&&(I={...I,video:{...t,size:i.size,sizeUnit:"bytes"}})}const E=!0===e.edited||!0===n.edited,S=e.deletedForEveryone??n.deletedForEveryone;if(void 0!==S){const t={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:f,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,n.receipt),sortKey:b,extensions:p,recalled:void 0,deletedForEveryone:S,body:{},encryption:u.encryption};return delete t.reactions,t}const k=e.recalled??n.recalled;if(void 0!==k){const t={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:f,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,n.receipt),sortKey:b,extensions:p,recalled:k,body:{},encryption:u.encryption};return delete t.reactions,t}const K={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:f,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,n.receipt),sortKey:b,extensions:p,contentType:w,body:I,encryption:A,...void 0===T?{}:{reactions:T},...E?{edited:!0}:{}};return void 0!==x?K.mention=x:delete K.mention,K}function s(t,i=""){const o=/* @__PURE__ */new Map;for(const n of t){const t=JSON.stringify([e(n),n.id]),r=o.get(t);o.set(t,void 0===r?n:a(r,n,i))}return[...o.values()]}function c(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.fileName===t.fileName&&e.size===t.size&&e.extension===t.extension&&e.fileType===t.fileType&&e.mimeType===t.mimeType&&e.md5===t.md5&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}function y(e,t){return e===t||void 0!==e&&void 0!==t&&JSON.stringify(e)===JSON.stringify(t)}function u(e,t){return void 0===e||void 0===t?e===t:e.atAll===t.atAll&&e.atUserIds.length===t.atUserIds.length&&(!e.atUserIds.some((e,i)=>e!==t.atUserIds[i])&&function(e,t){if(void 0===e||void 0===t)return e===t;const i=Object.keys(e);return i.length===Object.keys(t).length&&i.every(i=>e[i]===t[i])}(e.atUsersName,t.atUsersName))}function m(e,t){return void 0===e||void 0===t?e===t:e.length===t.length&&e.every((e,i)=>e===t[i])}function l(e,t){return void 0===e||void 0===t?e===t:e.caption===t.caption&&e.items.length===t.items.length&&e.items.every((e,i)=>function(e,t){return e.kind===t.kind&&e.url===t.url&&e.width===t.width&&e.height===t.height&&e.durationMs===t.durationMs&&e.thumbUrl===t.thumbUrl&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.size===t.size&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)&&e.hd===t.hd}(e,t.items[i]))}function v(e,t){return e.id===t.id&&e.conversationId===t.conversationId&&e.conversationType===t.conversationType&&e.senderId===t.senderId&&e.contentType===t.contentType&&JSON.stringify(e.body.customerService)===JSON.stringify(t.body.customerService)&&e.body.text===t.body.text&&function(e,t){return void 0===e||void 0===t?e===t:e.eventType===t.eventType&&e.timelineVisibility===t.timelineVisibility&&e.operatorId===t.operatorId&&e.rawNotifyType===t.rawNotifyType&&e.errcode===t.errcode&&e.fallbackText===t.fallbackText&&function(e,t){return void 0===e||void 0===t?e===t:e.length===t.length&&e.every((e,i)=>e===t[i])}(e.targetUserIds,t.targetUserIds)&&y(e.payload,t.payload)&&y(e.action,t.action)&&y(e.pinnedMessageAction,t.pinnedMessageAction)}(e.body.system,t.body.system)&&e.createdAt===t.createdAt&&e.sortKey===t.sortKey&&e.status===t.status&&e.serverTime===t.serverTime&&e.receipt===t.receipt&&e.readBySelf===t.readBySelf&&e.refMessageId===t.refMessageId&&e.edited===t.edited&&(e.recalled?.by??"")===(t.recalled?.by??"")&&(e.recalled?.at??0)===(t.recalled?.at??0)&&(e.deletedForEveryone?.by??"")===(t.deletedForEveryone?.by??"")&&(e.deletedForEveryone?.at??0)===(t.deletedForEveryone?.at??0)&&(e.deletedForEveryone?.reason??"")===(t.deletedForEveryone?.reason??"")&&function(e,t){return void 0===e||void 0===t?e===t:e.version===t.version&&e.total===t.total&&e.currentUserEmoji===t.currentUserEmoji&&e.events.length===t.events.length&&e.events.every((e,i)=>{const o=t.events[i];return void 0!==o&&e.id===o.id&&e.senderId===o.senderId&&e.emoji===o.emoji&&e.action===o.action&&e.createdAt===o.createdAt})}(e.reactions,t.reactions)&&e.encryption.encrypted===t.encryption.encrypted&&e.encryption.scheme===t.encryption.scheme&&e.encryption.decryptFailed===t.encryption.decryptFailed&&u(e.mention,t.mention)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.imageType===t.imageType&&e.size===t.size&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}(e.body.image,t.body.image)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&e.duration===t.duration&&e.durationUnit===t.durationUnit&&e.sizeUnit===t.sizeUnit&&e.unverifiedFileLength===t.unverifiedFileLength&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.size===t.size&&e.describe===t.describe&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}(e.body.video,t.body.video)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.durationMs===t.durationMs&&e.size===t.size&&e.md5===t.md5&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)&&(e.waveform?.length??0)===(t.waveform?.length??0)}(e.body.voice,t.body.voice)&&c(e.body.file,t.body.file)&&(void 0===e.body.filesAlbum||void 0===t.body.filesAlbum?e.body.filesAlbum===t.body.filesAlbum:e.body.filesAlbum.caption===t.body.filesAlbum.caption&&e.body.filesAlbum.items.length===t.body.filesAlbum.items.length&&e.body.filesAlbum.items.every((e,i)=>c(e,t.body.filesAlbum.items[i])))&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&e.exprType===t.exprType&&e.imageType===t.imageType&&e.size===t.size&&e.describe===t.describe&&e.contentId===t.contentId&&e.packageName===t.packageName&&m(e.thumbData,t.thumbData)}(e.body.sticker,t.body.sticker)&&function(e,t){return void 0===e||void 0===t?e===t:e.targetId===t.targetId&&e.avatar===t.avatar&&e.displayName===t.displayName&&e.username===t.username&&e.gender===t.gender&&e.kind===t.kind&&e.rawKind===t.rawKind}(e.body.contact,t.body.contact)&&function(e,t){return void 0===e||void 0===t?e===t:e.appId===t.appId&&e.host===t.host&&e.developerId===t.developerId&&e.name===t.name&&e.icon===t.icon&&e.productId===t.productId&&e.isDynamicHost===t.isDynamicHost&&e.suffixAddress===t.suffixAddress&&e.showType===t.showType&&e.rawShowType===t.rawShowType&&e.description===t.description&&e.currencySource===t.currencySource&&e.currencyType===t.currencyType&&e.gamePath===t.gamePath&&e.subGameName===t.subGameName&&e.gamePreviewUrl===t.gamePreviewUrl&&e.gamePreviewWidth===t.gamePreviewWidth&&e.gamePreviewHeight===t.gamePreviewHeight}(e.body.miniProgram,t.body.miniProgram)&&function(e,t){return void 0===e||void 0===t?e===t:JSON.stringify(e.modules)===JSON.stringify(t.modules)&&JSON.stringify(e.commands)===JSON.stringify(t.commands)}(e.body.robot,t.body.robot)&&function(e,t){return void 0===e||void 0===t?e===t:e.gameType===t.gameType&&e.value===t.value}(e.body.game,t.body.game)&&function(e,t){return void 0===e||void 0===t?e===t:e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.fromUserName===t.fromUserName&&e.toUserName===t.toUserName&&e.amount===t.amount&&e.currencyType===t.currencyType&&e.status===t.status&&e.serialNumber===t.serialNumber&&e.remark===t.remark&&e.sessionType===t.sessionType&&e.transferTime===t.transferTime&&e.receiveTime===t.receiveTime&&e.returnTime===t.returnTime&&e.isRead===t.isRead&&e.transferMsgId===t.transferMsgId&&e.coinName===t.coinName&&e.coinIcon===t.coinIcon}(e.body.transfer,t.body.transfer)&&function(e,t){return void 0===e||void 0===t?e===t:e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.fromUserName===t.fromUserName&&e.toUserName===t.toUserName&&e.giftType===t.giftType&&e.giftName===t.giftName&&e.giftIcon===t.giftIcon&&e.explain===t.explain&&e.state===t.state&&e.serialNumber===t.serialNumber&&e.sessionType===t.sessionType&&e.initiateTime===t.initiateTime&&e.amount===t.amount&&e.receiveTime===t.receiveTime&&e.returnTime===t.returnTime&&e.isRead===t.isRead&&e.zhangCount===t.zhangCount&&e.benCount===t.benCount&&e.fissionNumber===t.fissionNumber}(e.body.gift,t.body.gift)&&function(e,t){return void 0===e||void 0===t?e===t:e.callKind===t.callKind&&e.outcome===t.outcome&&e.durationMs===t.durationMs&&e.outgoing===t.outgoing}(e.body.call,t.body.call)&&function(e,t){return void 0===e||void 0===t?e===t:e.packetId===t.packetId&&e.packetType===t.packetType&&e.amount===t.amount&&e.count===t.count&&e.showAmount===t.showAmount&&e.thunderRate===t.thunderRate&&e.isThunder===t.isThunder&&e.thunderNumber===t.thunderNumber&&e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.currencyType===t.currencyType&&e.coinName===t.coinName}(e.body.redPacket,t.body.redPacket)&&l(e.body.mediaAlbum,t.body.mediaAlbum)&&function(e,t){return void 0===e||void 0===t?e===t:e.reason===t.reason}(e.body.unknown,t.body.unknown)&&function(e,t){return void 0===e||void 0===t?e===t:e.code===t.code&&e.reason===t.reason}(e.failure,t.failure)}export{s as dedupeById,v as isMessageEqual,a as mergeMessage,r as mergeReceipt,d as mergeSendStatus};
@@ -0,0 +1 @@
1
+ import{CUSTOMER_SERVICE_MESSAGE_TYPE as e,mapIncomingCustomerServiceChat as r}from"./customer-service-message-mapper.js";import{mapIncomingDirectChat as m}from"./message-mapper.js";function s(s,p,o){return s.msgType===e?r(s,p,o):m(s,p,o)}export{s as mapIncomingMesChat};
@@ -0,0 +1 @@
1
+ const e=/^[0-9a-f]{32}$/;function t(t){return e.test(t.replace(/-/g,"").toLowerCase())}function r(){return globalThis.crypto.randomUUID()}function o(e){const r=e.replace(/-/g,"").toLowerCase();if(!t(e))throw new Error(`toWireMsgId: 非法消息 id「${e}」(去横线后非 32 位 hex),拒绝作为出站 sMsgId`);return r}function n(t){const r=t.replace(/-/g,"").toLowerCase();return e.test(r)?r:t}function s(t){const r=t.toLowerCase();return e.test(r)?`${r.slice(0,8)}-${r.slice(8,12)}-${r.slice(12,16)}-${r.slice(16,20)}-${r.slice(20)}`:t}export{s as fromWireMsgId,t as isWireMsgId,r as newClientMessageId,o as toWireMsgId,n as toWireRefMsgId};
@@ -0,0 +1 @@
1
+ import{buildContentBMessageFields as e,parseContentBody as r}from"./content-body.js";import{resolveDirectConversationId as t}from"./conversation.js";import{toWireRefMsgId as d,toWireMsgId as n,fromWireMsgId as o}from"./message-id.js";import{computeSortKey as s}from"./sort.js";import{ErrCode as i}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";function c(e,d,n){const i=e.sFromId.toString(),c=e.sToId.toString(),a=Number(e.msgTime),p=o(e.sMsgId),y=r(d,n.selfId),I=a>0?a:n.receivedAt??Date.now(),m={id:p,conversationId:t(n.selfId,i,c),conversationType:"direct",senderId:i,contentType:y.contentType,body:y.body,createdAt:I,sortKey:s(I,p),status:"sent",receipt:"unread",...!0===n.readBySelf?{readBySelf:!0}:{},encryption:{encrypted:0!==e.encrypt}};return!0===n.decryptFailed&&(m.encryption.decryptFailed=!0),a>0&&(m.serverTime=a),e.parentMsgId&&(m.refMessageId=o(e.parentMsgId)),!0===n.edited&&(m.edited=!0),n.keepRaw&&(m.raw=function(e,r,t){return{cmdId:t,chat:{sMsgId:e.sMsgId,sFromId:e.sFromId.toString(),sToId:e.sToId.toString(),msgType:e.msgType,encrypt:e.encrypt,msgTime:e.msgTime.toString(),extend:e.extend||void 0,encryptVersion:e.encryptVersion||void 0,parentMsgId:e.parentMsgId||void 0},content:{contentType:r.contentType,text:r.content||void 0}}}(e,d,n.cmdId)),m}function a(r,t){return{sToId:BigInt(r.conversationId),sFromId:BigInt(t.selfId),sMsgId:n(r.id),msgType:1,encrypt:r.encryption.encrypted?1:0,bMessage:e(r.body),...void 0!==r.refMessageId&&""!==r.refMessageId?{parentMsgId:d(r.refMessageId)}:{}}}function p(e){return{id:o(e.sMsgId),serverTime:Number(e.sendtime),errcode:e.errcode}}function y(e){switch(e){case i.ERR_CHAT_FORBIDDEN:return{code:e,reason:"rejected",displayCode:"forbiddenOrLeft",retryable:!1};case i.ERR_CHAT_UNHEALTHY:return{code:e,reason:"rejected",displayCode:"contentRejected",retryable:!1};case i.ERR_GROUP_DISMISSED:return{code:e,reason:"rejected",displayCode:"groupDismissed",retryable:!1};case i.ERR_GROUP_NETWORKEXCEPTION:return{code:e,reason:"network",displayCode:"groupUnavailable",retryable:!0};default:return{code:e,reason:"rejected",retryable:!0}}}export{a as buildDirectOutgoingChat,y as classifyAckFailure,p as mapChatAck,c as mapIncomingDirectChat};
@@ -0,0 +1 @@
1
+ import{isWireMsgId as n,fromWireMsgId as o}from"./message-id.js";const t=20;function e(o){const t=/* @__PURE__ */new Set;for(const e of o){const o=e.trim();""!==o&&t.add(n(o)?o.replace(/-/g,""):o)}return[...t]}function i(n,t){const i=void 0===t?void 0:e(t),c=new Set(n),r=/* @__PURE__ */new Set;for(const t of n){if(""===t)continue;const n=o(t);if(void 0!==i){const t=i.filter(t=>o(t)===n);if(0===t.length||!t.every(n=>c.has(n)))continue}r.add(n)}return[...r]}export{t as MESSAGES_BY_ID_BATCH_LIMIT,i as fromWireMissingMessageIds,e as toWireMessageIds};
@@ -0,0 +1 @@
1
+ const r=22;function e(r){const e=r?.trim();return void 0===e||""===e?void 0:e}function i(r){return"number"==typeof r&&Number.isInteger(r)&&r>0?r:void 0}function o(r){switch(r){case 0:return{showType:"default"};case 1:return{showType:"board-game"};case 2:return{showType:"board-game-link"};case 3:return{showType:"game-preview"};default:return{showType:"unknown",rawShowType:r}}}function m(r,e){switch(r){case"default":return 0;case"board-game":return 1;case"board-game-link":return 2;case"game-preview":return 3;case"unknown":if(void 0===e||!Number.isInteger(e)||e<0||e>4294967295||e<=3)throw new Error("miniProgram body: unknown showType 必须提供合法 rawShowType");return e}}function n(r){return"unknown"===r.showType&&3===r.rawShowType}function a(r){if(null===r||"object"!=typeof r)return!1;const e=r;return"string"==typeof e.appId&&""!==e.appId.trim()&&("boolean"==typeof e.isDynamicHost&&("unknown"===e.showType?"number"==typeof e.rawShowType&&Number.isInteger(e.rawShowType)&&e.rawShowType>3&&e.rawShowType<=4294967295:"default"===e.showType||"board-game"===e.showType||"board-game-link"===e.showType||"game-preview"===e.showType))}function t(r){return{appId:r.miniProgramAppId,...void 0===e(r.miniProgramHost)?{}:{host:r.miniProgramHost.trim()},...void 0===e(r.miniProgramDeveloperId)?{}:{developerId:r.miniProgramDeveloperId.trim()},...void 0===e(r.miniProgramName)?{}:{name:r.miniProgramName.trim()},...void 0===e(r.miniProgramIcon)?{}:{icon:r.miniProgramIcon.trim()},...void 0===e(r.miniProgramProductId)?{}:{productId:r.miniProgramProductId.trim()},isDynamicHost:1===r.miniProgramIsDynamicHost,...void 0===e(r.miniProgramSuffixAddress)?{}:{suffixAddress:r.miniProgramSuffixAddress.trim()},...o(r.miniProgramShowType),...void 0===e(r.miniProgramDescription)?{}:{description:r.miniProgramDescription.trim()},...void 0===e(r.currencySource)?{}:{currencySource:r.currencySource.trim()},...void 0===e(r.miniProgramCurrencyType)?{}:{currencyType:r.miniProgramCurrencyType.trim()},...void 0===e(r.miniProgramGamePath)?{}:{gamePath:r.miniProgramGamePath.trim()},...void 0===e(r.miniProgramSubGameName)?{}:{subGameName:r.miniProgramSubGameName.trim()},...void 0===e(r.miniProgramGamePreviewUrl)?{}:{gamePreviewUrl:r.miniProgramGamePreviewUrl.trim()},...void 0===i(r.miniProgramGamePreviewWidth)?{}:{gamePreviewWidth:r.miniProgramGamePreviewWidth},...void 0===i(r.miniProgramGamePreviewHeight)?{}:{gamePreviewHeight:r.miniProgramGamePreviewHeight}}}function d(r){const e=r;if(!a(r))throw new Error(`miniProgram body: 出站字段非法(${String(e.appId)}/${String(e.showType)})`);return{contentType:22,content:"",miniProgramAppId:r.appId,...void 0===r.host?{}:{miniProgramHost:r.host},...void 0===r.developerId?{}:{miniProgramDeveloperId:r.developerId},...void 0===r.name?{}:{miniProgramName:r.name},...void 0===r.icon?{}:{miniProgramIcon:r.icon},...void 0===r.productId?{}:{miniProgramProductId:r.productId},miniProgramIsDynamicHost:r.isDynamicHost?1:0,...void 0===r.suffixAddress?{}:{miniProgramSuffixAddress:r.suffixAddress},miniProgramShowType:m(r.showType,r.rawShowType),...void 0===r.description?{}:{miniProgramDescription:r.description},...void 0===r.currencySource?{}:{currencySource:r.currencySource},...void 0===r.currencyType?{}:{miniProgramCurrencyType:r.currencyType},...void 0===r.gamePath?{}:{miniProgramGamePath:r.gamePath},...void 0===r.subGameName?{}:{miniProgramSubGameName:r.subGameName},...void 0===r.gamePreviewUrl?{}:{miniProgramGamePreviewUrl:r.gamePreviewUrl},...void 0===r.gamePreviewWidth?{}:{miniProgramGamePreviewWidth:r.gamePreviewWidth},...void 0===r.gamePreviewHeight?{}:{miniProgramGamePreviewHeight:r.gamePreviewHeight}}}export{r as MINI_PROGRAM_CONTENT_TYPE,n as isStaleMiniProgramShowTypeProjection,a as isValidMiniProgramBody,d as miniProgramBMessageFields,t as parseMiniProgramBody};
@@ -0,0 +1 @@
1
+ import{throwIfAborted as e}from"../abort.js";import{parseContentBody as t}from"./content-body.js";import{resolveDirectConversationId as n}from"./conversation.js";import{createCryptoBatchPreparation as r}from"./crypto-batch-preparation.js";import{mapIncomingMesChat as s}from"./mes-chat-mapper.js";import{fromWireMsgId as o}from"./message-id.js";import{toWireMessageIds as c,fromWireMissingMessageIds as i}from"./messages-by-id.js";import{mapIncomingDirectReaction as d}from"./reaction-mapper.js";import{getChatMsgByIdReqCodec as a,getChatMsgByIdRespCodec as m,bMessageCodec as p,bContentCodec as g,offlineChatMsgReqCodec as I,offlineChatMsgRespCodec as l,mesChatCodec as y}from"../../../im-protocol/src/protobuf/registry.js";import{CmdId as f}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{CryptoExecutionError as u,isCryptoExecutionError as h}from"../ports/crypto-task-executor.js";function T(e){return I.encode(I.create({userId:BigInt(e.userId),msgId:String(Date.now()),limit:e.limit??100,clientType:e.clientType??0,deliveredMsgInfos:e.deliveredMsgInfos??[]}))}const E=/* @__PURE__ */new Set([f.MES_CHAT_DELIVER,f.MES_CHAT_OPPOSITE_END,f.MES_CHAT_EDIT_MSG_C2C,f.MES_CHAT_EDIT_OPPOSITE_END]),w=p.create({contentType:1,content:""});function v(e){if(void 0!==e.itemErrors&&e.itemErrors.length>0)throw new AggregateError(e.itemErrors.map(e=>e.cause),`离线批次包含无法处理的消息:${e.itemErrors.map(e=>`${e.msgId}(cmd=${e.cmdId})`).join(", ")}`)}function M(e,t,n){const r=l.decode(e),s=[],o=[],c=[];for(const e of r.msgList)try{const r=S(e,t,n);null!==r&&(s.push(r),C(r)),o.push({msgId:e.sMsgId,msgTime:e.msgTime,cmdId:e.cmdId})}catch(t){c.push({msgId:e.sMsgId,cmdId:e.cmdId,cause:t})}return{messages:s,deliveredMsgInfos:o,batchSize:r.msgList.length,responseBytes:e.length,...0===c.length?{}:{itemErrors:c}}}function C(e){if("customerService"===e.conversationType&&(!0===e.encryption.decryptFailed||"malformed-content"===e.body.unknown?.reason))throw new Error("客服离线消息解包失败,未确认投递")}function D(e){const t=y.decode(e.sMsgData);return e.cmdId!==f.MES_CHAT_REACTION_DELIVER?t:{...t,sMsgId:t.sMsgId||e.sMsgId,sFromId:0n===t.sFromId?e.sFromId:t.sFromId,sToId:0n===t.sToId?e.sToId:t.sToId,msgTime:0n===t.msgTime?e.msgTime:t.msgTime,parentMsgId:t.parentMsgId||e.parentMsgId}}function S(e,n,r,c=!1,i){if(e.cmdId===f.MES_CHAT_REACTION_DELIVER){const t=i?.chat??D(e);return n.onReaction?.(d(t,n.selfId)),null}if(!E.has(e.cmdId))return null;const a=i?.chat??D(e);let m=w,I=!1,l=!1;if(0===a.encrypt)try{m=p.decode(a.sContent)}catch{l=!0}else if(1===a.encrypt&&void 0!==r){if(void 0!==i&&void 0===i.content)throw new u("protocol-mismatch");const e=function(e,t,n){const r=void 0===n?t.resolvePrivateKey({msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion}):"no-key"===n.kind?null:"";if(null===r)return t.onDecryptError?.({msgId:e.sMsgId,fromId:String(e.sFromId),toId:String(e.sToId),msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion,reason:"no-key"}),null;try{if("failed"===n?.kind)throw n.cause;if("plain"===n?.kind)return p.decode(n.plain);const s=g.decode(e.sContent);if(0===s.secretKey.length||0===s.cipherData.length)throw new Error(`BContent 字段缺失:secretKey=${s.secretKey.length}B cipherData=${s.cipherData.length}B`);const o=t.crypto.decryptEndToEnd({secretKey:s.secretKey,cipherData:s.cipherData,privateKey:r});return p.decode(o)}catch(n){return t.onDecryptError?.({msgId:e.sMsgId,fromId:String(e.sFromId),toId:String(e.sToId),msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion,reason:"decrypt-failed",cause:n}),null}}(a,r,i?.content);m=e??w,I=null===e}else I=!0;if(I&&1===a.encrypt&&c){const e=function(e,n){if(8!==e[0])return null;try{const r=p.decode(e);if(void 0!==r.$unknown&&r.$unknown.length>0)return null;const s=p.encode(r);if(s.length!==e.length||!s.every((t,n)=>t===e[n]))return null;if(s.length===p.encode(p.create({contentType:r.contentType})).length)return null;const o=t(r,n);return"unknown"===o.contentType||"text"===o.contentType&&""===r.content.trim()?null:r}catch{return null}}(a.sContent,n.selfId);null!==e&&(m=e,I=!1,n.onPlaintextFallback?.({msgId:a.sMsgId,fromId:String(a.sFromId),toId:String(a.sToId),contentType:m.contentType}))}const y=s(a,m,{selfId:n.selfId,cmdId:e.cmdId,receivedAt:n.receivedAt,keepRaw:n.keepRaw,decryptFailed:I,...1===e.isRead?{readBySelf:!0}:{}});return l&&(y.contentType="unknown",y.body={unknown:{reason:"malformed-content"}},y.raw={...y.raw,contentDecodeFailure:{codec:"BMessage",byteLength:a.sContent.length}}),I&&1===a.encrypt&&"direct"===y.conversationType&&r?.onDecryptRecovery?.({conversation:{conversationType:"direct",conversationId:y.conversationId},messageId:y.id,wireEncrypt:1,sContent:a.sContent.slice(),...""===a.encryptVersion?{}:{encryptVersion:a.encryptVersion},cmdId:e.cmdId,source:"offline",createdAt:Date.now()}),void 0===y.refMessageId&&e.parentMsgId&&(y.refMessageId=o(e.parentMsgId)),1===e.isCancel&&(y.recalled={by:y.senderId,at:y.serverTime??y.createdAt},y.body={}),1===e.isEdit&&(y.edited=!0),y}function _(e){return a.encode(a.create({userId:BigInt(e.userId),msgIds:c(e.messageIds),clientType:e.clientType??0}))}function b(e,t,n,r){const s=m.decode(e),o=[];for(const e of s.msgList){const r=S(e,t,n,!0);null!==r&&o.push(r)}return{messages:o,missingMessageIds:i(s.missingMsgIds,r),code:s.code}}function k(t,r,s){e(t.signal),t.assertCurrent?.(void 0===r||void 0===s?void 0:{conversationType:"direct",conversationId:n(s,String(r.sFromId),String(r.sToId))})}async function A(e){k(e),await e.yieldToEventLoop(),k(e)}async function V(e,t,n,s){const o=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map,i=r({...s,assertCurrent:()=>k(s)},(e,t)=>{o.get(e).content=t});for(const[r,d]of e.entries()){if(k(s),r>0&&r%5==0&&await A(s),!E.has(d.cmdId)&&d.cmdId!==f.MES_CHAT_REACTION_DELIVER)continue;let e,a;try{a=D(d)}catch(e){c.set(r,e);continue}k(s,a,t.selfId);const m={chat:a};if(o.set(r,m),E.has(d.cmdId)&&1===a.encrypt&&void 0!==n)try{const t=n.resolvePrivateKey({msgType:a.msgType,encrypt:a.encrypt,encryptVersion:a.encryptVersion});if(null===t)m.content={kind:"no-key"};else try{const n=g.decode(a.sContent);if(0===n.secretKey.length||0===n.cipherData.length)throw new Error("BContent secretKey/cipherData missing");e={itemIndex:r,input:{secretKey:n.secretKey,cipherData:n.cipherData,privateKey:t}}}catch(e){m.content={kind:"failed",cause:e}}}catch(e){if(h(e)||e instanceof Error&&"AbortError"===e.name)throw e;c.set(r,e)}void 0!==e&&await i.add(e)}return await i.finish(),k(s),{rows:o,errors:c}}async function L(e,t,n,r){k(r);const s=l.decode(e),o=await V(s.msgList,t,n,r);k(r);const c=[],i=[],d=[];for(const[e,a]of s.msgList.entries()){k(r),e>0&&e%5==0&&await A(r);const s=o.rows.get(e);k(r,s?.chat,t.selfId);try{if(o.errors.has(e))throw o.errors.get(e);const r=S(a,t,n,!1,s);null!==r&&(c.push(r),C(r)),i.push({msgId:a.sMsgId,msgTime:a.msgTime,cmdId:a.cmdId})}catch(e){if(h(e)||e instanceof Error&&"AbortError"===e.name)throw e;d.push({msgId:a.sMsgId,cmdId:a.cmdId,cause:e})}k(r,s?.chat,t.selfId)}return k(r),{messages:c,deliveredMsgInfos:i,batchSize:s.msgList.length,responseBytes:e.length,...0===d.length?{}:{itemErrors:d}}}async function K(e,t,n,r,s){k(s);const o=m.decode(e),c=await V(o.msgList,t,n,s);k(s);const d=[];for(const[e,r]of o.msgList.entries()){k(s),e>0&&e%5==0&&await A(s);const o=c.rows.get(e);if(k(s,o?.chat,t.selfId),c.errors.has(e))throw c.errors.get(e);const i=S(r,t,n,!0,o);null!==i&&d.push(i),k(s,o?.chat,t.selfId)}return k(s),{messages:d,missingMessageIds:i(o.missingMsgIds,r),code:o.code}}export{v as assertOfflineChatBatchComplete,b as decodeDirectMessagesByIdResponse,K as decodeDirectMessagesByIdResponseAsync,M as decodeDirectOfflineChatBatch,L as decodeDirectOfflineChatBatchAsync,_ as encodeDirectMessagesByIdRequest,T as encodeDirectOfflineChatPullRequest};
@@ -0,0 +1 @@
1
+ var e=Object.defineProperty,r=(r,n,s)=>((r,n,s)=>n in r?e(r,n,{enumerable:!0,configurable:!0,writable:!0,value:s}):r[n]=s)(r,"symbol"!=typeof n?n+"":n,s);import{buildContentBMessageFields as n}from"./content-body.js";import{mapIncomingGroupChat as s}from"./group-message-mapper.js";import{toWireRefMsgId as t,toWireMsgId as o}from"./message-id.js";import{bMessageCodec as i,mesGrpChatCodec as d}from"../../../im-protocol/src/protobuf/registry.js";import{encodeBoardPinnedMessage as a,BoardPinnedMessageCodecError as c,decodeBoardPinnedMessage as I}from"../../../im-protocol/src/board-pinned-message.js";class m extends Error{constructor(e,n,s){super(n,s),r(this,"code"),this.name="PinnedMessageMappingError",this.code=e}}function p(e){return e instanceof c||e instanceof m?e.code:"INVALID_SNAPSHOT"}function g(e,r){const n=I(e),{envelope:t}=n;if(2!==t.convType)throw new m("INVALID_SNAPSHOT","board pinned message convType 必须为 2");if(t.receiverId!==r.conversationId)throw new m("CONVERSATION_MISMATCH","board pinned message receiverId 与通知会话不一致");const o=Number(t.msgTime);if(!Number.isSafeInteger(o)||o<=0)throw new m("INVALID_SNAPSHOT","board pinned message msgTime 超出领域时间范围");let i;try{const e=d.create({sGrpId:BigInt(t.receiverId),sFromId:BigInt(t.senderId),sMsgId:t.msgId,msgType:t.msgType,msgTime:BigInt(t.msgTime),parentMsgId:t.parentMsgId??"",encrypt:0});i=s(e,n.message,{selfId:"",edited:1===t.isEdit})}catch(e){throw new m("INVALID_SNAPSHOT","board pinned message 无法映射为群消息",{cause:e})}const a="unknown"!==i.contentType?{state:"ready",message:i}:{state:"partial",senderId:i.senderId,createdAt:i.createdAt,reason:"unsupported-content"};return{conversationId:r.conversationId,conversationType:"group",messageId:i.id,preview:a,...void 0===r.operatorId?{}:{operatorId:r.operatorId}}}function f(e){if("group"!==e.conversationType||""===e.conversationId||""===e.senderId)throw new m("INVALID_SNAPSHOT","仅支持归属明确的普通群消息置顶");const r=e.serverTime??e.createdAt;if(!Number.isSafeInteger(r)||r<=0)throw new m("INVALID_SNAPSHOT","置顶消息时间非法");const s=i.create(n(e.body)),d=a({envelope:{convType:2,msgContent:"",msgId:o(e.id),msgTime:String(r),msgType:s.contentType,receiverId:e.conversationId,senderId:e.senderId,isBrowse:1,isCancel:0,isEdit:!0===e.edited?1:0,isNotifyAll:!0===e.mention?.atAll?1:0,nIncrId:"0",notifyUsersName:"",parentMsgId:void 0===e.refMessageId?"":t(e.refMessageId),readStatus:"read"===e.receipt?1:0,sendStatus:1},message:s});return{messageContent:d,pinnedMessage:g(d,{conversationId:e.conversationId})}}export{m as PinnedMessageMappingError,f as buildBoardPinnedMessage,g as mapBoardPinnedMessage,p as resolvePinnedMessageActionErrorCode};