k2-im 0.1.58 → 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 (470) hide show
  1. package/README.md +3 -1
  2. package/dist/browser.js +1 -1
  3. package/dist/chat-kit-pinia.d.ts +225 -170
  4. package/dist/chat-kit-pinia.js +1 -1
  5. package/dist/chat-kit-vue.d.ts +64 -44
  6. package/dist/chat-kit-vue.js +1 -1
  7. package/dist/chat-kit.d.ts +226 -171
  8. package/dist/chat-kit.js +1 -1
  9. package/dist/crypto.worker.js +17 -25
  10. package/dist/i18n.d.ts +61 -41
  11. package/dist/i18n.js +1 -1
  12. package/dist/index.d.ts +241 -186
  13. package/dist/index.js +1 -1
  14. package/dist/modules/api-protocol-client/src/bi-feedback.js +1 -0
  15. package/dist/modules/api-protocol-client/src/browser.js +1 -0
  16. package/dist/modules/api-protocol-client/src/client.js +1 -0
  17. package/dist/modules/api-protocol-client/src/config.js +1 -0
  18. package/dist/modules/api-protocol-client/src/constants.js +1 -0
  19. package/dist/modules/api-protocol-client/src/json.js +1 -0
  20. package/dist/modules/api-protocol-client/src/nonce.js +1 -0
  21. package/dist/modules/api-protocol-client/src/transports/axios.js +1 -0
  22. package/dist/modules/api-protocol-client/src/utils.js +1 -0
  23. package/dist/modules/crypto/browser.js +1 -0
  24. package/dist/modules/crypto/driver.js +1 -0
  25. package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -0
  26. package/dist/modules/im-browser/src/crypto/channel-key-service.js +1 -0
  27. package/dist/modules/im-browser/src/crypto/collect-tea.js +1 -0
  28. package/dist/modules/im-browser/src/crypto/crypto-task-executor.js +1 -0
  29. package/dist/modules/im-browser/src/crypto/crypto-worker-factory.js +1 -0
  30. package/dist/modules/im-browser/src/crypto/crypto-worker-protocol.js +1 -0
  31. package/dist/modules/im-browser/src/crypto/encrypt-key-service.js +1 -0
  32. package/dist/modules/im-browser/src/crypto/group-key-service.js +1 -0
  33. package/dist/modules/im-browser/src/crypto/peer-public-key-service.js +1 -0
  34. package/dist/modules/im-browser/src/crypto/rsa-private-key.js +1 -0
  35. package/dist/modules/im-browser/src/crypto/rsa-tea-crypto-adapter.js +1 -0
  36. package/dist/modules/im-browser/src/crypto/stale-key-refresh.js +1 -0
  37. package/dist/modules/im-browser/src/crypto/tea.js +1 -0
  38. package/dist/modules/im-browser/src/crypto/wait-for-key-signal.js +1 -0
  39. package/dist/modules/im-browser/src/http/application-http-adapters.js +1 -0
  40. package/dist/modules/im-browser/src/http/channel-http-adapter.js +1 -0
  41. package/dist/modules/im-browser/src/http/channel-join-application-http-adapter.js +1 -0
  42. package/dist/modules/im-browser/src/http/channel-member-http-adapter.js +1 -0
  43. package/dist/modules/im-browser/src/http/channel-mention-member-http-adapter.js +1 -0
  44. package/dist/modules/im-browser/src/http/cm-http-adapter.js +1 -0
  45. package/dist/modules/im-browser/src/http/directory-http-adapter.js +1 -0
  46. package/dist/modules/im-browser/src/http/expression-http-adapter.js +1 -0
  47. package/dist/modules/im-browser/src/http/lazy-api-protocol-client.js +1 -0
  48. package/dist/modules/im-browser/src/http/profile-http-adapter.js +1 -0
  49. package/dist/modules/im-browser/src/http/requests/applications.js +1 -0
  50. package/dist/modules/im-browser/src/http/requests/bind-robot-conversation.js +1 -0
  51. package/dist/modules/im-browser/src/http/requests/board-pinned-message-validation.js +1 -0
  52. package/dist/modules/im-browser/src/http/requests/channel-join-applications.js +1 -0
  53. package/dist/modules/im-browser/src/http/requests/channel-management.js +1 -0
  54. package/dist/modules/im-browser/src/http/requests/channel-members.js +1 -0
  55. package/dist/modules/im-browser/src/http/requests/channel-mention-members.js +1 -0
  56. package/dist/modules/im-browser/src/http/requests/channel-message-context.js +1 -0
  57. package/dist/modules/im-browser/src/http/requests/channel-mini-program-rel.js +1 -0
  58. package/dist/modules/im-browser/src/http/requests/channel-profile.js +1 -0
  59. package/dist/modules/im-browser/src/http/requests/channel-read-index.js +1 -0
  60. package/dist/modules/im-browser/src/http/requests/contact-blocklist.js +1 -0
  61. package/dist/modules/im-browser/src/http/requests/contact-friendship.js +1 -0
  62. package/dist/modules/im-browser/src/http/requests/contact-report.js +1 -0
  63. package/dist/modules/im-browser/src/http/requests/core-json-request.js +1 -0
  64. package/dist/modules/im-browser/src/http/requests/create-channel.js +1 -0
  65. package/dist/modules/im-browser/src/http/requests/create-face-to-face-group.js +1 -0
  66. package/dist/modules/im-browser/src/http/requests/create-group.js +1 -0
  67. package/dist/modules/im-browser/src/http/requests/customer-service-profile.js +1 -0
  68. package/dist/modules/im-browser/src/http/requests/get-board-pinned-message.js +1 -0
  69. package/dist/modules/im-browser/src/http/requests/get-channel-board-pinned-message.js +1 -0
  70. package/dist/modules/im-browser/src/http/requests/get-channel-secret-key.js +1 -0
  71. package/dist/modules/im-browser/src/http/requests/get-conversation-background-presets.js +1 -0
  72. package/dist/modules/im-browser/src/http/requests/get-group-encrypt-info.js +1 -0
  73. package/dist/modules/im-browser/src/http/requests/get-group-info.js +1 -0
  74. package/dist/modules/im-browser/src/http/requests/get-group-member-list.js +1 -0
  75. package/dist/modules/im-browser/src/http/requests/get-user-encrypt-info.js +1 -0
  76. package/dist/modules/im-browser/src/http/requests/get-user-info-friend.js +1 -0
  77. package/dist/modules/im-browser/src/http/requests/get-user-info-other.js +1 -0
  78. package/dist/modules/im-browser/src/http/requests/group-management.js +1 -0
  79. package/dist/modules/im-browser/src/http/requests/mark-group-read-all.js +1 -0
  80. package/dist/modules/im-browser/src/http/requests/membership-join.js +1 -0
  81. package/dist/modules/im-browser/src/http/requests/pin-board-message.js +1 -0
  82. package/dist/modules/im-browser/src/http/requests/pin-channel-board-message.js +1 -0
  83. package/dist/modules/im-browser/src/http/requests/pull-messages-by-id.js +1 -0
  84. package/dist/modules/im-browser/src/http/requests/pull-offline-channel.js +1 -0
  85. package/dist/modules/im-browser/src/http/requests/pull-offline-chat.js +1 -0
  86. package/dist/modules/im-browser/src/http/requests/pull-offline-group.js +1 -0
  87. package/dist/modules/im-browser/src/http/requests/pull-offline-signal.js +1 -0
  88. package/dist/modules/im-browser/src/http/requests/robot-menu-reply.js +1 -0
  89. package/dist/modules/im-browser/src/http/requests/robot-profile.js +1 -0
  90. package/dist/modules/im-browser/src/http/requests/search-robots.js +1 -0
  91. package/dist/modules/im-browser/src/http/requests/set-conversation-undisturb.js +1 -0
  92. package/dist/modules/im-browser/src/http/requests/set-friend-remark.js +1 -0
  93. package/dist/modules/im-browser/src/http/requests/set-group-nickname.js +1 -0
  94. package/dist/modules/im-browser/src/http/requests/unpin-board-message.js +1 -0
  95. package/dist/modules/im-browser/src/http/requests/unpin-channel-board-message.js +1 -0
  96. package/dist/modules/im-browser/src/http/requests/update-group-info.js +1 -0
  97. package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -0
  98. package/dist/modules/im-browser/src/media/file-md5.js +1 -0
  99. package/dist/modules/im-browser/src/media/image-clipboard.js +1 -0
  100. package/dist/modules/im-browser/src/media/image-header-dimensions.js +1 -0
  101. package/dist/modules/im-browser/src/media/media-downloader.js +1 -0
  102. package/dist/modules/im-browser/src/media/media-preview-adapter.js +1 -0
  103. package/dist/modules/im-browser/src/media/media-preview-preparation-executor.js +1 -0
  104. package/dist/modules/im-browser/src/media/media-request-limiter.js +1 -0
  105. package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -0
  106. package/dist/modules/im-browser/src/media/media-transfer-errors.js +1 -0
  107. package/dist/modules/im-browser/src/media/media-transfer-policy.js +1 -0
  108. package/dist/modules/im-browser/src/media/media-upload-credentials.js +1 -0
  109. package/dist/modules/im-browser/src/media/media-upload-recovery-codec.js +1 -0
  110. package/dist/modules/im-browser/src/media/media-upload-recovery-store.js +1 -0
  111. package/dist/modules/im-browser/src/media/media-upload-source-fingerprint.js +1 -0
  112. package/dist/modules/im-browser/src/media/s3-multipart-uploader.js +1 -0
  113. package/dist/modules/im-browser/src/media/xhr-upload-idle-timeout.js +1 -0
  114. package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -0
  115. package/dist/modules/im-browser/src/network/network-monitor.js +1 -0
  116. package/dist/modules/im-browser/src/scheduling/yield-to-browser.js +1 -0
  117. package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -0
  118. package/dist/modules/im-browser/src/transport/ws-transport.js +1 -0
  119. package/dist/modules/im-browser/src/voice/voice-amplitude.js +1 -0
  120. package/dist/modules/im-browser/src/voice/voice-capabilities.js +1 -0
  121. package/dist/modules/im-browser/src/voice/voice-codec.js +1 -0
  122. package/dist/modules/im-browser/src/voice/voice-errors.js +1 -0
  123. package/dist/modules/im-browser/src/voice/voice-playback.js +1 -0
  124. package/dist/modules/im-browser/src/voice/voice-player.js +1 -0
  125. package/dist/modules/im-browser/src/voice/voice-recorder.js +1 -0
  126. package/dist/modules/im-chat-kit/src/i18n/use-im-text.js +1 -0
  127. package/dist/modules/im-chat-kit/src/pinia/applications.store.js +1 -0
  128. package/dist/modules/im-chat-kit/src/pinia/capabilities.store.js +1 -0
  129. package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -0
  130. package/dist/modules/im-chat-kit/src/pinia/context.js +1 -0
  131. package/dist/modules/im-chat-kit/src/pinia/conversation-activation.js +1 -0
  132. package/dist/modules/im-chat-kit/src/pinia/conversation-deletion.js +1 -0
  133. package/dist/modules/im-chat-kit/src/pinia/conversation-list.store.js +1 -0
  134. package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -0
  135. package/dist/modules/im-chat-kit/src/pinia/history-return-after-send.js +1 -0
  136. package/dist/modules/im-chat-kit/src/pinia/media-transfer-estimate.js +1 -0
  137. package/dist/modules/im-chat-kit/src/pinia/media.store.js +1 -0
  138. package/dist/modules/im-chat-kit/src/pinia/message-operations.store.js +1 -0
  139. package/dist/modules/im-chat-kit/src/pinia/profile-directory.store.js +1 -0
  140. package/dist/modules/im-chat-kit/src/pinia/quoted-message.store.js +1 -0
  141. package/dist/modules/im-chat-kit/src/pinia/reaction.store.js +1 -0
  142. package/dist/modules/im-chat-kit/src/pinia/search-senders.js +1 -0
  143. package/dist/modules/im-chat-kit/src/pinia/search.store.js +1 -0
  144. package/dist/modules/im-chat-kit/src/pinia/session-favorites.store.js +1 -0
  145. package/dist/modules/im-chat-kit/src/pinia/session.store.js +1 -0
  146. package/dist/modules/im-chat-kit/src/pinia/thread-paging.store.js +1 -0
  147. package/dist/modules/im-chat-kit/src/pinia/thread-return-to-latest.js +1 -0
  148. package/dist/modules/im-chat-kit/src/pinia/thread.store.js +1 -0
  149. package/dist/modules/im-chat-kit/src/presentation/channel-mini-program-open.js +1 -0
  150. package/dist/modules/im-chat-kit/src/presentation/channel-mini-program-rels.js +1 -0
  151. package/dist/modules/im-chat-kit/src/presentation/conversation-list.js +1 -0
  152. package/dist/modules/im-chat-kit/src/presentation/conversation-unread.js +1 -0
  153. package/dist/modules/im-chat-kit/src/presentation/delayed-loading-indicator.js +1 -0
  154. package/dist/modules/im-chat-kit/src/presentation/media-source-priority.js +1 -0
  155. package/dist/modules/im-chat-kit/src/presentation/message-notification.js +1 -0
  156. package/dist/modules/im-chat-kit/src/presentation/message-search.js +1 -0
  157. package/dist/modules/im-chat-kit/src/presentation/mini-program-game-preview.js +1 -0
  158. package/dist/modules/im-chat-kit/src/presentation/mini-program-open-url.js +1 -0
  159. package/dist/modules/im-chat-kit/src/runtime/chat-runtime.js +1 -0
  160. package/dist/modules/im-chat-kit/src/runtime/conversation-prefetch-controller.js +1 -0
  161. package/dist/modules/im-chat-kit/src/runtime/media-object-url-registry.js +1 -0
  162. package/dist/modules/im-chat-kit/src/runtime/runtime-operation.js +1 -0
  163. package/dist/modules/im-chat-kit/src/services/capabilities.js +1 -0
  164. package/dist/modules/im-chat-kit/src/services/channel-member-management.service.js +1 -0
  165. package/dist/modules/im-chat-kit/src/services/channel-profile-management.service.js +1 -0
  166. package/dist/modules/im-chat-kit/src/services/channel-send-restriction.js +1 -0
  167. package/dist/modules/im-chat-kit/src/services/direct-contact-management.service.js +1 -0
  168. package/dist/modules/im-chat-kit/src/services/forward.service.js +1 -0
  169. package/dist/modules/im-chat-kit/src/services/group-member-management.service.js +1 -0
  170. package/dist/modules/im-chat-kit/src/services/group-profile-management.service.js +1 -0
  171. package/dist/modules/im-chat-kit/src/services/image-copy.service.js +1 -0
  172. package/dist/modules/im-chat-kit/src/services/media-file-classification.js +1 -0
  173. package/dist/modules/im-chat-kit/src/services/media.service.js +1 -0
  174. package/dist/modules/im-chat-kit/src/services/message.service.js +1 -0
  175. package/dist/modules/im-chat-kit/src/services/pinned-message-rules.js +1 -0
  176. package/dist/modules/im-chat-kit/src/services/pinned-message.service.js +1 -0
  177. package/dist/modules/im-chat-kit/src/services/profile-access.service.js +1 -0
  178. package/dist/modules/im-chat-kit/src/services/profile-directory.service.js +1 -0
  179. package/dist/modules/im-chat-kit/src/services/profile-display.js +1 -0
  180. package/dist/modules/im-chat-kit/src/services/profile.service.js +1 -0
  181. package/dist/modules/im-chat-kit/src/services/read.service.js +1 -0
  182. package/dist/modules/im-chat-kit/src/services/robot-sender-profile.js +1 -0
  183. package/dist/modules/im-chat-kit/src/services/search.service.js +1 -0
  184. package/dist/modules/im-chat-kit/src/services/send.service.js +1 -0
  185. package/dist/modules/im-chat-kit/src/thread/active-date.js +1 -0
  186. package/dist/modules/im-chat-kit/src/thread/create-thread-items.js +1 -0
  187. package/dist/modules/im-chat-kit/src/thread/message-locate-result.js +1 -0
  188. package/dist/modules/im-chat-kit/src/thread/new-message-badge.js +1 -0
  189. package/dist/modules/im-chat-kit/src/thread/resolve-message-body-kind.js +1 -0
  190. package/dist/modules/im-chat-kit/src/thread/resolve-quoted-message-presentation.js +1 -0
  191. package/dist/modules/im-chat-kit/src/thread/viewport-rules.js +1 -0
  192. package/dist/modules/im-chat-kit/src/utils/emoji/emoji-legacy-catalog.json.js +1 -0
  193. package/dist/modules/im-chat-kit/src/utils/emoji/index.js +1 -0
  194. package/dist/modules/im-chat-kit/src/utils/emoji/recent.js +1 -0
  195. package/dist/modules/im-chat-kit/src/utils/emoji/unicode-emoji-catalog.json.js +1 -0
  196. package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -0
  197. package/dist/modules/im-chat-kit/src/utils/highlight.js +1 -0
  198. package/dist/modules/im-chat-kit/src/utils/link.js +1 -0
  199. package/dist/modules/im-chat-kit/src/utils/media-batch.js +1 -0
  200. package/dist/modules/im-chat-kit/src/utils/media-dimensions.js +1 -0
  201. package/dist/modules/im-chat-kit/src/utils/media-format.js +1 -0
  202. package/dist/modules/im-chat-kit/src/utils/media-transfer-presentation.js +1 -0
  203. package/dist/modules/im-chat-kit/src/utils/time-display.js +1 -0
  204. package/dist/modules/im-chat-kit/src/utils/waveform.js +1 -0
  205. package/dist/modules/im-chat-kit/src/vue/thread/ImThreadBodySwitch.js +1 -0
  206. package/dist/modules/im-chat-kit/src/vue/thread/ImThreadItems.js +1 -0
  207. package/dist/modules/im-chat-kit/src/vue/thread/ImThreadSurface.js +1 -0
  208. package/dist/modules/im-chat-kit/src/vue/thread/ImThreadViewport.js +1 -0
  209. package/dist/modules/im-chat-kit/src/vue/thread/message-renderer-registry.js +1 -0
  210. package/dist/modules/im-chat-kit/src/vue/thread/thread-idle-task.js +1 -0
  211. package/dist/modules/im-chat-kit/src/vue/thread/thread-layout-measurements.js +1 -0
  212. package/dist/modules/im-chat-kit/src/vue/thread/thread-read-actions-context.js +1 -0
  213. package/dist/modules/im-chat-kit/src/vue/thread/thread-surface-context.js +1 -0
  214. package/dist/modules/im-chat-kit/src/vue/thread/thread-viewport-context.js +1 -0
  215. package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-target-group.js +1 -0
  216. package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-targets.js +1 -0
  217. package/dist/modules/im-chat-kit/src/vue/thread/use-im-thread-layout-measurement.js +1 -0
  218. package/dist/modules/im-core/src/abort.js +1 -0
  219. package/dist/modules/im-core/src/cache-namespace.js +1 -0
  220. package/dist/modules/im-core/src/connection/backoff.js +1 -0
  221. package/dist/modules/im-core/src/connection/connection-manager.js +1 -0
  222. package/dist/modules/im-core/src/connection/heartbeat-manager.js +1 -0
  223. package/dist/modules/im-core/src/conversation-identity.js +1 -0
  224. package/dist/modules/im-core/src/diagnostics.js +1 -0
  225. package/dist/modules/im-core/src/event-emitter.js +1 -0
  226. package/dist/modules/im-core/src/login/login-handler.js +1 -0
  227. package/dist/modules/im-core/src/mapping/bot-sender.js +1 -0
  228. package/dist/modules/im-core/src/mapping/call-record-body.js +1 -0
  229. package/dist/modules/im-core/src/mapping/channel-message-mapper.js +1 -0
  230. package/dist/modules/im-core/src/mapping/channel-notify-mapper.js +1 -0
  231. package/dist/modules/im-core/src/mapping/channel-offline-mapper.js +1 -0
  232. package/dist/modules/im-core/src/mapping/channel-pinned-message-mapper.js +1 -0
  233. package/dist/modules/im-core/src/mapping/channel-read-position.js +1 -0
  234. package/dist/modules/im-core/src/mapping/contact-body.js +1 -0
  235. package/dist/modules/im-core/src/mapping/content-body.js +1 -0
  236. package/dist/modules/im-core/src/mapping/conversation.js +1 -0
  237. package/dist/modules/im-core/src/mapping/crypto-batch-preparation.js +1 -0
  238. package/dist/modules/im-core/src/mapping/customer-service-body.js +1 -0
  239. package/dist/modules/im-core/src/mapping/customer-service-message-mapper.js +1 -0
  240. package/dist/modules/im-core/src/mapping/decrypt-recovery.js +1 -0
  241. package/dist/modules/im-core/src/mapping/file-body.js +1 -0
  242. package/dist/modules/im-core/src/mapping/files-album-body.js +1 -0
  243. package/dist/modules/im-core/src/mapping/game-body.js +1 -0
  244. package/dist/modules/im-core/src/mapping/gift-body.js +1 -0
  245. package/dist/modules/im-core/src/mapping/group-message-mapper.js +1 -0
  246. package/dist/modules/im-core/src/mapping/group-notify-mapper.js +1 -0
  247. package/dist/modules/im-core/src/mapping/group-offline-mapper.js +1 -0
  248. package/dist/modules/im-core/src/mapping/image-body.js +1 -0
  249. package/dist/modules/im-core/src/mapping/live-room-body.js +1 -0
  250. package/dist/modules/im-core/src/mapping/media-album-body.js +1 -0
  251. package/dist/modules/im-core/src/mapping/merge.js +1 -0
  252. package/dist/modules/im-core/src/mapping/mes-chat-mapper.js +1 -0
  253. package/dist/modules/im-core/src/mapping/message-id.js +1 -0
  254. package/dist/modules/im-core/src/mapping/message-mapper.js +1 -0
  255. package/dist/modules/im-core/src/mapping/messages-by-id.js +1 -0
  256. package/dist/modules/im-core/src/mapping/mini-program-body.js +1 -0
  257. package/dist/modules/im-core/src/mapping/offline-mapper.js +1 -0
  258. package/dist/modules/im-core/src/mapping/pinned-message-mapper.js +1 -0
  259. package/dist/modules/im-core/src/mapping/profile-mapper.js +1 -0
  260. package/dist/modules/im-core/src/mapping/reaction-mapper.js +1 -0
  261. package/dist/modules/im-core/src/mapping/recall-mapper.js +1 -0
  262. package/dist/modules/im-core/src/mapping/red-packet-body.js +1 -0
  263. package/dist/modules/im-core/src/mapping/robot-body.js +1 -0
  264. package/dist/modules/im-core/src/mapping/robot-message-mapper.js +1 -0
  265. package/dist/modules/im-core/src/mapping/search-text.js +1 -0
  266. package/dist/modules/im-core/src/mapping/session-mapper.js +1 -0
  267. package/dist/modules/im-core/src/mapping/signal-offline-mapper.js +1 -0
  268. package/dist/modules/im-core/src/mapping/sort.js +1 -0
  269. package/dist/modules/im-core/src/mapping/sticker-body.js +1 -0
  270. package/dist/modules/im-core/src/mapping/stored-message.js +1 -0
  271. package/dist/modules/im-core/src/mapping/system-event-timeline-policy.js +1 -0
  272. package/dist/modules/im-core/src/mapping/text-segments.js +1 -0
  273. package/dist/modules/im-core/src/mapping/transfer-body.js +1 -0
  274. package/dist/modules/im-core/src/mapping/transfer-status.js +1 -0
  275. package/dist/modules/im-core/src/mapping/unread-divider.js +1 -0
  276. package/dist/modules/im-core/src/mapping/video-body.js +1 -0
  277. package/dist/modules/im-core/src/mapping/voice-body.js +1 -0
  278. package/dist/modules/im-core/src/message-flow/call/direct-call-manager.js +1 -0
  279. package/dist/modules/im-core/src/message-flow/call/direct-call-record.js +1 -0
  280. package/dist/modules/im-core/src/message-flow/call/direct-p2p-call.js +1 -0
  281. package/dist/modules/im-core/src/message-flow/call/group-call-manager.js +1 -0
  282. package/dist/modules/im-core/src/message-flow/call/group-call-record.js +1 -0
  283. package/dist/modules/im-core/src/message-flow/conversation-support.js +1 -0
  284. package/dist/modules/im-core/src/message-flow/edit/edit-frame.js +1 -0
  285. package/dist/modules/im-core/src/message-flow/edit/edit-manager.js +1 -0
  286. package/dist/modules/im-core/src/message-flow/edit/edit-receive-handlers.js +1 -0
  287. package/dist/modules/im-core/src/message-flow/edit/edit-strategy.js +1 -0
  288. package/dist/modules/im-core/src/message-flow/expression/expression-message.js +1 -0
  289. package/dist/modules/im-core/src/message-flow/forward/can-transmit.js +1 -0
  290. package/dist/modules/im-core/src/message-flow/forward/forward-content-spec.js +1 -0
  291. package/dist/modules/im-core/src/message-flow/forward/forward-messages.js +1 -0
  292. package/dist/modules/im-core/src/message-flow/game/game-message.js +1 -0
  293. package/dist/modules/im-core/src/message-flow/gift/gift-message.js +1 -0
  294. package/dist/modules/im-core/src/message-flow/live-room/live-room-message.js +1 -0
  295. package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -0
  296. package/dist/modules/im-core/src/message-flow/mini-program/mini-program-message.js +1 -0
  297. package/dist/modules/im-core/src/message-flow/reaction/can-react.js +1 -0
  298. package/dist/modules/im-core/src/message-flow/reaction/reaction-manager.js +1 -0
  299. package/dist/modules/im-core/src/message-flow/reaction/reaction-receive-handlers.js +1 -0
  300. package/dist/modules/im-core/src/message-flow/read/channel-read-receive-handlers.js +1 -0
  301. package/dist/modules/im-core/src/message-flow/read/channel-read-strategy.js +1 -0
  302. package/dist/modules/im-core/src/message-flow/read/customer-service-read-strategy.js +1 -0
  303. package/dist/modules/im-core/src/message-flow/read/direct-read-sync.js +1 -0
  304. package/dist/modules/im-core/src/message-flow/read/group-read-strategy.js +1 -0
  305. package/dist/modules/im-core/src/message-flow/read/read-strategy.js +1 -0
  306. package/dist/modules/im-core/src/message-flow/read/robot-read-strategy.js +1 -0
  307. package/dist/modules/im-core/src/message-flow/recall/channel-message-deletion-manager.js +1 -0
  308. package/dist/modules/im-core/src/message-flow/recall/recall-frame.js +1 -0
  309. package/dist/modules/im-core/src/message-flow/recall/recall-manager.js +1 -0
  310. package/dist/modules/im-core/src/message-flow/recall/recall-receive-handlers.js +1 -0
  311. package/dist/modules/im-core/src/message-flow/recall/recall-strategy.js +1 -0
  312. package/dist/modules/im-core/src/message-flow/receive/channel-application-receive-handlers.js +1 -0
  313. package/dist/modules/im-core/src/message-flow/receive/channel-notify-receive-handlers.js +1 -0
  314. package/dist/modules/im-core/src/message-flow/receive/channel-receive-handlers.js +1 -0
  315. package/dist/modules/im-core/src/message-flow/receive/command-handler-registry.js +1 -0
  316. package/dist/modules/im-core/src/message-flow/receive/contact-application-answer-receive-handlers.js +1 -0
  317. package/dist/modules/im-core/src/message-flow/receive/contact-application-receive-handlers.js +1 -0
  318. package/dist/modules/im-core/src/message-flow/receive/direct-receive-handlers.js +1 -0
  319. package/dist/modules/im-core/src/message-flow/receive/friend-action-receive-handlers.js +1 -0
  320. package/dist/modules/im-core/src/message-flow/receive/group-event-receive-handlers.js +1 -0
  321. package/dist/modules/im-core/src/message-flow/receive/group-receive-handlers.js +1 -0
  322. package/dist/modules/im-core/src/message-flow/receive/mes-chat-receive-handlers.js +1 -0
  323. package/dist/modules/im-core/src/message-flow/receive/robot-receive-handlers.js +1 -0
  324. package/dist/modules/im-core/src/message-flow/receive/session-favorite-receive-handlers.js +1 -0
  325. package/dist/modules/im-core/src/message-flow/receive/wallet-notify-receive-handlers.js +1 -0
  326. package/dist/modules/im-core/src/message-flow/send/channel-outgoing-frame.js +1 -0
  327. package/dist/modules/im-core/src/message-flow/send/channel-send-strategy.js +1 -0
  328. package/dist/modules/im-core/src/message-flow/send/direct-outgoing-frame.js +1 -0
  329. package/dist/modules/im-core/src/message-flow/send/direct-send-strategy.js +1 -0
  330. package/dist/modules/im-core/src/message-flow/send/group-outgoing-frame.js +1 -0
  331. package/dist/modules/im-core/src/message-flow/send/group-send-strategy.js +1 -0
  332. package/dist/modules/im-core/src/message-flow/send/robot-outgoing-frame.js +1 -0
  333. package/dist/modules/im-core/src/message-flow/send/robot-send-strategy.js +1 -0
  334. package/dist/modules/im-core/src/message-flow/send/send-strategy-registry.js +1 -0
  335. package/dist/modules/im-core/src/message-flow/transfer/transfer-message.js +1 -0
  336. package/dist/modules/im-core/src/outbox/outbox-manager.js +1 -0
  337. package/dist/modules/im-core/src/packet-router.js +1 -0
  338. package/dist/modules/im-core/src/ports/crypto-port.js +1 -0
  339. package/dist/modules/im-core/src/ports/crypto-task-executor.js +1 -0
  340. package/dist/modules/im-core/src/ports/http-port.js +1 -0
  341. package/dist/modules/im-core/src/ports/media-asset-cache-port.js +1 -0
  342. package/dist/modules/im-core/src/push/push-registration.js +1 -0
  343. package/dist/modules/im-core/src/read/read-reporter.js +1 -0
  344. package/dist/modules/im-core/src/request-tracker.js +1 -0
  345. package/dist/modules/im-core/src/session-favorite-album.js +1 -0
  346. package/dist/modules/im-core/src/session-favorite-files.js +1 -0
  347. package/dist/modules/im-core/src/state/channel-permissions.js +1 -0
  348. package/dist/modules/im-core/src/state/channel-restriction-coordinator.js +1 -0
  349. package/dist/modules/im-core/src/state/domain-state.js +1 -0
  350. package/dist/modules/im-core/src/state/draft-store.js +1 -0
  351. package/dist/modules/im-core/src/state/group-restriction-coordinator.js +1 -0
  352. package/dist/modules/im-core/src/state/local-message-window-read-error.js +1 -0
  353. package/dist/modules/im-core/src/state/message-reactions.js +1 -0
  354. package/dist/modules/im-core/src/state/message-store.js +1 -0
  355. package/dist/modules/im-core/src/state/message-window-store.js +1 -0
  356. package/dist/modules/im-core/src/state/pinned-message-coordinator.js +1 -0
  357. package/dist/modules/im-core/src/state/pinned-message-store.js +1 -0
  358. package/dist/modules/im-core/src/state/read-store.js +1 -0
  359. package/dist/modules/im-core/src/state/session-sort.js +1 -0
  360. package/dist/modules/im-core/src/state/session-store.js +1 -0
  361. package/dist/modules/im-core/src/sync/channel-sync-checkpoint.js +1 -0
  362. package/dist/modules/im-core/src/sync/sync-manager.js +1 -0
  363. package/dist/modules/im-i18n/src/catalog/en-US.js +1 -0
  364. package/dist/modules/im-i18n/src/catalog/index.js +1 -0
  365. package/dist/modules/im-i18n/src/catalog/th-TH.js +1 -0
  366. package/dist/modules/im-i18n/src/catalog/vi-VN.js +1 -0
  367. package/dist/modules/im-i18n/src/catalog/zh-CN.js +1 -0
  368. package/dist/modules/im-i18n/src/catalog/zh-TW.js +1 -0
  369. package/dist/modules/im-i18n/src/create-im-i18n.js +1 -0
  370. package/dist/modules/im-i18n/src/format/failure.js +1 -0
  371. package/dist/modules/im-i18n/src/format/last-message.js +1 -0
  372. package/dist/modules/im-i18n/src/format/media.js +1 -0
  373. package/dist/modules/im-i18n/src/format/mention.js +1 -0
  374. package/dist/modules/im-i18n/src/format/service-text.js +1 -0
  375. package/dist/modules/im-i18n/src/format/system-message.js +1 -0
  376. package/dist/modules/im-i18n/src/internal/duration.js +1 -0
  377. package/dist/modules/im-i18n/src/internal/interpolate.js +1 -0
  378. package/dist/modules/im-i18n/src/locale.js +1 -0
  379. package/dist/modules/im-protocol/src/board-pinned-message.js +1 -0
  380. package/dist/modules/im-protocol/src/frame-codec.js +1 -0
  381. package/dist/modules/im-protocol/src/protobuf/gen/channel_pb.js +1 -0
  382. package/dist/modules/im-protocol/src/protobuf/gen/group_pb.js +1 -0
  383. package/dist/modules/im-protocol/src/protobuf/gen/im.app.msg_pb.js +1 -0
  384. package/dist/modules/im-protocol/src/protobuf/gen/im.channel_pb.js +1 -0
  385. package/dist/modules/im-protocol/src/protobuf/gen/im.group_pb.js +1 -0
  386. package/dist/modules/im-protocol/src/protobuf/gen/im.login_pb.js +1 -0
  387. package/dist/modules/im-protocol/src/protobuf/gen/im.msg_pb.js +1 -0
  388. package/dist/modules/im-protocol/src/protobuf/gen/im.pub_pb.js +1 -0
  389. package/dist/modules/im-protocol/src/protobuf/gen/im.robot_pb.js +1 -0
  390. package/dist/modules/im-protocol/src/protobuf/gen/im.sig_pb.js +1 -0
  391. package/dist/modules/im-protocol/src/protobuf/gen/msg_pb.js +1 -0
  392. package/dist/modules/im-protocol/src/protobuf/registry.js +1 -0
  393. package/dist/modules/im-sdk/src/cache-prefix-migration.js +1 -0
  394. package/dist/modules/im-sdk/src/create-im-client.js +1 -0
  395. package/dist/modules/im-sdk/src/domains/channel.js +1 -0
  396. package/dist/modules/im-sdk/src/domains/contact.js +1 -0
  397. package/dist/modules/im-sdk/src/domains/conversation.js +1 -0
  398. package/dist/modules/im-sdk/src/domains/group.js +1 -0
  399. package/dist/modules/im-sdk/src/domains/media-byte-computation.js +1 -0
  400. package/dist/modules/im-sdk/src/domains/media.js +1 -0
  401. package/dist/modules/im-sdk/src/domains/message.js +1 -0
  402. package/dist/modules/im-sdk/src/domains/pinned-message-source.js +1 -0
  403. package/dist/modules/im-sdk/src/domains/pinned-message.js +1 -0
  404. package/dist/modules/im-sdk/src/domains/session.js +1 -0
  405. package/dist/modules/im-sdk/src/product/applications.js +1 -0
  406. package/dist/modules/im-sdk/src/product/calls.js +1 -0
  407. package/dist/modules/im-sdk/src/product/capabilities.js +1 -0
  408. package/dist/modules/im-sdk/src/product/channel-mention-candidates.js +1 -0
  409. package/dist/modules/im-sdk/src/product/conversation-background.js +1 -0
  410. package/dist/modules/im-sdk/src/product/conversation-entry-unread.js +1 -0
  411. package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -0
  412. package/dist/modules/im-sdk/src/product/conversations.js +1 -0
  413. package/dist/modules/im-sdk/src/product/customer-service.js +1 -0
  414. package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -0
  415. package/dist/modules/im-sdk/src/product/diagnostics.js +1 -0
  416. package/dist/modules/im-sdk/src/product/directory.js +1 -0
  417. package/dist/modules/im-sdk/src/product/draft.js +1 -0
  418. package/dist/modules/im-sdk/src/product/emoji-catalog.js +1 -0
  419. package/dist/modules/im-sdk/src/product/emoji-catalog.json.js +1 -0
  420. package/dist/modules/im-sdk/src/product/events.js +1 -0
  421. package/dist/modules/im-sdk/src/product/expressions.js +1 -0
  422. package/dist/modules/im-sdk/src/product/face-to-face-group.js +1 -0
  423. package/dist/modules/im-sdk/src/product/group-calls.js +1 -0
  424. package/dist/modules/im-sdk/src/product/image-format.js +1 -0
  425. package/dist/modules/im-sdk/src/product/local-data.js +1 -0
  426. package/dist/modules/im-sdk/src/product/media.js +1 -0
  427. package/dist/modules/im-sdk/src/product/mention.js +1 -0
  428. package/dist/modules/im-sdk/src/product/message.js +1 -0
  429. package/dist/modules/im-sdk/src/product/messages-by-id.js +1 -0
  430. package/dist/modules/im-sdk/src/product/outbox.js +1 -0
  431. package/dist/modules/im-sdk/src/product/profiles.js +1 -0
  432. package/dist/modules/im-sdk/src/product/resource-uploader.js +1 -0
  433. package/dist/modules/im-sdk/src/product/robots.js +1 -0
  434. package/dist/modules/im-sdk/src/product/search.js +1 -0
  435. package/dist/modules/im-sdk/src/product/session-favorites.js +1 -0
  436. package/dist/modules/im-sdk/src/product/settings.js +1 -0
  437. package/dist/modules/im-sdk/src/runtime/advanced-message-diagnostics.js +1 -0
  438. package/dist/modules/im-sdk/src/runtime/channel-read-summary-refresh.js +1 -0
  439. package/dist/modules/im-sdk/src/runtime/customer-service-legacy-recovery.js +1 -0
  440. package/dist/modules/im-sdk/src/runtime/decrypt-diagnostics.js +1 -0
  441. package/dist/modules/im-sdk/src/runtime/foreground-work-coordinator.js +1 -0
  442. package/dist/modules/im-sdk/src/runtime/group-history-page-boundary.js +1 -0
  443. package/dist/modules/im-sdk/src/runtime/key-prefetch.js +1 -0
  444. package/dist/modules/im-sdk/src/runtime/local-media-preview.js +1 -0
  445. package/dist/modules/im-sdk/src/runtime/media-cache-maintenance.js +1 -0
  446. package/dist/modules/im-sdk/src/runtime/media-upload-recovery.js +1 -0
  447. package/dist/modules/im-sdk/src/runtime/protobuf-wire-shape.js +1 -0
  448. package/dist/modules/im-sdk/src/runtime/receiving-activity.js +1 -0
  449. package/dist/modules/im-sdk/src/runtime/recent-history-fetcher.js +1 -0
  450. package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -0
  451. package/dist/modules/im-sdk/src/runtime/session-http-clients.js +1 -0
  452. package/dist/modules/im-sdk/src/runtime/session-runtime.js +1 -0
  453. package/dist/modules/im-sdk/src/runtime/signal-offline-poller.js +1 -0
  454. package/dist/request-crypto.js +1 -1
  455. package/dist/sdk.d.ts +170 -111
  456. package/dist/sdk.js +1 -1
  457. package/package.json +2 -2
  458. package/dist/browser-GFKMMRZD.js +0 -1
  459. package/dist/browser-RTCHWSQ2.js +0 -2
  460. package/dist/chunk-2U2JMY5V.js +0 -1
  461. package/dist/chunk-B5V2O54N.js +0 -1
  462. package/dist/chunk-I7YY5G76.js +0 -1
  463. package/dist/chunk-IDECJJXC.js +0 -0
  464. package/dist/chunk-PHJQ6QKU.js +0 -2
  465. package/dist/chunk-Q2DEFN53.js +0 -1
  466. package/dist/chunk-SXY56EVC.js +0 -0
  467. package/dist/chunk-TIQ37Q7E.js +0 -2
  468. package/dist/chunk-VMNZGJNM.js +0 -2
  469. package/dist/chunk-WOT6VMZA.js +0 -1
  470. package/dist/chunk-X7ZBIWYF.js +0 -8
@@ -0,0 +1 @@
1
+ function t(t,r){for(const e of r){const r=t[e];if("string"==typeof r&&r.length>0)return r;if("number"==typeof r&&Number.isFinite(r))return String(r)}}function r(t,r){for(const e of r){const r=t[e];if("string"==typeof r){const t=r.trim();if(""!==t)return t}if("number"==typeof r&&Number.isFinite(r))return String(r)}}function e(t,r){for(const e of r){const r=t[e];if("number"==typeof r&&Number.isFinite(r))return r;if("string"==typeof r&&""!==r.trim()&&Number.isFinite(Number(r)))return Number(r)}}const i=["user_id","userId","id","uid"],o=["nick_name","nickName","nickname","name"],n=["remark_name","remarkName"],s=["contact_name","contactName"],u=["head_img_url","headImgUrl","avatar","head_url","headUrl","portrait"],a=["per_signature","signature","sign"],c=["mid"],m=["birthday"],d=["public_key","publicKey"],f=["is_undisturb","isUndisturb"];function l(l){const y=l.user_info,g=null!==y&&"object"==typeof y?y:l,p=t(g,i);if(void 0===p)throw new Error("toUserProfile: 缺少用户 id 字段(user_info.user_id / user_id)");const b={id:p,nickname:t(g,o)??""},v=r(l,n)??r(l,s);void 0!==v&&(b.remark=v);const _=t(g,u);void 0!==_&&(b.avatar=_);const h=t(g,a);void 0!==h&&(b.signature=h);const N=t(g,c);void 0!==N&&(b.miCallId=N);const I=t(g,m);if(void 0!==I){b.birthday=I;const t=function(t){const r=/^(\d{4})(?:-(\d{1,2})(?:-(\d{1,2}))?)?/.exec(t.trim()),e=r?Number(r[1]):Number.NaN;if(!Number.isFinite(e)||e<1900)return;const i=/* @__PURE__ */new Date;let o=i.getFullYear()-e;const n=void 0===r?.[2]?void 0:Number(r[2]),s=void 0===r?.[3]?void 0:Number(r[3]);if(void 0!==n){const t=i.getMonth()+1;(t<n||t===n&&void 0!==s&&i.getDate()<s)&&(o-=1)}return o>=0&&o<200?o:void 0}(I);void 0!==t&&(b.age=t)}const k=function(t){const r=t=>t.map(t=>"string"==typeof t?t.trim():null!==t&&"object"==typeof t&&"string"==typeof t.email?t.email.trim():"").filter(t=>""!==t);for(const e of["extend_email","extendEmail"]){const i=t[e];if(Array.isArray(i))return r(i);if("string"==typeof i&&""!==i.trim()){const t=i.trim();if(t.startsWith("["))try{const e=JSON.parse(t);if(Array.isArray(e))return r(e)}catch{}return[t]}}return[]}(l);k.length>0&&(b.remarkEmail=k);const w=function(t){const r=t=>t.flatMap(t=>{if(null===t||"object"!=typeof t)return[];const r=t,e=r.country_code??r.countryCode;if("string"!=typeof e||"string"!=typeof r.mobile)return[];const i=e.trim(),o=r.mobile.trim();return""===i||""===o?[]:[{countryCode:i,mobile:o}]});for(const e of["extend_mobile","extendMobile"]){const i=t[e];if(Array.isArray(i))return r(i);if("string"==typeof i&&i.trim().startsWith("["))try{const t=JSON.parse(i);if(Array.isArray(t))return r(t)}catch{}}return[]}(l);w.length>0&&(b.remarkPhones=w);const A=t(g,d);void 0!==A&&(b.publicKey=A);const C=e(l,f);return void 0!==C&&(b.muted=1===C),b}const y=["group_id","groupId","id","gid"],g=["group_name","groupName","name"],p=["group_head_img_url","groupHeadImgUrl","head_img_url","headImgUrl","avatar"],b=["total_users","member_count","memberCount","member_num","memberNum"],v=["status"],_=["is_ingroup","isInGroup","isIngroup"],h=["user_id","userId","owner_id","ownerId","master_id","masterId"],N=["verify_way","verifyWay"],I=["invite_code","inviteCode"];function k(r){const i=t(r,y);if(void 0===i)throw new Error("toGroupProfile: 缺少群 id 字段(09b 待核对真实接口字段)");const o={id:i,name:t(r,g)??""},n=t(r,p);void 0!==n&&(o.avatar=n);const s=e(r,b);void 0!==s&&(o.memberCount=s);const u=e(r,v);void 0!==u&&(o.status=u);const a=e(r,_);void 0!==a&&(o.isInGroup=1===a);const c=t(r,h);void 0!==c&&(o.ownerId=c);const m=e(r,N);void 0!==m&&(o.verifyWay=m);const d=t(r,I);void 0!==d&&(o.inviteCode=d);const l=r.to_user;if(null!==l&&"object"==typeof l){const t=e(l,f);void 0!==t&&(o.muted=1===t)}return o}export{k as toGroupProfile,l as toUserProfile};
@@ -0,0 +1 @@
1
+ import{fromWireMsgId as n}from"./message-id.js";import{mesReactionContentCodec as t}from"../../../im-protocol/src/protobuf/registry.js";const e=2;function o(n){if(0!==n&&1!==n)throw new Error(`Reaction action 非法:${n}`);return n}function r(n){const e=t.decode(n);if(""===e.emoji.trim())throw new Error("Reaction emoji 不能为空");return{emoji:e.emoji,action:o(e.action)}}function i(t,e){const o=r(t.sContent),i=t.sFromId.toString();return{id:n(t.sMsgId),conversation:{conversationType:"direct",conversationId:i===e?t.sToId.toString():i},parentMessageId:n(t.parentMsgId),senderId:i,emoji:o.emoji,action:o.action,createdAt:Number(t.msgTime)}}function s(t){const e=r(t.sContent);return{id:n(t.sMsgId),conversation:{conversationType:"group",conversationId:t.sGrpId.toString()},parentMessageId:n(t.parentMsgId),senderId:t.sFromId.toString(),emoji:e.emoji,action:e.action,createdAt:Number(t.msgTime)}}function c(t){const e=r(t.sContent);return{id:n(t.sMsgId),conversation:{conversationType:"channel",conversationId:t.sRadioId.toString()},parentMessageId:n(t.parentMsgId),senderId:t.sFromId.toString(),emoji:e.emoji,action:e.action,createdAt:Number(t.msgTime)}}function a(n){if(2===n.eventType)return!0;if(0!==n.eventType||""===n.parentMsgId||0!==n.encrypt||0===n.sContent.length)return!1;try{const t=r(n.sContent);return/^\[[^[\]\s]+\]$/.test(t.emoji)}catch{return!1}}function d(t){const e=r(t.sContent);return{id:n(t.sMsgId),conversation:{conversationType:"channel",conversationId:t.sChnnId.toString()},parentMessageId:n(t.parentMsgId),senderId:t.sFromId.toString(),emoji:e.emoji,action:e.action,createdAt:Number(t.msgTime)}}export{e as CHANNEL_REACTION_EVENT_TYPE,a as isChannelOfflineReaction,d as mapIncomingChannelOfflineReaction,c as mapIncomingChannelReaction,i as mapIncomingDirectReaction,s as mapIncomingGroupReaction};
@@ -0,0 +1 @@
1
+ import{resolveDirectConversationId as e}from"./conversation.js";import{isWireMsgId as t,fromWireMsgId as n}from"./message-id.js";import{computeSortKey as r}from"./sort.js";function o(t,o){const s=n(t.sMsgId),d=String(t.sFromId),i=Number(t.cancelTime)||Number(t.msgTime)||Date.now(),c=1===t.nCancelType,a=c?String(t.sGroupId):e(o,d,String(t.sToId)),y=Number(t.msgTime)||i;return{id:s,conversationId:a,conversationType:c?"group":"direct",senderId:d,contentType:"text",body:{},createdAt:y,sortKey:r(y,s),status:"sent",receipt:"read",encryption:{encrypted:!1},recalled:{by:d,at:i}}}function s(e){const t=n(e.sMsgId),o=e.sFromId.toString(),s=Number(e.msgTime);return{id:t,conversationId:e.sRadioId.toString(),conversationType:"channel",senderId:o,contentType:"text",body:{},createdAt:s,sortKey:r(s,t),status:"sent",receipt:"read",encryption:{encrypted:!1},recalled:{by:o,at:s}}}function d(e){const t=n(e.sMsgId),o=e.sFromId.toString(),s=Number(e.msgTime);return{id:t,conversationId:e.sRadioId.toString(),conversationType:"channel",senderId:o,contentType:"text",body:{},createdAt:s,sortKey:r(s,t),status:"sent",receipt:"read",encryption:{encrypted:!1},deletedForEveryone:{by:o,at:s,reason:"channel-moderation"}}}function i(e){const t=n(e.sMsgId),o=e.sFromId.toString(),s=Number(e.msgTime),d={id:t,conversationId:e.sChnnId.toString(),conversationType:"channel",senderId:o,contentType:"text",body:{},createdAt:s,serverTime:s,sortKey:r(s,t),status:"sent",receipt:"read",encryption:{encrypted:0!==e.encrypt},extensions:{...""===e.sIndex?{}:{historyCursor:e.sIndex},...0n===e.sIncrId?{}:{channelSequence:e.sIncrId.toString()}}};if(1===e.uOperationType)return{...d,deletedForEveryone:{by:o,at:s,reason:"channel-moderation"}};if(2===e.uOperationType)return{...d,recalled:{by:o,at:s}};throw new Error(`CHANNEL 历史删除类型非法:${e.uOperationType}`)}function c(e,o){if(102!==o.contentType)return null;if(1!==o.type&&2!==o.type)return null;if(!t(o.content))return null;const s=n(o.content),d=o.oprUserId>0n?o.oprUserId.toString():e.senderId.toString(),i=Number(e.msgTime),c={id:s,conversationId:e.channelId.toString(),conversationType:"channel",senderId:d,contentType:"text",body:{},createdAt:i,sortKey:r(i,s),status:"sent",receipt:"read",encryption:{encrypted:0!==e.encrypt}};return 1===o.type?{...c,deletedForEveryone:{by:d,at:i,reason:"channel-moderation"}}:{...c,recalled:{by:d,at:i}}}export{d as buildChannelDeletedPlaceholder,i as buildChannelHistoryRemovalPlaceholder,c as buildChannelOperationNotifyRemoval,s as buildChannelRecalledPlaceholder,o as buildRecalledPlaceholder};
@@ -0,0 +1 @@
1
+ const e=25,t=26;function r(e){const t=e?.trim();return void 0===t||""===t?void 0:t}function o(e,t){if(e<0n)throw new Error(`red packet body: ${t} 非法`);return e.toString()}function n(e,t){const r=e.trim();if(!/^\d+$/.test(r))throw new Error(`red packet body: ${t} 必须为十进制数字`);return BigInt(r)}function d(e){return 1===e||2===e||3===e||4===e}function i(e){if(null===e||"object"!=typeof e)return!1;const t=e;return"string"==typeof t.packetId&&""!==t.packetId.trim()&&(!!d(t.packetType)&&((void 0===t.amount||"string"==typeof t.amount&&""!==t.amount.trim())&&(!!(void 0===t.count||"string"==typeof t.count&&/^\d+$/.test(t.count.trim()))&&((void 0===t.thunderRate||"string"==typeof t.thunderRate)&&(!!(void 0===t.thunderNumber||"string"==typeof t.thunderNumber&&/^\d+$/.test(t.thunderNumber.trim()))&&(!!(void 0===t.fromUid||"string"==typeof t.fromUid&&/^\d+$/.test(t.fromUid.trim()))&&(!!(void 0===t.toUid||"string"==typeof t.toUid&&/^\d+$/.test(t.toUid.trim()))&&(!(void 0!==t.currencyType&&("number"!=typeof t.currencyType||!Number.isInteger(t.currencyType)||t.currencyType<0))&&((void 0===t.coinName||"string"==typeof t.coinName)&&((void 0===t.showAmount||"boolean"==typeof t.showAmount)&&(void 0===t.isThunder||"boolean"==typeof t.isThunder)))))))))))}function c(e){const t=e.radPacketId.trim();if(""===t)throw new Error("red packet body: packetId 缺失");if(!d(e.radPacketType))throw new Error(`red packet body: packetType 非法(${String(e.radPacketType)})`);const n=0n===e.fromUid?void 0:o(e.fromUid,"fromUid"),i=0n===e.toUid?void 0:o(e.toUid,"toUid");return{packetId:t,packetType:e.radPacketType,...void 0===r(e.radPacketAmount)?{}:{amount:e.radPacketAmount.trim()},...0n===e.redPacketCount?{}:{count:e.redPacketCount.toString()},...e.redPacketIsShowAmount?{showAmount:!0}:{},...void 0===r(e.redPacketThunderRate)?{}:{thunderRate:e.redPacketThunderRate.trim()},...e.redPacketIsThunder?{isThunder:!0}:{},...0n===e.redPacketThunderNumber?{}:{thunderNumber:e.redPacketThunderNumber.toString()},...void 0===n?{}:{fromUid:n},...void 0===i?{}:{toUid:i},...0===e.currencyType?{}:{currencyType:e.currencyType},...void 0===r(e.coinName)?{}:{coinName:e.coinName.trim()}}}function u(e){const t=e;if(!i(e))throw new Error(`red packet body: 出站字段非法(${String(t.packetId)}/${String(t.packetType)})`);return{contentType:25,content:"",radPacketId:e.packetId.trim(),radPacketType:e.packetType,...void 0===e.amount?{}:{radPacketAmount:e.amount.trim()},...void 0===e.count?{}:{redPacketCount:n(e.count,"count")},...!0===e.showAmount?{redPacketIsShowAmount:!0}:{},...void 0===e.thunderRate?{}:{redPacketThunderRate:e.thunderRate},...!0===e.isThunder?{redPacketIsThunder:!0}:{},...void 0===e.thunderNumber?{}:{redPacketThunderNumber:n(e.thunderNumber,"thunderNumber")},...void 0===e.fromUid?{}:{fromUid:n(e.fromUid,"fromUid")},...void 0===e.toUid?{}:{toUid:n(e.toUid,"toUid")},...void 0===e.currencyType?{}:{currencyType:e.currencyType},...void 0===e.coinName?{}:{coinName:e.coinName}}}function a(e){const t=o(e.fromUid,"fromUid"),n=o(e.toUid,"toUid");if("0"===t||"0"===n)throw new Error("red packet claim: fromUid/toUid 缺失");const d=!0===e.redPacketIsThunder,i=r(e.radPacketId),c=r(e.radPacketAmount);return{eventType:d?"red_packet_claimed_thunder":"red_packet_claimed",operatorId:n,targetUserIds:[t],payload:{...void 0===i?{}:{packetId:i},...void 0===c?{}:{amount:c},isThunder:d}}}function m(e){return"red_packet_claimed"===e||"red_packet_claimed_thunder"===e}function p(e,t){if(!m(e.eventType))return e;const r=e.operatorId??"",o=e.targetUserIds?.[0]??"";if(void 0!==t&&""!==t&&(t===r||t===o)){if("hidden"!==e.timelineVisibility)return e;const{timelineVisibility:t,...r}=e;return r}return"hidden"===e.timelineVisibility?e:{...e,timelineVisibility:"hidden"}}export{t as RED_PACKET_CLAIM_CONTENT_TYPE,e as RED_PACKET_CONTENT_TYPE,p as applyRedPacketClaimVisibility,m as isRedPacketClaimEvent,i as isValidRedPacketBody,c as parseRedPacketBody,a as parseRedPacketClaimSystem,u as redPacketBMessageFields};
@@ -0,0 +1 @@
1
+ import{bMessageCodec as t}from"../../../im-protocol/src/protobuf/registry.js";const n=18,e=Object.freeze({modules:Object.freeze([]),commands:Object.freeze([])});function r(t){if("string"!=typeof t)return t;const n=t.trim();if(""!==n)try{return JSON.parse(n)}catch{return}}function o(t){if(null!==t&&"object"==typeof t&&!Array.isArray(t))return t}function i(t){return Array.isArray(t)?t:[]}function c(t){if("string"!=typeof t)return;const n=t.trim();return""===n?void 0:n}function m(t){return"number"==typeof t&&Number.isSafeInteger(t)&&t>=0?String(t):c(t)}function s(t){const n=o(t.text),e=c(n?.content)??"",i=function(t){const n=t.trim();if(!n.startsWith("["))return;const e=r(n);if(!Array.isArray(e)||0===e.length)return;if(!e.every(t=>void 0!==o(t)?.type))return;const i=a(e);return i.length>0?i:void 0}(e);return void 0!==i?i:{type:"section",textType:c(n?.type)??"plain-text",content:e}}function u(t){const n=function(t){const n="number"==typeof t?t:"string"==typeof t?Number(t.trim()):Number.NaN;if(Number.isFinite(n)&&!(n<=0))return n>1e12?n:1e3*n}(t.endTime);if(void 0!==n)return{type:"countdown",endTimeMs:n}}function d(t){const n=o(t);if(void 0===n)return;const e=c(n.type);return"divider"!==e&&void 0!==e?"section"===e?s(n):"image-group"===e?function(t){const n=i(t.elements).map(t=>c(o(t)?.src)).filter(t=>void 0!==t);if(0!==n.length)return{type:"image-group",images:Object.freeze(n)}}(n):"countdown"===e?u(n):void 0:void 0}function a(t){const n=Array.isArray(t)?t:i(r(t)),e=[];for(const t of n){const n=d(t);void 0!==n&&("type"in n?e.push(n):e.push(...n))}return Object.freeze(e)}function p(t){const n=o(t),e=c(n?.menu_name)??c(n?.menuName);if(void 0===n||void 0===e)return;const i=m(n.menu_id)??m(n.menuId),s=m(n.msg_type)??m(n.messageType),u=function(t){const n=o("string"==typeof t?r(t):t);if(void 0===n)return;const e=c(n.path),i=c(n.app_id)??c(n.appId),m=c(n.domain);return void 0!==e||void 0!==i||void 0!==m?{...void 0===e?{}:{path:e},...void 0===i?{}:{appId:i},...void 0===m?{}:{domain:m}}:void 0}(n.msg_content??n.content);return{menuName:e,...void 0===i?{}:{menuId:i},...void 0===s?{}:{messageType:s},...void 0===u?{}:{miniProgram:u}}}function f(t){const n=[];for(const e of i(t)){if(Array.isArray(e)){const t=e.map(p).filter(t=>void 0!==t);t.length>0&&n.push(Object.freeze(t));continue}const t=p(e);void 0!==t&&n.push(Object.freeze([t]))}return Object.freeze(n)}function y(t){const n=o(t);return void 0!==n&&("section"===n.type?"string"==typeof n.textType&&"string"==typeof n.content:"image-group"===n.type?Array.isArray(n.images)&&n.images.every(t=>"string"==typeof t&&""!==t.trim()):"countdown"===n.type&&("number"==typeof n.endTimeMs&&Number.isFinite(n.endTimeMs)&&n.endTimeMs>0))}function g(t){const n=o(t);return void 0!==n&&"string"==typeof n.menuName&&""!==n.menuName.trim()}function v(t){const n=o(t);return!(void 0===n||!Array.isArray(n.modules)||!Array.isArray(n.commands))&&(n.modules.every(y)&&n.commands.every(t=>Array.isArray(t)&&t.every(g)))}function l(t){const n=function(t){const n=r(t)??t,e=o(n);if(void 0===e)return{content:n,children:void 0};const i=e.contentType;if(18===i||"18"===i){const t=r(e.content)??e.content,n=o(t);return void 0===n?{content:t,children:void 0}:{content:r(n.content)??n.content,children:n.children}}return{content:r(e.content)??e.content,children:e.children}}(t);return{modules:a(n.content),commands:f(n.children)}}function h(t){try{return l(t.content)}catch{return e}}function b(n,e){if(18!==e?.contentType||void 0===e.text||""===e.text.trim())return;const r=h(t.create({contentType:18,content:e.text}));return 0===r.modules.length&&0===r.commands.length||void 0!==n&&JSON.stringify(n)===JSON.stringify(r)?void 0:r}function A(t){return"section"===t.type?{type:"section",text:{type:t.textType,content:t.content}}:"image-group"===t.type?{type:"image-group",elements:t.images.map(t=>({type:"image",src:t}))}:{type:"countdown",endTime:String(t.endTimeMs)}}function T(t){return{menu_name:t.menuName,...void 0===t.menuId?{}:{menu_id:t.menuId},...void 0===t.messageType?{}:{msg_type:t.messageType},...void 0===t.miniProgram?{}:{msg_content:{...void 0===t.miniProgram.path?{}:{path:t.miniProgram.path},...void 0===t.miniProgram.appId?{}:{app_id:t.miniProgram.appId},...void 0===t.miniProgram.domain?{}:{domain:t.miniProgram.domain}}}}}function N(t){if(!v(t))throw new Error("robot body: 出站字段非法");return{contentType:18,content:JSON.stringify({content:t.modules.map(A),children:t.commands.map(t=>t.map(T))})}}export{n as ROBOT_CONTENT_TYPE,v as isValidRobotBody,h as parseRobotBody,b as repairStoredRobotBody,N as robotBMessageFields};
@@ -0,0 +1 @@
1
+ import{buildContentBMessageFields as t,parseContentBody as e}from"./content-body.js";import{toWireMsgId as r,toWireRefMsgId as o,fromWireMsgId as n}from"./message-id.js";import{computeSortKey as i}from"./sort.js";import{bMessageCodec as d}from"../../../im-protocol/src/protobuf/registry.js";function s(t,e){if(""===t.robotId.trim())throw new Error("robot reply: robotId 缺失");if(t.userId<=0n)throw new Error("robot reply: userId 缺失或非法");return m(t,f(t.content),e)}function c(t,e){if(0===t.content.byteLength)return;const r=t.robotId.trim();if(""===r)throw new Error("robot fixed reply: robotId 缺失");const o=t.userId.trim();if(!/^[1-9]\d*$/.test(o))throw new Error("robot fixed reply: userId 缺失或非法");const n=t.msgId.trim();if(""===n)throw new Error("robot fixed reply: sMsgId 缺失");let i;try{i=d.decode(t.content)}catch(t){const e=t instanceof Error?t.message:String(t);throw new Error(`robot fixed reply: sContent 不是 BMessage(${e})`)}return m({robotId:r,userId:BigInt(o),sMsgId:n,msgTime:t.msgTime},i,e)}function m(t,r,o){const d=n(t.sMsgId),s=Number(t.msgTime),c=s>0?s:o.receivedAt??Date.now(),m=e(r,o.selfId),g={id:d,conversationId:t.robotId,conversationType:"robot",senderId:t.robotId,contentType:m.contentType,body:m.body,createdAt:c,sortKey:i(c,d),status:"sent",receipt:"unread",encryption:{encrypted:!1}};return s>0&&(g.serverTime=s),o.keepRaw&&(g.raw={cmdId:o.cmdId,chat:{sMsgId:t.sMsgId,sFromId:t.robotId,sToId:t.userId.toString(),msgType:11,encrypt:0,msgTime:t.msgTime.toString()},content:{contentType:r.contentType,text:r.content||void 0}}),g}function g(t){if(""===t.msgId.trim())throw new Error("robot ack: msgId 缺失");return{id:n(t.msgId),serverTime:0,errcode:t.errCode}}function y(e,o){if(e.encryption.encrypted)throw new Error("robot 私聊只走明文 JSON(EncryptType.NONE),禁止 encrypt=1");if(""===e.conversationId.trim())throw new Error("robot 出站: robotId 缺失");const n=t(e.body);return{userId:BigInt(o.selfId),robotId:e.conversationId,sMsgId:r(e.id),msgTime:BigInt(e.createdAt),content:p(n,e.refMessageId)}}function f(t){const e=t.trim();if(e.startsWith("{"))try{const t=JSON.parse(e);if(null!==t&&"object"==typeof t&&!Array.isArray(t))return d.create(function(t){const e=u(t.contentType)??1,r="string"==typeof t.content?t.content:"",o=I(t.md5)??I(t.MD5),n=u(t.fileLength);return{contentType:e,content:r,...void 0!==u(t.width)?{width:u(t.width)}:{},...void 0!==u(t.height)?{height:u(t.height)}:{},...void 0!==u(t.duration)?{duration:u(t.duration)}:{},...void 0!==I(t.describe)?{describe:I(t.describe)}:{},...void 0!==o?{MD5:o}:{},...void 0!==u(t.imageType)?{imageType:u(t.imageType)}:{},...void 0!==n&&n>0?{fileLength:BigInt(Math.round(n))}:{}}}(t))}catch{}try{return d.decode((new TextEncoder).encode(t))}catch{return d.create({contentType:1,content:t})}}function p(t,e){const r={contentType:t.contentType,content:t.content};return 1===t.contentType&&(r.logicType=0),void 0!==t.width&&(r.width=t.width),void 0!==t.height&&(r.height=t.height),void 0!==t.duration&&(r.duration=t.duration),void 0!==t.describe&&""!==t.describe&&(r.describe=t.describe),void 0!==t.MD5&&""!==t.MD5&&(r.md5=t.MD5),void 0!==t.imageType&&(r.imageType=t.imageType),void 0!==t.fileLength&&t.fileLength>0n&&(r.fileLength=Number(t.fileLength)),void 0!==e&&""!==e&&(r.parentMsgId=o(e)),JSON.stringify(r)}function u(t){if("number"==typeof t&&Number.isFinite(t))return t;if("string"==typeof t&&""!==t.trim()){const e=Number(t);if(Number.isFinite(e))return e}}function I(t){return"string"==typeof t&&""!==t?t:void 0}export{y as buildOutgoingRobotChat,s as mapIncomingRobotChat,c as mapIncomingRobotFixedChat,g as mapRobotMsgAck,f as parseRobotWireContent};
@@ -0,0 +1 @@
1
+ let e,t;const r={customerService:e=>e.customerService?.text??"",text:e=>e.text??"",file:e=>[e.file?.fileName,e.file?.extension].filter(e=>void 0!==e&&""!==e).join(" "),contact:e=>[e.contact?.displayName,e.contact?.username,e.contact?.targetId].filter(e=>void 0!==e&&""!==e).join(" "),image:()=>"",video:()=>"",voice:()=>"",sticker:()=>"",filesAlbum:e=>[e.filesAlbum?.caption,...e.filesAlbum?.items.map(e=>e.fileName)??[]].filter(Boolean).join(" "),mediaAlbum:e=>e.mediaAlbum?.caption?.trim()??"",miniProgram:e=>[e.miniProgram?.name,e.miniProgram?.description].filter(e=>void 0!==e&&""!==e).join(" "),robot:e=>e.robot?.modules.flatMap(e=>"section"===e.type?[e.content]:[]).filter(e=>""!==e.trim()).join(" ")??"",game:()=>"",transfer:e=>[e.transfer?.fromUserName,e.transfer?.toUserName,e.transfer?.remark,e.transfer?.coinName].filter(e=>void 0!==e&&""!==e).join(" "),gift:e=>[e.gift?.giftName,e.gift?.fromUserName,e.gift?.toUserName,e.gift?.explain].filter(e=>void 0!==e&&""!==e).join(" "),liveRoom:e=>[e.liveRoom?.liveRoomName,e.liveRoom?.broadcasterUserName].filter(e=>void 0!==e&&""!==e).join(" "),call:()=>"",redPacket:e=>e.redPacket?.coinName?.trim()??"",system:()=>"",unknown:()=>""};function n(e){return r[e.contentType](e.body)}async function i(e){const r=e.trim(),n=r.charAt(0);if(/^[A-Z]$/i.test(n))return n.toLocaleUpperCase();if(!/\p{Script=Han}/u.test(n))return"#";const i=(await(t??(t=import("pinyin-pro").then(e=>e.pinyin)),t))(r,{type:"array"}),o=i[0]?.charAt(0).toLocaleUpperCase();return/^[A-Z]$/.test(o??"")?o:"#"}async function o(t){const r=t.trim().toLocaleLowerCase();if(""===r)throw new Error("IM 文本搜索关键词不能为空");const n=r.replace(/[\s'-]+/g,""),i=/^[a-z]+$/.test(n)?await(e??(e=import("pinyin-pro").then(e=>e.match)),e):void 0;return Object.freeze({keyword:r,match(e,t={}){const o=function(e,t){const r=[],n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");for(const t of e.matchAll(new RegExp(n,"giu"))){const e=t.index;r.push(Object.freeze({start:e,end:e+t[0].length}))}return Object.freeze(r)}(e,r);if(o.length>0)return Object.freeze({method:"direct",ranges:o});if(!1===t.pinyin||void 0===i||!/\p{Script=Han}/u.test(e))return null;const a=i(e,n);if(null===a)return null;const c=function(e,t){if(0===t.length)return Object.freeze([]);const r=[...new Set(t)].filter(t=>Number.isSafeInteger(t)&&t>=0&&t<e.length).sort((e,t)=>e-t);if(0===r.length)return Object.freeze([]);const n=[];let i=r[0],o=i;for(const e of r.slice(1))e!==o+1?(n.push(Object.freeze({start:i,end:o+1})),i=e,o=e):o=e;return n.push(Object.freeze({start:i,end:o+1})),Object.freeze(n)}(e,a);return 0===c.length?null:Object.freeze({method:"pinyin",ranges:c})}})}export{o as createImTextSearchMatcher,n as extractSearchText,i as getImTextSearchInitial};
@@ -0,0 +1 @@
1
+ import{resolveMessageTimestamp as e}from"./sort.js";import{classifyStickerImageType as t}from"./sticker-body.js";function n(e){return void 0!==e.recalled||void 0!==e.deletedForEveryone?"":e.body.text??""}function i(e,n={}){if(d(e)){if(void 0!==e.deletedForEveryone){if("channel"===e.conversationType&&!1===n.showChannelModerationDeleted)return;return{kind:"channel-moderation-deleted",by:e.deletedForEveryone.by}}if(void 0!==e.recalled)return{kind:"recalled",by:e.recalled.by};if(!0===e.encryption.decryptFailed)return{kind:"decrypt-failed"};if(void 0!==e.body.customerService){const t=e.body.customerService;return""!==t.text?{kind:"text",text:t.text}:t.images.length>0?{kind:"image"}:t.files.length>0?{kind:"file"}:{kind:"unknown"}}if(e.body.text)return{kind:"text",text:e.body.text};if("image"===e.contentType)return{kind:"image"};if("video"===e.contentType)return{kind:"video"};if("voice"===e.contentType)return void 0!==e.body.voice?.durationMs?{kind:"voice",durationMs:e.body.voice.durationMs}:{kind:"voice"};if("filesAlbum"===e.contentType&&void 0!==e.body.filesAlbum)return{kind:"filesAlbum",count:e.body.filesAlbum.items.length,...void 0===e.body.filesAlbum.caption?{}:{caption:e.body.filesAlbum.caption}};if("file"===e.contentType)return{kind:"file"};if("sticker"===e.contentType)return{kind:t(e.body.sticker?.imageType??0)};if("mediaAlbum"===e.contentType&&void 0!==e.body.mediaAlbum){const t=e.body.mediaAlbum.items,n=e.body.mediaAlbum.caption,i=t[0]?.kind;return{kind:"mediaAlbum",imageCount:t.filter(e=>"image"===e.kind).length,videoCount:t.filter(e=>"video"===e.kind).length,...void 0!==n&&""!==n.trim()?{caption:n}:{},...void 0===i?{}:{firstItemKind:i}}}if("contact"===e.contentType)return{kind:"contact"};if("miniProgram"===e.contentType)return{kind:"miniProgram"};if("robot"===e.contentType)return{kind:"robot"};if("transfer"===e.contentType)return{kind:"transfer"};if("gift"===e.contentType)return{kind:"gift"};if("liveRoom"===e.contentType&&void 0!==e.body.liveRoom){const t=e.body.liveRoom,n=t.liveRoomName?.trim()||t.broadcasterUserName?.trim()||"";return""===n?{kind:"liveRoom"}:{kind:"liveRoom",title:n}}if("call"===e.contentType&&void 0!==e.body.call)return{kind:"call",callKind:e.body.call.callKind};if("redPacket"===e.contentType)return{kind:"redPacket"};if("game"===e.contentType&&void 0!==e.body.game)return{kind:"game",gameType:e.body.game.gameType};if("unknown"===e.contentType)return{kind:"unknown"};if("system"===e.contentType&&void 0!==e.body.system){const{pinnedMessageAction:t,...n}=e.body.system;return{kind:"system",system:n}}return e.encryption.encrypted?{kind:"encrypted"}:void 0}}function o(e,t){return e.eventType===t.eventType&&e.timelineVisibility===t.timelineVisibility&&e.operatorId===t.operatorId&&e.rawNotifyType===t.rawNotifyType&&e.errcode===t.errcode&&e.fallbackText===t.fallbackText&&JSON.stringify(e.action)===JSON.stringify(t.action)&&function(e,t){return void 0===e||void 0===t?e===t:e.length===t.length&&e.every((e,n)=>e===t[n])}(e.targetUserIds,t.targetUserIds)&&function(e,t){return e===t||void 0!==e&&void 0!==t&&JSON.stringify(e)===JSON.stringify(t)}(e.payload,t.payload)}function d(e){return"hidden"!==e.body.system?.timelineVisibility}function r(e,t){if(void 0===e||void 0===t)return e===t;if(e.kind!==t.kind)return!1;switch(e.kind){case"text":return e.text===t.text;case"voice":return e.durationMs===t.durationMs;case"recalled":case"channel-moderation-deleted":return e.by===t.by;case"system":return o(e.system,t.system);case"game":return e.gameType===t.gameType;case"call":return e.callKind===t.callKind;case"liveRoom":return e.title===t.title;case"filesAlbum":{const n=t;return e.count===n.count&&e.caption===n.caption}case"mediaAlbum":{const n=t;return e.imageCount===n.imageCount&&e.videoCount===n.videoCount&&e.caption===n.caption&&e.firstItemKind===n.firstItemKind}case"image":case"gif":case"video":case"file":case"sticker":case"contact":case"miniProgram":case"robot":case"transfer":case"gift":case"redPacket":case"encrypted":case"decrypt-failed":case"unknown":return!0}}function a(e,t){if(void 0!==t&&""!==t?e.senderId===t:e.senderId!==e.conversationId)return"failed"===e.status?"failed":"pending"===e.status||"uploading"===e.status||"sending"===e.status?"sending":void 0}function s(e,t){if(void 0!==t&&""!==t&&e.senderId===t&&"sent"===e.status&&void 0===e.recalled&&void 0===e.deletedForEveryone&&"system"!==e.contentType)return"read"===e.receipt?"read":"unread"}function c(t,o={}){const r="channel"===t.conversationType&&void 0!==t.deletedForEveryone&&!1===o.showChannelModerationDeleted,c=!r&&"system"===t.contentType&&d(t)?t.body.system:void 0,l=r?void 0:"text"===t.contentType?t.mention:void 0;return{id:t.conversationId,type:t.conversationType,title:"",lastMessagePreview:n(t),lastMessageSummary:i(t,o),...r?{}:{lastMessageSenderId:t.senderId},lastMessageSystemEvent:c?.eventType,lastMessageSystemTargetsSelf:void 0!==c&&void 0!==o.selfId&&""!==o.selfId?c.targetUserIds?.includes(o.selfId)??!1:void 0,...void 0!==l?{lastMessageMention:l}:{},...void 0===t.recalled||r?{}:{lastMessageRecalled:{by:t.recalled.by}},...void 0===t.deletedForEveryone||r?{}:{lastMessageDeletedForEveryone:{by:t.deletedForEveryone.by}},timestamp:e(t),unreadCount:o.unreadCount??0,mentionUnreadCount:o.mentionUnreadCount??0,pinned:!1,muted:!1,lastMessageSendState:r?void 0:a(t,o.selfId),lastMessageReceipt:s(t,o.selfId)}}export{d as isMessageVisibleInTimeline,r as lastMessageSummaryEqual,c as sessionFromMessage};
@@ -0,0 +1 @@
1
+ function n(n){if(n<0n)throw new Error("signal offline: varint 不支持负数");const e=[];let t=n;for(;t>=0x80n;)e.push(128|Number(0x7Fn&t)),t>>=7n;return e.push(Number(t)),Uint8Array.from(e)}function e(e,t){const r=Uint8Array.of(e<<3),o=n(t),f=new Uint8Array(1+o.length);return f.set(r,0),f.set(o,1),f}function t(e,t){const r=e<<3|2,o=n(BigInt(t.length)),f=new Uint8Array(1+o.length+t.length);return f[0]=r,f.set(o,1),f.set(t,1+o.length),f}function r(n,e){let t=0n,r=0n,o=e;for(;o<n.length;){const e=BigInt(n[o]);if(o+=1,t|=(0x7Fn&e)<<r,0n==(0x80n&e))return{value:t,offset:o};if(r+=7n,r>63n)throw new Error("signal offline: varint 过长")}throw new Error("signal offline: varint 不完整")}function o(n,e,t){if(0===t)return r(n,e).offset;if(1===t){if(e+8>n.length)throw new Error("signal offline: 64 位字段不完整");return e+8}if(2===t){const t=r(n,e),o=Number(t.value)+t.offset;if(o>n.length)throw new Error("signal offline: 长度字段越界");return o}if(5===t){if(e+4>n.length)throw new Error("signal offline: 32 位字段不完整");return e+4}throw new Error(`signal offline: wire type ${String(t)}`)}function f(n){const r=new TextEncoder,o=[e(1,BigInt(n.userId)),t(2,r.encode(n.msgId??""))];for(const e of n.deliveredMsgIds??[])o.push(t(3,r.encode(e)));return o.push(e(4,BigInt(n.limit??100))),o.push(e(5,BigInt(n.clientType??0))),function(n){const e=n.reduce((n,e)=>n+e.length,0),t=new Uint8Array(e);let r=0;for(const e of n)t.set(e,r),r+=e.length;return t}(o)}function i(n){let e=0,t=0,f=new Uint8Array(0),i="";const s=new TextDecoder;for(;e<n.length;){const l=n[e];e+=1;const u=l>>>3,c=7&l;if(1===u&&0===c){const o=r(n,e);t=Number(o.value),e=o.offset;continue}if(2===u&&2===c){const t=r(n,e),o=t.offset+Number(t.value);if(o>n.length)throw new Error("signal offline: sMsgData 越界");f=new Uint8Array(n.subarray(t.offset,o)),e=o;continue}if(3===u&&2===c){const t=r(n,e),o=t.offset+Number(t.value);if(o>n.length)throw new Error("signal offline: sMsgId 越界");i=s.decode(n.subarray(t.offset,o)),e=o;continue}e=o(n,e,c)}return{cmdId:t,body:f,msgId:i}}function s(n){const e=[];let t=0;for(;t<n.length;){const f=n[t];t+=1;const s=7&f;if(3===f>>>3&&2===s){const o=r(n,t),f=o.offset+Number(o.value);if(f>n.length)throw new Error("signal offline: msgList 越界");e.push(i(n.subarray(o.offset,f))),t=f;continue}t=o(n,t,s)}return{items:e,deliveredMsgIds:e.map(n=>n.msgId).filter(n=>""!==n)}}export{s as decodeOfflineSignalBatch,f as encodeOfflineSignalPullRequest};
@@ -0,0 +1 @@
1
+ function t(t){const e=t.serverTime;return void 0!==e&&Number.isFinite(e)&&e>0&&e<=864e13?e:void 0}function e(e){return t(e)??e.createdAt}function n(t){const n="channel"===t.conversationType?t.extensions?.channelSequence:void 0,o="string"==typeof n&&/^\d+$/.test(n)?`${n.padStart(20,"0")}:${t.id}`:t.id;return r(e(t),o)}function r(t,e){const n=Number.isFinite(t)&&t>0?Math.floor(t):0;return`${String(n).padStart(16,"0")}:${e}`}function o(t,e){return t.sortKey<e.sortKey?-1:t.sortKey>e.sortKey?1:0}export{o as compareBySortKey,n as computeMessageSortKey,r as computeSortKey,t as resolveMessageServerTime,e as resolveMessageTimestamp};
@@ -0,0 +1 @@
1
+ const e=7,t=2,r=1;function i(e){return 1===e?"gif":"sticker"}function n(e){if("string"!=typeof e||""===e.trim())return!1;try{const t=new URL(e.trim());return("https:"===t.protocol||"http:"===t.protocol)&&""===t.username&&""===t.password}catch{return!1}}function o(e){return"number"==typeof e&&Number.isInteger(e)&&e>=0&&e<=4294967295}function a(e){if(2===e.exprType){if(!n(e.content))throw new Error("sticker body: LINK URL 非法");if(!o(e.width)||!o(e.height))throw new Error("sticker body: LINK 尺寸非法")}const t={url:e.content,width:e.width,height:e.height,exprType:e.exprType,imageType:e.imageType};return e.fileLength>0n&&(t.size=Number(e.fileLength)),""!==e.describe&&(t.describe=e.describe),""!==e.contentId&&(t.contentId=e.contentId),""!==e.exprePackageName&&(t.packageName=e.exprePackageName),e.thumbData.length>0&&(t.thumbData=e.thumbData),t}function c(e){if(2===e.exprType){if(!n(e.url))throw new Error("sticker body: 出站 LINK URL 非法");if(!o(e.width)||0===e.width||!o(e.height)||0===e.height)throw new Error("sticker body: 出站 LINK 尺寸必须为正 uint32")}return{contentType:7,content:e.url,width:e.width,height:e.height,exprType:e.exprType,imageType:e.imageType,...void 0!==e.size&&e.size>0?{fileLength:BigInt(e.size)}:{},...void 0!==e.describe&&""!==e.describe?{describe:e.describe}:{},...void 0!==e.contentId&&""!==e.contentId?{contentId:e.contentId}:{},...void 0!==e.packageName&&""!==e.packageName?{exprePackageName:e.packageName}:{},...void 0!==e.thumbData&&e.thumbData.length>0?{thumbData:e.thumbData}:{}}}export{r as GIF_STICKER_IMAGE_TYPE,t as LINK_STICKER_EXPR_TYPE,e as STICKER_CONTENT_TYPE,i as classifyStickerImageType,n as isValidLinkStickerUrl,o as isValidStickerWireDimension,a as parseStickerBody,c as stickerBMessageFields};
@@ -0,0 +1 @@
1
+ import{isValidCallRecordBody as o}from"./call-record-body.js";import{normalizeChannelNotifyTimelineVisibility as e,backfillLegacyChannelNotify as t}from"./channel-notify-mapper.js";import{isValidGameBody as n}from"./game-body.js";import{normalizeGroupNotifySemantics as i}from"./group-notify-mapper.js";import{repairStoredRobotBody as d}from"./robot-body.js";import{normalizeSystemEventTimelineVisibility as r}from"./system-event-timeline-policy.js";import{normalizeStoredVideoBody as s}from"./video-body.js";const u=-5,p=-4,a=/* @__PURE__ */new Set(["image","video","voice","file","sticker"]);function c(u){let p=i(e(t(u)));if(void 0!==p.body.video){const o=s(p.body.video);o!==p.body.video&&(p={...p,body:{...p.body,video:o}})}if(void 0===p.body.game||n(p.body.game)||(p={...p,contentType:"unknown",body:{unknown:{reason:"malformed-content"}}}),void 0===p.body.call||o(p.body.call)||(p={...p,contentType:"unknown",body:{unknown:{reason:"malformed-content"}}}),"robot"===p.contentType){const o=d(p.body.robot,p.raw?.content);void 0!==o&&(p={...p,body:{...p.body,robot:o}})}const a=function(o){const e=[];return void 0!==o.customerService&&e.push("customerService"),void 0!==o.text&&e.push("text"),void 0!==o.system&&e.push("system"),void 0!==o.image&&e.push("image"),void 0!==o.video&&e.push("video"),void 0!==o.voice&&e.push("voice"),void 0!==o.file&&e.push("file"),void 0!==o.sticker&&e.push("sticker"),void 0!==o.contact&&e.push("contact"),void 0!==o.miniProgram&&e.push("miniProgram"),void 0!==o.game&&e.push("game"),void 0!==o.transfer&&e.push("transfer"),void 0!==o.gift&&e.push("gift"),void 0!==o.call&&e.push("call"),void 0!==o.redPacket&&e.push("redPacket"),void 0!==o.filesAlbum&&e.push("filesAlbum"),void 0!==o.mediaAlbum&&e.push("mediaAlbum"),void 0!==o.robot&&e.push("robot"),void 0!==o.liveRoom&&e.push("liveRoom"),void 0!==o.unknown&&e.push("unknown"),1===e.length?e[0]:void 0}(p.body);if(void 0!==a&&a!==p.contentType&&(p={...p,contentType:a}),p=r(p),"text"!==p.contentType||void 0===p.extensions?.unsupportedContentType)return p;const{unsupportedContentType:c,...v}=p.extensions;return{...p,contentType:"unknown",body:{unknown:{reason:"unsupported-content-type"}},...0===Object.keys(v).length?{extensions:void 0}:{extensions:v}}}function v(o){if("uploading"===o.status){const e=a.has(o.contentType)?o.contentType:void 0;return{...o,status:"failed",failure:{code:-5,reason:"unknown",displayCode:"media.uploadInterrupted",...void 0!==e?{mediaKind:e}:{},retryable:!1}}}if("failed"===o.status&&-4===o.failure?.code){const e="video"===o.contentType||"file"===o.contentType?o.contentType:void 0,t=void 0===e?o.failure.displayCode:"media.uploadInterrupted";return!1!==o.failure.retryable||o.failure.displayCode!==t||void 0!==e&&o.failure.mediaKind!==e?{...o,failure:{...o.failure,...void 0===t?{}:{displayCode:t},...void 0===e?{}:{mediaKind:e},retryable:!1}}:o}return o}export{p as LOCAL_MEDIA_ERROR_CODE,u as LOCAL_UPLOAD_INTERRUPTED_CODE,v as failInterruptedUpload,c as normalizeStoredMessageContent};
@@ -0,0 +1 @@
1
+ import{isRedPacketClaimEvent as e}from"./red-packet-body.js";const n=/* @__PURE__ */new Set(["group_info_changed","group_member_renamed","channel_name_changed","channel_avatar_changed","channel_all_muted","channel_all_unmuted","channel_private_chat_disabled","channel_private_chat_enabled","channel_member_renamed"]);function t(t){const i="system"===t.contentType?t.body.system:void 0;if(void 0===i)return t;if(e(i.eventType))return t;if(!function(e,n){return n.startsWith("group_")?"group"===e.conversationType:n.startsWith("channel_")?"channel"===e.conversationType:!n.startsWith("direct_")||"direct"===e.conversationType}(t,i.eventType))return t;const r=n.has(i.eventType);if(r===("hidden"===i.timelineVisibility))return t;const a={...i};return r?a.timelineVisibility="hidden":delete a.timelineVisibility,{...t,body:{...t.body,system:a}}}export{t as normalizeSystemEventTimelineVisibility};
@@ -0,0 +1 @@
1
+ const t=["@所有人","@All","@Tất cả","@ทั้งหมด"];function e(t,e){if(""===t)return[{kind:"text",text:""}];const n=[...s(t,e)];if(void 0!==e.matchers)for(const s of e.matchers)n.push(...s(t));return 0===n.length?[{kind:"text",text:t}]:(n.sort((t,e)=>t.start-e.start||e.end-t.end),function(t,e){const n=[];let s=0;for(const r of e)r.start<s||r.start<0||r.end<r.start||r.end+1>t.length||(r.start>s&&n.push({kind:"text",text:t.slice(s,r.start)}),n.push(r.segment),s=r.end+1);s<t.length&&n.push({kind:"text",text:t.slice(s)});return n.length>0?n:[{kind:"text",text:t}]}(t,n))}function n(t,e){return{kind:"mention",text:`@${e.resolveName(t)}`,userId:t,atAll:!1,isMe:t===e.selfId}}function s(e,s){const r=s.mention;if(void 0===r)return[];const i=r.atAll?function(t){const e=t.filter(t=>""!==t);if(0===e.length)return/\[(\d+)\]/g;const n=[...e].sort((t,e)=>e.length-t.length).map(t=>{return`${e=t,e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?![A-Za-z0-9])`;var e}).join("|");return new RegExp(`\\[(\\d+)\\]|${n}`,"g")}(s.atAllTexts??t):/\[(\d+)\]/g,o=[];let l=i.exec(e);for(;null!==l;){const t=l[1];if(void 0!==t&&!r.atUserIds.includes(t)){l=i.exec(e);continue}const c=void 0===t?{kind:"mention",text:s.atAllDisplay??l[0],atAll:!0,isMe:!0}:n(t,s);o.push({start:l.index,end:l.index+l[0].length-1,segment:c}),l=i.exec(e)}return o}export{e as resolveTextSegments};
@@ -0,0 +1 @@
1
+ const e=16;function r(e){const r=e?.trim();return void 0===r||""===r?void 0:r}function t(e,r){if(e<0n)throw new Error(`transfer body: ${r} 非法`);return e.toString()}function i(e,r){const t=e.trim();if(!/^\d+$/.test(t))throw new Error(`transfer body: ${r} 必须为十进制数字`);return BigInt(t)}function n(e){return 0===e||1===e||2===e||3===e}function o(e){return 1===e||2===e}function s(e){if(null===e||"object"!=typeof e)return!1;const r=e;return!("string"!=typeof r.fromUid||!/^\d+$/.test(r.fromUid.trim()))&&(!("string"!=typeof r.toUid||!/^\d+$/.test(r.toUid.trim()))&&(!("string"!=typeof r.amount||!/^\d+$/.test(r.amount.trim()))&&(!("string"!=typeof r.serialNumber||!/^\d+$/.test(r.serialNumber.trim()))&&(!("number"!=typeof r.currencyType||!Number.isInteger(r.currencyType)||r.currencyType<0)&&(!("number"!=typeof r.transferTime||!Number.isSafeInteger(r.transferTime)||r.transferTime<0)&&(!!n(r.status)&&!!o(r.sessionType)))))))}function m(e){const i=e.status;if(!n(i))throw new Error(`transfer body: status 非法(${String(i)})`);const s=e.sessionType;if(!o(s))throw new Error(`transfer body: sessionType 非法(${String(s)})`);return{fromUid:t(e.fromUid,"fromUid"),toUid:t(e.toUid,"toUid"),amount:t(e.amount,"amount"),currencyType:e.currencyType,status:i,serialNumber:t(e.serialNumber,"serialNumber"),sessionType:s,transferTime:Number(e.transferTime),...void 0===r(e.fromUserName)?{}:{fromUserName:e.fromUserName.trim()},...void 0===r(e.toUserName)?{}:{toUserName:e.toUserName.trim()},...void 0===r(e.remark)?{}:{remark:e.remark.trim()},...0n===e.receiveTime?{}:{receiveTime:Number(e.receiveTime)},...0n===e.returnTime?{}:{returnTime:Number(e.returnTime)},...0===e.isRead?{}:{isRead:1===e.isRead},...void 0===r(e.msgId)?{}:{transferMsgId:e.msgId.trim()},...void 0===r(e.coinName)?{}:{coinName:e.coinName.trim()},...void 0===r(e.coinIcon)?{}:{coinIcon:e.coinIcon.trim()}}}function a(e){const r=e;if(!s(e))throw new Error(`transfer body: 出站字段非法(${String(r.serialNumber)}/${String(r.status)})`);return{contentType:16,content:"",fromUid:i(e.fromUid,"fromUid"),toUid:i(e.toUid,"toUid"),amount:i(e.amount,"amount"),currencyType:e.currencyType,status:e.status,serialNumber:i(e.serialNumber,"serialNumber"),sessionType:e.sessionType,transferTime:BigInt(e.transferTime),...void 0===e.fromUserName?{}:{fromUserName:e.fromUserName},...void 0===e.toUserName?{}:{toUserName:e.toUserName},...void 0===e.remark?{}:{remark:e.remark},...void 0===e.receiveTime?{}:{receiveTime:BigInt(e.receiveTime)},...void 0===e.returnTime?{}:{returnTime:BigInt(e.returnTime)},...void 0===e.isRead?{}:{isRead:e.isRead?1:0},...void 0===e.transferMsgId?{}:{msgId:e.transferMsgId},...void 0===e.coinName?{}:{coinName:e.coinName},...void 0===e.coinIcon?{}:{coinIcon:e.coinIcon}}}export{e as TRANSFER_CONTENT_TYPE,s as isValidTransferBody,m as parseTransferBody,a as transferBMessageFields};
@@ -0,0 +1 @@
1
+ function e(e,t){return"transfer"===e.contentType&&void 0!==e.body.transfer&&e.body.transfer.serialNumber===t}function t(e,t){return{...e,status:t.status,...void 0===t.receiveTime?{}:{receiveTime:t.receiveTime},...void 0===t.returnTime?{}:{returnTime:t.returnTime},...void 0===t.isRead?{}:{isRead:t.isRead}}}function r(e){const t=e.body.transfer,r=(1===t?.status?t.receiveTime:2===t?.status||3===t?.status?t.returnTime:void 0)??e.serverTime??e.createdAt;return!Number.isFinite(r)||r<=0?0:r<1e12?1e3*r:r}function n(e,t){const n=e.body.transfer,s=t.body.transfer;if(void 0===n)return t;if(void 0===s)return e;if(0===n.status&&0!==s.status)return t;if(0===s.status&&0!==n.status)return e;const i=r(e),o=r(t);return i!==o?o>i?t:e:n.status!==s.status?s.status>n.status?t:e:void 0!==t.serverTime&&void 0===e.serverTime?t:e}function s(e){const t=e.body.transfer;return"transfer"!==e.contentType||void 0===t?null:`${e.conversationType}\0${e.conversationId}\0${t.serialNumber}`}function i(e,t){return e.status===t.status&&e.receiveTime===t.receiveTime&&e.returnTime===t.returnTime&&e.isRead===t.isRead}function o(e,r){const o=/* @__PURE__ */new Map,u=new Set(r.map(e=>e.id)),a=new Map(r.map(e=>[e.id,e]));for(const e of r){const t=s(e);null!==t&&o.set(t,[...o.get(t)??[],e])}if(0===o.size)return[...r];for(const t of e){const e=s(t);null!==e&&o.has(e)&&!u.has(t.id)&&o.get(e)?.push(t)}const c=[];for(const e of o.values()){const r=e.reduce(n).body.transfer;if(void 0!==r)for(const n of e){const e=n.body.transfer;if(void 0===e||i(e,r))continue;const s={...n,body:{transfer:t(e,r)}};u.has(n.id)?a.set(n.id,s):c.push(s)}}return[...r.map(e=>a.get(e.id)??e),...c]}function u(t,r,s,o){const u=[];for(const a of t){if(!e(a,r))continue;const t=a.body.transfer;if(void 0===t)continue;const c={...t,status:s,...1===s&&void 0!==o?{receiveTime:o}:{},...2===s||3===s?{returnTime:o??t.returnTime}:{}},f={...a,body:{transfer:c}};n(a,f)!==f||i(t,c)||u.push({...a,body:{transfer:c}})}return u}export{t as applyTransferStatusToBody,u as collectTransferStatusBySerialNumber,o as synchronizeTransferStatusMessages};
@@ -0,0 +1 @@
1
+ function e(e,t){return!0!==e.readBySelf&&("system"===e.contentType?"direct"===e.conversationType?"direct_contact_established"===e.body.system?.eventType||"direct_contact_required"===e.body.system?.eventType:"group"===e.conversationType||"channel"===e.conversationType:""!==t?e.senderId!==t:"direct"===e.conversationType&&e.senderId===e.conversationId)}export{e as isConversationUnreadMessage};
@@ -0,0 +1 @@
1
+ const e=3,t=1e3;function i(e){const i={url:e.content,width:e.width,height:e.height};e.hd&&(i.hd=!0);const r=function(e){const i=e.duration;if(!Number.isFinite(i)||i<=0)return;const r=0===e.fileEncryptType&&0===e.width&&0===e.height&&i%t===0&&i/t<=300;return n(e.fileEncryptType,e.teaKey)||r?i/t:i}(e);return void 0!==r&&(i.duration=r,r!==e.duration&&(i.durationUnit="seconds")),e.thumbData.length>0&&(i.thumbData=e.thumbData),""!==e.describe&&(i.describe=e.describe),""!==e.MD5&&(i.md5=e.MD5),e.fileLength>0n&&(i.unverifiedFileLength=e.fileLength.toString()),e.teaKey.length>0&&(i.teaKey=e.teaKey),0!==e.fileEncryptType&&(i.fileEncryptType=e.fileEncryptType),i}function n(e,t){return(void 0===e||0===e)&&(t?.length??0)>0}function r(e){if(void 0!==e.size&&"bytes"!==e.sizeUnit){const{size:t,...i}=e;e={...i,...void 0===i.unverifiedFileLength&&Number.isSafeInteger(t)&&t>0?{unverifiedFileLength:String(Math.round(t/1024))}:{}}}return"seconds"===e.durationUnit||void 0===e.duration||!Number.isFinite(e.duration)||e.duration<=0||!n(e.fileEncryptType,e.teaKey)||0===e.width&&0===e.height&&e.duration<=300?e:{...e,duration:e.duration/t,durationUnit:"seconds"}}function d(e){const i=n(e.fileEncryptType,e.teaKey)?t:1,r=function(e){if(void 0!==e.size){if(!Number.isSafeInteger(e.size)||e.size<0)throw new RangeError("视频 size 必须为非负安全整数字节数");return 0===e.size?void 0:BigInt(e.size)}if(void 0===e.unverifiedFileLength)return;if(!/^\d{1,20}$/.test(e.unverifiedFileLength)||BigInt(e.unverifiedFileLength)>0xFFFFFFFFFFFFFFFFn)throw new RangeError("视频历史 fileLength 必须为 uint64 十进制整数");return BigInt(e.unverifiedFileLength)}(e);return{contentType:3,content:e.url,width:e.width,height:e.height,...!0===e.hd?{hd:!0}:{},...void 0!==e.duration&&Number.isFinite(e.duration)&&e.duration>0?{duration:Math.max(1,Math.round(e.duration*i))}:{},...void 0!==e.thumbData&&e.thumbData.length>0?{thumbData:e.thumbData}:{},...void 0!==e.describe&&""!==e.describe?{describe:e.describe}:{},...void 0!==e.md5&&""!==e.md5?{MD5:e.md5}:{},...void 0===r?{}:{fileLength:r},...void 0!==e.teaKey&&e.teaKey.length>0?{teaKey:e.teaKey}:{},...void 0!==e.fileEncryptType&&0!==e.fileEncryptType?{fileEncryptType:e.fileEncryptType}:{}}}export{e as VIDEO_CONTENT_TYPE,r as normalizeStoredVideoBody,i as parseVideoBody,d as videoBMessageFields};
@@ -0,0 +1 @@
1
+ const e=4;function t(e){const t={url:e.content,durationMs:e.duration};return""!==e.MD5&&(t.md5=e.MD5),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 n(e){return{contentType:4,content:e.url,duration:Math.max(0,Math.round(e.durationMs)),...void 0!==e.md5&&""!==e.md5?{MD5:e.md5}:{},...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 VOICE_CONTENT_TYPE,t as parseVoiceBody,n as voiceBMessageFields};
@@ -0,0 +1 @@
1
+ import{toWireMsgId as e,newClientMessageId as n}from"../../mapping/message-id.js";import{upsertDirectCallRecord as r}from"./direct-call-record.js";import{requireNumericUserId as d,requireCallId as o,mapSignalCallType as i,isInviteExpired as t,mapAnswerErrcode as c,mapHangupReasonCode as l,peerBeginNotifyType as a,toHangupReasonCode as s,toAnswerErrcode as I,DIRECT_CALL_INVITE_TTL_MS as g,PEER_AUDIO_BEGIN_VALUE_CALLER as m,PEER_AUDIO_BEGIN_VALUE_CALLEE as u,DIRECT_CALL_INVITE_ENCRYPT_NONE as p,toSignalCallType as f,encodeDirectCallInviteContent as A}from"./direct-p2p-call.js";import{CmdId as v,ErrCode as S}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{sigSponsorCallAnsAckCodec as E,sigHangUpAckCodec as _,sigP2pCallStateNotifyAckCodec as P,sigSponsorCallDeliverCodec as L,sigSponsorCallAckCodec as h,sigSponsorCallAnsDeliverCodec as C,sigHangUpCodec as T,sigP2pCallStateNotifyDeliverCodec as y,sigP2pCallExchangeNatInfoDeliverCodec as R,sigSponsorCallDeliverAckCodec as N,sigSponsorCallAnsDeliverAckCodec as w,sigHangUpDeliverAckCodec as M,sigP2pCallStateNotifyDeliverAckCodec as O,sigP2pCallExchangeNatInfoDeliverAckCodec as K,sigSponsorCallAnsCodec as G,sigP2pCallStateNotifyCodec as b,sigSponsorCallCodec as F}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as D}from"../../../../im-protocol/src/frame-codec.js";const V=/* @__PURE__ */new Set([S.ERR_CHAT_FORBIDDEN,S.ERR_CHAT_FRIEND_DEL]);function j(e){return{conversationType:"direct",conversationId:e}}function U(e){return"accepted"===e||"connected"===e}function H(H){let B,x;function Y(){return H.now?.()??Date.now()}function $(){const e=H.getSelfId();if(""===e.trim())throw new Error("call signaling: 当前账号未就绪");return e}function q(e){if(!H.isAuthenticated())throw new Error(`call signaling: 未鉴权,不能${e}`);return $()}function X(){void 0!==B?.ringTimer&&clearTimeout(B.ringTimer),B&&(B.ringTimer=void 0)}function k(){void 0!==x?.ringTimer&&clearTimeout(x.ringTimer),x&&(x.ringTimer=void 0)}function z(e,n){H.emitter.emit({type:"call:hangup",conversation:j(e.peerId),callId:e.callId,peerId:e.peerId,outcome:n})}function J(e,n=Y(),r=!0){if(void 0===x)return;const d=x;return k(),W(d,e,n),x=void 0,r&&z(d,e),d}function Q(e,n){return void 0===e.connectedAt?0:Math.max(0,n-e.connectedAt)}function W(e,n,d,o){r(H.domainState,{callId:e.callId,peerId:e.peerId,selfId:$(),callKind:e.callKind,outcome:n,durationMs:Q(e,d),outgoing:"outgoing"===e.direction,createdAt:d,...o})}function Z(e,n=Y(),r=!0){if(void 0===B)return;const d=B;return X(),function(e,n){void 0!==B&&W(B,e,n)}(e,n),B=void 0,r&&z(d,e),void 0!==x&&(B=x,x=void 0),d}function ee(e,n,r){const d=e===v.SIG_SPONSORP2PCALL_DELIVER_ACK?N.encode(N.create({sUserId:n,sMsgId:r})):e===v.SIG_SPONSORP2PCALL_ANS_DELIVER_ACK?w.encode(w.create({sUserId:n,sMsgId:r})):e===v.SIG_P2PCALLHANGUPDElIVER_ACK?M.encode(M.create({sUserId:n,sMsgId:r})):e===v.SIG_P2PCALLSTATENOTIFYDElIVER_ACK?O.encode(O.create({sUserId:n,sMsgId:r})):K.encode(K.create({sUserId:n,sMsgId:r}));H.sendFrame(D({command:e,body:d}))}function ne(e){return setTimeout(e,g)}function re(){return e(n())}function de(e,n,r,o){const i=G.encode(G.create({sToId:d(n,"peerId"),sFromId:d(e,"selfId"),sMsgId:re(),msgTime:BigInt(Y()),errcode:I(o),scallId:r}));H.sendFrame(D({command:v.SIG_SPONSORP2PCALL_ANS,body:i}))}function oe(e,n,r,o){const i=T.encode(T.create({sToId:d(n,"peerId"),sFromId:d(e,"selfId"),sMsgId:re(),msgTime:BigInt(Y()),scallId:r,hangupReasonCode:s(o)}));H.sendFrame(D({command:v.SIG_P2PCALLHANGUP,body:i}))}function ie(e,n){const r=o(e.callId);if(d(e.peerId,"peerId"),void 0===B||B.callId!==r||B.peerId!==e.peerId)throw new Error(`call signaling: 没有匹配的通话,不能${n}`);return B}function te(e,n){const r="video"===n?"通知对端视频已开始":"通知对端音频已开始",o=q(r),i=ie(e,r);if(i.callKind!==n)throw new Error(`call signaling: 当前通话不是${"video"===n?"视频":"语音"},不能发送首帧通知`);if("accepted"!==i.phase&&"connected"!==i.phase)throw new Error("call signaling: 未接听不能发送首帧通知");const t=b.encode(b.create({sToId:d(i.peerId,"peerId"),sFromId:d(o,"selfId"),sMsgId:re(),msgTime:BigInt(Y()),notifyType:a(n),notifyValue:"caller"===e.role?m:u,scallId:i.callId}));H.sendFrame(D({command:v.SIG_P2PCALLSTATENOTIFY,body:t}))}function ce(e,n){n!==S.NON_ERR&&H.emitter.emit({type:"error",error:{scope:"protocol",message:`call signaling: ${e} ACK 失败`,cause:{errcode:n}}})}return{handlers:[{command:v.SIG_SPONSORP2PCALL_DELIVER,handler:(e,n)=>function(e){const n=L.decode(e);if(""===n.sMsgId.trim())throw new Error("call signaling: invite deliver 缺少 sMsgId");const c=$();ee(v.SIG_SPONSORP2PCALL_DELIVER_ACK,d(c,"selfId"),n.sMsgId);const l=o(n.scallId),a=n.sFromId.toString();if(n.sFromId<=0n||n.sInviteId.toString()!==c)throw new Error("call signaling: invite deliver 身份不匹配");if(a===c)return;const s=Number(n.msgTime),I=i(n.callType),g=t(s,Y()),m=j(a);if(g)return r(H.domainState,{callId:l,peerId:a,selfId:c,callKind:I,outcome:"missed",durationMs:0,outgoing:!1,createdAt:s}),void H.emitter.emit({type:"call:incoming",conversation:m,callId:l,peerId:a,callKind:I,createdAt:s,expired:!0});if(B?.callId===l||x?.callId===l)return;if(void 0!==B&&!U(B.phase))return de(c,a,l,"busy"),void r(H.domainState,{callId:l,peerId:a,selfId:c,callKind:I,outcome:"busy",durationMs:0,outgoing:!1,createdAt:s});if(void 0!==B&&B.peerId===a)return de(c,a,l,"busy"),void r(H.domainState,{callId:l,peerId:a,selfId:c,callKind:I,outcome:"busy",durationMs:0,outgoing:!1,createdAt:s});if(void 0!==x)return de(c,a,l,"busy"),void r(H.domainState,{callId:l,peerId:a,selfId:c,callKind:I,outcome:"busy",durationMs:0,outgoing:!1,createdAt:s});const u={callId:l,peerId:a,callKind:I,direction:"incoming",phase:"incoming-ringing",startedAt:s};if(u.ringTimer=ne(()=>{x?.callId!==l||"incoming-ringing"!==x.phase?B?.callId===l&&"incoming-ringing"===B.phase&&Z("missed",s):J("missed")}),void 0!==B&&U(B.phase))return x=u,void H.emitter.emit({type:"call:incoming",conversation:m,callId:l,peerId:a,callKind:I,createdAt:s,expired:!1});B=u,H.emitter.emit({type:"call:incoming",conversation:m,callId:l,peerId:a,callKind:I,createdAt:s,expired:!1})}(n)},{command:v.SIG_SPONSORP2PCALL_ACK,handler:(e,n)=>function(e){const n=h.decode(e);if(void 0===B||"outgoing"!==B.direction)return;if(n.errcode===S.NON_ERR)return;const r=n.errcode===S.ERR_CALL_PEER_OFFLINE?"peer-offline":"ack-error",d=B,o=Y();X(),B=void 0,V.has(n.errcode)?(W(d,"cancelled",o,{status:"failed",failure:{code:n.errcode,reason:"rejected",displayCode:"contactRequired",retryable:!1}}),H.domainState.appendDirectContactRequiredNotice(d.peerId,d.callId,o+1)):W(d,"cancelled",o),H.emitter.emit({type:"call:failed",conversation:j(d.peerId),callId:d.callId,peerId:d.peerId,reason:r})}(n)},{command:v.SIG_SPONSORP2PCALL_ANS_DELIVER,handler:(e,n)=>function(e){const n=C.decode(e);if(""===n.sMsgId.trim())throw new Error("call signaling: answer deliver 缺少 sMsgId");const r=$();ee(v.SIG_SPONSORP2PCALL_ANS_DELIVER_ACK,d(r,"selfId"),n.sMsgId);const i=o(n.scallId);if(void 0===B||B.callId!==i||"outgoing"!==B.direction)return;const t=c(n.errcode);if(H.emitter.emit({type:"call:answered",conversation:j(B.peerId),callId:i,peerId:B.peerId,result:t}),"accept"===t)return X(),void(B.phase="accepted");Z("reject"===t?"rejected":"busy"===t?"busy":"cancelled")}(n)},{command:v.SIG_SPONSORP2PCALL_ANS_ACK,handler:(e,n)=>ce("answer",E.decode(n).errcode)},{command:v.SIG_P2PCALLHANGUPDElIVER,handler:(e,n)=>function(e){const n=T.decode(e);if(""===n.sMsgId.trim())throw new Error("call signaling: hangup deliver 缺少 sMsgId");const r=$();ee(v.SIG_P2PCALLHANGUPDElIVER_ACK,d(r,"selfId"),n.sMsgId);const i=o(n.scallId);if(void 0!==x&&x.callId===i)return void J(l(n.hangupReasonCode,x.direction,!1));if(void 0===B||B.callId!==i)return;Z(l(n.hangupReasonCode,B.direction,"connected"===B.phase))}(n)},{command:v.SIG_P2PCALLHANGUP_ACK,handler:(e,n)=>ce("hangup",_.decode(n).errcode)},{command:v.SIG_P2PCALLSTATENOTIFYDElIVER,handler:(e,n)=>function(e){const n=y.decode(e);if(""===n.sMsgId.trim())throw new Error("call signaling: state notify deliver 缺少 sMsgId");const r=$();if(ee(v.SIG_P2PCALLSTATENOTIFYDElIVER_ACK,d(r,"selfId"),n.sMsgId),void 0===B)return;if(n.notifyType!==a(B.callKind))return;const i=o(n.scallId);B.callId===i&&("accepted"!==B.phase&&"connected"!==B.phase||(void 0===B.connectedAt&&(B.connectedAt=Y()),B.phase="connected",H.emitter.emit({type:"video"===B.callKind?"call:peer-video-begin":"call:peer-audio-begin",conversation:j(B.peerId),callId:i,peerId:B.peerId})))}(n)},{command:v.SIG_P2PCALLSTATENOTIFY_ACK,handler:(e,n)=>ce("state-notify",P.decode(n).errcode)},{command:v.SIG_P2PCALL_EXCHANGE_NATINFO_DELIVER,handler:(e,n)=>function(e){const n=R.decode(e);if(""===n.sMsgId.trim())throw new Error("call signaling: nat deliver 缺少 sMsgId");ee(v.SIG_P2PCALL_EXCHANGE_NATINFO_DELIVER_ACK,d($(),"selfId"),n.sMsgId)}(n)}],invite:function(e){const n=q("发起通话"),r=e.callKind??"audio",i=String(d(e.peerId,"peerId"));if(i===n)throw new Error("call signaling: 不能呼叫自己");const t=o(e.callId);if(void 0!==B)throw new Error("call signaling: 已有进行中的通话");const c=Y();return B={callId:t,peerId:i,callKind:r,direction:"outgoing",phase:"outgoing-ringing",startedAt:c},function(e,n,r,o){const i=F.encode(F.create({sInviteId:d(n,"peerId"),sFromId:d(e,"selfId"),sMsgId:re(),msgTime:BigInt(Y()),encrypt:p,sContent:A(),callType:f(o),scallId:r}));H.sendFrame(D({command:v.SIG_SPONSORP2PCALL,body:i}))}(n,i,t,r),B.ringTimer=ne(()=>{B?.callId===t&&"outgoing-ringing"===B.phase&&(oe(n,i,t,"no-answer"),Z("cancelled"))}),{callId:t,conversation:j(i)}},accept:function(e){const n=q("接听"),r=o(e.callId);if(d(e.peerId,"peerId"),void 0!==x&&x.callId===r&&x.peerId===e.peerId){if(void 0!==B)throw new Error("call signaling: 请先结束当前通话再接听等待来电");B=x,x=void 0}const i=ie(e,"接听");if("incoming"!==i.direction||"incoming-ringing"!==i.phase)throw new Error("call signaling: 当前状态不能接听");X(),de(n,i.peerId,i.callId,"accept"),i.phase="accepted"},reject:function(e){const n=q("拒绝"),r=o(e.callId);if(d(e.peerId,"peerId"),void 0!==x&&x.callId===r&&x.peerId===e.peerId)return de(n,x.peerId,x.callId,"reject"),void J("rejected");const i=ie(e,"拒绝");if("incoming"!==i.direction||"incoming-ringing"!==i.phase)throw new Error("call signaling: 当前状态不能拒绝");de(n,i.peerId,i.callId,"reject"),Z("rejected")},busy:function(e){const n=q("回忙"),i=o(e.callId),t=String(d(e.peerId,"peerId"));de(n,t,i,"busy"),B?.callId!==i?x?.callId!==i?r(H.domainState,{callId:i,peerId:t,selfId:n,callKind:"audio",outcome:"busy",durationMs:0,outgoing:!1,createdAt:Y()}):J("busy"):Z("busy")},hangup:function(e){const n=q("挂断"),r=ie(e,"挂断");oe(n,r.peerId,r.callId,e.reason);const d="connected"===r.phase;Z(l(s(e.reason),r.direction,d))},notifyPeerAudioBegin:function(e){te(e,"audio")},notifyPeerVideoBegin:function(e){te(e,"video")},dispose(){X(),k(),B=void 0,x=void 0}}}export{H as createDirectCallManager};
@@ -0,0 +1 @@
1
+ import{computeSortKey as e}from"../../mapping/sort.js";function t(t){const o={callKind:t.callKind,outcome:t.outcome,durationMs:t.durationMs,outgoing:t.outgoing};return{id:t.callId,conversationId:t.peerId,conversationType:"direct",senderId:t.outgoing?t.selfId:t.peerId,contentType:"call",body:{call:o},createdAt:t.createdAt,sortKey:e(t.createdAt,t.callId),status:t.status??"sent",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1},...void 0===t.failure?{}:{failure:t.failure}}}function o(e,o){const c=t(o),n=e.getConversationMessage(c,o.callId);"call"===n?.contentType&&"completed"===n.body.call?.outcome&&"completed"!==o.outcome||e.upsertMessages([c],"live")}export{t as buildDirectCallRecordMessage,o as upsertDirectCallRecord};
@@ -0,0 +1 @@
1
+ import{ErrCode as r}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";const n=3e4,e=0,t=1,i=0;function E(r=0,n=0){if(!Number.isInteger(r)||!Number.isInteger(n)||r<0||n<0)throw new Error(`call signaling: invite screen 尺寸非法(${String(r)}×${String(n)})`);return JSON.stringify({screenW:r,screenH:n})}const R=5,o=6,c=1,_=2;function u(r){return"video"===r?6:5}function L(r){return"audio"===r?1:0}function s(r){if(1===r)return"audio";if(0===r)return"video";throw new Error(`call signaling: callType 非法(${String(r)})`)}function l(r,n,e=3e4){if(!Number.isFinite(r)||r<=0)throw new Error(`call signaling: msgTime 非法(${String(r)})`);if(!Number.isFinite(n)||n<=0)throw new Error(`call signaling: now 非法(${String(n)})`);return n-r>e}function a(n){if(n===r.NON_ERR)return"accept";if(n===r.ERR_CALL_REFUSE||n===r.EXCEPT_ERR)return"reject";if(n===r.ERR_CALL_BUSY)return"busy";if(n===r.ERR_CALL_CALLEE_LIVEKIT_TOKEN)return"token-failed";if(n===r.ERR_CALL_CALLEE_LIVEKIT_CONN)return"connect-failed";throw new Error(`call signaling: 应答 errcode 无法识别(${n})`)}function f(n){switch(n){case"accept":return r.NON_ERR;case"reject":return r.ERR_CALL_REFUSE;case"busy":return r.ERR_CALL_BUSY}}function g(n){switch(n){case"cancel":return r.ERR_CALL_CALLER_CANCEL;case"no-answer":return r.ERR_CALL_CALLEE_NO_ANSWER;case"end":return r.NON_ERR;case"peer-lost":return r.ERR_CALL_PEER_LOST}}function C(n,e,t){if(t)return n===r.ERR_CALL_PEER_LOST||n===r.ERR_CALL_PEER_START_TIMEOUT?"interrupted":"completed";if(n===r.ERR_CALL_REFUSE)return"rejected";if(n===r.ERR_CALL_BUSY)return"busy";if(n===r.ERR_CALL_CALLEE_NO_ANSWER)return"outgoing"===e?"cancelled":"missed";if(n===r.ERR_CALL_CALLER_CANCEL)return"outgoing"===e?"cancelled":"missed";if(n===r.NON_ERR||n===r.EXCEPT_ERR)return"outgoing"===e?"cancelled":"missed";if(n===r.ERR_CALL_PEER_LOST||n===r.ERR_CALL_PEER_START_TIMEOUT)return"interrupted";throw new Error(`call signaling: hangupReasonCode 无法识别(${n})`)}function A(r,n){if("string"!=typeof r||!/^\d+$/.test(r))throw new Error(`call signaling: ${n} 非法`);return BigInt(r)}function d(r,n){const e=r.trim(),t=n.trim();return e===t||""!==e&&""!==t&&(!(!/^\d+$/.test(e)||!/^\d+$/.test(t))&&BigInt(e)===BigInt(t))}function N(r){const n=r.trim();if(""===n||"0"===n)throw new Error("call signaling: callId 缺失或非法");return n}export{i as DIRECT_CALL_INVITE_ENCRYPT_NONE,n as DIRECT_CALL_INVITE_TTL_MS,R as PEER_AUDIO_BEGIN_NOTIFY_TYPE,_ as PEER_AUDIO_BEGIN_VALUE_CALLEE,c as PEER_AUDIO_BEGIN_VALUE_CALLER,o as PEER_VIDEO_BEGIN_NOTIFY_TYPE,t as SIGNAL_CALL_TYPE_AUDIO,e as SIGNAL_CALL_TYPE_VIDEO,E as encodeDirectCallInviteContent,l as isInviteExpired,a as mapAnswerErrcode,C as mapHangupReasonCode,s as mapSignalCallType,u as peerBeginNotifyType,N as requireCallId,A as requireNumericUserId,d as sameImUserId,f as toAnswerErrcode,g as toHangupReasonCode,L as toSignalCallType};
@@ -0,0 +1 @@
1
+ import{toWireMsgId as e,newClientMessageId as r}from"../../mapping/message-id.js";import{requireNumericUserId as t,requireCallId as n,isInviteExpired as o,sameImUserId as d,DIRECT_CALL_INVITE_TTL_MS as i}from"./direct-p2p-call.js";import{upsertGroupCallNotice as s}from"./group-call-record.js";import{CmdId as c,ErrCode as I}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{sigGroupCallAnsAckCodec as l,sigGroupCallJoinAckCodec as a,sigGroupCallHangupAckCodec as m,sigGroupCallFinishAckCodec as u,sigGroupCallBusyAckCodec as g,sigGroupCallStatusAckCodec as f,sigSponsorGroupCallDeliverCodec as p,sigSponsorGroupCallAckCodec as _,sigGroupCallAnsDeliverCodec as L,sigGroupCallJoinDeliverCodec as A,sigGroupCallHangupDeliverCodec as S,sigGroupCallFinishDeliverCodec as v,sigGroupCallBusyDeliverCodec as C,sigGroupCallDisconnectedDeliverCodec as h,sigGroupCallStatusDeliverCodec as G,sigGroupCallBusyCodec as E,sigGroupCallStatusCodec as R,sigSponsorGroupCallDeliverAckCodec as O,sigGroupCallFinishCodec as N,sigGroupCallHangupCodec as U,sigGroupCallAnsCodec as w,sigGroupCallJoinCodec as y,sigSponsorGroupCallCodec as b}from"../../../../im-protocol/src/protobuf/registry.js";import{GROUP_CALL_ANS_TYPE as T,GROUP_CALL_JOIN_TYPE as P}from"../../../../im-protocol/src/protobuf/gen/im.sig_pb.js";import{encodeFrame as D}from"../../../../im-protocol/src/frame-codec.js";const V=9;function K(e){if(e<0n)throw new Error("group call: varint 不支持负数");const r=[];let t=e;for(;t>=0x80n;)r.push(128|Number(0x7Fn&t)),t>>=7n;return r.push(Number(t)),Uint8Array.from(r)}function j(e,r,t){if(0===t.length)return e;if(r<=0||r>=16)throw new Error(`group call: 非法 protobuf field ${r}`);const n=r<<3,o=[e];let d=0;for(const e of t){const r=K(e),t=new Uint8Array(1+r.length);t[0]=n,t.set(r,1),o.push(t),d+=t.length}const i=new Uint8Array(e.length+d);let s=0;for(const e of o)i.set(e,s),s+=e.length;return i}function F(e){return{conversationType:"group",conversationId:e}}function B(e){return e.filter(e=>"in-call"===e.status).length<=1}function J(V){const K=/* @__PURE__ */new Map,J=/* @__PURE__ */new Set,H=[];function x(){return V.now?.()??Date.now()}function Y(e,r,t,n,o){s(V.domainState,{kind:e,groupId:r,callId:t,createdAt:n,...void 0===o?{}:{operatorId:o}})}function $(){const e=V.getSelfId();if(""===e.trim())throw new Error("call signaling: 当前账号未就绪");return e}function k(e){if(!V.isAuthenticated())throw new Error(`未鉴权,不能${e}`);return $()}function M(){return e(r())}function q(e){if(""===e.trim())return!1;if(J.has(e))return!1;if(J.add(e),H.push(e),H.length>256){const e=H.shift();void 0!==e&&J.delete(e)}return!0}function z(e){void 0!==e.incomingRingTimer&&clearTimeout(e.incomingRingTimer),e.incomingRingTimer=void 0}function Q(e,r,t){const n=e.members.find(e=>e.userId===r);void 0===n?e.members.push({userId:r,status:t}):n.status=t}function W(e,r){e.members=e.members.filter(e=>e.userId!==r)}function X(e){const r=K.get(e.groupId);void 0!==r&&z(r);const t=[];for(const r of e.inCallIds)t.some(e=>e.userId===r)||t.push({userId:r,status:"in-call"});for(const r of e.ringingIds)t.some(e=>e.userId===r)||t.push({userId:r,status:"ringing"});const n={groupId:e.groupId,callId:e.callId,inviterId:e.inviterId,createdAt:e.createdAt,members:t};return K.set(e.groupId,n),n}function Z(e,r){const t=K.get(e);if(void 0!==t&&(void 0===r||t.callId===r))return z(t),K.delete(e),t}function ee(e,r,t){const n=O.encode(O.create({userId:r,msgId:t}));V.sendFrame(D({command:e,body:n}))}function re(e,r,n){const o=N.encode(N.create({groupId:t(r,"groupId"),userId:t(e,"selfId"),msgId:M(),msgTime:BigInt(x()),callId:n}));V.sendFrame(D({command:c.SIG_GROUPCALL_FINISH,body:o}))}function te(e,r,o){const d=k("响应群会议"),i=n(r),s=K.get(e);void 0!==s&&s.callId===i&&z(s),function(e,r,n,o){const d=w.encode(w.create({groupId:t(r,"groupId"),userId:t(e,"selfId"),msgId:M(),msgTime:BigInt(x()),callId:n,ansType:o?T.CALL_ANS_AGREED:T.CALL_ANS_REFUSE}));V.sendFrame(D({command:c.SIG_GROUPCALL_ANS,body:d}))}(d,e,i,o),void 0!==s&&s.callId===i&&(o?Q(s,d,"in-call"):(W(s,d),V.emitter.emit({type:"group-call:answered",conversation:F(e),callId:i,groupId:e,userId:d,agreed:!1})))}function ne(e,r,o){const d=k("发送群会议忙线"),i=E.encode(E.create({groupId:t(e,"groupId"),userId:t(d,"selfId"),msgId:M(),msgTime:BigInt(x()),callId:n(r),hintUser:t(o,"hintUserId")}));V.sendFrame(D({command:c.SIG_GROUPCALL_BUSY,body:i}));const s=K.get(e);void 0!==s&&s.callId===r&&W(s,d)}function oe(e){const r=p.decode(e);if(""===r.msgId.trim())throw new Error("group call: create deliver 缺少 msgId");const s=$();if(ee(c.SIG_SPONSORGROUPCALL_DELIVER_ACK,t(s,"selfId"),r.msgId),!q(r.msgId))return;const I=r.groupId.toString(),l=r.userId.toString(),a=n(r.callId),m=r.inviteIds.map(e=>e.toString()).filter(e=>"0"!==e),u=Number(r.msgTime),g=o(u,x(),i),f=F(I),_=d(l,s),L=m.some(e=>d(e,s))||0===m.length&&!_;if(_)return void X({groupId:I,callId:a,inviterId:l,createdAt:u,inCallIds:[s],ringingIds:m.filter(e=>!d(e,s))});const A=K.get(I);if(void 0!==A&&A.callId!==a&&A.members.some(e=>d(e.userId,s)&&"in-call"===e.status))return re(s,I,a),void Y("ended",I,a,Number.isFinite(u)?u:x());if(X({groupId:I,callId:a,inviterId:l,createdAt:u,inCallIds:[l],ringingIds:L?[.../* @__PURE__ */new Set([s,...m.filter(e=>!d(e,l))])]:m.filter(e=>!d(e,l))}),Y("started",I,a,Number.isFinite(u)?u:x(),l),!L)return;if(g)return void V.emitter.emit({type:"group-call:incoming",conversation:f,callId:a,groupId:I,inviterId:l,inviteIds:m,createdAt:u,expired:!0});if(function(e,r){for(const t of K.values())if(t.groupId!==r&&t.members.some(r=>d(r.userId,e)))return!0;return!1}(s,I))return void ne(I,a,l);const S=K.get(I);void 0!==S&&(S.incomingRingTimer=setTimeout(()=>{const e=K.get(I);if(void 0===e||e.callId!==a)return;const r=e.members.find(e=>d(e.userId,s));if(void 0!==r&&"ringing"===r.status){try{te(I,a,!1)}catch{W(e,s)}Y("missed",I,a,x())}},i)),V.emitter.emit({type:"group-call:incoming",conversation:f,callId:a,groupId:I,inviterId:l,inviteIds:m,createdAt:u,expired:!1})}function de(e,r){r!==I.NON_ERR&&V.emitter.emit({type:"error",error:{scope:"protocol",message:`group call: ${e} ACK 失败`,cause:{errCode:r}}})}return{commandHandlers:[{command:c.SIG_SPONSORGROUPCALL_DELIVER,handler:(e,r)=>oe(r)},{command:c.SIG_SPONSORGROUPCALL_ACK,handler:(e,r)=>function(e){const r=_.decode(e);if(r.errCode===I.NON_ERR)return;const t=$();for(const e of K.values()){if(!d(e.inviterId,t))continue;const r=Z(e.groupId,e.callId);if(void 0!==r)return void V.emitter.emit({type:"group-call:failed",conversation:F(r.groupId),callId:r.callId,groupId:r.groupId,reason:"ack-error"})}V.emitter.emit({type:"error",error:{scope:"protocol",message:"group call: createRoom ACK 失败",cause:{errCode:r.errCode}}})}(r)},{command:c.SIG_GROUPCALL_ANS_DELIVER,handler:(e,r)=>function(e){const r=L.decode(e);if(""===r.msgId.trim())throw new Error("group call: answer deliver 缺少 msgId");const o=$();if(ee(c.SIG_GROUPCALL_ANS_DELIVER_ACK,t(o,"selfId"),r.msgId),!q(r.msgId))return;const d=r.groupId.toString(),i=r.userId.toString(),s=n(r.callId),I=r.ansType===T.CALL_ANS_AGREED,l=K.get(d);void 0!==l&&l.callId===s&&(I?Q(l,i,"in-call"):W(l,i),V.emitter.emit({type:"group-call:answered",conversation:F(d),callId:s,groupId:d,userId:i,agreed:I}))}(r)},{command:c.SIG_GROUPCALL_ANS_ACK,handler:(e,r)=>de("answer",l.decode(r).errCode)},{command:c.SIG_GROUPCALL_JOIN_DELIVER,handler:(e,r)=>function(e){const r=A.decode(e);if(""===r.msgId.trim())throw new Error("group call: join deliver 缺少 msgId");const o=$();if(ee(c.SIG_GROUPCALL_JOIN_DELIVER_ACK,t(o,"selfId"),r.msgId),!q(r.msgId))return;const i=r.groupId.toString(),s=r.userId.toString(),I=n(r.callId),l=r.inviteIds.map(e=>e.toString()).filter(e=>"0"!==e&&e!==s);let a=K.get(i);if(void 0===a||a.callId!==I)a=X({groupId:i,callId:I,inviterId:s,createdAt:Number(r.msgTime),inCallIds:[s],ringingIds:l});else if(Q(a,s,"in-call"),r.joinType===P.CALL_JOIN_INVITE)for(const e of l)Q(a,e,"ringing");V.emitter.emit({type:"group-call:joined",conversation:F(i),callId:I,groupId:i,userId:s,inviteIds:l,isInvite:r.joinType===P.CALL_JOIN_INVITE});const m=l.some(e=>d(e,o))||0===l.length&&r.joinType===P.CALL_JOIN_INVITE&&!d(s,o),u=a.members.find(e=>d(e.userId,o));m&&r.joinType===P.CALL_JOIN_INVITE&&!d(s,o)&&"in-call"!==u?.status&&V.emitter.emit({type:"group-call:incoming",conversation:F(i),callId:I,groupId:i,inviterId:s,inviteIds:l,createdAt:Number(r.msgTime),expired:!1})}(r)},{command:c.SIG_GROUPCALL_JOIN_ACK,handler:(e,r)=>de("join",a.decode(r).errCode)},{command:c.SIG_GROUPCALL_HANGUP_DELIVER,handler:(e,r)=>function(e){const r=S.decode(e);if(""===r.msgId.trim())throw new Error("group call: hangup deliver 缺少 msgId");const o=$();if(ee(c.SIG_GROUPCALL_HANGUP_DELIVER_ACK,t(o,"selfId"),r.msgId),!q(r.msgId))return;const d=r.groupId.toString(),i=r.userId.toString(),s=n(r.callId),I=K.get(d);void 0!==I&&I.callId===s&&(W(I,i),V.emitter.emit({type:"group-call:left",conversation:F(d),callId:s,groupId:d,userId:i}),B(I.members)&&(Z(d,s),Y("ended",d,s,x()),V.emitter.emit({type:"group-call:finished",conversation:F(d),callId:s,groupId:d,userId:i})))}(r)},{command:c.SIG_GROUPCALL_HANGUP_ACK,handler:(e,r)=>de("hangup",m.decode(r).errCode)},{command:c.SIG_GROUPCALL_FINISH_DELIVER,handler:(e,r)=>function(e){const r=v.decode(e);if(""===r.msgId.trim())throw new Error("group call: finish deliver 缺少 msgId");const o=$();if(ee(c.SIG_GROUPCALL_FINISH_DELIVER_ACK,t(o,"selfId"),r.msgId),!q(r.msgId))return;const d=r.groupId.toString(),i=r.userId.toString(),s=n(r.callId);Z(d,s),Y("ended",d,s,Number(r.msgTime)||x()),V.emitter.emit({type:"group-call:finished",conversation:F(d),callId:s,groupId:d,userId:i})}(r)},{command:c.SIG_GROUPCALL_FINISH_ACK,handler:(e,r)=>de("finish",u.decode(r).errCode)},{command:c.SIG_GROUPCALL_BUSY_DELIVER,handler:(e,r)=>function(e){const r=C.decode(e);if(""===r.msgId.trim())throw new Error("group call: busy deliver 缺少 msgId");const o=$();if(ee(c.SIG_GROUPCALL_BUSY_DELIVER_ACK,t(o,"selfId"),r.msgId),!q(r.msgId))return;const d=r.groupId.toString(),i=r.userId.toString(),s=n(r.callId),I=K.get(d);void 0!==I&&I.callId===s&&W(I,i),V.emitter.emit({type:"group-call:busy",conversation:F(d),callId:s,groupId:d,userId:i,hintUserId:r.hintUser.toString()})}(r)},{command:c.SIG_GROUPCALL_BUSY_ACK,handler:(e,r)=>de("busy",g.decode(r).errCode)},{command:c.SIG_GROUPCALL_DISCONNECTED_DELIVER,handler:(e,r)=>function(e){const r=h.decode(e);if(""===r.msgId.trim())throw new Error("group call: disconnected deliver 缺少 msgId");const o=$();if(ee(c.SIG_GROUPCALL_DISCONNECTED_DELIVER_ACK,t(o,"selfId"),r.msgId),!q(r.msgId))return;const d=r.groupId.toString(),i=n(r.callId),s=K.get(d);if(void 0!==s&&s.callId===i){for(const e of r.users){const r=e.toString();W(s,r),V.emitter.emit({type:"group-call:left",conversation:F(d),callId:i,groupId:d,userId:r})}B(s.members)&&(Z(d,i),Y("ended",d,i,x()),V.emitter.emit({type:"group-call:finished",conversation:F(d),callId:i,groupId:d,userId:r.userId.toString()}))}}(r)},{command:c.SIG_GROUPCALL_STATUS_DELIVER,handler:(e,r)=>function(e){const r=G.decode(e);if(""===r.msgId.trim())throw new Error("group call: status deliver 缺少 msgId");ee(c.SIG_GROUPCALL_STATUS_DELIVER_ACK,t($(),"selfId"),r.msgId)}(r)},{command:c.SIG_GROUPCALL_STATUS_ACK,handler:(e,r)=>de("status",f.decode(r).errCode)}],createRoom:function(e,r,o){const i=k("发起群会议"),s=n(r),I=[...new Set(o.map(e=>e.trim()).filter(e=>""!==e&&!d(e,i)))];if(0===I.length)throw new Error("call signaling: 群会议至少邀请 1 人");if(I.length+1>9)throw new Error("call signaling: 群会议人数不能超过 9");const l=K.get(e);if(void 0!==l&&l.members.filter(e=>"in-call"===e.status).length>0)throw new Error("call signaling: 当前群已有进行中的会议");!function(e,r,n,o){const d=o.map(e=>t(e,"inviteId")),i=j(b.encode(b.create({groupId:t(r,"groupId"),userId:t(e,"selfId"),msgId:M(),msgTime:BigInt(x()),callId:n,inviteIds:d})),6,d);V.sendFrame(D({command:c.SIG_SPONSORGROUPCALL,body:i}))}(i,e,s,I),X({groupId:e,callId:s,inviterId:i,createdAt:x(),inCallIds:[i],ringingIds:I}),Y("started",e,s,x(),i)},joinRoom:function(e,r,o,i){const s=k("加入群会议"),I=n(r),l=[...new Set(o.map(e=>e.trim()).filter(e=>""!==e&&!d(e,s)))];!function(e,r,n,o,d){const i=o.map(e=>t(e,"inviteId")),s=j(y.encode(y.create({groupId:t(r,"groupId"),userId:t(e,"selfId"),msgId:M(),msgTime:BigInt(x()),callId:n,joinType:d?P.CALL_JOIN_INVITE:P.CALL_JOIN_APPLY,inviteIds:i})),5,i);V.sendFrame(D({command:c.SIG_GROUPCALL_JOIN,body:s}))}(s,e,I,l,i);const a=K.get(e);if(void 0!==a&&a.callId===I&&(Q(a,s,"in-call"),i))for(const e of l)Q(a,e,"ringing")},answer:te,hangup:function(e,r){const o=k("退出群会议"),d=n(r),i=K.get(e);if(void 0!==i&&i.callId===d&&B(i.members))return re(o,e,d),Z(e,d),Y("ended",e,d,x()),void V.emitter.emit({type:"group-call:finished",conversation:F(e),callId:d,groupId:e,userId:o});!function(e,r,n){const o=U.encode(U.create({groupId:t(r,"groupId"),userId:t(e,"selfId"),msgId:M(),msgTime:BigInt(x()),callId:n}));V.sendFrame(D({command:c.SIG_GROUPCALL_HANGUP,body:o}))}(o,e,d),void 0!==i&&i.callId===d&&(z(i),W(i,o)),V.emitter.emit({type:"group-call:left",conversation:F(e),callId:d,groupId:e,userId:o})},finish:function(e,r){const t=k("结束群会议"),o=n(r);re(t,e,o),Z(e,o),Y("ended",e,o,x()),V.emitter.emit({type:"group-call:finished",conversation:F(e),callId:o,groupId:e,userId:t})},setStatus:function(e,r,o,d){const i=k("修改群会议状态"),s=R.encode(R.create({groupId:t(e,"groupId"),userId:t(i,"selfId"),msgId:M(),msgTime:BigInt(x()),callId:n(r),statusType:o?1:0,status:d?1:0}));V.sendFrame(D({command:c.SIG_GROUPCALL_STATUS,body:s}))},busy:ne,inspectMeeting:function(e){const r=K.get(e);return void 0===r?null:function(e){return{groupId:e.groupId,callId:e.callId,inviterId:e.inviterId,createdAt:e.createdAt,members:e.members.map(e=>({userId:e.userId,status:e.status}))}}(r)},dispose(){for(const e of K.values())z(e);K.clear()}}}export{V as GROUP_CALL_MAX_MEMBERS,J as createGroupCallManager,B as shouldFinishGroupCall};
@@ -0,0 +1 @@
1
+ import{SYSTEM_SENDER_ID as t}from"../../mapping/group-notify-mapper.js";import{fromWireMsgId as e}from"../../mapping/message-id.js";import{computeSortKey as r}from"../../mapping/sort.js";const o={started:"group_call_started",ended:"group_call_ended",missed:"group_call_missed"};function n(t,r){const o=`group-call-notice:${r}:${t.trim()}`,n=[0,1,2,3].map(t=>function(t){let e=2166136261;for(let r=0;r<t.length;r+=1)e^=t.charCodeAt(r),e=Math.imul(e,16777619);return e>>>0}(`${o}:${t}`).toString(16).padStart(8,"0")).join("");return e(n)}function a(e){const a=n(e.callId,e.kind),d=e.operatorId?.trim()??"";return{id:a,conversationId:e.groupId,conversationType:"group",senderId:t,contentType:"system",body:{system:{eventType:o[e.kind],...""===d?{}:{operatorId:d},payload:{callId:e.callId}}},createdAt:e.createdAt,sortKey:r(e.createdAt,a),status:"sent",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1}}}function d(t,e){const r=n(e.callId,e.kind),o=a(e);void 0===t.getConversationMessage(o,r)&&t.upsertMessages([o],"live")}export{a as buildGroupCallNoticeMessage,n as groupCallNoticeMessageId,d as upsertGroupCallNotice};
@@ -0,0 +1 @@
1
+ function r(r,t){return`[${t}] 会话类型 '${r}' 尚未接入消息链路;请新增对应的发送策略 / 收包处理器 / 离线同步 / 密钥解析,禁止复用 direct 单聊链路。`}export{r as describeUnsupportedConversation};
@@ -0,0 +1 @@
1
+ import{toWireMsgId as e}from"../../mapping/message-id.js";import{mesMsgEditCodec as o,mesGrpMsgEditCodec as n,mesRadioEditMsgCodec as t}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as r}from"../../../../im-protocol/src/frame-codec.js";import{CmdId as c}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";function d(n){const t=o.create({userId:BigInt(n.selfId),receiveId:BigInt(n.peerId),msgId:e(n.messageId),content:n.content});return r({command:c.MES_CHAT_EDIT_MSG_C2C,body:o.encode(t)})}function I(o){const t=n.create({userId:BigInt(o.selfId),groupId:BigInt(o.groupId),msgId:e(o.messageId),content:o.content});return r({command:c.MES_GRPCHAT_EDIT_MSG_C2C,body:n.encode(t)})}function m(o){const n=t.create({userId:BigInt(o.selfId),radioId:BigInt(o.channelId),msgId:e(o.messageId),content:o.content,IncrId:o.incrementId});return r({command:c.MES_RADIO_EDIT_MSG_C2C,body:t.encode(n)})}export{m as buildChannelEditFrame,d as buildDirectEditFrame,I as buildGroupEditFrame};
@@ -0,0 +1 @@
1
+ import{toWireMsgId as e}from"../../mapping/message-id.js";import{createDefaultEditStrategyRegistry as o}from"./edit-strategy.js";import{ErrCode as r}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";const n=12e4;function t(t){const s=t.now??(()=>Date.now()),i=t.strategies??o(),a=/* @__PURE__ */new Map;function d(e,o){const r=a.get(e);void 0!==r&&(clearTimeout(r.timer),a.delete(e),r.resolve(o))}return{edit(o){const r=t.domainState.getConversationMessage(o,o.messageId);if(void 0===r)return Promise.resolve({ok:!1,reason:"not-found"});if(o.conversationId!==r.conversationId||o.conversationType!==r.conversationType)return Promise.resolve({ok:!1,reason:"not-found"});if(("group"===o.conversationType||"channel"===o.conversationType)&&t.domainState.getPinnedMessage(o)?.messageId===o.messageId)return Promise.resolve({ok:!1,reason:"pinned"});const c=t.getSelfId();if(r.senderId!==c)return Promise.resolve({ok:!1,reason:"not-own"});if("sent"!==r.status)return Promise.resolve({ok:!1,reason:"not-sent"});if(void 0!==r.recalled)return Promise.resolve({ok:!1,reason:"recalled"});if(void 0!==r.deletedForEveryone)return Promise.resolve({ok:!1,reason:"deleted"});if(""===o.text)return Promise.resolve({ok:!1,reason:"empty"});const m=i.resolve(o.conversationType);if(void 0===m)return Promise.resolve({ok:!1,reason:"unsupported"});if(s()-(r.serverTime??r.createdAt)>n)return Promise.resolve({ok:!1,reason:"expired"});if(!t.isAuthenticated())return Promise.resolve({ok:!1,reason:"disconnected"});const v=e(o.messageId),l=a.get(v);if(void 0!==l)return l.promise;let p;const u=new Promise(e=>{p=e}),f={messageId:o.messageId,conversationId:o.conversationId,conversationType:o.conversationType,text:o.text,mention:o.mention,resolve:p,timer:setTimeout(()=>{},0),promise:u};return clearTimeout(f.timer),a.set(v,f),(async()=>{let e;try{e=await m.prepare(o,r,{selfId:c,crypto:t.crypto,resolvePublicKey:t.resolvePublicKey,resolveGroupKey:t.resolveGroupKey})}catch{if(a.get(v)!==f)return;return void d(v,{ok:!1,reason:"encrypt-failed"})}a.get(v)===f&&(e.ok?"group"!==o.conversationType&&"channel"!==o.conversationType||t.domainState.getPinnedMessage(o)?.messageId!==o.messageId?(f.timer=setTimeout(()=>d(v,{ok:!1,reason:"timeout"}),15e3),t.sendFrame(e.frame)):d(v,{ok:!1,reason:"pinned"}):d(v,e))})(),u},onEditAck({sMsgId:e,errcode:o}){const n=a.get(e);if(void 0!==n)return o===r.NON_ERR||0===o?(t.domainState.editMessage({conversationId:n.conversationId,conversationType:n.conversationType},n.messageId,{text:n.text},n.mention),void d(e,{ok:!0})):void d(e,"channel"===n.conversationType?{ok:!1,reason:"failed",errcode:o}:{ok:!1,reason:"failed"})},reset(){for(const e of[...a.keys()])d(e,{ok:!1,reason:"disconnected"})}}}export{n as EDIT_WINDOW_MS,t as createEditManager};
@@ -0,0 +1 @@
1
+ import{CmdId as o}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{mesMsgEditAckCodec as r,mesGrpMsgEditAckCodec as d,mesRadioEditMsgAckCodec as e}from"../../../../im-protocol/src/protobuf/registry.js";function c(c){return[{command:o.MES_CHAT_MSG_EDIT_ACK,handler:(o,d)=>{const e=r.decode(d);c.onEditAck({sMsgId:e.sMsgId,errcode:e.errcode})}},{command:o.MES_GRPCHAT_EDIT_MSG_C2C_ACK,handler:(o,r)=>{const e=d.decode(r);c.onEditAck({sMsgId:e.sMsgId,errcode:e.errcode})}},{command:o.MES_RADIO_EDIT_MSG_C2C_ACK,handler:(o,r)=>{const d=e.decode(r);c.onEditAck({sMsgId:d.sMsgId,errcode:d.errcode})}}]}export{c as createEditReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{buildEncryptedChannelChatBytes as e}from"../send/channel-outgoing-frame.js";import{buildEncryptedMesChatBytes as n}from"../send/direct-outgoing-frame.js";import{buildEncryptedGroupChatBytes as o}from"../send/group-outgoing-frame.js";import{buildDirectEditFrame as r,buildGroupEditFrame as t,buildChannelEditFrame as s}from"./edit-frame.js";import{buildDirectOutgoingChat as a}from"../../mapping/message-mapper.js";import{buildGroupOutgoingChat as i}from"../../mapping/group-message-mapper.js";import{buildChannelOutgoingChat as c}from"../../mapping/channel-message-mapper.js";function d(e=[]){const n=/* @__PURE__ */new Map;function o(e){if(n.has(e.conversationType))throw new Error(`编辑策略重复注册:${e.conversationType}`);n.set(e.conversationType,e)}for(const n of e)o(n);return{register:o,resolve:e=>n.get(e)}}function p(){return{conversationType:"direct",async prepare(e,o,t){if(void 0===t.crypto||void 0===t.resolvePublicKey)return{ok:!1,reason:"no-key"};const s=await t.resolvePublicKey(o.conversationId);if(null===s||""===s)return{ok:!1,reason:"no-key"};const i=a({id:e.messageId,conversationId:o.conversationId,body:{text:e.text},encryption:{encrypted:!0},refMessageId:o.refMessageId},{selfId:t.selfId}),c=n(i,t.crypto,s);return{ok:!0,frame:r({selfId:t.selfId,peerId:e.conversationId,messageId:e.messageId,content:c})}}}}function f(){return{conversationType:"group",async prepare(e,n,r){if(void 0===r.crypto||void 0===r.resolveGroupKey)return{ok:!1,reason:"no-key"};const s=await r.resolveGroupKey(n.conversationId);if(null===s||""===s.publicKey)return{ok:!1,reason:"no-key"};const a=i({id:e.messageId,conversationId:n.conversationId,body:{text:e.text},encryption:{encrypted:!0},mention:e.mention,refMessageId:n.refMessageId},{selfId:r.selfId}),c=o(a,r.crypto,s.publicKey,s.version);return{ok:!0,frame:t({selfId:r.selfId,groupId:e.conversationId,messageId:e.messageId,content:c})}}}}function m(n){return{conversationType:"channel",async prepare(o,r,t){if("text"!==r.contentType)return{ok:!1,reason:"unsupported-content"};let a;try{a=await n.resolveProfile(r.conversationId)}catch{return{ok:!1,reason:"failed"}}if(null===a||"active"!==a.channelState||!a.permissions.sendMessages)return{ok:!1,reason:"restricted"};if(void 0===t.crypto)return{ok:!1,reason:"no-key"};const i=await n.resolveChannelKey(r.conversationId);if(null===i||16!==i.length)return{ok:!1,reason:"no-key"};const d=r.serverTime??r.createdAt,p=c({id:o.messageId,conversationId:r.conversationId,body:{text:o.text},mention:o.mention,refMessageId:r.refMessageId},{selfId:t.selfId,createdAt:d}),f=e(p,t.crypto,i),m=r.extensions?.channelSequence,I="string"==typeof m&&/^\d+$/.test(m)?BigInt(m):0n;return{ok:!0,frame:s({selfId:t.selfId,channelId:r.conversationId,messageId:r.id,content:f,incrementId:I})}}}}function I(){return d([p(),f()])}export{m as createChannelEditStrategy,I as createDefaultEditStrategyRegistry,p as createDirectEditStrategy,d as createEditStrategyRegistry,f as createGroupEditStrategy};
@@ -0,0 +1 @@
1
+ import{GIF_STICKER_IMAGE_TYPE as e,LINK_STICKER_EXPR_TYPE as r}from"../../mapping/sticker-body.js";const t=4294967295;function s(e,r){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`sendExpression: ${r} 必须为正安全整数`);return e}function n(e,r){if(!Number.isSafeInteger(e)||e<=0||e>t)throw new Error(`sendExpression: ${r} 必须为 1..4294967295 的整数`);return e}function o(e,r){const t=Math.max(e,r);return t/Math.min(e,r)>2.2&&t>2880?2:0}function i(e,r){if(void 0===e)throw new Error(`sendExpression: ${r} 不能为空`);const t=e.trim();if(""===t)throw new Error(`sendExpression: ${r} 不能为空`);return t}function d(e){const r=e.trim();let t;try{t=new URL(r)}catch{throw new Error("sendExpression: asset.url 必须是有效的 http(s) URL")}if("https:"!==t.protocol&&"http:"!==t.protocol||""!==t.username||""!==t.password)throw new Error("sendExpression: asset.url 必须是无凭据的 http(s) URL");return t.href}function c(t){const c=t.kind;if("sticker"!==c&&"gif"!==c)throw new Error(`sendExpression: 不支持的 asset.kind(${String(c)})`);if("gif"===t.kind&&Object.prototype.hasOwnProperty.call(t,"packageId"))throw new Error("sendExpression: GIF 不允许提供 asset.packageId");const a=n(t.width,"asset.width"),p=n(t.height,"asset.height"),u=t.description?.trim(),h="sticker"===t.kind?i(t.resourceId,"asset.resourceId"):(f=t.resourceId,w="asset.resourceId",void 0===f?void 0:i(f,w));var f,w;const g="sticker"===t.kind?i(t.packageId,"asset.packageId"):void 0;return{sticker:{url:d(t.url),width:a,height:p,exprType:r,imageType:"gif"===t.kind?e:o(a,p),...void 0===h?{}:{contentId:h},...void 0===g?{}:{packageName:g},...void 0===t.size?{}:{size:s(t.size,"asset.size")},...void 0===u||""===u?{}:{describe:u}}}}function a(e,r){const t=c(r.asset),{id:s,createdAt:n}=e.outbox.allocateMessageIdentity(r);return e.outbox.enqueueMedia({id:s,createdAt:n,conversationId:r.conversationId,conversationType:r.conversationType,contentType:"sticker",body:t,encryption:{encrypted:!1},...void 0===r.refMessageId?{}:{refMessageId:r.refMessageId}})}export{c as buildExpressionMessageBody,a as sendExpressionMessage};
@@ -0,0 +1 @@
1
+ import{resolveForwardContentSpec as n}from"./forward-content-spec.js";function e(n){return"voice"===n.contentType||"call"===n.contentType||"unknown"===n.contentType||!0===n.encryption.decryptFailed}function t(e){return void 0===e.recalled&&(void 0===e.deletedForEveryone&&(!0!==e.encryption.decryptFailed&&void 0!==n(e.contentType)))}function o(e){const t=n(e.contentType);return void 0!==t&&t.isContentReady(e)}function r(n){return t(n)&&o(n)}export{r as canTransmit,t as canTransmitByType,o as canTransmitContent,e as requiresForwardTypeConfirmation};
@@ -0,0 +1 @@
1
+ import{isValidGameBody as e}from"../../mapping/game-body.js";import{isValidLiveRoomBody as t}from"../../mapping/live-room-body.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as i}from"../../mapping/media-album-body.js";import{isValidMiniProgramBody as o}from"../../mapping/mini-program-body.js";import{LINK_STICKER_EXPR_TYPE as n,isValidLinkStickerUrl as d,isValidStickerWireDimension as r}from"../../mapping/sticker-body.js";function y(e){if(void 0===e)return!1;const t=e.trim();return""!==t&&!t.startsWith("blob:")}function a(e){if(void 0!==e)return new Uint8Array(e)}function m(e){const{id:t,createdAt:i}=e.outbox.allocateMessageIdentity(e.target);return e.outbox.enqueueMedia({id:t,conversationId:e.target.conversationId,conversationType:e.target.conversationType,contentType:e.contentType,body:e.body,encryption:e.encryption,createdAt:i}).id}const u={contentType:"file",isContentReady:e=>y(e.body.file?.url),cloneBody:e=>{const t=e.body.file;if(void 0===t)return{};const i=a(t.teaKey);return{file:{url:t.url,fileName:t.fileName,...void 0!==t.size?{size:t.size}:{},...void 0!==t.extension?{extension:t.extension}:{},...void 0!==t.fileType?{fileType:t.fileType}:{},...void 0!==t.mimeType?{mimeType:t.mimeType}:{},...void 0!==t.md5?{md5:t.md5}:{},...void 0!==t.fileEncryptType?{fileEncryptType:t.fileEncryptType}:{},...void 0!==i?{teaKey:i}:{}}}},enqueue:m},c={contentType:"filesAlbum",isContentReady:e=>{const t=e.body.filesAlbum;return void 0!==t&&1===t.items.length&&Array.from(t.caption??"").length<=i&&t.items.every(e=>y(e.url))},cloneBody:e=>{const t=e.body.filesAlbum;return void 0===t?{}:{filesAlbum:{...void 0===t.caption?{}:{caption:t.caption},items:t.items.map(t=>u.cloneBody({...e,body:{file:t}}).file)}}},enqueue:m};function s(e){const t=a(e.thumbData),i=a(e.teaKey);return{image:{url:e.url,width:e.width,height:e.height,...void 0!==e.md5?{md5:e.md5}:{},...void 0!==e.size?{size:e.size}:{},...void 0!==e.fileEncryptType?{fileEncryptType:e.fileEncryptType}:{},...void 0!==t?{thumbData:t}:{},...void 0!==i?{teaKey:i}:{}}}}function p(e){const t=a(e.thumbData),i=a(e.teaKey);return{video:{url:e.url,width:e.width,height:e.height,...void 0!==e.durationMs?{duration:e.durationMs/1e3,durationUnit:"seconds"}:{},...!0===e.hd?{hd:!0}:{},...void 0!==e.md5?{md5:e.md5}:{},...void 0!==e.size?{size:e.size,sizeUnit:"bytes"}:{},...void 0!==e.fileEncryptType?{fileEncryptType:e.fileEncryptType}:{},...void 0!==t?{thumbData:t}:{},...void 0!==i?{teaKey:i}:{}}}}function l(e,t){const i=e.body.mediaAlbum;if("mediaAlbum"!==e.contentType||void 0===i)return{ok:!1,reason:"not-media-album"};const o=Number.isInteger(t)&&t>=0?i.items[t]:void 0;return void 0===o?{ok:!1,reason:"item-not-found"}:y(o.url)?{ok:!0,contentType:o.kind,body:"video"===o.kind?p(o):s(o)}:{ok:!1,reason:"item-not-ready"}}const v=new Map([{contentType:"text",isContentReady:e=>""!==(e.body.text??"").trim(),cloneBody:e=>({text:e.body.text??""}),enqueue:function(e){return e.outbox.enqueueText({conversationId:e.target.conversationId,conversationType:e.target.conversationType,text:e.body.text??"",encrypted:e.encryption.encrypted}).id}},{contentType:"image",isContentReady:e=>y(e.body.image?.url),cloneBody:e=>{const t=e.body.image;if(void 0===t)return{};const i=a(t.thumbData),o=a(t.teaKey);return{image:{url:t.url,width:t.width,height:t.height,...void 0!==t.md5?{md5:t.md5}:{},...void 0!==t.imageType?{imageType:t.imageType}:{},...void 0!==t.size?{size:t.size}:{},...void 0!==t.fileEncryptType?{fileEncryptType:t.fileEncryptType}:{},...void 0!==i?{thumbData:i}:{},...void 0!==o?{teaKey:o}:{}}}},enqueue:m},{contentType:"video",isContentReady:e=>y(e.body.video?.url),cloneBody:e=>{const t=e.body.video;if(void 0===t)return{};const i=a(t.thumbData),o=a(t.teaKey);return{video:{url:t.url,width:t.width,height:t.height,...void 0!==t.duration?{duration:t.duration,durationUnit:"seconds"}:{},...!0===t.hd?{hd:!0}:{},...void 0!==t.md5?{md5:t.md5}:{},...void 0!==t.size?{size:t.size}:{},...void 0!==t.sizeUnit?{sizeUnit:t.sizeUnit}:{},...void 0!==t.unverifiedFileLength?{unverifiedFileLength:t.unverifiedFileLength}:{},...void 0!==t.fileEncryptType?{fileEncryptType:t.fileEncryptType}:{},...void 0!==i?{thumbData:i}:{},...void 0!==o?{teaKey:o}:{}}}},enqueue:m},u,c,{contentType:"mediaAlbum",isContentReady:e=>{const t=e.body.mediaAlbum;return void 0!==t&&0!==t.items.length&&t.items.every(e=>y(e.url))},cloneBody:e=>{const t=e.body.mediaAlbum;return void 0===t?{}:{mediaAlbum:{...void 0!==t.caption?{caption:t.caption}:{},items:t.items.map(e=>{const t=a(e.thumbData),i=a(e.teaKey);return{kind:e.kind,url:e.url,width:e.width,height:e.height,...void 0!==e.durationMs?{durationMs:e.durationMs}:{},...void 0!==e.thumbUrl?{thumbUrl:e.thumbUrl}:{},...void 0!==e.md5?{md5:e.md5}:{},...void 0!==e.size?{size:e.size}:{},...void 0!==e.fileEncryptType?{fileEncryptType:e.fileEncryptType}:{},...void 0!==e.hd?{hd:e.hd}:{},...void 0!==t?{thumbData:t}:{},...void 0!==i?{teaKey:i}:{}}})}}},enqueue:m},{contentType:"liveRoom",isContentReady:e=>t(e.body.liveRoom),cloneBody:e=>{const t=e.body.liveRoom;return void 0===t?{}:{liveRoom:{...t}}},enqueue:m},{contentType:"sticker",isContentReady:e=>{const t=e.body.sticker;return void 0!==t&&(t.exprType!==n?y(t.url):d(t.url)&&r(t.width)&&t.width>0&&r(t.height)&&t.height>0)},cloneBody:e=>{const t=e.body.sticker;if(void 0===t)return{};const i=a(t.thumbData);return{sticker:{url:t.url,width:t.width,height:t.height,exprType:t.exprType,imageType:t.imageType,...void 0!==t.size?{size:t.size}:{},...void 0!==t.describe?{describe:t.describe}:{},...void 0!==t.contentId?{contentId:t.contentId}:{},...void 0!==t.packageName?{packageName:t.packageName}:{},...void 0!==i?{thumbData:i}:{}}}},enqueue:e=>m({...e,encryption:{encrypted:!1}})},{contentType:"game",isContentReady:t=>void 0!==t.body.game&&e(t.body.game),cloneBody:e=>{const t=e.body.game;return void 0===t?{}:{game:{...t}}},enqueue:m},{contentType:"miniProgram",isContentReady:e=>void 0!==e.body.miniProgram&&o(e.body.miniProgram),cloneBody:e=>{const t=e.body.miniProgram;return void 0===t?{}:{miniProgram:{...t}}},enqueue:m}].map(e=>[e.contentType,e]));function h(e){return v.get(e)}export{l as buildMediaAlbumItemForwardContent,y as isRemoteMediaUrl,h as resolveForwardContentSpec};
@@ -0,0 +1 @@
1
+ import{canTransmit as e,canTransmitByType as o}from"./can-transmit.js";import{buildMediaAlbumItemForwardContent as t,resolveForwardContentSpec as n}from"./forward-content-spec.js";const s=9;function r(){return{encrypted:!0}}function i(e){return"body"in e&&"contentType"in e&&"sortKey"in e}const a={"not-media-album":"type-not-allowed","item-not-found":"album-item-not-found","item-not-ready":"media-not-ready"};function d(s,d){const c=s.now??(()=>Date.now()),u=[],p=[];if(0===d.messages.length)return{results:[{ok:!1,sourceMessageId:"",targetConversationId:"",targetConversationType:"direct",reason:"empty-input"}],skippedSourceIds:[]};const v=function(e,o){if(0===e.length)return"empty-input";if(e.length>9)return"too-many-targets";for(const t of e)if(void 0===o.resolve(t.conversationType))return"unsupported-target-type"}(d.targets,s.sendStrategies);if(void 0!==v){for(const e of d.targets.length>0?d.targets:[{conversationId:"",conversationType:"direct"}])for(const o of d.messages)u.push({ok:!1,sourceMessageId:o.id,targetConversationId:e.conversationId,targetConversationType:e.conversationType,reason:v});return{results:u,skippedSourceIds:[]}}const g=[];for(const t of d.messages){const n=void 0===s.resolveCurrentMessage?i(t)?t:void 0:s.resolveCurrentMessage(t);if(void 0===n||"customerService"===n.conversationType||n.id!==t.id||n.conversationId!==t.conversationId||n.conversationType!==t.conversationType){p.push(t.id);continue}(void 0===t.itemIndex?e(n):o(n))?g.push(void 0===t.itemIndex?{message:n}:{message:n,itemIndex:t.itemIndex}):p.push(t.id)}for(const e of d.targets)for(const{message:o,itemIndex:i}of g)try{const d=void 0===i?void 0:t(o,i);if(void 0!==d&&!d.ok){u.push({ok:!1,sourceMessageId:o.id,targetConversationId:e.conversationId,targetConversationType:e.conversationType,reason:a[d.reason]});continue}const p=!0===d?.ok?d.contentType:o.contentType,v=n(p);if(void 0===v){u.push({ok:!1,sourceMessageId:o.id,targetConversationId:e.conversationId,targetConversationType:e.conversationType,reason:"type-not-allowed"});continue}const g=!0===d?.ok?d.body:v.cloneBody(o),y=r(),f=v.enqueue({outbox:s.outbox,target:e,source:o,body:g,encryption:y,now:c,contentType:p});u.push({ok:!0,sourceMessageId:o.id,targetConversationId:e.conversationId,targetConversationType:e.conversationType,newMessageId:f})}catch{u.push({ok:!1,sourceMessageId:o.id,targetConversationId:e.conversationId,targetConversationType:e.conversationType,reason:"send-failed"})}return{results:u,skippedSourceIds:p}}export{s as FORWARD_TARGET_MAX,d as forwardMessages};
@@ -0,0 +1 @@
1
+ const e=4294967296;function n(){const e=globalThis.crypto;if(void 0===e||"function"!=typeof e.getRandomValues)throw new Error("sendGame: 当前 runtime 未提供 crypto.getRandomValues,必须注入 randomUint32");return e.getRandomValues(new Uint32Array(1))[0]}function r(r,t=n){if(!Number.isSafeInteger(r)||r<=0||r>e)throw new Error("sendGame: maxExclusive 非法");const o=Math.floor(e/r)*r;for(let n=0;n<128;n+=1){const n=t();if(!Number.isSafeInteger(n)||n<0||n>=e)throw new Error("sendGame: randomUint32 必须返回 uint32");if(n<o)return n%r}throw new Error("sendGame: 随机源连续落入拒绝区间")}function t(e,n){if("rock-paper-scissors"===e)return{gameType:e,value:r(3,n)+1};if("dice"===e)return{gameType:e,value:r(6,n)+1};throw new Error(`sendGame: 不支持的 gameType(${String(e)})`)}function o(e,n){const r=t(n.gameType,e.randomUint32),{id:o,createdAt:a}=e.outbox.allocateMessageIdentity(n);return e.outbox.enqueueMedia({id:o,createdAt:a,conversationId:n.conversationId,conversationType:n.conversationType,contentType:"game",body:{game:r},encryption:{encrypted:!0},...void 0===n.refMessageId?{}:{refMessageId:n.refMessageId}})}export{t as createGameMessageBody,o as sendGameMessage,r as unbiasedRandomInt};
@@ -0,0 +1 @@
1
+ import{isValidGiftBody as e}from"../../mapping/gift-body.js";function t(t,o){if("channel"===o.conversationType)throw new Error("sendGift: CHANNEL 不发送礼物");if(!e(o.gift))throw new Error("sendGift: 礼物正文非法");const{id:n,createdAt:r}=t.outbox.allocateMessageIdentity(o);return t.outbox.enqueueMedia({id:n,createdAt:r,conversationId:o.conversationId,conversationType:o.conversationType,contentType:"gift",body:{gift:o.gift},encryption:{encrypted:!1},...void 0===o.refMessageId?{}:{refMessageId:o.refMessageId}})}export{t as sendGiftMessage};
@@ -0,0 +1 @@
1
+ import{isValidLiveRoomBody as e}from"../../mapping/live-room-body.js";function o(o,t){if(!e(t.liveRoom))throw new Error("sendLiveRoom: 直播间分享正文非法");const{id:n,createdAt:r}=o.outbox.allocateMessageIdentity(t);return o.outbox.enqueueMedia({id:n,createdAt:r,conversationId:t.conversationId,conversationType:t.conversationType,contentType:"liveRoom",body:{liveRoom:t.liveRoom},encryption:{encrypted:t.encrypted??!1},...void 0===t.refMessageId?{}:{refMessageId:t.refMessageId}})}export{o as sendLiveRoomMessage};
@@ -0,0 +1 @@
1
+ import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as e,MEDIA_ALBUM_MAX_ITEMS as t,resolveMediaAlbumSendContentType as a,measureMediaAlbumContentBytes as i,mediaAlbumBMessageFields as n,MEDIA_ALBUM_CONTENT_WARN_BYTES as o}from"../../mapping/media-album-body.js";import{computeSortKey as r}from"../../mapping/sort.js";import{SIMPLE_ENCRYPT_HEAD_BYTES as d}from"../../ports/crypto-port.js";import{mediaAssetResourceVersion as s}from"../../ports/media-asset-cache-port.js";import{LOCAL_MEDIA_ERROR_CODE as l}from"../../mapping/stored-message.js";function c(e){return Number.isFinite(e)&&e>0}const u=16384;function p(e,t){if(("video"===t||"image"===t)&&void 0!==e&&c(e.width)&&c(e.height)&&("video"!==t||void 0===e.duration||c(e.duration))&&("video"!==t||void 0===e.posterData||e.posterData instanceof Uint8Array&&0!==e.posterData.length&&!(e.posterData.length>16384)))return{width:e.width,height:e.height,..."video"===t&&void 0!==e.duration?{duration:e.duration}:{},..."video"===t&&void 0!==e.posterData?{thumbData:new Uint8Array(e.posterData)}:{}}}function m(e,t){return void 0===t?e:{...e,width:t.width,height:t.height,...void 0===t.thumbData?{}:{thumbData:t.thumbData},...void 0===e.duration&&void 0!==t.duration?{duration:t.duration}:{}}}const f={contentType:"image",uploadKind:"image",encryptMode:"integral",streamUpload:!0,async buildPreview(e,t,a,i){const n=await a.imageDimensions(e,t,i),o=await a.imageThumbnail(e,{mimeType:t,maxSize:320,targetBytes:12288,maxBytes:20480,quality:.9,minQuality:.72},i);return{width:n.width,height:n.height,...o.data.byteLength<=20480?{thumbData:o.data}:{}}},buildBody:({url:e,meta:t,size:a,teaKey:i,fileEncryptType:n})=>({image:{url:e,width:t.width,height:t.height,...void 0!==t.thumbData?{thumbData:t.thumbData}:{},...void 0!==a?{size:a}:{},...void 0!==n?{fileEncryptType:n}:{},...void 0!==i?{teaKey:i}:{}}})},v={contentType:"video",uploadKind:"video",encryptMode:"integral",streamUpload:!0,async buildPreview(e,t,a,i){const n=await a.videoPoster(e,{mimeType:t,maxSize:320,targetBytes:10240,maxBytes:u,quality:.84,minQuality:.68},i);return{width:n.width,height:n.height,...n.data.byteLength<=u?{thumbData:n.data}:{},duration:n.duration}},buildBody:({url:e,meta:t,size:a,teaKey:i,fileEncryptType:n},o)=>({video:{url:e,width:t.width,height:t.height,...void 0!==t.duration?{duration:t.duration}:{},...void 0!==o.caption&&""!==o.caption?{describe:o.caption}:{},...void 0!==t.thumbData?{thumbData:t.thumbData}:{},...void 0!==a?{size:a,sizeUnit:"bytes"}:{},...void 0!==n?{fileEncryptType:n}:{},...void 0!==i?{teaKey:i}:{}}})},g={contentType:"voice",uploadKind:"voice",encryptMode:"integral",buildPreview:()=>Promise.resolve({width:0,height:0}),buildBody:({url:e,size:t,teaKey:a,fileEncryptType:i},n)=>({voice:{url:e,durationMs:n.durationMs??0,...void 0!==n.waveform&&n.waveform.length>0?{waveform:n.waveform}:{},...void 0!==t?{size:t}:{},...void 0!==i?{fileEncryptType:i}:{},...void 0!==a?{teaKey:a}:{}}})},y={contentType:"sticker",uploadKind:"sticker",encryptMode:"none",async buildPreview(e,t,a,i){const n=await a.imageDimensions(e,t,i);return{width:n.width,height:n.height}},buildBody:({url:e,meta:t,size:a})=>({sticker:{url:e,width:t.width,height:t.height,exprType:2,imageType:1,...void 0===a?{}:{size:a}}})};const h={contentType:"file",uploadKind:"file",encryptMode:"simple",streamUpload:!0,buildPreview:()=>Promise.resolve({width:0,height:0}),buildBody({url:e,size:t,teaKey:a,fileEncryptType:i},n){const o=n.filename??"",r=function(e){const t=e.lastIndexOf(".");return t>-1&&t<e.length-1?e.slice(t+1).toLowerCase():""}(o),d=function(e,t){const a=t??"";return a.startsWith("image/")||["jpg","jpeg","png","gif","webp","bmp","heic","svg"].includes(e)?1:a.startsWith("video/")||["mp4","mov","m4v","3gp","avi","mkv","webm","flv"].includes(e)?2:a.startsWith("audio/")||["mp3","m4a","wav","aac","flac","ogg"].includes(e)?3:["pdf","doc","docx","xls","xlsx","ppt","pptx","txt","csv","zip","rar","7z","apk","json"].includes(e)?4:0}(r,n.mimeType);return{file:{url:e,fileName:o,...void 0!==t?{size:t}:{},...""!==r?{extension:r}:{},...0!==d?{fileType:d}:{},...void 0!==n.mimeType&&""!==n.mimeType?{mimeType:n.mimeType}:{},...void 0!==i?{fileEncryptType:i}:{},...void 0!==a?{teaKey:a}:{}}}}},w={...h,contentType:"filesAlbum",buildBody(e,t){const a=h.buildBody(e,t).file;return{filesAlbum:{...t.caption?.trim()?{caption:t.caption}:{},items:[{...a,extension:a.extension??"",fileType:a.fileType??0,...["zip","rar","torrent"].includes(a.extension??"")?{fileType:5}:{},...void 0===e.md5?{}:{md5:e.md5}}]}}}};function b(e){switch(e){case"empty":return"media.empty";case"no-crypto":return"media.noCrypto";case"preview-failed":return"media.previewFailed";case"encrypt-failed":return"media.encryptFailed";case"upload-failed":case"offline":return"media.uploadFailed";case"cancelled":return"media.cancelled";case"paused":throw new Error("暂停不是失败状态,不应生成失败文案");case"invalid-duration":return"media.invalidDuration";case"content-too-large":return"media.contentTooLarge"}}function T(e,t){return"video"===e||void 0===t||t>16777216?"large":"small"}function k(){return new DOMException("媒体上传已取消","AbortError")}function M(e){return"album"===e.kind?e.items.flatMap(e=>void 0===e.resume||void 0!==e.uploaded?[]:[{resume:e.resume,kind:e.uploadKind}]):void 0===e.resume?[]:[{resume:e.resume,kind:e.spec.uploadKind}]}function I(e){if("album"===e.kind)return{code:l,reason:"unknown",displayCode:b(e.failureReason),retryable:!1};const t="video"===e.spec.contentType||"file"===e.spec.contentType||"filesAlbum"===e.spec.contentType;return{code:l,reason:"unknown",displayCode:t?"media.uploadInterrupted":b(e.failureReason),mediaKind:e.spec.uploadKind,retryable:!1}}function A(e,t){if(!Number.isInteger(e)||e<1||e>6)throw new RangeError(`媒体上传并发数必须是 1-6 的整数(${t})`)}function E(c){const u=function(e){let t=0,a=0;const i=[];function n(i){return t<e.total&&("large"!==i||a<e.largeFiles)}function o(e){t+=1,"large"===e&&(a+=1);let i=!1;return()=>{i||(i=!0,t-=1,"large"===e&&(a-=1),r())}}function r(){let e=0;for(;e<i.length;){const t=i[e];t.signal.aborted?(i.splice(e,1),t.signal.removeEventListener("abort",t.onAbort),t.reject(k())):n(t.tier)?(i.splice(e,1),t.signal.removeEventListener("abort",t.onAbort),t.resolve(o(t.tier))):e+=1}}return{acquire:(e,t)=>t.aborted?Promise.reject(k()):new Promise((a,n)=>{const o={tier:e,signal:t,resolve:a,reject:n,onAbort:()=>{const e=i.indexOf(o);e>=0&&i.splice(e,1),n(k())}};i.push(o),t.addEventListener("abort",o.onAbort,{once:!0}),r()})}}(function(e){if(void 0===e)return{total:5,largeFiles:3};if("number"==typeof e)return A(e,"总数"),{total:e,largeFiles:e};const t=e.total??5;A(t,"total");const a=e.largeFiles??Math.min(3,t);if(A(a,"largeFiles"),a>t)throw new RangeError(`媒体上传大文件档并发数 ${a} 不能超过总并发数 ${t}`);return{total:t,largeFiles:a}}(c.maxConcurrentUploads)),E=/* @__PURE__ */new Map,C=/* @__PURE__ */new Map,P=/* @__PURE__ */new Map,K=/* @__PURE__ */new Map;let R=!1;const D=/* @__PURE__ */new Map,z=/* @__PURE__ */new Map,U=/* @__PURE__ */new Set,S=/* @__PURE__ */new Map,x=/* @__PURE__ */new Map;function _(e,t){const a=S.get(e)??/* @__PURE__ */new Set;S.set(e,a),a.add(t),U.add(t),t.finally(()=>{a.delete(t),U.delete(t),0===a.size&&S.get(e)===a&&S.delete(e),ie(e)})}function B(e){return[...S.get(e)??[]]}const O=/* @__PURE__ */new Map,F=/* @__PURE__ */new Set,L=/* @__PURE__ */new Map,q=/* @__PURE__ */new Map,V=/* @__PURE__ */new Map,j=/* @__PURE__ */new Map,N=/* @__PURE__ */new Map,Y=/* @__PURE__ */new Map;let $=!0,W=0,Q=0;function G(e){return{conversationType:e.conversationType,conversationId:e.conversationId}}function H(e,t,a,i){c.mediaTransfer.abandonUpload(e).catch(e=>{c.onMediaTransferError?.({stage:"upload",kind:t,messageId:a,conversation:i,cause:e})})}function J(e,t,a,i,n,o){if(!$)return;const r=G(t);L.set(e,{input:G(t),state:a,percent:i,phase:o}),c.emitter.emit({type:"media-task:updated",conversation:r,task:{id:`upload:${e}`,messageId:e,ref:r,direction:"upload",state:a,percent:Math.max(0,Math.min(100,Math.round(i))),attempt:K.get(e)?.attempt??1,maxAttempts:3,...V.get(e),...q.has(e)?{items:Object.freeze(q.get(e).map(e=>Object.freeze({...e,state:"completed"===e.state?"completed":"canceled"===a||"failed"===a?a:e.state})))}:{},...z.get(e),...void 0===o?{}:{phase:o},...void 0===n?{}:{failure:n}}})}function X(e,t){ae(),N.delete(e),Y.delete(e),N.set(e,t),te()}function Z(e){const t=K.get(e);if(E.has(e)||O.has(e)||B(e).length>0||void 0!==t&&(!0!==t.settled||void 0!==t.waiting))return!1;const a=L.get(e)?.state;return"failed"===a||"canceled"===a||"paused"===a&&"manual"===t?.pauseReason}function ee(e,t){const a=G(t.input),i=M(t),n="media"===t.kind?t.spec.uploadKind:"image",o={...I(t),displayCode:"media.uploadInterrupted",retryable:!1};N.delete(e),Y.delete(e),K.delete(e),j.delete(e),V.delete(e),q.delete(e),z.delete(e),D.delete(e),L.delete(e),P.delete(e);for(const t of i)H(t.resume,t.kind,e,a);if(function(e,t,a){const i=c.recoveryPort;if(void 0===i)return;const n=B(e),o=Promise.all(n).then(()=>i.remove(G(t),e)).catch(i=>{c.onMediaTransferError?.({stage:"upload",kind:a,messageId:e,conversation:G(t),cause:i})});_(e,o)}(e,a,n),!$)return;const r=c.domainState.getConversationMessage?.(a,e)??t.message;"sent"!==r.status&&(c.domainState.upsertMessages([{...r,status:"failed",failure:o}],"live"),J(e,a,"failed",0,o))}function te(){if($)for(const[e,t]of N){if(N.size<=3)break;Z(e)&&ee(e,t)}}function ae(){if(!$)return;const e=Date.now();for(const[t,a]of N){const i=Y.get(t);void 0!==i&&e-i>=864e5&&Z(t)&&ee(t,a)}}function ie(e){$&&(N.has(e)&&Z(e)&&!Y.has(e)&&Y.set(e,Date.now()),te())}async function ne(e,t,a,i,n,o,f=!1){const v=W,g=()=>$&&v===W;if(!g())return void 0!==o&&void 0!==a&&H(o,e.uploadKind,a,G(t)),{ok:!1,reason:"cancelled"};const y=Q;let h,w,M=n,I=o,A=Promise.resolve(void 0);const U=/* @__PURE__ */new Set,S="function"==typeof t.data;const B=function(e){return"undefined"!=typeof Blob&&e instanceof Blob}(t.data)?t.data:void 0,O=S||void 0!==B?void 0:t.data,F=S||void 0!==B,q=!0===e.streamUpload&&void 0!==B,Y=e=>{if(void 0!==B)return B;if(void 0===e)throw new Error("媒体预览缺少内容:非 Blob 输入必须先读出字节");return new Blob([e],void 0===t.mimeType?void 0:{type:t.mimeType})};if(0===O?.length||0===B?.size)return{ok:!1,reason:"empty"};const Z=t.encrypted??!0;if(Z&&void 0===c.crypto)return{ok:!1,reason:"no-crypto"};const ee=p(t.localPreviewMetadata,e.contentType);if(("video"===e.contentType||"image"===e.contentType)&&void 0!==t.localPreviewMetadata&&void 0===ee)return{ok:!1,reason:"preview-failed"};const te=void 0===a||void 0===i?c.outbox.allocateMessageIdentity({conversationId:t.conversationId,conversationType:t.conversationType}):{id:a,createdAt:i},{id:ae,createdAt:ie}=te,ne=c.getSelfId();let oe=ee??{width:0,height:0};if(!F)try{oe=m(await e.buildPreview(Y(O),t.mimeType,c.mediaPreview),ee)}catch{}if(!g())return void 0!==I&&H(I,e.uploadKind,ae,G(t)),{ok:!1,reason:"cancelled"};const re=B?.size??O?.byteLength,de={url:t.localPreviewUrl??"",...void 0===re?{}:{size:re}};let le={id:ae,conversationId:t.conversationId,conversationType:t.conversationType,senderId:ne,contentType:e.contentType,body:e.buildBody({...de,meta:oe},t),createdAt:ie,sortKey:r(ie,ae),status:"uploading",receipt:"unread",encryption:{encrypted:Z},...void 0!==t.refMessageId?{refMessageId:t.refMessageId}:{}};c.domainState.upsertMessages([le],"live",{newOutgoing:!0});const ce=f?0:j.get(ae)??0;f&&V.delete(ae),j.set(ae,ce),J(ae,t,"queued",ce,void 0,"waiting-upload-slot");const ue=(a,i=!1)=>{const n={code:l,reason:"unknown",displayCode:"cleanup-unconfirmed"===h?"media.cleanupUnconfirmed":"resume-unavailable"===h?"media.resumeUnavailable":"timeout"===h?"media.uploadTimeout":b(a),mediaKind:e.uploadKind,retryable:i};if(!g())return{ok:!1,reason:a};const o=K.get(ae);return"paused"===o?.stopped?(J(ae,t,"paused",j.get(ae)??0),{ok:!1,reason:a}):void 0!==o&&void 0===o.stopped&&o.attempt<3&&("network"===o.failure||"timeout"===o.failure||"credentials-expired"===o.failure||"offline"===a&&void 0!==c.waitUntilOnline)?(J(ae,t,"queued",j.get(ae)??0,void 0,"waiting-retry"),{ok:!1,reason:a}):("cancelled"===o?.stopped||void 0!==o&&o.attempt>=3&&("network"===o.failure||"timeout"===o.failure||"credentials-expired"===o.failure)||(c.domainState.upsertMessages([{...le,status:"failed",failure:n}],"live"),J(ae,t,"cancelled"===a?"canceled":"failed",j.get(ae)??0,n)),{ok:!1,reason:a})},pe=async()=>{if(void 0!==I)try{await c.mediaTransfer.abandonUpload(I),I=void 0}catch(a){throw h="cleanup-unconfirmed",c.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:G(t),cause:a}),a}},me=async a=>{if(await A,await Promise.all([...U]),"cancelled"===a&&"paused"!==K.get(ae)?.stopped&&!0!==K.get(ae)?.retainCheckpoint&&"cleanup-unconfirmed"!==h)try{await pe()}catch{}return"cancelled"===a&&"paused"!==K.get(ae)?.stopped&&!0!==K.get(ae)?.retainCheckpoint&&void 0!==c.recoveryPort&&(await Promise.all([...U]),await c.recoveryPort.remove(G(t),ae).catch(a=>c.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:G(t),cause:a}))),g()?(X(ae,{kind:"media",spec:e,input:t,createdAt:ie,message:le,failureReason:a,...!0===K.get(ae)?.retainCheckpoint?{retainCheckpoint:!0}:{},..."cleanup-unconfirmed"===h||"resume-unavailable"===h?{restartRequired:!0}:{},...void 0===M?{}:{teaKey:M},...void 0===I?{}:{resume:I}}),ue(a,!0)):{ok:!1,reason:"cancelled"}},fe=new AbortController;E.set(ae,fe),C.set(ae,G(t));const ve=K.get(ae)?.stopped;void 0!==ve&&fe.abort("cancelled"===ve&&K.get(ae)?.retainCheckpoint?"cancelled-preserve":ve),!1===c.isOnline?.()&&se(ae,"offline");try{if(f&&(await pe(),!g()))return{ok:!1,reason:"cancelled"};if(void 0!==B&&("video"!==e.contentType||void 0===ee?.thumbData)){try{oe=m(await e.buildPreview(B,t.mimeType,c.mediaPreview,fe.signal),ee)}catch{}if(!g())return{ok:!1,reason:"cancelled"};le={...le,body:e.buildBody({url:t.localPreviewUrl??"",meta:oe,size:B.size},t)},c.domainState.upsertMessages([le],"live")}const a=await u.acquire(T(e.contentType,B?.size??O?.byteLength),fe.signal);try{let a;J(ae,t,"running",j.get(ae)??0);try{q||(a=S?await t.data():void 0!==B?new Uint8Array(await B.arrayBuffer()):O)}catch{return ue("upload-failed",!0)}const i=q?B.size:a.length;if(0===i)return ue("empty");if(S&&("video"!==e.contentType||void 0===ee?.thumbData)){try{oe=m(await e.buildPreview(Y(a),t.mimeType,c.mediaPreview,fe.signal),ee)}catch{}if(!g())return{ok:!1,reason:"cancelled"};le={...le,body:e.buildBody({url:t.localPreviewUrl??"",meta:oe,size:i},t)},c.domainState.upsertMessages([le],"live")}if(fe.signal.throwIfAborted(),("video"===e.contentType||"file"===e.contentType||"filesAlbum"===e.contentType)&&void 0!==c.recoveryPort&&!0===c.shouldPersistUpload?.(e.uploadKind,i)){w=new AbortController,x.set(ae,w);const i=w.signal;z.set(ae,{recovery:"session-only",recoveryReason:"fingerprint-pending"}),A=Promise.resolve().then(()=>c.recoveryPort.fingerprint(q?B:a,i)).catch(a=>{!i.aborted&&g()&&(z.set(ae,{recovery:"session-only",recoveryReason:"unavailable"}),c.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:G(t),cause:a}))}),q||await A}if(fe.signal.aborted)throw k();let n,o,r=q?B:a,l=1;if(Z&&void 0!==c.crypto&&"none"!==e.encryptMode){const t=c.crypto;try{M??(M=t.randomTeaKey());const i=M;"simple"===e.encryptMode?(r=q?new Blob([new Uint8Array(t.encryptFileSimple({teaKey:i,plain:new Uint8Array(await B.slice(0,d).arrayBuffer())})),B.slice(d)]):t.encryptFileSimple({teaKey:i,plain:a}),l=2):q?(n=e=>t.encryptSymmetricChunked({teaKey:i,plain:e,signal:fe.signal}),l=3):(r=t.encryptSymmetric({teaKey:i,plain:a}),l=3)}catch{return ue("encrypt-failed")}}try{!1===c.isOnline?.()&&se(ae,"offline"),await(c.waitUntilOnline?.(fe.signal)),fe.signal.throwIfAborted();o=(await c.mediaTransfer.upload({recoveryManaged:!0,forceRefreshCredentials:!0===K.get(ae)?.refreshCredentials,data:r,...void 0===n?{}:{transformPart:n},kind:e.uploadKind,conversationType:t.conversationType,signal:fe.signal,...void 0===I?{}:{resume:I},onFailure:e=>{if(g()&&E.get(ae)===fe){h=e;const t=K.get(ae);void 0!==t&&(t.failure=e)}},onResumeInvalidated:()=>{g()&&E.get(ae)===fe&&(I=void 0)},onResumable:a=>{if(g()&&E.get(ae)===fe&&(I=a,!("cancelled"===K.get(ae)?.stopped&&!0!==K.get(ae)?.retainCheckpoint||void 0===w||void 0===c.recoveryPort||"video"!==e.contentType&&"file"!==e.contentType&&"filesAlbum"!==e.contentType))){const i=D.get(ae)??Date.now();D.set(ae,i);const n=A.then(async n=>{void 0===n||w?.signal.aborted||!g()&&!R||E.get(ae)!==fe||"cancelled"===K.get(ae)?.stopped&&!0!==K.get(ae)?.retainCheckpoint&&!R||(await c.recoveryPort.save({version:1,ref:G(t),messageId:ae,kind:"video"===e.contentType?"video":"file",createdAt:ie,savedAt:i,source:{...n,...void 0===t.filename?{}:{filename:t.filename},...void 0===t.mimeType?{}:{mimeType:t.mimeType}},encrypted:Z,...void 0===M?{}:{teaKey:M},resume:a,...void 0===t.caption?{}:{caption:t.caption},...void 0===t.filesAlbum?{}:{filesAlbum:t.filesAlbum},...void 0===t.refMessageId?{}:{refMessageId:t.refMessageId},..."video"===e.contentType?{preview:oe}:{}}),E.get(ae)!==fe||w?.signal.aborted||z.set(ae,{recovery:"available"}))}).catch(a=>{const i="object"==typeof a&&null!==a&&"reason"in a?String(a.reason):"storage";(E.get(ae)===fe||N.has(ae))&&z.set(ae,{recovery:"session-only",recoveryReason:i}),c.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:G(t),cause:a})});U.add(n),_(ae,n),n.finally(()=>{U.delete(n);const e=L.get(ae);!$||void 0===e||"running"!==e.state&&"paused"!==e.state&&"queued"!==e.state||J(ae,e.input,e.state,e.percent,void 0,e.phase)})}},...void 0!==t.filename?{filename:t.filename}:{},...void 0!==t.mimeType?{mimeType:t.mimeType}:{},onProgress:e=>{if(!g()||fe.signal.aborted||E.get(ae)!==fe)return;const a=Number.isFinite(e.percent)?Math.max(0,Math.min(100,Math.round(e.percent))):0,i=Math.max(j.get(ae)??0,a);V.set(ae,{bytesTransferred:e.bytesTransferred,bytesTotal:e.bytesTotal}),j.set(ae,i),c.emitter.emit({type:"media:progress",conversation:G(t),messageId:ae,percent:i}),fe.signal.aborted||E.get(ae)!==fe||J(ae,t,"running",i,void 0,e.phase)}})).url}catch(a){if(fe.signal.aborted&&a instanceof Error&&"AbortError"===a.name||c.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:G(t),cause:a}),!g())return{ok:!1,reason:"cancelled"};const i=fe.signal.aborted?P.get(ae)??"cancelled":"upload-failed";return await me(i)}if(!g())return{ok:!1,reason:"cancelled"};if(fe.signal.aborted){const e=P.get(ae)??"cancelled";return await me(e)}if(y===Q&&("image"===e.contentType||"video"===e.contentType)&&void 0!==c.mediaAssetCache){const i=e.contentType,n=B??new Blob([a],void 0===t.mimeType?void 0:{type:t.mimeType}),r=n.size;c.mediaAssetCache.put({kind:i,messageId:ae,resourceVersion:s(o,{conversation:G(t)}),blob:n,...void 0===t.mimeType?{}:{mimeType:t.mimeType}}).catch(e=>{c.onMediaAssetCacheError?.({operation:"put",kind:i,messageId:ae,byteLength:r,cause:e})})}const u="filesAlbum"===e.contentType?await(c.mediaPreview.fileMd5?.(Y(a),fe.signal)):void 0;if(!g())return{ok:!1,reason:"cancelled"};if(fe.signal.throwIfAborted(),"filesAlbum"===e.contentType&&void 0===u)throw new Error("FILES_ALBUM requires fileMd5");return await A,await Promise.all([...U]),g()?(fe.signal.throwIfAborted(),c.outbox.enqueueMedia({optimisticAlreadyCreated:!0,id:ae,conversationId:t.conversationId,conversationType:t.conversationType,contentType:e.contentType,body:e.buildBody({url:o,meta:oe,size:i,...void 0===u?{}:{md5:u},..."none"===e.encryptMode?{}:{teaKey:M,fileEncryptType:l}},t),encryption:{encrypted:Z},createdAt:ie,...void 0!==t.refMessageId?{refMessageId:t.refMessageId}:{}}),await Promise.all([...U]),void 0!==c.recoveryPort&&await c.recoveryPort.remove(G(t),ae).catch(a=>c.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:G(t),cause:a})),J(ae,t,"completed",100),{ok:!0,messageId:ae}):{ok:!1,reason:"cancelled"}}finally{a()}}catch{if(!g())return{ok:!1,reason:"cancelled"};const e=fe.signal.aborted?P.get(ae)??"cancelled":"upload-failed";return await me(e)}finally{await A,await Promise.all([...U]),x.get(ae)===w&&x.delete(ae),!g()&&R&&await Promise.all([...U]),g()||void 0===I||R&&"available"===z.get(ae)?.recovery||H(I,e.uploadKind,ae,G(t)),E.get(ae)===fe&&(E.delete(ae),C.delete(ae),N.has(ae)||j.delete(ae),P.delete(ae))}}async function oe(d,g,y,h,w=!1){const k=W,M=()=>$&&k===W,I=G(d),A=(e,t)=>{for(const a of t)void 0!==a.resume&&H(a.resume,a.uploadKind,e,I)};if(!M())return void 0!==g&&void 0!==h&&A(g,h),{ok:!1,reason:"cancelled"};if(0===d.items.length)return{ok:!1,reason:"empty"};if(d.items.length>t)throw new RangeError(`媒体合集最多 ${t} 项,收到 ${d.items.length} 项`);const R=void 0!==d.caption&&""!==d.caption.trim()?d.caption:void 0;if(void 0!==R&&Array.from(R).length>e)throw new RangeError(`媒体合集配文最长 ${e} 字符,收到 ${Array.from(R).length}`);if(d.items.some(e=>0===e.data.size))return{ok:!1,reason:"empty"};if(void 0===h&&"mediaAlbum"!==a(d)){const e=d.items[0];return ne("video"===e.kind?v:f,{conversationId:d.conversationId,conversationType:d.conversationType,data:e.data,...void 0!==e.mimeType?{mimeType:e.mimeType}:{},...void 0!==e.filename?{filename:e.filename}:{},...void 0!==e.localPreviewUrl?{localPreviewUrl:e.localPreviewUrl}:{},...void 0!==e.localPreviewMetadata?{localPreviewMetadata:e.localPreviewMetadata}:{},...void 0!==d.encrypted?{encrypted:d.encrypted}:{},...void 0!==d.refMessageId?{refMessageId:d.refMessageId}:{}},g,y)}const D=d.encrypted??!0;if(D&&void 0===c.crypto)return{ok:!1,reason:"no-crypto"};const z=D?c.crypto:void 0,U=Q,S=void 0===g||void 0===y?c.outbox.allocateMessageIdentity(I):{id:g,createdAt:y},{id:x,createdAt:_}=S,B=d.items.map((e,t)=>{const a=h?.[t];return{uploadKind:e.kind,...void 0===a?.uploaded?{}:{uploaded:a.uploaded},...void 0===a?.preview?{}:{preview:a.preview},...void 0===a?.teaKey?{}:{teaKey:a.teaKey},...void 0===a?.resume?{}:{resume:a.resume}}}),O=B.map((e,t)=>{const a=d.items[t].data.size,i=void 0!==e.uploaded?a:w?0:e.resume?.bytesUploaded??0;return{itemIndex:t,bytesTransferred:i,bytesTotal:a,percent:void 0!==e.uploaded?100:Math.min(99,Math.floor(i/a*100)),state:void 0!==e.uploaded?"completed":"queued"}});q.set(x,O);const F=()=>({...void 0===R?{}:{caption:R},items:d.items.map((e,t)=>function(e,t,a){const i=t.uploaded,n=i?.meta??t.preview??p(e.localPreviewMetadata,e.kind)??{width:0,height:0};return{kind:e.kind,url:i?.url??e.localPreviewUrl??"",width:n.width,height:n.height,..."video"===e.kind&&void 0!==n.duration&&n.duration>0?{durationMs:Math.max(1,Math.round(1e3*n.duration))}:{},...void 0===n.thumbData?{}:{thumbData:n.thumbData},size:i?.size??e.data.size,...void 0===i?.teaKey?{}:{teaKey:i.teaKey},...void 0===i?{}:{fileEncryptType:i.fileEncryptType},...void 0===a?{}:{hd:a}}}(e,B[t],d.hd))});let L={id:x,conversationId:d.conversationId,conversationType:d.conversationType,senderId:c.getSelfId(),contentType:"mediaAlbum",body:{mediaAlbum:F()},createdAt:_,sortKey:r(_,x),status:"uploading",receipt:"unread",encryption:{encrypted:D},...void 0!==d.refMessageId?{refMessageId:d.refMessageId}:{}};c.domainState.upsertMessages([L],"live",{newOutgoing:!0});const Y=w?0:j.get(x)??0;let Z;w&&V.delete(x),j.set(x,Y),J(x,d,"queued",Y,void 0,"waiting-upload-slot");const ee=(e,t)=>{const a={code:l,reason:"unknown",displayCode:"cleanup-unconfirmed"===Z?"media.cleanupUnconfirmed":"resume-unavailable"===Z?"media.resumeUnavailable":"timeout"===Z?"media.uploadTimeout":b(e),retryable:t};if(!M())return{ok:!1,reason:e};const i=K.get(x);return"paused"===i?.stopped?(J(x,d,"paused",j.get(x)??0),{ok:!1,reason:e}):void 0!==i&&void 0===i.stopped&&i.attempt<3&&("network"===i.failure||"timeout"===i.failure||"credentials-expired"===i.failure||"offline"===e&&void 0!==c.waitUntilOnline)?(J(x,d,"queued",j.get(x)??0,void 0,"waiting-retry"),{ok:!1,reason:e}):("cancelled"===i?.stopped||void 0!==i&&i.attempt>=3&&("network"===i.failure||"timeout"===i.failure||"credentials-expired"===i.failure)||(c.domainState.upsertMessages([{...L,status:"failed",failure:a}],"live"),J(x,d,"cancelled"===e?"canceled":"failed",j.get(x)??0,a)),{ok:!1,reason:e})},te=new AbortController;E.set(x,te),C.set(x,I);const ae=K.get(x)?.stopped;void 0!==ae&&te.abort("cancelled"===ae&&K.get(x)?.retainCheckpoint?"cancelled-preserve":ae),!1===c.isOnline?.()&&se(x,"offline");const ie=()=>M()&&E.get(x)===te,oe=()=>{M()&&ie()&&(L={...L,body:{mediaAlbum:F()}},c.domainState.upsertMessages([L],"live"))},re=d.items.reduce((e,t)=>e+t.data.size,0),de=B.map((e,t)=>void 0!==e.uploaded?d.items[t].data.size:e.resume?.bytesUploaded??0),le=()=>{if(!M()||!ie()||te.signal.aborted)return;const e=de.reduce((e,t)=>e+t,0),t=Math.min(99,Math.max(j.get(x)??0,Math.floor(e/re*100)));V.set(x,{bytesTransferred:e,bytesTotal:re}),j.set(x,t),c.emitter.emit({type:"media:progress",conversation:I,messageId:x,percent:t}),!te.signal.aborted&&ie()&&J(x,d,"running",t,void 0,"transferring")};let ce;const ue=async()=>{let e=!0;return await Promise.all(B.map(async t=>{if(void 0!==t.resume)try{await c.mediaTransfer.abandonUpload(t.resume),delete t.resume}catch(a){e=!1,Z="cleanup-unconfirmed",c.onMediaTransferError?.({stage:"upload",kind:t.uploadKind,messageId:x,conversation:I,cause:a})}})),e},pe=e=>(X(x,{kind:"album",input:d,createdAt:_,message:L,failureReason:e,items:B,...!0===K.get(x)?.retainCheckpoint?{retainCheckpoint:!0}:{},..."cleanup-unconfirmed"===Z||"resume-unavailable"===Z?{restartRequired:!0}:{}}),ee(e,!0));try{if(w){const e=await ue();if(!M())return{ok:!1,reason:"cancelled"};if(!e)return pe("cancelled"===P.get(x)?"cancelled":"upload-failed");for(let e=0;e<B.length;e+=1)void 0===B[e].uploaded&&(de[e]=0)}if(await Promise.all(d.items.map(async(e,t)=>{const a=B[t];if(void 0===a.uploaded)try{!1===c.isOnline?.()&&se(x,"offline"),await(c.waitUntilOnline?.(te.signal)),te.signal.throwIfAborted();const i=await async function(e){const{conversation:t,encryptWith:a,isCurrentAttempt:i,item:n,onBytesUploaded:o,onPreviewReady:r,onSlotAcquired:d,signal:s,state:l}=e,g="video"===n.kind?v:f,y=p(n.localPreviewMetadata,n.kind);let h=y??{width:0,height:0};if("video"!==n.kind||void 0===y?.thumbData)try{h=m(await g.buildPreview(n.data,n.mimeType,c.mediaPreview,s),y)}catch{}void 0===h.thumbData&&void 0!==l.preview?.thumbData&&(h=l.preview),l.preview=h,r();const w=await u.acquire(T(n.kind,n.data.size),s);try{let r;d();let u=1;if(void 0!==a){l.teaKey??(l.teaKey=a.randomTeaKey());const e=l.teaKey;r=t=>a.encryptSymmetricChunked({teaKey:e,plain:t,signal:s}),u=3}return{url:(await c.mediaTransfer.upload({recoveryManaged:!0,forceRefreshCredentials:e.forceRefreshCredentials,data:n.data,...void 0===r?{}:{transformPart:r},kind:g.uploadKind,conversationType:t.conversationType,signal:s,...void 0===l.resume?{}:{resume:l.resume},onFailure:t=>{i()&&e.onFailure(t)},onResumeInvalidated:()=>{i()&&delete l.resume},onResumable:e=>{$&&i()&&(l.resume=e)},...void 0!==n.filename?{filename:n.filename}:{},...void 0!==n.mimeType?{mimeType:n.mimeType}:{},onProgress:e=>{$&&!s.aborted&&i()&&o(e.bytesTransferred)}})).url,meta:h,size:n.data.size,...void 0===l.teaKey?{}:{teaKey:l.teaKey},fileEncryptType:u}}finally{w()}}({item:e,state:a,conversation:I,encryptWith:z,signal:te.signal,isCurrentAttempt:ie,onPreviewReady:oe,onSlotAcquired:()=>{M()&&ie()&&!te.signal.aborted&&(O[t]={...O[t],state:"running"},J(x,d,"running",j.get(x)??0))},forceRefreshCredentials:!0===K.get(x)?.refreshCredentials,onFailure:e=>{const t="cleanup-unconfirmed"===e||"resume-unavailable"===e;if(te.signal.aborted&&!t)return;"cleanup-unconfirmed"!==e&&("cleanup-unconfirmed"===Z||"resume-unavailable"!==e&&"resume-unavailable"===Z)||(Z=e);const a=K.get(x);void 0!==a&&(a.failure=Z)},onBytesUploaded:a=>{de[t]=a,O[t]={...O[t],bytesTransferred:a,percent:Math.min(99,Math.floor(a/e.data.size*100)),state:"running"},le()}});if(!ie())return;a.uploaded=i,O[t]={...O[t],bytesTransferred:e.data.size,percent:100,state:"completed"},de[t]=e.data.size,le()}catch(a){ie()&&!te.signal.aborted&&(O[t]={...O[t],state:"failed"}),((e,t)=>{void 0===ce&&(ce=te.signal.aborted?P.get(x)??"cancelled":"upload-failed","upload-failed"===ce&&c.onMediaTransferError?.({stage:"upload",kind:e,messageId:x,conversation:I,cause:t}),te.abort("offline"))})(e.kind,a)}})),!M())return{ok:!1,reason:"cancelled"};if(!ie())return{ok:!1,reason:"cancelled"};if("cancelled"===P.get(x))return"cleanup-unconfirmed"!==Z&&!0!==K.get(x)?.retainCheckpoint&&await ue(),M()?pe("cancelled"):{ok:!1,reason:"cancelled"};if(void 0!==ce)return pe(ce);if(te.signal.aborted){return pe(P.get(x)??"cancelled")}const e=F();let t;try{t=i(n(e).content)}catch(t){return c.onMediaAlbumContentSize?.({messageId:x,conversation:I,itemCount:e.items.length,outcome:"rejected",cause:t}),ee("content-too-large",!1)}if(t>=o&&c.onMediaAlbumContentSize?.({messageId:x,conversation:I,itemCount:e.items.length,contentBytes:t,outcome:"warn"}),U===Q&&void 0!==c.mediaAssetCache){const e=c.mediaAssetCache;d.items.forEach((t,a)=>{const i=B[a].uploaded;void 0!==i&&e.put({kind:t.kind,messageId:x,resourceVersion:s(i.url,{conversation:I,itemIndex:a}),blob:t.data,...void 0===t.mimeType?{}:{mimeType:t.mimeType}}).catch(e=>{c.onMediaAssetCacheError?.({operation:"put",kind:t.kind,messageId:x,byteLength:t.data.size,cause:e})})})}return c.outbox.enqueueMedia({optimisticAlreadyCreated:!0,id:x,conversationId:d.conversationId,conversationType:d.conversationType,contentType:"mediaAlbum",body:{mediaAlbum:e},encryption:{encrypted:D},createdAt:_,...void 0!==d.refMessageId?{refMessageId:d.refMessageId}:{}}),J(x,d,"completed",100),{ok:!0,messageId:x}}finally{M()||A(x,B),E.get(x)===te&&(E.delete(x),C.delete(x),N.has(x)||j.delete(x),P.delete(x))}}function re(e,t,a,i=1){const{id:n,createdAt:o}=a??c.outbox.allocateMessageIdentity(G(e)),r={attempt:i};let d,s;Y.delete(n),K.set(n,r);const l=new Promise((e,t)=>{d=e,s=t});return r.done=l,(async()=>{let e=await t(n,o);for(;K.get(n)===r&&void 0===r.stopped&&r.attempt<3;){const t=N.get(n);if(!$||e.ok||void 0===t||t.restartRequired||"network"!==r.failure&&"timeout"!==r.failure&&"credentials-expired"!==r.failure&&(e.ok||"offline"!==e.reason||void 0===c.waitUntilOnline))break;const a=new AbortController;if(r.waiting=a,await(c.waitUntilOnline?.(a.signal).catch(()=>{})),await new Promise(e=>{const t=setTimeout(i,1===r.attempt?1e3:3e3);function i(){clearTimeout(t),a.signal.removeEventListener("abort",i),e()}a.signal.addEventListener("abort",i,{once:!0}),a.signal.aborted&&i()}),await(c.waitUntilOnline?.(a.signal).catch(()=>{})),delete r.waiting,!$||void 0!==r.stopped||K.get(n)!==r)break;r.attempt+=1,r.refreshCredentials="credentials-expired"===r.failure,delete r.failure,N.delete(n),Y.delete(n),e=await de(n,t,!1)}const a=N.get(n),i="cancelled"!==r.stopped&&r.attempt>=3&&("network"===r.failure||"timeout"===r.failure||"credentials-expired"===r.failure);if($&&K.get(n)===r&&void 0!==a&&i&&!0===c.retainFailedUploads){r.stopped="cancelled",r.retainCheckpoint=!0,a.retainCheckpoint=!0;const e={...I(a),displayCode:"timeout"===r.failure?"media.uploadTimeout":"media.uploadFailed",retryable:!0};c.domainState.upsertMessages([{...a.message,status:"failed",failure:e}],"live"),J(n,a.input,"failed",j.get(n)??0,e)}else if($&&K.get(n)===r&&void 0!==a&&("cancelled"===r.stopped||i)){r.stopped="cancelled";const t={...I(a),displayCode:"timeout"===r.failure?"media.uploadTimeout":"media.cancelled",retryable:!0===r.retainCheckpoint&&!i};(!0!==r.retainCheckpoint||i)&&await ue(n,a),$&&K.get(n)===r&&(c.domainState.upsertMessages([{...a.message,status:"failed",failure:t}],"live"),J(n,a.input,"canceled",j.get(n)??0,t)),e={ok:!1,reason:"cancelled"}}return"paused"===r.stopped?{ok:!1,reason:"paused"}:e})().then(e=>{r.settled=!0,ie(n),d(e)},e=>{r.settled=!0,ie(n),s(e)}),l.then(()=>{K.get(n)===r&&"paused"!==r.stopped&&(K.delete(n),N.has(n)||(j.delete(n),V.delete(n),q.delete(n),z.delete(n),D.delete(n),L.delete(n)))},()=>{K.get(n)===r&&K.delete(n)}),l}function de(e,t,a){return"album"===t.kind?oe(t.input,e,t.createdAt,t.items,a):ne(t.spec,t.input,e,t.createdAt,t.teaKey,t.resume,a)}function se(e,t){const a=K.get(e);if(!$||void 0===a||"cancelled"===a.stopped)return;if("paused"===a.stopped)return void("pagehide"===t&&"offline"===a.pauseReason&&(a.pauseReason="pagehide"));a.stopped="paused",a.pauseReason=t;const i=E.get(e);a.waiting?.abort(),i?.abort("paused");const n=L.get(e);void 0!==n&&K.get(e)===a&&"paused"===a.stopped&&J(e,n.input,"paused",j.get(e)??n.percent)}async function le(e,t="manual"){const a=K.get(e);if(!$||void 0===a||"cancelled"===a.stopped)return!1;if("paused"===a.stopped)return("manual"===t||"pagehide"===t&&"offline"===a.pauseReason)&&(a.pauseReason=t),await a.done,ie(e),$&&K.get(e)===a&&N.has(e);se(e,t),await a.done,await Promise.all(B(e));const i=N.get(e);return!(!$||K.get(e)!==a||"paused"!==a.stopped||void 0===i)&&(J(e,i.input,"paused",j.get(e)??0),!0)}function ce(e){ae();const t=K.get(e),a=N.get(e);if(!$||"paused"!==t?.stopped||!0!==t.settled||void 0===a||E.has(e))return!1;N.delete(e),Y.delete(e);const i=W;return re(a.input,()=>de(e,a,!1),{id:e,createdAt:a.createdAt},t.attempt).catch(t=>{$&&i===W&&c.onMediaTransferError?.({stage:"upload",kind:"media"===a.kind?a.spec.uploadKind:"image",messageId:e,conversation:G(a.input),cause:t})}),!0}async function ue(e,t){N.delete(e),Y.delete(e),z.delete(e),D.delete(e),V.delete(e),q.delete(e),F.add(e);try{await Promise.all(B(e)),await(c.recoveryPort?.remove(G(t.input),e).catch(a=>{c.onMediaTransferError?.({stage:"upload",kind:"media"===t.kind?t.spec.uploadKind:"image",messageId:e,conversation:G(t.input),cause:a})})),await Promise.all(M(t).map(async a=>{try{await c.mediaTransfer.abandonUpload(a.resume)}catch(i){c.onMediaTransferError?.({stage:"upload",kind:a.kind,messageId:e,conversation:G(t.input),cause:i})}}))}catch(a){c.onMediaTransferError?.({stage:"upload",kind:"media"===t.kind?t.spec.uploadKind:"image",messageId:e,conversation:G(t.input),cause:a})}finally{F.delete(e),z.delete(e),D.delete(e),V.delete(e)}}function pe(e,t){if(ae(),!$)return!1;const a=K.get(e),i=E.get(e);if(!0!==t?.retainCheckpoint&&x.get(e)?.abort(),void 0!==a&&(a.stopped="cancelled",a.retainCheckpoint=!0===t?.retainCheckpoint,a.waiting?.abort()),void 0!==i){const a=C.get(e);return void 0!==a&&!0!==t?.retainCheckpoint&&function(e,t){if(void 0===c.recoveryPort)return;const a=B(e),i="video"===c.domainState.getConversationMessage?.(t,e)?.contentType?"video":"file",n=Promise.all(a).then(()=>c.recoveryPort.remove(t,e)).catch(a=>{c.onMediaTransferError?.({stage:"upload",kind:i,messageId:e,conversation:t,cause:a})});_(e,n)}(e,a),P.set(e,"cancelled"),i.abort(!0===t?.retainCheckpoint?"cancelled-preserve":"cancelled"),!0}const n=N.get(e);if(void 0===n||void 0===a)return void 0!==a&&"queued"===L.get(e)?.state;if(!0===t?.retainCheckpoint)n.retainCheckpoint=!0,n.failureReason="cancelled";else{_(e,ue(e,n))}const o={...I(n),displayCode:"media.cancelled",retryable:!0===t?.retainCheckpoint};return c.domainState.upsertMessages([{...n.message,status:"failed",failure:o}],"live"),J(e,n.input,"canceled",j.get(e)??0,o),K.get(e)===a&&K.delete(e),ie(e),!0!==t?.retainCheckpoint&&(j.delete(e),q.delete(e),L.delete(e)),!0}async function me(e,t,a,i){ae();const n=W,o=B(t);return o.length>0&&await Promise.all(o),$&&n===W?(D.delete(t),re(i,()=>ne(e,i,t,a,void 0,void 0,!0),{id:t,createdAt:a})):{ok:!1,reason:"cancelled"}}return{sendImage:e=>re(e,(t,a)=>ne(f,e,t,a)),sendVideo:e=>re(e,(t,a)=>ne(v,e,t,a)),replaceVideo:(e,t,a)=>me(v,e,t,a),sendVoice:e=>{const t=e.durationMs;return void 0===t||!Number.isFinite(t)||t<1e3?Promise.resolve({ok:!1,reason:"invalid-duration"}):re(e,(t,a)=>ne(g,e,t,a))},sendFile:t=>void 0!==t.caption&&Array.from(t.caption).length>e?Promise.resolve({ok:!1,reason:"content-too-large"}):re(t,(e,a)=>ne(t.filesAlbum||t.caption?.trim()?w:h,t,e,a)),sendGif:e=>re(e,(t,a)=>ne(y,{...e,encrypted:!1},t,a)),sendMediaAlbum:e=>re(e,(t,a)=>oe(e,t,a)),replaceFile:(t,a,i)=>void 0!==i.caption&&Array.from(i.caption).length>e?Promise.resolve({ok:!1,reason:"content-too-large"}):me(i.filesAlbum||i.caption?.trim()?w:h,t,a,i),cancel:pe,pause:le,async pauseAll(e="pagehide"){for(const{controller:e}of O.values())e.abort();await Promise.all([...K.keys()].map(t=>le(t,e)))},async resumePaused(e,t){await Promise.all([...K.entries()].map(async([a,i])=>{if(t?.aborted||"paused"!==i.stopped||"manual"===i.pauseReason)return;if(void 0===e&&"offline"!==i.pauseReason)return;const n=L.get(a)?.input;if(void 0!==e&&(n?.conversationType!==e.conversationType||n.conversationId!==e.conversationId))return;await i.done;const o=N.get(a);t?.aborted||K.get(a)!==i||void 0===o||void 0===e&&"offline"!==i.pauseReason||(void 0===e||o.input.conversationType===e.conversationType&&o.input.conversationId===e.conversationId)&&ce(a)}))},resume:ce,cancelConversation(e,t="offline"){for(const t of O.values())t.ref.conversationType===e.conversationType&&t.ref.conversationId===e.conversationId&&t.controller.abort();for(const[t,a]of N)if(a.input.conversationType===e.conversationType&&a.input.conversationId===e.conversationId){if(K.has(t))pe(t);else{for(const e of M(a))H(e.resume,e.kind,t,G(a.input));c.recoveryPort?.remove(G(a.input),t).catch(i=>c.onMediaTransferError?.({stage:"upload",kind:"media"===a.kind?a.spec.uploadKind:"image",messageId:t,conversation:e,cause:i}))}N.delete(t),Y.delete(t),q.delete(t),V.delete(t),j.delete(t),L.delete(t)}if($)for(const[a,i]of C){if(i.conversationType!==e.conversationType||i.conversationId!==e.conversationId)continue;const n=E.get(a);if(void 0===n)continue;const o=K.get(a);void 0!==o&&(o.stopped="cancelled"),P.set(a,t),x.get(a)?.abort(),n.abort(t)}},cancelAll(e="offline"){if($){if("offline"===e){const e=W;for(const t of K.keys()){const a=L.get(t)?.input;le(t,"offline").catch(i=>{$&&e===W&&void 0!==a&&c.onMediaTransferError?.({stage:"upload",kind:"video"===c.domainState.getConversationMessage?.(a,t)?.contentType?"video":"file",messageId:t,conversation:a,cause:i})})}return}if("session-ended"===e){for(const{controller:e}of O.values())e.abort();for(const e of K.values())e.stopped="cancelled",e.waiting?.abort();W+=1,Q+=1}for(const t of x.values())t.abort(e);for(const t of E.values())t.abort(e)}},retry(e,t){if(ae(),F.has(e))return!1;if(!$)return!1;const a=N.get(e);if(void 0===a)return!1;if(!0===K.get(e)?.retainCheckpoint&&!0!==K.get(e)?.settled)return!1;if(a.restartRequired&&!0!==t?.restartUpload)return!1;const i=!0===t?.restartUpload||"cancelled"===a.failureReason&&!0!==a.retainCheckpoint;return N.delete(e),Y.delete(e),re(a.input,()=>de(e,a,i),{id:e,createdAt:a.createdAt}),!0},expireRetainedUploads:ae,invalidateAssetCacheWrites(){Q+=1},async dispose(e){if(!$)return;R=!0===e?.preserveRecovery;for(const{controller:e}of O.values())e.abort();const t=[...K.values()].flatMap(e=>void 0===e.done?[]:[e.done]);for(const e of K.values())e.stopped="cancelled",e.waiting?.abort();if($=!1,Q+=1,!R)for(const e of x.values())e.abort();for(const e of E.values())e.abort(R?"page-preserve":"cancelled");for(const[e,t]of N)if(!R||"available"!==z.get(e)?.recovery)for(const a of M(t))H(a.resume,a.kind,e,G(t.input));N.clear(),Y.clear(),await Promise.allSettled(t),await Promise.all([...U]),E.clear(),j.clear(),P.clear();for(const[e,t]of N)if(!R||"available"!==z.get(e)?.recovery)for(const a of M(t))H(a.resume,a.kind,e,G(t.input));N.clear(),Y.clear(),K.clear(),V.clear(),q.clear(),z.clear(),D.clear(),L.clear(),await(c.recoveryPort?.drain())},async recoverUpload(e,t,a){ae();const i=c.recoveryPort;if(!$||void 0===i)throw new Error("IM_MEDIA_RECOVERY_UNAVAILABLE");if(K.has(t)||O.has(t))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const n=new AbortController;O.set(t,{controller:n,ref:e});const o=()=>{if(!$||n.signal.aborted||O.get(t)?.controller!==n)throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE")},r=(e,t)=>{if(void 0===e||e.senderId!==c.getSelfId()||void 0!==e.recalled||void 0!==e.deletedForEveryone||"media.cancelled"===e.failure?.displayCode&&!0!==e.failure.retryable||"media.uploadTimeout"===e.failure?.displayCode&&!1===e.failure.retryable||"failed"!==e.status&&"uploading"!==e.status)return!1;const a="video"===e.contentType,i="file"===e.contentType||"filesAlbum"===e.contentType&&1===e.body.filesAlbum?.items.length;return(a||i)&&(void 0===t||e.contentType===t)};let d;try{d=await i.acquireLease(n.signal),o();const s=c.domainState.getConversationMessage?.(e,t);if(!r(s))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const l=await i.get(e,t);if(o(),void 0===l)throw new Error("IM_MEDIA_RECOVERY_NOT_FOUND");const u="video"===l.kind?"video":l.filesAlbum||l.caption?.trim()?"filesAlbum":"file";if(!r(s,u))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const p=await i.fingerprint(a,n.signal);if(o(),p.size!==l.source.size||p.sha256!==l.source.sha256)throw new Error("IM_MEDIA_RECOVERY_FILE_MISMATCH");const m=c.domainState.getConversationMessage?.(e,t);if(K.has(t)||!r(m,u))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const f={conversationId:e.conversationId,conversationType:e.conversationType,data:a,encrypted:l.encrypted,filename:l.source.filename,mimeType:l.source.mimeType,caption:l.caption,filesAlbum:l.filesAlbum,refMessageId:l.refMessageId,...void 0===l.preview?{}:{localPreviewMetadata:{width:l.preview.width,height:l.preview.height,duration:l.preview.duration,posterData:l.preview.thumbData}}};return D.set(t,l.savedAt),await re(f,()=>ne("video"===l.kind?v:l.filesAlbum||l.caption?.trim()?w:h,f,t,l.createdAt,l.teaKey,l.resume),{id:t,createdAt:l.createdAt})}finally{O.get(t)?.controller===n&&O.delete(t),ie(t),d?.release()}}}}export{E as createMediaSender};
@@ -0,0 +1 @@
1
+ import{isValidMiniProgramBody as e}from"../../mapping/mini-program-body.js";function r(r,o){if(!e(o.miniProgram))throw new Error("sendMiniProgram: 小程序正文非法");const{id:n,createdAt:i}=r.outbox.allocateMessageIdentity(o);return r.outbox.enqueueMedia({id:n,createdAt:i,conversationId:o.conversationId,conversationType:o.conversationType,contentType:"miniProgram",body:{miniProgram:o.miniProgram},encryption:{encrypted:o.encrypted??!1},...void 0===o.refMessageId?{}:{refMessageId:o.refMessageId}})}export{r as sendMiniProgramMessage};
@@ -0,0 +1 @@
1
+ const e=/* @__PURE__ */new Set(["text","image","video","voice","file","sticker","contact","game","miniProgram","robot","transfer","gift","call","redPacket","mediaAlbum","liveRoom"]);function t(t){return e.has(t.contentType)&&void 0===t.recalled&&void 0===t.deletedForEveryone&&!0!==t.encryption.decryptFailed}export{e as REACTION_SUPPORTED_CONTENT_TYPES,t as canReactToMessage};
@@ -0,0 +1 @@
1
+ import{newClientMessageId as e,toWireMsgId as t,toWireRefMsgId as o}from"../../mapping/message-id.js";import{resolveChannelAccess as n}from"../../state/channel-permissions.js";import{canReactToMessage as r}from"./can-react.js";import{isReactionEmojiToken as i,isGameReactionEmoji as s}from"../../state/message-reactions.js";import{ErrCode as a,CmdId as c}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{radioChatReactionCodec as d,mesGrpChatReactionCodec as m,mesChatReactionOppositeEndCodec as p,mesChatReactionCodec as v,mesReactionContentCodec as g}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as l}from"../../../../im-protocol/src/frame-codec.js";function I(I){const u=/* @__PURE__ */new Map,f=I.now??Date.now,j=I.timeoutMs??3e4;let M=!1;function S(e,n){const r=BigInt(I.getSelfId()),i=BigInt(e.conversation.conversationId),s=(a=e.emoji,u=e.action,g.encode(g.create({emoji:a,action:u})));var a,u;const f=t(e.id),j=o(e.parentMessageId);switch(e.conversation.conversationType){case"direct":{const t=n===c.MES_CHAT_REACTION_OPPOSITE_END?p:v,o=t.create({sToId:i,sFromId:r,sMsgId:f,msgType:1,msgTime:BigInt(e.createdAt),encrypt:0,sContent:s,parentMsgId:j});return l({command:n??c.MES_CHAT_REACTION_MSG_C2C,body:t.encode(o)})}case"group":{const t=m.create({sGrpId:i,sToId:i,sFromId:r,sMsgId:f,msgType:5,msgTime:BigInt(e.createdAt),encrypt:0,sContent:s,parentMsgId:j});return l({command:c.MES_GRPCHAT_REACTION_MSG_C2C,body:m.encode(t)})}case"channel":{const t=d.create({sRadioId:i,sFromId:r,sMsgId:f,msgTime:BigInt(e.createdAt),encrypt:0,sContent:s,parentMsgId:j});return l({command:c.MES_RADIO_REACTION_MSG_C2C,body:d.encode(t)})}}}function T(e,t,o){clearTimeout(e.timer),u.delete(e.event.id),I.domainState.rollbackReaction(e.event.conversation,e.event.parentMessageId,e.event.id),e.resolve({ok:!1,reason:t,...void 0===o?{}:{errcode:o}})}function _(t){if(M||!I.isAuthenticated())return Promise.resolve({ok:!1,reason:"disconnected"});const o=I.domainState.getConversationMessage(t.conversation,t.parentMessageId);if(void 0===o)return Promise.resolve({ok:!1,reason:"not-found"});if(!r(o))return Promise.resolve({ok:!1,reason:"unsupported-message"});if(0===t.action&&"channel"===t.conversation.conversationType){const e=I.domainState.getConversationContext(t.conversation),o=n({channelState:"channel"===e?.type?e.channelState??"unknown_restricted":"unknown_restricted",snapshot:"channel"===e?.type?e.channelAccessSnapshot:void 0,permissions:"channel"===e?.type?e.channelPermissions:void 0,nowMs:f()});if("active"!==o.channelState||!o.permissions.sendMessages)return Promise.resolve({ok:!1,reason:"restricted"})}if(!i(t.emoji)||s(t.emoji)||!1===I.isEmojiSupported?.(t.emoji))return Promise.resolve({ok:!1,reason:"invalid-emoji"});const a=Object.freeze({id:e(),conversation:Object.freeze({...t.conversation}),parentMessageId:t.parentMessageId,senderId:I.getSelfId(),emoji:t.emoji,action:t.action,createdAt:f()});return I.domainState.applyReaction(a,"live"),new Promise(e=>{const t=setTimeout(()=>{const e=u.get(a.id);void 0!==e&&T(e,"timeout")},j);u.set(a.id,{event:a,resolve:e,timer:t});try{I.sendFrame(S(a))}catch(e){I.logger?.("reaction-send-frame-failed",{eventId:a.id,cause:e});const t=u.get(a.id);void 0!==t&&T(t,"failed")}})}return{set:_,toggle:function(e){const t=I.domainState.getConversationMessage(e.conversation,e.parentMessageId),o=t?.reactions?.currentUserEmoji===e.emoji?1:0;return _({...e,action:o})},onAck:function(e){const t=u.get(e.eventId);if(void 0!==t)if(e.errcode===a.NON_ERR||0===e.errcode){if(clearTimeout(t.timer),u.delete(t.event.id),"direct"===t.event.conversation.conversationType)try{I.sendFrame(S(t.event,c.MES_CHAT_REACTION_OPPOSITE_END))}catch(e){I.logger?.("reaction-opposite-end-send-failed",{eventId:t.event.id,cause:e})}0===t.event.action&&void 0!==I.reportReaction&&I.reportReaction(t.event.emoji).catch(e=>I.logger?.("reaction-report-failed",{emoji:t.event.emoji,cause:e})),t.resolve({ok:!0,event:t.event})}else T(t,"failed",e.errcode)},ingest:(e,t="live")=>function(e){return""!==e.id.trim()&&""!==e.conversation.conversationId.trim()&&""!==e.parentMessageId.trim()&&""!==e.senderId.trim()&&(0===e.action||1===e.action)&&Number.isSafeInteger(e.createdAt)&&e.createdAt>=0}(e)&&i(e.emoji)&&!s(e.emoji)&&!1!==I.isEmojiSupported?.(e.emoji)?I.domainState.applyReaction(e,t):(I.logger?.("reaction-event-ignored",{eventId:e.id,parentMessageId:e.parentMessageId,emoji:e.emoji}),"ignored"),dispose(){M=!0;for(const e of[...u.values()])T(e,"disconnected")}}}export{I as createReactionManager};
@@ -0,0 +1 @@
1
+ import{CmdId as e}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{mesChatReactionAckCodec as r,mesChatReactionDeliverCodec as o,mesGrpChatReactionAckCodec as d,mesGrpChatReactionDeliverCodec as n,radioChatReactionAckCodec as a,radioChatReactionDeliverCodec as t}from"../../../../im-protocol/src/protobuf/registry.js";import{fromWireMsgId as c}from"../../mapping/message-id.js";import{mapIncomingDirectReaction as s,mapIncomingGroupReaction as m,mapIncomingChannelReaction as g}from"../../mapping/reaction-mapper.js";function i(i){return[{command:e.MES_CHAT_REACTION_MSG_ACK,handler:(e,o)=>{const d=r.decode(o);i.manager.onAck({eventId:c(d.sMsgId),errcode:d.errcode})}},{command:e.MES_CHAT_REACTION_DELIVER,handler:(e,r)=>{const d=s(o.decode(r),i.getSelfId());i.manager.ingest(d,"live"),i.logger?.("direct-reaction-deliver",{eventId:d.id,parentMessageId:d.parentMessageId})}},{command:e.MES_GRPCHAT_REACTION_MSG_C2C_ACK,handler:(e,r)=>{const o=d.decode(r);i.manager.onAck({eventId:c(o.sMsgId),errcode:o.errcode})}},{command:e.MES_GRPCHAT_REACTION_DELIVER,handler:(e,r)=>{const o=m(n.decode(r));i.manager.ingest(o,"live"),i.logger?.("group-reaction-deliver",{eventId:o.id,parentMessageId:o.parentMessageId})}},{command:e.MES_RADIO_REACTION_MSG_C2C_ACK,handler:(e,r)=>{const o=a.decode(r);i.manager.onAck({eventId:c(o.sMsgId),errcode:o.errcode})}},{command:e.MES_RADIO_REACTION_DELIVER,handler:(e,r)=>{const o=g(t.decode(r));i.manager.ingest(o,"live"),i.logger?.("channel-reaction-deliver",{eventId:o.id,parentMessageId:o.parentMessageId})}}]}export{i as createReactionReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{CmdId as r,ErrCode as e}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{mesRadioSyncReadAckCodec as o,mesRadioSyncReadDeliverCodec as d}from"../../../../im-protocol/src/protobuf/registry.js";function t(t){return[{command:r.MES_RADIO_SYNC_READ_MSG_C2C_ACK,handler:(r,d)=>{const c=o.decode(d);try{t.logger?.("channel-sync-read-ack",{errcode:c.errcode})}catch{}c.errcode!==e.NON_ERR&&t.emitter.emit({type:"error",error:{scope:"sync",message:`CHANNEL 多端已读同步 ACK 失败(cmdId=${r}, errcode=${c.errcode})`}})}},{command:r.MES_RADIO_SYNC_READ_MSG_DELIVER_C2C,handler:(r,e)=>{const o=d.decode(e),c=o.sUserId.toString();if(o.sUserId<=0n||c!==t.getSelfId())throw new Error(`CHANNEL 0x3207 用户不匹配(received=${c})`);if(o.radioId<=0n)throw new Error("CHANNEL 0x3207 频道 id 缺失或非法");const n=o.lastReadIndex.trim();if(""===n)throw new Error(`CHANNEL 0x3207 cursor 缺失(channelId=${o.radioId})`);t.applyRemoteRead({conversationId:o.radioId.toString(),readCursor:n})}}]}export{t as createChannelReadReceiveHandlers};
@@ -0,0 +1 @@
1
+ import{getChannelReadOrder as e,compareChannelReadPosition as n}from"../../mapping/channel-read-position.js";import{mesRadioSyncReadMsgCodec as o}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as t}from"../../../../im-protocol/src/frame-codec.js";import{CmdId as r}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";function i(e){const i=/* @__PURE__ */new Map,s=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map;let d=0;function l(n,o){const t={conversationType:"channel",conversationId:n},r=e.domainState.getConversationContext(t);if(void 0===r)throw new Error(`CHANNEL 已读失败:会话不存在(channelId=${n})`);if("channel"!==r.type)throw new Error(`CHANNEL 已读失败:会话类型为 ${r.type}(channelId=${n})`);if(""===o.trim())throw new Error(`CHANNEL 已读 cursor 缺失(channelId=${n})`);const i=e.domainState.getConversationMessage(t,o),s=e.domainState.getLoadedMessagesByConversation(t).find(e=>e.extensions?.historyCursor===o),c=(void 0===i?void 0:a(i))??(void 0===s?void 0:a(s));if(void 0===c)throw new Error(`CHANNEL 已读 cursor 无法定位到本地消息(channelId=${n}, cursor=${o})`);return c}function v(n){const o={conversationType:"channel",conversationId:n},t=e.domainState.getReadState(o);if(void 0!==t?.readCursor&&""!==t.readCursor){const n=e.domainState.getLoadedMessagesByConversation(o).find(e=>e.extensions?.historyCursor===t.readCursor);if(void 0!==n){const e=a(n);if(void 0!==e)return e}}return void 0===t?.readCursorSortKey?void 0:{sortKey:t.readCursorSortKey}}function u(e,o){return n(e,o)}function m(e,n){const o=c.get(e),t=void 0===o?v(e):o.committed;return void 0!==t&&u(t,n)>=0}function p(n,o){const t=c.get(n),r=!0===o.settleConversation?e.domainState.applyChannelConversationReadOptimistically:e.domainState.applyChannelReadOptimistically;if(void 0!==t){const e=u(t.optimistic,o);if(e>0){if(!0===o.settleConversation)throw new Error(`CHANNEL 整会话目标早于正在结算的位置(channelId=${n})`);return}if(0===e&&(!0!==o.settleConversation||!0===t.optimistic.settleConversation))return;return r(t.transaction,o.messageId,o.cursor),t.optimistic=o,void(0===e?t.steps[t.steps.length-1]=o:t.steps.push(o))}const i=v(n),s=e.domainState.beginChannelReadTransaction({conversationType:"channel",conversationId:n});r(s,o.messageId,o.cursor),c.set(n,{transaction:s,committed:i,optimistic:o,steps:[o]})}function f(e,n){const o=i.get(e);(void 0===o||u(n,o)>0||0===u(n,o)&&!0===n.settleConversation)&&i.set(e,n)}function I(n,i){if(void 0!==e.syncRead)try{const s=o.encode(o.create({sUserId:BigInt(e.syncRead.getSelfId()),radioId:BigInt(n),lastReadIndex:i}));e.syncRead.sendFrame(t({command:r.MES_RADIO_SYNC_READ_MSG_C2C,body:s}))}catch(o){e.emitter.emit({type:"error",error:{scope:"unknown",message:`CHANNEL 多端已读同步(0x3205)发送失败(channelId=${n})`,cause:o}})}}function h(n,o){try{e.onReadCommitted?.({channelId:n,readCursor:o})}catch(o){e.emitter.emit({type:"error",error:{scope:"sync",message:`CHANNEL 已读摘要校准未启动(channelId=${n})`,cause:o}})}}function C(n,o){const t=Promise.resolve().then(()=>async function(n,o){let t;try{for(;;){if(o!==d)return;const r=i.get(n);if(void 0===r)return;if(i.delete(n),m(n,r)){const o=c.get(n);!0===r.settleConversation&&void 0!==o&&(e.domainState.commitChannelReadTransaction(o.transaction,r.cursor),0===u(o.optimistic,r)&&c.delete(n));continue}try{await e.updateReadIndex({channelId:n,readCursor:r.cursor})}catch(t){if(o!==d)return;const i=c.get(n);throw void 0!==i&&(e.domainState.rollbackChannelReadTransaction(i.transaction),c.delete(n)),f(n,r),t}if(o!==d)return;if(m(n,r))continue;const s=c.get(n);void 0!==s&&e.domainState.commitChannelReadTransaction(s.transaction,r.cursor)||e.domainState.applyChannelReadPosition({conversationType:"channel",conversationId:n},r.messageId,r.cursor),void 0!==s&&(s.committed=r,0===u(s.optimistic,r)&&c.delete(n)),e.logger?.("channel-read-index",{channelId:n,cursor:r.cursor}),I(n,r.cursor),t=r.cursor}}finally{if(o===d){void 0!==t&&h(n,t);try{e.onReadSettled?.({channelId:n})}catch(o){e.emitter.emit({type:"error",error:{scope:"sync",message:`CHANNEL 已读摘要等待未解除(channelId=${n})`,cause:o}})}}}}(n,o)).then(()=>{if(s.get(n)===t)return s.delete(n),o===d&&i.has(n)?C(n,o):void 0},e=>{throw s.get(n)===t&&s.delete(n),e});return s.set(n,t),t}function y(e,n){let o;try{if(o=l(e.conversationId,e.readCursor),n&&(o.settleConversation=!0),!n&&m(e.conversationId,o))return Promise.resolve();const t=v(e.conversationId);if(n&&void 0!==t&&u(t,o)>0)throw new Error(`CHANNEL 整会话目标早于当前已读位置(channelId=${e.conversationId})`);const r=i.get(e.conversationId);if(void 0===r||c.has(e.conversationId))p(e.conversationId,o);else{const n=u(r,o);0===n&&!0===r.settleConversation&&(o=r),n<0&&!m(e.conversationId,r)&&p(e.conversationId,r),p(e.conversationId,o),n>0&&p(e.conversationId,r)}}catch(e){return Promise.reject(e)}f(e.conversationId,o);const t=s.get(e.conversationId);return void 0!==t?t:C(e.conversationId,d)}return{conversationType:"channel",markRead:e=>y(e,!1),settleConversationRead:e=>y(e,!0),applyRemoteRead:function(n){const o=l(n.conversationId,n.readCursor);if(m(n.conversationId,o))return;const t=c.get(n.conversationId);if(void 0!==t&&t.steps.some(e=>!0===e.settleConversation)&&u(o,t.optimistic)<0){e.domainState.rollbackChannelReadTransaction(t.transaction),c.delete(n.conversationId),e.domainState.applyChannelReadPosition({conversationType:"channel",conversationId:n.conversationId},o.messageId,o.cursor);for(const e of t.steps)u(e,o)>0&&p(n.conversationId,e);h(n.conversationId,o.cursor)}else e.domainState.applyChannelReadPosition({conversationType:"channel",conversationId:n.conversationId},o.messageId,o.cursor),c.delete(n.conversationId),h(n.conversationId,o.cursor)},reset:function(){d+=1;for(const n of c.values())e.domainState.rollbackChannelReadTransaction(n.transaction);i.clear(),s.clear(),c.clear()}}}function s(e){return void 0===e?void 0:a(e)?.cursor}function a(n){const o=n.extensions?.historyCursor;if("string"==typeof o&&""!==o.trim())return{cursor:o,messageId:n.id,...e(n)}}function c(e){let o;for(const t of e){const e=a(t);void 0!==e&&(void 0===o||n(e,o)>0)&&(o=e)}return o?.cursor}export{i as createChannelReadStrategy,s as getChannelMessageReadCursor,a as getChannelMessageReadPosition,c as getLatestChannelMessageReadCursor};
@@ -0,0 +1 @@
1
+ function e(e){return{conversationType:"customerService",markRead:({conversationId:r,readCursor:o})=>{e.domainState.advanceRead({conversationType:"customerService",conversationId:r},o)}}}export{e as createCustomerServiceReadStrategy};
@@ -0,0 +1 @@
1
+ import{fromWireMsgId as e,toWireMsgId as t,isWireMsgId as o}from"../../mapping/message-id.js";import{CmdId as r}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{mesChatSyncReadMsgC2cCodec as n}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as s}from"../../../../im-protocol/src/frame-codec.js";function i(e,t,o){if(void 0!==o&&""!==o)return e.domainState.getConversationMessage({conversationType:"direct",conversationId:t},o)?.sortKey}function d(e,t,r,n){const s=i(e,t,n);if(void 0===s)return;const d=i(e,t,r),c=e.getSelfId();return e.domainState.getLoadedMessagesByConversation({conversationType:"direct",conversationId:t}).filter(e=>function(e){if("voice"===e.contentType||"video"===e.contentType)return!1;const t=e.body.system?.eventType;return("direct"!==e.conversationType||"direct_contact_established"!==t&&"direct_contact_required"!==t&&"direct_message_refused"!==t)&&o(e.id)}(e)&&e.senderId!==c&&e.sortKey<=s&&(void 0===d||e.sortKey>d)).map(e=>e.id)}function c(i){const c=/* @__PURE__ */new Set,a=/* @__PURE__ */new Map,m=/* @__PURE__ */new Map;function p(e){const d=m.get(e);if(void 0===d||0===d.size||!i.isAuthenticated())return;for(const e of d)o(e)||d.delete(e);if(0===d.size)return void m.delete(e);const c=[...d];for(let o=0;o<c.length;o+=50){const a=c.slice(o,o+50);try{const o=n.encode(n.create({sUserId:BigInt(i.getSelfId()),sFromId:BigInt(e),msgIdList:a.map(t)}));i.sendFrame(s({command:r.MES_CHAT_SYNC_READ_MSG_C2C,body:o}));for(const e of a)d.delete(e)}catch(t){i.emitter.emit({type:"error",error:{scope:"protocol",message:`direct 媒体消费多端同步(4117)发送失败(peerId=${e})`,cause:t}});break}}0===d.size&&m.delete(e)}function f(e){const o=i.domainState.getReadState({conversationType:"direct",conversationId:e})?.readCursor??"";if(""===o||!i.isAuthenticated())return;const c=d(i,e,a.get(e),o);if(void 0===c)return;if(0===c.length)return void a.set(e,o);let m,p=!0;for(let o=0;o<c.length;o+=50){const d=c.slice(o,o+50),a=d.map(t);try{const t=n.encode(n.create({sUserId:BigInt(i.getSelfId()),sFromId:BigInt(e),msgIdList:a}));i.sendFrame(s({command:r.MES_CHAT_SYNC_READ_MSG_C2C,body:t})),m=d.at(-1),i.logger?.("direct-sync-read-c2c",{peerId:e,count:a.length,offset:o})}catch(t){i.emitter.emit({type:"error",error:{scope:"protocol",message:`direct 多端已读同步(4117)发送失败(peerId=${e})`,cause:t}}),p=!1;break}}p?a.set(e,o):void 0!==m&&a.set(e,m)}return{report(e){c.add(e),f(e)},reportConsumedMedia(e,t){const o=i.domainState.getConversationMessage({conversationType:"direct",conversationId:e},t);if(void 0===o||o.senderId===i.getSelfId()||"voice"!==o.contentType&&"video"!==o.contentType)return;c.add(e);let r=m.get(e);void 0===r&&(r=/* @__PURE__ */new Set,m.set(e,r)),r.add(t),p(e)},onAck({errcode:e}){i.logger?.("direct-sync-read-ack",{errcode:e}),32768!==e&&0!==e&&i.emitter.emit({type:"error",error:{scope:"sync",message:`direct 多端已读同步 ACK 失败(errcode=${e})`,code:r.MES_CHAT_SYNC_READ_MSG_C2C_ACK}})},onDeliver({userId:t,peerId:o,msgIdList:r}){if(t!==i.getSelfId())return;const n=r.map(t=>i.domainState.getConversationMessage({conversationType:"direct",conversationId:o},e(t))).filter(e=>void 0!==e).sort((e,t)=>e.sortKey<t.sortKey?-1:e.sortKey>t.sortKey?1:0).at(-1);void 0!==n&&i.domainState.advanceRead({conversationType:"direct",conversationId:o},n.id)},onAuthenticated(){for(const e of c)f(e),p(e)},reset(){}}}export{c as createDirectReadSyncCoordinator};
@@ -0,0 +1 @@
1
+ import{toWireMsgId as e,isWireMsgId as o}from"../../mapping/message-id.js";import{mesGroupSyncReadMsgC2cCodec as t}from"../../../../im-protocol/src/protobuf/registry.js";import{encodeFrame as r}from"../../../../im-protocol/src/frame-codec.js";import{CmdId as n}from"../../../../im-protocol/src/protobuf/gen/im.pub_pb.js";function s(s){const i=/* @__PURE__ */new Map,d=/* @__PURE__ */new Set,a=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map;function p(){return s.isAuthenticated?.()??!0}function g(i,d){const{syncRead:a}=s;if(void 0===a||!p())return;const g=a.getSelfId(),u=s.domainState.getLoadedMessagesByConversation({conversationType:"group",conversationId:i}),m=u.find(e=>e.id===d);if(void 0===m)return;const l=c.get(i),f=void 0===l?void 0:u.find(e=>e.id===l)?.sortKey,y=u.filter(e=>function(e){const t=e.body?.system?.eventType;return"group_call_started"!==t&&"group_call_ended"!==t&&"group_call_missed"!==t&&o(e.id)}(e)&&e.senderId!==g&&e.sortKey<=m.sortKey&&(void 0===f||e.sortKey>f));if(0===y.length)return void c.set(i,d);const v=y.map(o=>e(o.id));let I,_=!0;for(let e=0;e<v.length;e+=50){const o=v.slice(e,e+50);try{const d=t.encode(t.create({sUserId:BigInt(g),msgIdList:o,groupId:BigInt(i)}));a.sendFrame(r({command:n.MES_GRPCHAT_SYNC_READ_MSG_C2C,body:d})),I=y[Math.min(e+50,y.length)-1]?.id,s.logger?.("grp-sync-read-c2c",{groupId:i,count:o.length,offset:e})}catch(e){s.emitter.emit({type:"error",error:{scope:"unknown",message:`群多端已读同步(0x2307)发送失败(groupId=${i})`,cause:e}}),_=!1;break}}_?c.set(i,d):void 0!==I&&c.set(i,I)}async function u(e){if(!d.has(e)&&p()){d.add(e);try{for(;p();){const o=i.get(e);if(void 0===o)return;if(i.delete(e),a.get(e)!==o){g(e,o);try{await s.markGroupReadAll(e),a.set(e,o)}catch(t){return p()?(i.get(e)===o&&i.delete(e),void s.emitter.emit({type:"error",error:{scope:"unknown",message:`群已读 read_all 失败(groupId=${e})`,cause:t}})):void(i.has(e)||i.set(e,o))}}}}finally{d.delete(e),p()&&i.has(e)&&u(e)}}}return{conversationType:"group",markRead({conversationId:e,readCursor:o}){s.domainState.applyServerUnread({conversationType:"group",conversationId:e},0,o),s.logger?.("grp-read-all",{groupId:e}),i.set(e,o),u(e)},onAuthenticated(){for(const e of i.keys())u(e)}}}export{s as createGroupReadStrategy};
@@ -0,0 +1 @@
1
+ function e(e=[]){const o=/* @__PURE__ */new Map;function n(e){if(o.has(e.conversationType))throw new Error(`已读策略重复注册:${e.conversationType}`);o.set(e.conversationType,e)}for(const o of e)n(o);return{register:n,resolve:e=>o.get(e),onAuthenticated:()=>{for(const e of o.values())e.onAuthenticated?.()}}}export{e as createReadStrategyRegistry};
@@ -0,0 +1 @@
1
+ function o(o){return{conversationType:"robot",markRead:({conversationId:e,readCursor:n})=>{o.domainState.advanceRead({conversationType:"robot",conversationId:e},n)}}}export{o as createRobotReadStrategy};