k2-im 0.1.57 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/browser.d.ts +1 -1
- package/dist/browser.js +1 -1
- package/dist/chat-kit-pinia.d.ts +227 -170
- package/dist/chat-kit-pinia.js +1 -1
- package/dist/chat-kit-vue.d.ts +64 -44
- package/dist/chat-kit-vue.js +1 -1
- package/dist/chat-kit.d.ts +244 -173
- package/dist/chat-kit.js +1 -1
- package/dist/crypto.worker.js +17 -25
- package/dist/i18n.d.ts +61 -41
- package/dist/i18n.js +1 -1
- package/dist/index.d.ts +259 -188
- package/dist/index.js +1 -1
- package/dist/modules/api-protocol-client/src/bi-feedback.js +1 -0
- package/dist/modules/api-protocol-client/src/browser.js +1 -0
- package/dist/modules/api-protocol-client/src/client.js +1 -0
- package/dist/modules/api-protocol-client/src/config.js +1 -0
- package/dist/modules/api-protocol-client/src/constants.js +1 -0
- package/dist/modules/api-protocol-client/src/json.js +1 -0
- package/dist/modules/api-protocol-client/src/nonce.js +1 -0
- package/dist/modules/api-protocol-client/src/transports/axios.js +1 -0
- package/dist/modules/api-protocol-client/src/utils.js +1 -0
- package/dist/modules/crypto/browser.js +1 -0
- package/dist/modules/crypto/driver.js +1 -0
- package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -0
- package/dist/modules/im-browser/src/crypto/channel-key-service.js +1 -0
- package/dist/modules/im-browser/src/crypto/collect-tea.js +1 -0
- package/dist/modules/im-browser/src/crypto/crypto-task-executor.js +1 -0
- package/dist/modules/im-browser/src/crypto/crypto-worker-factory.js +1 -0
- package/dist/modules/im-browser/src/crypto/crypto-worker-protocol.js +1 -0
- package/dist/modules/im-browser/src/crypto/encrypt-key-service.js +1 -0
- package/dist/modules/im-browser/src/crypto/group-key-service.js +1 -0
- package/dist/modules/im-browser/src/crypto/peer-public-key-service.js +1 -0
- package/dist/modules/im-browser/src/crypto/rsa-private-key.js +1 -0
- package/dist/modules/im-browser/src/crypto/rsa-tea-crypto-adapter.js +1 -0
- package/dist/modules/im-browser/src/crypto/stale-key-refresh.js +1 -0
- package/dist/modules/im-browser/src/crypto/tea.js +1 -0
- package/dist/modules/im-browser/src/crypto/wait-for-key-signal.js +1 -0
- package/dist/modules/im-browser/src/http/application-http-adapters.js +1 -0
- package/dist/modules/im-browser/src/http/channel-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/channel-join-application-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/channel-member-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/channel-mention-member-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/cm-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/directory-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/expression-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/lazy-api-protocol-client.js +1 -0
- package/dist/modules/im-browser/src/http/profile-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/http/requests/applications.js +1 -0
- package/dist/modules/im-browser/src/http/requests/bind-robot-conversation.js +1 -0
- package/dist/modules/im-browser/src/http/requests/board-pinned-message-validation.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-join-applications.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-management.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-members.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-mention-members.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-message-context.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-mini-program-rel.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-profile.js +1 -0
- package/dist/modules/im-browser/src/http/requests/channel-read-index.js +1 -0
- package/dist/modules/im-browser/src/http/requests/contact-blocklist.js +1 -0
- package/dist/modules/im-browser/src/http/requests/contact-friendship.js +1 -0
- package/dist/modules/im-browser/src/http/requests/contact-report.js +1 -0
- package/dist/modules/im-browser/src/http/requests/core-json-request.js +1 -0
- package/dist/modules/im-browser/src/http/requests/create-channel.js +1 -0
- package/dist/modules/im-browser/src/http/requests/create-face-to-face-group.js +1 -0
- package/dist/modules/im-browser/src/http/requests/create-group.js +1 -0
- package/dist/modules/im-browser/src/http/requests/customer-service-profile.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-board-pinned-message.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-channel-board-pinned-message.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-channel-secret-key.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-conversation-background-presets.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-group-encrypt-info.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-group-info.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-group-member-list.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-user-encrypt-info.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-user-info-friend.js +1 -0
- package/dist/modules/im-browser/src/http/requests/get-user-info-other.js +1 -0
- package/dist/modules/im-browser/src/http/requests/group-management.js +1 -0
- package/dist/modules/im-browser/src/http/requests/mark-group-read-all.js +1 -0
- package/dist/modules/im-browser/src/http/requests/membership-join.js +1 -0
- package/dist/modules/im-browser/src/http/requests/pin-board-message.js +1 -0
- package/dist/modules/im-browser/src/http/requests/pin-channel-board-message.js +1 -0
- package/dist/modules/im-browser/src/http/requests/pull-messages-by-id.js +1 -0
- package/dist/modules/im-browser/src/http/requests/pull-offline-channel.js +1 -0
- package/dist/modules/im-browser/src/http/requests/pull-offline-chat.js +1 -0
- package/dist/modules/im-browser/src/http/requests/pull-offline-group.js +1 -0
- package/dist/modules/im-browser/src/http/requests/pull-offline-signal.js +1 -0
- package/dist/modules/im-browser/src/http/requests/robot-menu-reply.js +1 -0
- package/dist/modules/im-browser/src/http/requests/robot-profile.js +1 -0
- package/dist/modules/im-browser/src/http/requests/search-robots.js +1 -0
- package/dist/modules/im-browser/src/http/requests/set-conversation-undisturb.js +1 -0
- package/dist/modules/im-browser/src/http/requests/set-friend-remark.js +1 -0
- package/dist/modules/im-browser/src/http/requests/set-group-nickname.js +1 -0
- package/dist/modules/im-browser/src/http/requests/unpin-board-message.js +1 -0
- package/dist/modules/im-browser/src/http/requests/unpin-channel-board-message.js +1 -0
- package/dist/modules/im-browser/src/http/requests/update-group-info.js +1 -0
- package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -0
- package/dist/modules/im-browser/src/media/file-md5.js +1 -0
- package/dist/modules/im-browser/src/media/image-clipboard.js +1 -0
- package/dist/modules/im-browser/src/media/image-header-dimensions.js +1 -0
- package/dist/modules/im-browser/src/media/media-downloader.js +1 -0
- package/dist/modules/im-browser/src/media/media-preview-adapter.js +1 -0
- package/dist/modules/im-browser/src/media/media-preview-preparation-executor.js +1 -0
- package/dist/modules/im-browser/src/media/media-request-limiter.js +1 -0
- package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -0
- package/dist/modules/im-browser/src/media/media-transfer-errors.js +1 -0
- package/dist/modules/im-browser/src/media/media-transfer-policy.js +1 -0
- package/dist/modules/im-browser/src/media/media-upload-credentials.js +1 -0
- package/dist/modules/im-browser/src/media/media-upload-recovery-codec.js +1 -0
- package/dist/modules/im-browser/src/media/media-upload-recovery-store.js +1 -0
- package/dist/modules/im-browser/src/media/media-upload-source-fingerprint.js +1 -0
- package/dist/modules/im-browser/src/media/s3-multipart-uploader.js +1 -0
- package/dist/modules/im-browser/src/media/xhr-upload-idle-timeout.js +1 -0
- package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -0
- package/dist/modules/im-browser/src/network/network-monitor.js +1 -0
- package/dist/modules/im-browser/src/scheduling/yield-to-browser.js +1 -0
- package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -0
- package/dist/modules/im-browser/src/transport/ws-transport.js +1 -0
- package/dist/modules/im-browser/src/voice/voice-amplitude.js +1 -0
- package/dist/modules/im-browser/src/voice/voice-capabilities.js +1 -0
- package/dist/modules/im-browser/src/voice/voice-codec.js +1 -0
- package/dist/modules/im-browser/src/voice/voice-errors.js +1 -0
- package/dist/modules/im-browser/src/voice/voice-playback.js +1 -0
- package/dist/modules/im-browser/src/voice/voice-player.js +1 -0
- package/dist/modules/im-browser/src/voice/voice-recorder.js +1 -0
- package/dist/modules/im-chat-kit/src/i18n/use-im-text.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/applications.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/capabilities.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/context.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/conversation-activation.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/conversation-deletion.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/conversation-list.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/history-return-after-send.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/media-transfer-estimate.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/media.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/message-operations.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/profile-directory.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/quoted-message.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/reaction.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/search-senders.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/search.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/session-favorites.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/session.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/thread-paging.store.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/thread-return-to-latest.js +1 -0
- package/dist/modules/im-chat-kit/src/pinia/thread.store.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/channel-mini-program-open.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/channel-mini-program-rels.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/conversation-list.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/conversation-unread.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/delayed-loading-indicator.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/media-source-priority.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/message-notification.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/message-search.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/mini-program-game-preview.js +1 -0
- package/dist/modules/im-chat-kit/src/presentation/mini-program-open-url.js +1 -0
- package/dist/modules/im-chat-kit/src/runtime/chat-runtime.js +1 -0
- package/dist/modules/im-chat-kit/src/runtime/conversation-prefetch-controller.js +1 -0
- package/dist/modules/im-chat-kit/src/runtime/media-object-url-registry.js +1 -0
- package/dist/modules/im-chat-kit/src/runtime/runtime-operation.js +1 -0
- package/dist/modules/im-chat-kit/src/services/capabilities.js +1 -0
- package/dist/modules/im-chat-kit/src/services/channel-member-management.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/channel-profile-management.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/channel-send-restriction.js +1 -0
- package/dist/modules/im-chat-kit/src/services/direct-contact-management.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/forward.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/group-member-management.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/group-profile-management.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/image-copy.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/media-file-classification.js +1 -0
- package/dist/modules/im-chat-kit/src/services/media.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/message.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/pinned-message-rules.js +1 -0
- package/dist/modules/im-chat-kit/src/services/pinned-message.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/profile-access.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/profile-directory.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/profile-display.js +1 -0
- package/dist/modules/im-chat-kit/src/services/profile.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/read.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/robot-sender-profile.js +1 -0
- package/dist/modules/im-chat-kit/src/services/search.service.js +1 -0
- package/dist/modules/im-chat-kit/src/services/send.service.js +1 -0
- package/dist/modules/im-chat-kit/src/thread/active-date.js +1 -0
- package/dist/modules/im-chat-kit/src/thread/create-thread-items.js +1 -0
- package/dist/modules/im-chat-kit/src/thread/message-locate-result.js +1 -0
- package/dist/modules/im-chat-kit/src/thread/new-message-badge.js +1 -0
- package/dist/modules/im-chat-kit/src/thread/resolve-message-body-kind.js +1 -0
- package/dist/modules/im-chat-kit/src/thread/resolve-quoted-message-presentation.js +1 -0
- package/dist/modules/im-chat-kit/src/thread/viewport-rules.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/emoji/emoji-legacy-catalog.json.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/emoji/index.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/emoji/recent.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/emoji/unicode-emoji-catalog.json.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/highlight.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/link.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/media-batch.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/media-dimensions.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/media-format.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/media-transfer-presentation.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/time-display.js +1 -0
- package/dist/modules/im-chat-kit/src/utils/waveform.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/ImThreadBodySwitch.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/ImThreadItems.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/ImThreadSurface.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/ImThreadViewport.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/message-renderer-registry.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/thread-idle-task.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/thread-layout-measurements.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/thread-read-actions-context.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/thread-surface-context.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/thread-viewport-context.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-target-group.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-targets.js +1 -0
- package/dist/modules/im-chat-kit/src/vue/thread/use-im-thread-layout-measurement.js +1 -0
- package/dist/modules/im-core/src/abort.js +1 -0
- package/dist/modules/im-core/src/cache-namespace.js +1 -0
- package/dist/modules/im-core/src/connection/backoff.js +1 -0
- package/dist/modules/im-core/src/connection/connection-manager.js +1 -0
- package/dist/modules/im-core/src/connection/heartbeat-manager.js +1 -0
- package/dist/modules/im-core/src/conversation-identity.js +1 -0
- package/dist/modules/im-core/src/diagnostics.js +1 -0
- package/dist/modules/im-core/src/event-emitter.js +1 -0
- package/dist/modules/im-core/src/login/login-handler.js +1 -0
- package/dist/modules/im-core/src/mapping/bot-sender.js +1 -0
- package/dist/modules/im-core/src/mapping/call-record-body.js +1 -0
- package/dist/modules/im-core/src/mapping/channel-message-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/channel-notify-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/channel-offline-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/channel-pinned-message-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/channel-read-position.js +1 -0
- package/dist/modules/im-core/src/mapping/contact-body.js +1 -0
- package/dist/modules/im-core/src/mapping/content-body.js +1 -0
- package/dist/modules/im-core/src/mapping/conversation.js +1 -0
- package/dist/modules/im-core/src/mapping/crypto-batch-preparation.js +1 -0
- package/dist/modules/im-core/src/mapping/customer-service-body.js +1 -0
- package/dist/modules/im-core/src/mapping/customer-service-message-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/decrypt-recovery.js +1 -0
- package/dist/modules/im-core/src/mapping/file-body.js +1 -0
- package/dist/modules/im-core/src/mapping/files-album-body.js +1 -0
- package/dist/modules/im-core/src/mapping/game-body.js +1 -0
- package/dist/modules/im-core/src/mapping/gift-body.js +1 -0
- package/dist/modules/im-core/src/mapping/group-message-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/group-notify-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/group-offline-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/image-body.js +1 -0
- package/dist/modules/im-core/src/mapping/live-room-body.js +1 -0
- package/dist/modules/im-core/src/mapping/media-album-body.js +1 -0
- package/dist/modules/im-core/src/mapping/merge.js +1 -0
- package/dist/modules/im-core/src/mapping/mes-chat-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/message-id.js +1 -0
- package/dist/modules/im-core/src/mapping/message-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/messages-by-id.js +1 -0
- package/dist/modules/im-core/src/mapping/mini-program-body.js +1 -0
- package/dist/modules/im-core/src/mapping/offline-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/pinned-message-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/profile-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/reaction-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/recall-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/red-packet-body.js +1 -0
- package/dist/modules/im-core/src/mapping/robot-body.js +1 -0
- package/dist/modules/im-core/src/mapping/robot-message-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/search-text.js +1 -0
- package/dist/modules/im-core/src/mapping/session-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/signal-offline-mapper.js +1 -0
- package/dist/modules/im-core/src/mapping/sort.js +1 -0
- package/dist/modules/im-core/src/mapping/sticker-body.js +1 -0
- package/dist/modules/im-core/src/mapping/stored-message.js +1 -0
- package/dist/modules/im-core/src/mapping/system-event-timeline-policy.js +1 -0
- package/dist/modules/im-core/src/mapping/text-segments.js +1 -0
- package/dist/modules/im-core/src/mapping/transfer-body.js +1 -0
- package/dist/modules/im-core/src/mapping/transfer-status.js +1 -0
- package/dist/modules/im-core/src/mapping/unread-divider.js +1 -0
- package/dist/modules/im-core/src/mapping/video-body.js +1 -0
- package/dist/modules/im-core/src/mapping/voice-body.js +1 -0
- package/dist/modules/im-core/src/message-flow/call/direct-call-manager.js +1 -0
- package/dist/modules/im-core/src/message-flow/call/direct-call-record.js +1 -0
- package/dist/modules/im-core/src/message-flow/call/direct-p2p-call.js +1 -0
- package/dist/modules/im-core/src/message-flow/call/group-call-manager.js +1 -0
- package/dist/modules/im-core/src/message-flow/call/group-call-record.js +1 -0
- package/dist/modules/im-core/src/message-flow/conversation-support.js +1 -0
- package/dist/modules/im-core/src/message-flow/edit/edit-frame.js +1 -0
- package/dist/modules/im-core/src/message-flow/edit/edit-manager.js +1 -0
- package/dist/modules/im-core/src/message-flow/edit/edit-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/edit/edit-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/expression/expression-message.js +1 -0
- package/dist/modules/im-core/src/message-flow/forward/can-transmit.js +1 -0
- package/dist/modules/im-core/src/message-flow/forward/forward-content-spec.js +1 -0
- package/dist/modules/im-core/src/message-flow/forward/forward-messages.js +1 -0
- package/dist/modules/im-core/src/message-flow/game/game-message.js +1 -0
- package/dist/modules/im-core/src/message-flow/gift/gift-message.js +1 -0
- package/dist/modules/im-core/src/message-flow/live-room/live-room-message.js +1 -0
- package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -0
- package/dist/modules/im-core/src/message-flow/mini-program/mini-program-message.js +1 -0
- package/dist/modules/im-core/src/message-flow/reaction/can-react.js +1 -0
- package/dist/modules/im-core/src/message-flow/reaction/reaction-manager.js +1 -0
- package/dist/modules/im-core/src/message-flow/reaction/reaction-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/read/channel-read-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/read/channel-read-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/read/customer-service-read-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/read/direct-read-sync.js +1 -0
- package/dist/modules/im-core/src/message-flow/read/group-read-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/read/read-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/read/robot-read-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/recall/channel-message-deletion-manager.js +1 -0
- package/dist/modules/im-core/src/message-flow/recall/recall-frame.js +1 -0
- package/dist/modules/im-core/src/message-flow/recall/recall-manager.js +1 -0
- package/dist/modules/im-core/src/message-flow/recall/recall-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/recall/recall-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/channel-application-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/channel-notify-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/channel-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/command-handler-registry.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/contact-application-answer-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/contact-application-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/direct-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/friend-action-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/group-event-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/group-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/mes-chat-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/robot-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/session-favorite-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/receive/wallet-notify-receive-handlers.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/channel-outgoing-frame.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/channel-send-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/direct-outgoing-frame.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/direct-send-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/group-outgoing-frame.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/group-send-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/robot-outgoing-frame.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/robot-send-strategy.js +1 -0
- package/dist/modules/im-core/src/message-flow/send/send-strategy-registry.js +1 -0
- package/dist/modules/im-core/src/message-flow/transfer/transfer-message.js +1 -0
- package/dist/modules/im-core/src/outbox/outbox-manager.js +1 -0
- package/dist/modules/im-core/src/packet-router.js +1 -0
- package/dist/modules/im-core/src/ports/crypto-port.js +1 -0
- package/dist/modules/im-core/src/ports/crypto-task-executor.js +1 -0
- package/dist/modules/im-core/src/ports/http-port.js +1 -0
- package/dist/modules/im-core/src/ports/media-asset-cache-port.js +1 -0
- package/dist/modules/im-core/src/push/push-registration.js +1 -0
- package/dist/modules/im-core/src/read/read-reporter.js +1 -0
- package/dist/modules/im-core/src/request-tracker.js +1 -0
- package/dist/modules/im-core/src/session-favorite-album.js +1 -0
- package/dist/modules/im-core/src/session-favorite-files.js +1 -0
- package/dist/modules/im-core/src/state/channel-permissions.js +1 -0
- package/dist/modules/im-core/src/state/channel-restriction-coordinator.js +1 -0
- package/dist/modules/im-core/src/state/domain-state.js +1 -0
- package/dist/modules/im-core/src/state/draft-store.js +1 -0
- package/dist/modules/im-core/src/state/group-restriction-coordinator.js +1 -0
- package/dist/modules/im-core/src/state/local-message-window-read-error.js +1 -0
- package/dist/modules/im-core/src/state/message-reactions.js +1 -0
- package/dist/modules/im-core/src/state/message-store.js +1 -0
- package/dist/modules/im-core/src/state/message-window-store.js +1 -0
- package/dist/modules/im-core/src/state/pinned-message-coordinator.js +1 -0
- package/dist/modules/im-core/src/state/pinned-message-store.js +1 -0
- package/dist/modules/im-core/src/state/read-store.js +1 -0
- package/dist/modules/im-core/src/state/session-sort.js +1 -0
- package/dist/modules/im-core/src/state/session-store.js +1 -0
- package/dist/modules/im-core/src/sync/channel-sync-checkpoint.js +1 -0
- package/dist/modules/im-core/src/sync/sync-manager.js +1 -0
- package/dist/modules/im-i18n/src/catalog/en-US.js +1 -0
- package/dist/modules/im-i18n/src/catalog/index.js +1 -0
- package/dist/modules/im-i18n/src/catalog/th-TH.js +1 -0
- package/dist/modules/im-i18n/src/catalog/vi-VN.js +1 -0
- package/dist/modules/im-i18n/src/catalog/zh-CN.js +1 -0
- package/dist/modules/im-i18n/src/catalog/zh-TW.js +1 -0
- package/dist/modules/im-i18n/src/create-im-i18n.js +1 -0
- package/dist/modules/im-i18n/src/format/failure.js +1 -0
- package/dist/modules/im-i18n/src/format/last-message.js +1 -0
- package/dist/modules/im-i18n/src/format/media.js +1 -0
- package/dist/modules/im-i18n/src/format/mention.js +1 -0
- package/dist/modules/im-i18n/src/format/service-text.js +1 -0
- package/dist/modules/im-i18n/src/format/system-message.js +1 -0
- package/dist/modules/im-i18n/src/internal/duration.js +1 -0
- package/dist/modules/im-i18n/src/internal/interpolate.js +1 -0
- package/dist/modules/im-i18n/src/locale.js +1 -0
- package/dist/modules/im-protocol/src/board-pinned-message.js +1 -0
- package/dist/modules/im-protocol/src/frame-codec.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/channel_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/group_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.app.msg_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.channel_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.group_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.login_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.msg_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.pub_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.robot_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/im.sig_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/gen/msg_pb.js +1 -0
- package/dist/modules/im-protocol/src/protobuf/registry.js +1 -0
- package/dist/modules/im-sdk/src/cache-prefix-migration.js +1 -0
- package/dist/modules/im-sdk/src/create-im-client.js +1 -0
- package/dist/modules/im-sdk/src/domains/channel.js +1 -0
- package/dist/modules/im-sdk/src/domains/contact.js +1 -0
- package/dist/modules/im-sdk/src/domains/conversation.js +1 -0
- package/dist/modules/im-sdk/src/domains/group.js +1 -0
- package/dist/modules/im-sdk/src/domains/media-byte-computation.js +1 -0
- package/dist/modules/im-sdk/src/domains/media.js +1 -0
- package/dist/modules/im-sdk/src/domains/message.js +1 -0
- package/dist/modules/im-sdk/src/domains/pinned-message-source.js +1 -0
- package/dist/modules/im-sdk/src/domains/pinned-message.js +1 -0
- package/dist/modules/im-sdk/src/domains/session.js +1 -0
- package/dist/modules/im-sdk/src/product/applications.js +1 -0
- package/dist/modules/im-sdk/src/product/calls.js +1 -0
- package/dist/modules/im-sdk/src/product/capabilities.js +1 -0
- package/dist/modules/im-sdk/src/product/channel-mention-candidates.js +1 -0
- package/dist/modules/im-sdk/src/product/conversation-background.js +1 -0
- package/dist/modules/im-sdk/src/product/conversation-entry-unread.js +1 -0
- package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -0
- package/dist/modules/im-sdk/src/product/conversations.js +1 -0
- package/dist/modules/im-sdk/src/product/customer-service.js +1 -0
- package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -0
- package/dist/modules/im-sdk/src/product/diagnostics.js +1 -0
- package/dist/modules/im-sdk/src/product/directory.js +1 -0
- package/dist/modules/im-sdk/src/product/draft.js +1 -0
- package/dist/modules/im-sdk/src/product/emoji-catalog.js +1 -0
- package/dist/modules/im-sdk/src/product/emoji-catalog.json.js +1 -0
- package/dist/modules/im-sdk/src/product/events.js +1 -0
- package/dist/modules/im-sdk/src/product/expressions.js +1 -0
- package/dist/modules/im-sdk/src/product/face-to-face-group.js +1 -0
- package/dist/modules/im-sdk/src/product/group-calls.js +1 -0
- package/dist/modules/im-sdk/src/product/image-format.js +1 -0
- package/dist/modules/im-sdk/src/product/local-data.js +1 -0
- package/dist/modules/im-sdk/src/product/media.js +1 -0
- package/dist/modules/im-sdk/src/product/mention.js +1 -0
- package/dist/modules/im-sdk/src/product/message.js +1 -0
- package/dist/modules/im-sdk/src/product/messages-by-id.js +1 -0
- package/dist/modules/im-sdk/src/product/outbox.js +1 -0
- package/dist/modules/im-sdk/src/product/profiles.js +1 -0
- package/dist/modules/im-sdk/src/product/resource-uploader.js +1 -0
- package/dist/modules/im-sdk/src/product/robots.js +1 -0
- package/dist/modules/im-sdk/src/product/search.js +1 -0
- package/dist/modules/im-sdk/src/product/session-favorites.js +1 -0
- package/dist/modules/im-sdk/src/product/settings.js +1 -0
- package/dist/modules/im-sdk/src/runtime/advanced-message-diagnostics.js +1 -0
- package/dist/modules/im-sdk/src/runtime/channel-read-summary-refresh.js +1 -0
- package/dist/modules/im-sdk/src/runtime/customer-service-legacy-recovery.js +1 -0
- package/dist/modules/im-sdk/src/runtime/decrypt-diagnostics.js +1 -0
- package/dist/modules/im-sdk/src/runtime/foreground-work-coordinator.js +1 -0
- package/dist/modules/im-sdk/src/runtime/group-history-page-boundary.js +1 -0
- package/dist/modules/im-sdk/src/runtime/key-prefetch.js +1 -0
- package/dist/modules/im-sdk/src/runtime/local-media-preview.js +1 -0
- package/dist/modules/im-sdk/src/runtime/media-cache-maintenance.js +1 -0
- package/dist/modules/im-sdk/src/runtime/media-upload-recovery.js +1 -0
- package/dist/modules/im-sdk/src/runtime/protobuf-wire-shape.js +1 -0
- package/dist/modules/im-sdk/src/runtime/receiving-activity.js +1 -0
- package/dist/modules/im-sdk/src/runtime/recent-history-fetcher.js +1 -0
- package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -0
- package/dist/modules/im-sdk/src/runtime/session-http-clients.js +1 -0
- package/dist/modules/im-sdk/src/runtime/session-runtime.js +1 -0
- package/dist/modules/im-sdk/src/runtime/signal-offline-poller.js +1 -0
- package/dist/request-crypto.js +1 -1
- package/dist/sdk.d.ts +170 -111
- package/dist/sdk.js +1 -1
- package/package.json +2 -2
- package/dist/browser-2MUNHRDS.js +0 -1
- package/dist/browser-RTCHWSQ2.js +0 -2
- package/dist/chunk-2OCWQHFJ.js +0 -2
- package/dist/chunk-46ARFR7U.js +0 -8
- package/dist/chunk-HQDLYL3K.js +0 -2
- package/dist/chunk-IC6HI33O.js +0 -1
- package/dist/chunk-IDECJJXC.js +0 -0
- package/dist/chunk-J3TLOAQI.js +0 -2
- package/dist/chunk-Q2DEFN53.js +0 -1
- package/dist/chunk-SXY56EVC.js +0 -0
- package/dist/chunk-WL3NFQ7Y.js +0 -1
- package/dist/chunk-WOT6VMZA.js +0 -1
- package/dist/chunk-WS7BWP7C.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{requestCoreJson as e,CoreJsonBusinessError as r}from"./core-json-request.js";function n(e){const r=Number(e);return Number.isSafeInteger(r)&&String(r)===e?r:e}async function u(n,u,i,o){const t=await e(n,u,i,{method:"POST",responseMode:"strict"});if(!t.ok)throw new r(o,t.code,t.message)}function i(e){const r=e.userIds.map(e=>({user_id:n(e)}));return u(e.client,"/user_group/invited",{group_id:e.groupId,members:JSON.stringify(r)},"邀请群成员")}function o(e){return u(e.client,"/user_group/kick",{group_id:e.groupId,out_user_id:e.userId},"移除群成员")}function t(e){return u(e.client,"/user_group/transfer",{group_id:e.groupId,new_user_id:e.userId},"转让群组")}function s(e){return u(e.client,"/user_group/user/quit",{group_id:e.groupId,...void 0===e.newOwnerId?{}:{new_user_id:e.newOwnerId}},"退出群组")}function d(e){return u(e.client,"/user_group/edit",{group_id:e.groupId,verify_way:e.verifyWay,...4===e.verifyWay&&void 0!==e.inviteCode?{invite_code:e.inviteCode}:{}},"修改普通群入群验证方式")}export{i as inviteGroupMembers,s as leaveGroup,o as removeGroupMember,t as transferGroupOwnership,d as updateGroupVerification};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{encodeGroupReadAllRequest as o,decodeGroupReadAllResponse as r}from"../../../../im-core/src/mapping/group-offline-mapper.js";const p=/* @__PURE__ */new Set([200,32768]);async function e(e){const t=o({userId:e.userId,groupId:e.groupId}),a=await e.http.postProtobuf({path:"/offline/v1/group/read_all",body:t}),{code:d}=r(a);if(!p.has(d))throw new Error(`群 read_all 业务失败:code=${d}(groupId=${e.groupId})`)}export{e as markGroupReadAll};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{requestCoreJson as e,CoreJsonBusinessError as r}from"./core-json-request.js";class t extends Error{constructor(e){super(`${e}响应包含无法识别的 is_waitting`),this.name="MembershipJoinMappingError"}}async function n(n,o,i,c){const d=await e(n,o,i,{method:"POST",responseMode:"strict"});if(!d.ok)throw new r(c,d.code,d.message);if(null===d.data||void 0===d.data)throw new t(c);return function(e,r){if(!0===e||1===e||"1"===e)return Object.freeze({outcome:"waiting"});if(null==e||!1===e||0===e||"0"===e)return Object.freeze({outcome:"joined"});throw new t(r)}(d.data.is_waitting,c)}async function o(t,n,o,i){const c=await e(t,n,o,{method:"POST",responseMode:"strict"});if(!c.ok)throw new r(i,c.code,c.message);return Object.freeze({outcome:"joined"})}function i(e){return n(e.client,"/user_group/apply",{group_id:e.groupId,qrcode_type:2,remarks:e.remarks??""},"申请加入普通群")}function c(e){return o(e.client,"/user_group/enter_by_invite_code",{group_id:e.groupId,invite_code:e.inviteCode},"使用邀请码加入普通群")}function d(e){return n(e.client,"/user_radio/add/apply",{radio_id:e.channelId,remarks:e.remarks??""},"申请加入社群")}function s(e){return o(e.client,"/user_radio/enter_by_invite_code",{radio_id:e.channelId,invite_code:e.inviteCode},"使用邀请码加入社群")}export{t as MembershipJoinMappingError,s as joinChannelByInviteCode,c as joinGroupByInviteCode,d as requestChannelMembership,i as requestGroupMembership};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{assertBoardGroupId as e}from"./board-pinned-message-validation.js";import{requestCoreJson as r}from"./core-json-request.js";import{decodeBoardPinnedMessage as o}from"../../../../im-protocol/src/board-pinned-message.js";async function n(n){if(e(n.groupId),""===n.messageContent.trim())throw new Error("board pinned message messageContent 不能为空");const t=o(n.messageContent);if(2!==t.envelope.convType)throw new Error("board pin 快照 convType 必须为 2");if(t.envelope.receiverId!==n.groupId)throw new Error("board pin 快照 receiverId 与目标 groupId 不一致");const s=await r(n.client,"/api/v1/board/board_msg_top",{group_id:n.groupId,group_type:2,msg_content:n.messageContent},{method:"POST",prefix:"",responseMode:"strict"});if(!s.ok)return s;if(null!==s.data)throw new Error("board pin 响应结构非法:成功 data 必须为空");return{...s,data:null}}export{n as pinBoardMessage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{assertBoardChannelId as e}from"./board-pinned-message-validation.js";import{requestCoreJson as n}from"./core-json-request.js";import{decodeBoardPinnedMessage as r}from"../../../../im-protocol/src/board-pinned-message.js";async function o(o){if(e(o.channelId),""===o.messageContent.trim())throw new Error("channel board pinned message messageContent 不能为空");const t=r(o.messageContent);if(3!==t.envelope.convType)throw new Error("channel board pin 快照 convType 必须为 3");if(t.envelope.receiverId!==o.channelId)throw new Error("channel board pin 快照 receiverId 与目标 channelId 不一致");const a=await n(o.client,"/api/v1/board/board_msg_top",{group_id:o.channelId,group_type:1,msg_content:o.messageContent},{method:"POST",prefix:"",responseMode:"strict"});if(!a.ok)return a;if(null!==a.data)throw new Error("channel board pin 响应结构非法:成功 data 必须为空");return{...a,data:null}}export{o as pinChannelBoardMessage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{throwIfAborted as e}from"../../../../im-core/src/abort.js";import{encodeGroupMessagesByIdRequest as s,decodeGroupMessagesByIdResponse as r,decodeGroupMessagesByIdResponseAsync as n}from"../../../../im-core/src/mapping/group-offline-mapper.js";import{encodeDirectMessagesByIdRequest as p,decodeDirectMessagesByIdResponse as a,decodeDirectMessagesByIdResponseAsync as t}from"../../../../im-core/src/mapping/offline-mapper.js";import{encodeChannelMessagesByIdRequest as o,decodeChannelMessagesByIdResponse as c}from"../../../../im-core/src/mapping/channel-offline-mapper.js";async function i(s){e(s.asyncDecrypt?.signal),s.asyncDecrypt?.assertCurrent?.();const r=p({userId:s.userId,messageIds:s.messageIds,clientType:s.clientType}),n=await s.http.postProtobuf({path:"/offline/v1/chat/msg/by_id",body:r,...void 0===s.asyncDecrypt?.signal?{}:{signal:s.asyncDecrypt.signal}}),o={selfId:s.userId,keepRaw:!0,onReaction:s.onReaction,onPlaintextFallback:s.onPlaintextFallback};return void 0===s.asyncDecrypt?a(n,o,s.decryptDeps,s.messageIds):t(n,o,s.decryptDeps,s.messageIds,s.asyncDecrypt)}async function d(p){e(p.asyncDecrypt?.signal),p.asyncDecrypt?.assertCurrent?.(),void 0===p.asyncDecrypt&&void 0!==p.prepareKeys&&void 0!==p.decryptDeps&&""!==p.groupId&&await p.prepareKeys([p.groupId]);const a=s({userId:p.userId,groupId:p.groupId,messageIds:p.messageIds,clientType:p.clientType}),t=await p.http.postProtobuf({path:"/offline/v1/group/msg/by_id",body:a,...void 0===p.asyncDecrypt?.signal?{}:{signal:p.asyncDecrypt.signal}}),o={selfId:p.userId,keepRaw:!0,source:"history",onReaction:p.onReaction};return void 0===p.asyncDecrypt?r(t,o,p.decryptDeps,p.messageIds):n(t,{...o,expectedGroupId:p.groupId},p.decryptDeps,p.messageIds,{...p.asyncDecrypt,...void 0===p.prepareKeys?{}:{prepareKeys:e=>p.prepareKeys([...e])}})}async function y(e){void 0!==e.decryptDeps&&void 0!==e.prepareKey&&await e.prepareKey(e.channelId);const s=o({userId:e.userId,channelId:e.channelId,messageIds:e.messageIds,clientType:e.clientType}),r=await e.http.postProtobuf({path:"/channel/v1/msg/by_id",body:s});return c(r,{selfId:e.userId,keepRaw:!0,expectedChannelIds:[e.channelId],diagnostic:{endpoint:"msgById",surface:"msg-by-id",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},e.decryptDeps,e.messageIds)}export{y as pullChannelMessagesById,i as pullDirectMessagesById,d as pullGroupMessagesById};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{encodeChannelSessionsRequest as e,decodeChannelSessionsResponse as n,encodeChannelMessagesRequest as o,decodeChannelMessagesResponse as t,decodeChannelMessagesResponseAsync as a,encodeChannelHistoryRequest as s,decodeChannelHistoryResponse as i}from"../../../../im-core/src/mapping/channel-offline-mapper.js";import{throwIfAborted as r}from"../../../../im-core/src/abort.js";import{compareBySortKey as c}from"../../../../im-core/src/mapping/sort.js";import{pullChannelMessagesRespCodec as d}from"../../../../im-protocol/src/protobuf/registry.js";async function l(o){const t=[];for(const a of u(o.channels,20)){const s=e({userId:o.userId,clientType:o.clientType,channels:a}),i=await o.http.postProtobuf({path:"/channel/v1/sessions",body:s}),r={selfId:o.userId,keepRaw:o.keepRaw??!0,expectedChannelIds:a.map(e=>e.channelId),diagnostic:{endpoint:"sessions",surface:"session-last",...void 0===o.operationId?{}:{operationId:o.operationId},clientTypeHeader:o.clientType,clientTypeBody:o.clientType}},c=n(i,r);await f(o,c.sessions.filter(e=>"active"===e.channelState||0===e.raw?.status).map(e=>e.channelId)),t.push(...n(i,{...r,onContentDecodeError:o.onContentDecodeError,onReaction:o.onReaction},o.decryptDeps).sessions)}return t}async function p(e){const n=function(e){if(void 0===e)return 10;if(!Number.isInteger(e)||e<=0)throw new Error("channel offline: channelBatchSize 必须为正整数");return Math.min(e,10)}(e.channelBatchSize),s=e.messageCount??30,i=function(e){if(void 0===e)return 100;if(!Number.isInteger(e)||e<=0)throw new Error("channel offline: maxPagesPerBatch 必须为正整数");return e}(e.maxPagesPerBatch),d=/* @__PURE__ */new Map;for(const c of u(e.pulls,n)){let n=c.map(e=>({...e}));const l=new Map(n.map(e=>[e.channelId,/* @__PURE__ */new Set([e.baseIndex])]));let p=0;for(;n.length>0;){r(e.signal),await(e.beforePage?.()),r(e.signal);const c=e.isChannelCurrent;if(void 0!==c&&(n=n.filter(e=>c(e.channelId))),0===n.length)break;if(p>=i){const e=n.map(({channelId:e,baseIndex:n})=>`${e}@${n}`).join(",");throw new Error(`channel offline 分页超过 maxPagesPerBatch=${i}(active=${e})`)}p+=1;const h=o({userId:e.userId,clientType:e.clientType,pulls:n.map(e=>({channelId:e.channelId,baseIndex:e.baseIndex,direction:0,count:s,contain:0}))});r(e.signal);const I=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:h,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal),await f(e,n.map(e=>e.channelId)),r(e.signal);const u={selfId:e.userId,keepRaw:e.keepRaw??!0,expectedChannelIds:n.map(e=>e.channelId),diagnostic:{endpoint:"offlineMessages",surface:"offline-batch",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},g=void 0===e.yieldToEventLoop?t(I,u,e.decryptDeps):await a(I,u,e.decryptDeps,{yieldToEventLoop:e.yieldToEventLoop,signal:e.signal});r(e.signal);const y=[];for(const e of n){const n=g.nextBaseIndexes[e.channelId],o=g.messageCounts[e.channelId]??0;if(void 0===n)continue;const t=l.get(e.channelId);if(t.has(n))throw new Error(`channel offline cursor 循环(channelId=${e.channelId}, baseIndex=${n})`);o<s||(t.add(n),y.push({channelId:e.channelId,baseIndex:n}))}await(e.onPage?.(g.messages,{pulls:n.map(e=>({...e})),nextBaseIndexes:{...g.nextBaseIndexes},messageCounts:{...g.messageCounts}})),r(e.signal);for(const e of g.messages)d.has(e.id)||d.set(e.id,e);n=y}}return[...d.values()].sort(c)}async function h(e){r(e.signal);const n=e.count??30;if(!Number.isInteger(n)||n<=0)throw new Error("channel latest: count 必须为正整数");void 0!==e.decryptDeps&&void 0!==e.prepareKey&&await e.prepareKey(e.channelId);const s=o({userId:e.userId,clientType:e.clientType,pulls:[{channelId:e.channelId,baseIndex:"",direction:1,count:n,contain:0}]});r(e.signal);const i=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:s,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal);const c={selfId:e.userId,keepRaw:e.keepRaw??!0,expectedChannelIds:[e.channelId],diagnostic:{endpoint:"offlineMessages",surface:"history-page",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},l=void 0===e.yieldToEventLoop?{...t(i,c,e.decryptDeps),firstBaseIndex:d.decode(i).lsMessage[0]?.sIndex}:await a(i,c,e.decryptDeps,{yieldToEventLoop:e.yieldToEventLoop,signal:e.signal}),p=l.batchSize===n,h=l.firstBaseIndex;if(p&&("string"!=typeof h||""===h.trim()))throw new Error(`channel latest: 满页缺少向旧 cursor(channelId=${e.channelId})`);return{messages:l.messages,hasOlder:p,...p?{nextCursor:h}:{}}}async function I(e){r(e.signal);const n=e.count??30;void 0!==e.decryptDeps&&void 0!==e.prepareKey&&await e.prepareKey(e.channelId);const o=s({userId:e.userId,clientType:e.clientType,channelId:e.channelId,baseIndex:e.baseIndex,count:n,contain:e.contain??0});r(e.signal);const t=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:o,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal);return i(t,{selfId:e.userId,channelId:e.channelId,requestedBaseIndex:e.baseIndex,requestedCount:n,keepRaw:e.keepRaw??!0,diagnostic:{endpoint:"history",surface:"history-page",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},e.decryptDeps)}async function f(e,n){if(void 0===e.decryptDeps||void 0===e.prepareKeys)return;const o=[...new Set(n.filter(Boolean))];o.length>0&&await e.prepareKeys(o)}function u(e,n){const o=[];for(let t=0;t<e.length;t+=n)o.push(e.slice(t,t+n));return o}export{I as pullChannelHistory,h as pullChannelLatestPage,p as pullChannelOfflineMessages,l as pullChannelSessions};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{assertOfflineChatBatchComplete as e,encodeDirectOfflineChatPullRequest as n,decodeDirectOfflineChatBatch as t,decodeDirectOfflineChatBatchAsync as r}from"../../../../im-core/src/mapping/offline-mapper.js";import{throwIfAborted as s}from"../../../../im-core/src/abort.js";async function c(e,c){s(c.asyncDecrypt?.signal),c.asyncDecrypt?.assertCurrent?.();const i=n({userId:c.userId,clientType:c.clientType,limit:c.limit,deliveredMsgInfos:c.deliveredMsgInfos}),o=await c.http.postProtobuf({path:e,body:i,...void 0===c.asyncDecrypt?.signal?{}:{signal:c.asyncDecrypt.signal}}),a={selfId:c.userId,keepRaw:!0,onReaction:c.onReaction};return void 0===c.asyncDecrypt?t(o,a,c.decryptDeps):r(o,a,c.decryptDeps,c.asyncDecrypt)}function i(e){return c("/offline/v1/chat",e)}function o(e){return c("/offline/v1/owner_chat",e)}function a(n){return i(n).then(n=>(e(n),n.messages))}function p(n){return o(n).then(n=>(e(n),n.messages))}export{a as pullOfflineInboundChat,i as pullOfflineInboundChatBatch,p as pullOfflineOwnerChat,o as pullOfflineOwnerChatBatch};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{throwIfAborted as e}from"../../../../im-core/src/abort.js";import{encodeGroupOfflineSessionRequest as o,decodeGroupOfflineSessionAsync as s,decodeGroupOfflineSession as r,encodeGroupHistoryRequest as t,decodeGroupHistoryBatchAsync as i,decodeGroupHistoryBatch as n,encodeGroupOfflinePullRequest as p,decodeGroupOfflineBatchAsync as a,decodeGroupOfflineBatch as d}from"../../../../im-core/src/mapping/group-offline-mapper.js";function c(e){if(void 0!==e.asyncDecrypt)return{...e.asyncDecrypt,...void 0===e.prepareKeys?{}:{prepareKeys:o=>e.prepareKeys([...o])}}}function l(e){return[...new Set(e.filter(e=>void 0!==e&&""!==e))]}async function u(o){const s=c(o);e(s?.signal),s?.assertCurrent?.();const r=p({userId:o.userId,clientType:o.clientType,limit:o.limit,deliveredMsgIds:o.deliveredMsgInfos?.map(e=>e.msgId)}),t=await o.http.postProtobuf({path:"/offline/v1/group",body:r,...void 0===s?.signal?{}:{signal:s.signal}});if(void 0!==s)return a(t,{selfId:o.userId,keepRaw:!0,onReaction:o.onReaction},o.decryptDeps,s);if(void 0!==o.prepareKeys&&void 0!==o.decryptDeps){const e=l(d(t,{selfId:o.userId}).messages.map(e=>e.conversationId));e.length>0&&await o.prepareKeys(e)}return d(t,{selfId:o.userId,keepRaw:!0,onReaction:o.onReaction},o.decryptDeps)}async function y(t){const i=c(t);e(i?.signal),i?.assertCurrent?.();const n=o({userId:t.userId,clientType:t.clientType,size:t.size}),p=await t.http.postProtobuf({path:"/offline/v1/group/session",body:n,...void 0===i?.signal?{}:{signal:i.signal}});if(void 0!==i)return s(p,{selfId:t.userId,keepRaw:!0,onReaction:t.onReaction},t.decryptDeps,i);if(void 0!==t.prepareKeys&&void 0!==t.decryptDeps){const e=r(p,{selfId:t.userId}),o=l([...e.unreads.map(e=>e.groupId),...e.messages.map(e=>e.conversationId)]);o.length>0&&await t.prepareKeys(o)}return r(p,{selfId:t.userId,keepRaw:!0,onReaction:t.onReaction},t.decryptDeps)}async function g(o){const s=c(o),r=o.signal??s?.signal;e(r),e(s?.signal),s?.assertCurrent?.(),void 0===s&&void 0!==o.prepareKeys&&void 0!==o.decryptDeps&&""!==o.groupId&&await o.prepareKeys([o.groupId]);const p=t({userId:o.userId,groupId:o.groupId,baseTime:o.baseTime,direct:o.direct,limit:o.limit,clientType:o.clientType});e(r);const a=await o.http.postProtobuf({path:"/offline/v1/group/history_msg",body:p,...void 0===r?{}:{signal:r}});e(r);const d={selfId:o.userId,keepRaw:o.keepRaw??!0,source:"history",onReaction:o.onReaction};return void 0!==s?i(a,{...d,expectedGroupId:o.groupId},o.decryptDeps,{yieldToEventLoop:s.yieldToEventLoop,signal:r},s):void 0===o.yieldToEventLoop?n(a,d,o.decryptDeps):i(a,{...d,expectedGroupId:o.groupId},o.decryptDeps,{yieldToEventLoop:o.yieldToEventLoop,signal:o.signal})}export{g as pullGroupHistory,u as pullOfflineGroupBatch,y as pullOfflineGroupSession};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{encodeOfflineSignalPullRequest as i,decodeOfflineSignalBatch as e}from"../../../../im-core/src/mapping/signal-offline-mapper.js";async function n(n){const s=i({userId:n.userId,clientType:n.clientType,limit:n.limit??100,msgId:String(Date.now()),deliveredMsgIds:n.deliveredMsgIds}),t=await n.http.postProtobuf({path:"/offline/v1/signal",body:s,...void 0===n.signal?{}:{signal:n.signal}});return e(t)}export{n as pullOfflineSignal};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function t(t,r,n){const e=t.trim(),o=/^0+$/.test(e);if(!/^\d+$/.test(e)||!n&&o)throw new Error(`机器人指令 ${r} 必须是${n?"非负":"正"}整数`);return BigInt(e)}function r(t){const r=[];let n=t;for(;n>0x7fn;)r.push(Number(0x7fn&n|0x80n)),n>>=7n;return r.push(Number(n)),r}function n(t,n){const e=[...(new TextEncoder).encode(n)];return[t<<3|2,...r(BigInt(e.length)),...e]}function e(e){const o=t(e.menuId,"menuId",!0),f=e.robotId.trim(),u=t(e.userId,"userId",!1);if(""===f)throw new Error("机器人指令 robotId 不能为空");const i=[8,...r(o),...n(2,f),24,...r(u)];return Uint8Array.from(i)}function o(t,r){let n=0n,e=0n,o=r;for(;o<t.length&&e<=63n;){const r=t[o];if(o+=1,n|=BigInt(127&r)<<e,!(128&r))return{value:n,offset:o};e+=7n}throw new Error("机器人固定回复 protobuf 截断")}function f(t,r,n){if(0===n)return o(t,r).offset;if(1===n)return r+8;if(5===n)return r+4;if(2===n){const n=o(t,r),e=Number(n.value);if(!Number.isSafeInteger(e)||e<0||n.offset+e>t.length)throw new Error("机器人固定回复 protobuf 截断");return n.offset+e}throw new Error(`机器人固定回复 protobuf 字段类型不支持:${n}`)}function u(t){let r=0n,n=0n,e="",u=0,i=0n,s=new Uint8Array,c=0;for(;c<t.length;){const a=o(t,c),m=Number(a.value>>3n),b=Number(7n&a.value);if(c=a.offset,0===b&&(1===m||2===m||4===m||5===m)){const e=o(t,c);c=e.offset,1===m?r=e.value:2===m?n=e.value:4===m?u=Number(e.value):i=e.value;continue}if(2===b&&(3===m||6===m)){const r=o(t,c),n=Number(r.value);if(!Number.isSafeInteger(n)||n<0||r.offset+n>t.length)throw new Error("机器人固定回复 protobuf 截断");const f=t.subarray(r.offset,r.offset+n);3===m?e=(new TextDecoder).decode(f):s=Uint8Array.from(f),c=r.offset+n;continue}const l=f(t,c,b);if(l>t.length)throw new Error("机器人固定回复 protobuf 截断");c=l}return{toId:r.toString(),fromId:n.toString(),msgId:e,msgType:u,msgTime:i,content:s}}async function i(t,r){return u(await t.postProtobuf({path:"/robotRouter/fixed_chat_msg",body:e(r)}))}export{u as decodeFixedChatMsgResponse,e as encodeFixedChatMsgRequest,i as requestRobotMenuReply};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var o=Object.defineProperty,e=(e,n,t)=>((e,n,t)=>n in e?o(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t)(e,"symbol"!=typeof n?n+"":n,t);import{requestCoreJson as n}from"./core-json-request.js";class t extends Error{constructor(o,n,t){super(`${"profile"===o?"读取机器人资料":"confirm"===o?"确认机器人开聊":"读取机器人指令"}失败(${n}):${t||"unknown error"}`),e(this,"responseCode"),e(this,"operation"),this.name="RobotProfileError",this.responseCode=n,this.operation=o}}class r extends Error{constructor(o){super(o),this.name="RobotProfileMappingError"}}function i(o){return"string"==typeof o||"number"==typeof o?String(o).trim():""}function s(o){const e=i(o);return""===e?void 0:e}function d(o){return null===o||"object"!=typeof o||Array.isArray(o)?void 0:o}function a(o){return i(o.robot_id??o.robotId)}function u(o){if(null!=o&&""!==o){if(!0===o||1===o||"1"===o)return!0;if(!1===o||0===o||"0"===o)return!1;throw new r("机器人首次开聊标记必须是布尔值")}}function c(o){const e=function(o){const e=d(o);if(void 0!==e&&""!==a(e))return e;const n=d(e?.data);if(void 0!==n&&""!==a(n))return n;throw new r("机器人资料缺少稳定 robot_id")}(o),n=a(e),t=i(e.robot_name??e.robotName)||n,c=s(e.mid??e.botMid??e.bot_mid),f=s(e.img_url??e.imgUrl),m=s(e.developer_name??e.developerName??e.developer),p=s(e.desc??e.description),v=function(o){if(null==o||""===o)return;const e="number"==typeof o?o:Number(o);if(!Number.isSafeInteger(e)||e<0)throw new r("机器人使用人数必须是非负整数");return e}(e.users_count??e.usersCount??e.useNum),l=u(e.first),h=s(e.app_id??e.appId),b=s(e.developer_id??e.developerId),_=s(e.app_name??e.appName),y=s(e.domain),w=s(e.suffix_address??e.suffixAddress),g=s(e.h5_url??e.h5Url),I=u(e.is_dynamic??e.isDynamic);return{id:n,displayName:t,...void 0===c?{}:{username:c},...void 0===f?{}:{avatarUrl:f},...void 0===m?{}:{developerName:m},...void 0===p?{}:{description:p},...void 0===v?{}:{userCount:v},...void 0===l?{}:{firstChat:l},...void 0===h?{}:{appId:h},...void 0===b?{}:{developerId:b},...void 0===_?{}:{appName:_},...void 0===y?{}:{domain:y},...void 0===w?{}:{suffixAddress:w},...void 0===g?{}:{h5Url:g},...void 0===I?{}:{dynamicHost:I}}}function f(o){const e=o.trim();if(""===e)throw new r("机器人 robotId 不能为空");return e}function m(o){return{responseMode:"strict",method:"POST",...void 0===o?{}:{headers:{"Client-type":String(o)}}}}async function p(o,e){const i=f(e.robotId),s=function(o){if(void 0!==o){if(!Number.isSafeInteger(o)||o<1||o>5)throw new r("机器人资料 lang 必须是 1 到 5 的整数");return o}}(e.lang),d=await n(o,"/robot/info",{robot_id:i,...void 0===s?{}:{lang:s}},m(e.clientType));if(!d.ok)throw new t("profile",d.code,d.message);return c(d.data)}async function v(o,e){const r=f(e.robotId),i=await n(o,"/robot/confirm_chat_robot",{robot_id:r},m(e.clientType));if(!i.ok)throw new t("confirm",i.code,i.message)}function l(o,e=0){if(e>2)return;const n=d(o)??("string"==typeof o?function(o){try{return d(JSON.parse(o))}catch{return}}(o):void 0);if(void 0===n)return;const t=s(n.app_id??n.appId),r=s(n.domain);if(void 0!==t&&void 0!==r){const o=s(n.path);return{appId:t,domain:r,...void 0===o?{}:{path:o}}}const i=n.content??n.msg_content??n.msgContent;return void 0!==i&&i!==o?l(i,e+1):void 0}function h(o){const e=d(o);if(void 0===e)throw new r("机器人指令项必须是对象");const n=i(e.menu_id??e.menuId??e.id),t=i(e.menu_name??e.menuName);if(""===n||""===t)throw new r("机器人指令缺少 menu_id 或 menu_name");const s=e.msg_type??e.msgType,a=void 0===s?0:Number(s);if(!Number.isSafeInteger(a))throw new r("机器人指令 msg_type 必须是整数");if(2===a){const o=l(e.msg_content??e.msgContent??e.content);if(void 0!==o)return{id:n,name:t,kind:"app",appId:o.appId,domain:o.domain,...void 0===o.path?{}:{path:o.path}}}return{id:n,name:t,kind:"message",requestsReply:0===a||1===a}}function b(o){const e=[];for(const n of function(o){const e=d(o),n=d(e?.data),t=e?.chat_menus??e?.chatMenus??n?.chat_menus??n?.chatMenus;if(void 0===t)return[];if(!Array.isArray(t))throw new r("机器人指令 chat_menus 必须是数组");return t}(o))if(Array.isArray(n))for(const o of n)e.push(h(o));else e.push(h(n));return e}async function _(o,e){const r=f(e.robotId),i=await n(o,"/robot/chat_menu",{robot_id:r},m(e.clientType));if(!i.ok)throw new t("menu",i.code,i.message);return b(i.data)}export{t as RobotProfileError,r as RobotProfileMappingError,v as confirmRobotChat,_ as getRobotChatMenus,p as getRobotProfile};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.defineProperty,r=(r,o,t)=>((r,o,t)=>o in r?e(r,o,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[o]=t)(r,"symbol"!=typeof o?o+"":o,t);import{requestCoreJson as o}from"./core-json-request.js";class t extends Error{constructor(e,o){super(`搜索机器人失败(${e}):${o||"unknown error"}`),r(this,"responseCode"),this.name="RobotDirectoryError",this.responseCode=e}}class n extends Error{constructor(e){super(e),this.name="RobotDirectoryMappingError"}}function i(e){return"string"==typeof e||"number"==typeof e?String(e).trim():""}function a(e){const r=i(e);return""===r?void 0:r}function s(e){return null===e||"object"!=typeof e||Array.isArray(e)?void 0:e}function u(e){const r=s(e);if(void 0===r)throw new n("机器人目录项必须是对象");const o=i(r.robot_id??r.robotId);if(""===o)throw new n("机器人目录项缺少稳定 robot_id");const t=i(r.robot_name??r.robotName)||o,u=a(r.mid??r.botMid??r.bot_mid),p=a(r.img_url??r.imgUrl),d=function(e){return!0===e||1===e||"1"===e||!1!==e&&0!==e&&"0"!==e&&void 0}(r.bind);return{id:o,displayName:t,...void 0===u?{}:{username:u},...void 0===p?{}:{avatarUrl:p},...void 0===d?{}:{bound:d}}}async function p(e,r){if(!Number.isSafeInteger(r.page)||r.page<1)throw new n("机器人目录 page 必须是正整数");if(!Number.isSafeInteger(r.pageSize)||r.pageSize<1||r.pageSize>100)throw new n("机器人目录 pageSize 必须是 1-100 的整数");const i=r.keyword?.trim()??"",a=r.groupId?.trim()??"";if(""===a!=(void 0===r.groupType))throw new n("机器人目录 groupId 与 groupType 必须同时提供或同时省略");const p=await o(e,"/robot/search_robot",{page:r.page,page_size:r.pageSize,...""===i?{}:{keyword:i},...""===a||void 0===r.groupType?{}:{group_id:a,group_type:r.groupType},...!0===r.boundOnly?{search_type:1}:{}},{responseMode:"strict",method:"POST",...void 0===r.clientType?{}:{headers:{"Client-type":String(r.clientType)}}});if(!p.ok)throw new t(p.code,p.message);const d=function(e){if(Array.isArray(e))return e;const r=s(e);if(void 0===r)throw new n("机器人目录 data 必须是对象或数组");const o=r.data??r.list;if(!Array.isArray(o))throw new n("机器人目录 data.data 必须是数组");return o}(p.data).map(u),c=function(e){const r=s(e);if(void 0===r)return;const o=r.total_count??r.totalCount;if(void 0===o)return;const t="number"==typeof o?o:Number(o);if(!Number.isSafeInteger(t)||t<0)throw new n("机器人目录 total_count 必须是非负整数");return t}(p.data);return{items:d,exhausted:void 0===c?d.length<r.pageSize:r.page*r.pageSize>=c}}export{t as RobotDirectoryError,n as RobotDirectoryMappingError,p as searchRobots};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{requestCoreJson as r,CORE_JSON_CODE_SUCCESS as e}from"./core-json-request.js";const o={direct:"/friend/undisturb/set",group:"/user_group/user/edit",channel:"/user_radio/user/setting",robot:"/friend/undisturb/set"},t={direct:"friend_user_id",group:"group_id",channel:"radio_id",robot:"friend_user_id"};async function i(i){const n=o[i.conversationType],d=t[i.conversationType];if(void 0===n||void 0===d)throw new Error(`免打扰未支持会话类型:${i.conversationType}`);const{code:s}=await r(i.client,n,{[d]:i.targetId,is_undisturb:i.muted?"1":"0"},{method:"POST"});if(s!==e)throw new Error(`免打扰设置失败:code=${s}(${i.conversationType} ${i.targetId})`)}export{i as setConversationUndisturb};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{requestCoreJson as e,CORE_JSON_CODE_SUCCESS as o}from"./core-json-request.js";async function i(i){const r={friend_user_id:i.userId};void 0!==i.name&&(r.nick_name=i.name),void 0!==i.email&&(r.ext_email=JSON.stringify(i.email)),void 0!==i.phones&&(r.ext_mobile=JSON.stringify(i.phones.map(e=>({country_code:e.countryCode,mobile:e.mobile}))));const{code:n}=await e(i.client,"/friend/remarks/update",r,{method:"POST"});if(n!==o)throw new Error(`设置好友备注失败:code=${n}(userId=${i.userId})`)}export{i as setFriendRemark};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{requestCoreJson as o,CORE_JSON_CODE_SUCCESS as r}from"./core-json-request.js";async function e(e){const{code:n}=await o(e.client,"/user_group/user/edit",{group_id:e.groupId,nick_name:e.nickname},{method:"POST"});if(n!==r)throw new Error(`修改群内昵称失败:code=${n}(groupId=${e.groupId})`)}export{e as setGroupNickname};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{assertBoardGroupId as r}from"./board-pinned-message-validation.js";import{requestCoreJson as o}from"./core-json-request.js";async function t(t){r(t.groupId);const a=await o(t.client,"/api/v1/board/board_msg_top_cancel",{group_id:t.groupId,group_type:2},{method:"POST",prefix:"",responseMode:"strict"});if(!a.ok)return a;if(null!==a.data)throw new Error("board unpin 响应结构非法:成功 data 必须为空");return{...a,data:null}}export{t as unpinBoardMessage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{assertBoardChannelId as n}from"./board-pinned-message-validation.js";import{requestCoreJson as r}from"./core-json-request.js";async function o(o){n(o.channelId);const a=await r(o.client,"/api/v1/board/board_msg_top_cancel",{group_id:o.channelId,group_type:1},{method:"POST",prefix:"",responseMode:"strict"});if(!a.ok)return a;if(null!==a.data)throw new Error("channel board unpin 响应结构非法:成功 data 必须为空");return{...a,data:null}}export{o as unpinChannelBoardMessage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{requestCoreJson as o,CORE_JSON_CODE_SUCCESS as r}from"./core-json-request.js";async function e(e){const a={group_id:e.groupId};void 0!==e.name&&(a.name=e.name),void 0!==e.avatarUrl&&(a.head_img_url=e.avatarUrl);const{code:t}=await o(e.client,"/user_group/edit",a,{method:"POST"});if(t!==r)throw new Error(`修改群资料失败:code=${t}(groupId=${e.groupId})`)}export{e as updateGroupInfo};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{encryptCollectTeaBody as e,parseCollectFavoriteMsgBody as r}from"../crypto/collect-tea.js";import{requestCoreJson as t,CoreJsonBusinessError as i}from"./requests/core-json-request.js";import{projectSessionFavoriteFilesBody as n,parseSessionFavoriteFileItems as o}from"../../../im-core/src/session-favorite-files.js";import{resolveSessionFavoriteListImageUrl as a}from"../../../im-core/src/session-favorite-album.js";class s extends Error{constructor(){super("会话收藏 Core API 未配置"),this.name="SessionFavoriteProviderUnavailableError"}}class c extends Error{constructor(e){super(e),this.name="SessionFavoriteMappingError"}}function d(e){return"string"==typeof e?e:null==e?"":String(e)}function m(e,r){const t=d(e).trim();if(""===t)throw new c(`${r} 不能为空`);return t}function l(e){if("direct"===e)return 0;if("group"===e)return 1;if("channel"===e)return 2;throw new c(`favorite conversation type ${e}`)}function f(e,r){return"text"===r||"location"===r?d(e.content).trim():"file"===r?d(e.fileName||e.file_name||e.name).trim():"mediaAlbum"===r||"filesAlbum"===r?d(e.caption).trim():"liveRoom"===r?d(e.liveRoomName).trim()||d(e.broadcasterUserName).trim():""}function u(e,r){const t=d(e.group_id).trim(),i=d(e.radio_id).trim(),n=Number(d(e.msg_type).trim());if(1===n&&""!==t)return{conversationType:"group",conversationId:t};if(2===n&&""!==i)return{conversationType:"channel",conversationId:i};if(""!==t)return{conversationType:"group",conversationId:t};if(""!==i)return{conversationType:"channel",conversationId:i};if(0===n){const t=d(e.from_id).trim(),i=d(e.to_id).trim(),n=t===r.trim()?i:t;if(""!==n)return{conversationType:"direct",conversationId:n}}return null}function v(e,r){const t=e.from_user,i=d(t?.nick_name||t?.nickname||t?.name).trim();return""===i?r:i}function p(e,t){const i=d(e.uu_id).trim(),s=function(e){const r="number"==typeof e?e:Number(String(e??"").trim());return 1===r?"text":2===r?"image":3===r?"video":4===r?"voice":5===r?"location":11===r?"file":28===r?"mediaAlbum":29===r?"filesAlbum":30===r?"liveRoom":null}(e.content_type),c=r(d(e.msg_body),t);if(""===i||null===s||null===c)return null;const m=d(e.from_id).trim();return Object.freeze({collectId:i,msgId:d(e.msg_id).trim(),kind:s,senderId:m,senderName:v(e,m),avatarUrl:d(e.from_user?.avatar).trim(),createdAt:d(e.create_time||e.update_time||e.msg_time).trim(),text:f(c,s),imageUrl:a(s,c),fileName:"filesAlbum"===s?o(c).map(e=>e.fileName).join(" "):"file"===s?f(c,"file"):"",body:"filesAlbum"===s?n(c):Object.freeze({...c}),conversation:u(e,t)})}function y(){if("undefined"==typeof crypto||"function"!=typeof crypto.randomUUID)throw new c("collect uuid 不可用");return crypto.randomUUID()}function g(r){async function d(e,n,o){if(void 0===r.coreClient)throw new s;const a=await t(r.coreClient,e,n,{method:"POST",responseMode:"strict",prefix:""});if(!a.ok)throw new i(o,a.code,a.message);return a.data}return{async list(){const e=m(r.getUserId(),"favorite userId"),t=await d("/api/v1/user/favorite/list",{start_time:"1970-01-01 08:00:00",page_size:"2000"},"会话收藏列表");return Object.freeze(function(e){if(null==e)return[];if(Array.isArray(e))return e;if("object"==typeof e&&null!==e&&"list"in e){const r=e.list;if(null==r)return[];if(Array.isArray(r))return r}throw new c("favorite list data 必须是数组或 { list }")}(t).flatMap(r=>{const t=p(r,e);return null===t?[]:[t]}))},async add(t){const i=m(r.getUserId(),"favorite userId"),s=(r.createCollectId??y)(),c={msg_id:m(t.messageId,"favorite msgId"),content_type:(u=t.kind,"text"===u?1:"image"===u?2:"video"===u?3:"voice"===u?4:"location"===u?5:"mediaAlbum"===u?28:"filesAlbum"===u?29:"liveRoom"===u?30:11),msg_type:l(t.conversation.conversationType),msg_time:String(t.createdAt),from_id:m(t.senderId,"favorite fromId"),to_id:m(t.peerId,"favorite toId"),is_hide:!0===t.hide?"1":"0",uu_id:s,msg_body:e(JSON.stringify(t.plainBody),i)};var u,v;return"group"===t.conversation.conversationType&&(c.group_id=t.conversation.conversationId),"channel"===t.conversation.conversationType&&(c.radio_id=t.conversation.conversationId),await d("/api/v1/user/favorite/add",c,"添加会话收藏"),v={collectId:s,msgId:t.messageId.trim(),kind:t.kind,senderId:t.senderId.trim(),senderName:t.senderId.trim(),avatarUrl:"",createdAt:String(t.createdAt),text:f(t.plainBody,t.kind),imageUrl:a(t.kind,t.plainBody),fileName:"filesAlbum"===t.kind?o(t.plainBody).map(e=>e.fileName).join(" "):"file"===t.kind?f(t.plainBody,"file"):"",body:"filesAlbum"===t.kind?n(t.plainBody):t.plainBody,conversation:t.conversation},Object.freeze({...v,body:Object.freeze({...v.body}),conversation:null===v.conversation?null:Object.freeze({...v.conversation})})},async delete(e){const r=[...new Set(e.map(e=>e.trim()).filter(e=>""!==e))];if(0===r.length)throw new c("favorite ids 不能为空");await d("/api/v1/user/favorite/del",{ids:r.join("|")},"删除会话收藏")}}}export{c as SessionFavoriteMappingError,s as SessionFavoriteProviderUnavailableError,g as createSessionFavoriteHttpAdapter};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createMD5 as r}from"hash-wasm";import{throwIfAborted as e}from"../../../im-core/src/abort.js";async function o(o,t){e(t);const a=await r();e(t);let n=performance.now();for(let r=0;r<o.size;r+=1048576){e(t);const i=new Uint8Array(await o.slice(r,r+1048576).arrayBuffer());e(t),a.update(i),performance.now()-n>=8&&(await new Promise(r=>setTimeout(r,0)),e(t),n=performance.now())}return e(t),a.digest("hex")}export{o as fileMd5};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function a(){return"undefined"!=typeof navigator&&"function"==typeof ClipboardItem&&"function"==typeof navigator.clipboard?.write}function r(a){if(!a.isCurrent())throw new DOMException("Image copy is no longer active","AbortError")}async function t(a,t){if(r(t),0===a.size)throw new Error("Empty clipboard image");const i=URL.createObjectURL(a),n=new Image;let e;try{if(await new Promise((a,r)=>{n.onload=()=>a(),n.onerror=()=>r(new Error("Clipboard image decode failed")),n.src=i}),r(t),n.naturalWidth<=0||n.naturalHeight<=0)throw new Error("Invalid clipboard image dimensions");if("image/png"===a.type)return a;if(n.naturalWidth*n.naturalHeight>16777216)throw new Error("Clipboard image exceeds canvas pixel limit");e=document.createElement("canvas"),e.width=n.naturalWidth,e.height=n.naturalHeight;const o=e.getContext("2d");if(null===o)throw new Error("Clipboard canvas unavailable");o.drawImage(n,0,0);const l=await new Promise((a,r)=>{e.toBlob(t=>null===t?r(new Error("Clipboard PNG encoding failed")):a(t),"image/png")});return r(t),l}finally{n.onload=null,n.onerror=null,n.src="",URL.revokeObjectURL(i),void 0!==e&&(e.width=e.height=0)}}async function i(i,n){if(void 0!==n&&""!==n){r(i);let e=!1;const o={...i,isCurrent:()=>!e&&i.isCurrent()};try{if(!a())throw new Error("Image Clipboard API unavailable");const e=(async()=>t(await i.loadOriginal(),o))();return e.catch(()=>{}),await navigator.clipboard.write([new ClipboardItem({"image/png":e,"text/plain":new Blob([n],{type:"text/plain"})})]),r(i),"original"}catch{return e=!0,r(i),await navigator.clipboard.writeText(n),r(i),"text"}finally{e=!0}}if(!a())throw new Error("Image Clipboard API unavailable");r(i);let e=!1;const o={...i,isCurrent:()=>!e&&i.isCurrent()},l={quality:"original"},c=async()=>(r(o),l.quality="thumbnail",t(await i.loadThumbnail(),o)),w=(async()=>{try{return await t(await i.loadOriginal(),o)}catch(a){r(o);try{return await c()}catch(t){throw r(o),new AggregateError([a,t],"Original and thumbnail copy failed")}}})();w.catch(()=>{});try{try{await navigator.clipboard.write([new ClipboardItem({"image/png":w})])}catch(a){if(r(o),"object"==typeof a&&null!==a&&"name"in a&&("NotAllowedError"===a.name||"SecurityError"===a.name))throw a;if(await w,r(o),"thumbnail"===l.quality)throw a;const t=c();t.catch(()=>{}),await navigator.clipboard.write([new ClipboardItem({"image/png":t})])}return r(o),l.quality}finally{e=!0}}export{a as canCopyImageToClipboard,i as copyImageToClipboard};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function t(t){return t>=192&&t<=207&&196!==t&&200!==t&&204!==t}function n(t,n,i){return function(t){return void 0!==t&&t>=5&&t<=8}(i)?{width:n,height:t}:{width:t,height:n}}function i(t,n,i){if(n+6>i)return;for(const[i,e]of[69,120,105,102,0,0].entries())if(t.getUint8(n+i)!==e)return;const e=n+6;if(e+8>i)return;const r=t.getUint16(e,!1);if(19789!==r&&18761!==r)return;const f=18761===r;if(42!==t.getUint16(e+2,f))return;const u=e+t.getUint32(e+4,f);if(u+2>i)return;const o=t.getUint16(u,f);for(let n=0;n<o;n++){const e=u+2+12*n;if(e+12>i)return;if(274===t.getUint16(e,f))return t.getUint16(e+8,f)}}function e(t,n,i){return!(n<i.length)&&i.every((n,i)=>t.getUint8(i)===n)}async function r(r){if(0===r.size)return;const f=new Uint8Array(await r.slice(0,Math.min(r.size,262144)).arrayBuffer()),u=new DataView(f.buffer,f.byteOffset,f.byteLength),o=f.byteLength;return e(u,o,[255,216,255])?function(e,r){let f,u=2;for(;u+4<=r;){if(255!==e.getUint8(u))return;const o=e.getUint8(u+1);if(255===o){u+=1;continue}if(218===o||217===o)return;const g=e.getUint16(u+2,!1);if(g<2)return;const c=u+4,U=u+2+g;if(U>r)return;if(t(o)){if(c+5>r)return;const t=e.getUint16(c+1,!1),i=e.getUint16(c+3,!1);if(i<=0||t<=0)return;return n(i,t,f)}225===o&&void 0===f&&(f=i(e,c,U)),u=U}}(u,o):e(u,o,[137,80,78,71,13,10,26,10])?function(t,n){if(n<24)return;const i=t.getUint32(16,!1),e=t.getUint32(20,!1);return i>0&&e>0?{width:i,height:e}:void 0}(u,o):e(u,o,[71,73,70,56])?function(t,n){if(n<10)return;const i=t.getUint16(6,!0),e=t.getUint16(8,!0);return i>0&&e>0?{width:i,height:e}:void 0}(u,o):e(u,o,[82,73,70,70])&&o>=12&&1464156752===u.getUint32(8,!1)?function(t,n){if(n<30)return;const i=t.getUint32(12,!1);if(1448097824===i){const n=16383&t.getUint16(26,!0),i=16383&t.getUint16(28,!0);return n>0&&i>0?{width:n,height:i}:void 0}if(1448097868===i){const n=t.getUint32(21,!0);return{width:1+(16383&n),height:1+(n>>>14&16383)}}if(1448097880===i)return{width:1+(t.getUint16(24,!0)|t.getUint8(26)<<16),height:1+(t.getUint16(27,!0)|t.getUint8(29)<<16)}}(u,o):void 0}export{r as readImageDimensionsFromHeader};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createMediaRequestLimiter as e}from"./media-request-limiter.js";import{MediaTransferError as t}from"./media-transfer-errors.js";import{MEDIA_TRANSFER_PART_BYTES as n,MEDIA_TRANSFER_REQUEST_CONCURRENCY as o,MEDIA_DOWNLOAD_PART_CONCURRENCY as r}from"./media-transfer-policy.js";function a(a=!0,i,d=n){if(!Number.isSafeInteger(d)||d<=0)throw new RangeError("下载分段大小必须为正整数");const s=e(o),l=/* @__PURE__ */new WeakMap;async function c(e,n){if(!e.ok)throw new t("download-range-failed",`媒体下载失败:HTTP ${e.status}`);return void 0===n.onProgress||null===e.body?!0===n.preferBlob?await e.blob():new Uint8Array(await e.arrayBuffer()):async function(e,t,n,o=!1){const r=Number(e.headers.get("content-length")??0),a=void 0!==n&&Number.isFinite(n)&&n>0?Math.floor(n):0,i=Number.isFinite(r)&&r>0?r:a;let d=0;const s=e.body.pipeThrough(new TransformStream({transform(e,n){d+=e.byteLength;const o=i>0?Math.min(99,Math.round(d/i*100)):0;t({percent:o,bytesTransferred:d,bytesTotal:i}),n.enqueue(e)}})),l=new Response(s,{headers:e.headers});return o?await l.blob():new Uint8Array(await l.arrayBuffer())}(e,n.onProgress,n.expectedBytes,!0===n.preferBlob)}async function u(e){const n=e.resume?.transport,o="object"==typeof n&&null!==n?l.get(n):void 0;if(void 0!==e.resume&&(void 0===o||o.url!==e.url))throw e.onResumeInvalidated?.(),new t("download-range-invalid","下载断点不属于当前资源或传输实例,请重新下载");const a=new AbortController,u=()=>a.abort(e.signal?.reason);e.signal?.aborted?u():e.signal?.addEventListener("abort",u,{once:!0});const f=a.signal,w=void 0===o?[]:[...o.blobs];let b,g=w.reduce((e,t)=>e+(t?.size??0),0),h=o?.object,y=o?.mimeType??"",m=0,v=!1,p=!1;function B(){if(void 0===e.onResumable||void 0===h||0===g)return;const t=Object.freeze({});l.set(t,Object.freeze({url:e.url,object:Object.freeze({...h}),mimeType:y,blobs:Object.freeze([...w])}));const n=Object.freeze({bytesDownloaded:g,bytesTotal:h.total,transport:t});e.onResumable(n)}function E(){const t=h.total;e.onProgress?.({percent:Math.min(99,Math.round(g/t*100)),bytesTransferred:g,bytesTotal:t})}function M(e){return void 0!==h&&w[e]?.size===Math.min(d,h.total-e*d)}async function x(n,a=!1){const l=a?0:n*d+(w[n]?.size??0),u=a?0:void 0===h?l+d-1:Math.min((n+1)*d-1,h.total-1);return s(f,async()=>{const s=await fetch(e.url,{signal:f,cache:"no-store",headers:{Range:`bytes=${l}-${u}`}});if(void 0===o&&void 0===h&&0===n&&200===s.status)return i?.record("info","sdk","media","download-range-unavailable",()=>({data:{reason:"server-returned-full-response"}})),w[0]=await c(s,{...e,preferBlob:!0}),"single";if(429===s.status||s.status>=500)throw await(s.body?.cancel().catch(()=>{})),new t("download-range-failed",`媒体下载失败:HTTP ${s.status}`);let b;try{b=function(e,n,o,r){const a=/^bytes (\d+)-(\d+)\/(\d+)$/.exec(e.headers.get("content-range")??""),i=e.headers.get("etag")??"",d=e.headers.get("content-length"),s=Number(a?.[1]),l=Number(a?.[2]),c=Number(a?.[3]);if(206!==e.status||null===a||![s,l,c].every(Number.isSafeInteger)||c<=0||s!==n||l!==Math.min(o,c-1)||l<s||!/^"[\x21\x23-\x7E\x80-\xFF]*"$/.test(i)||null!==d&&(!/^\d+$/.test(d)||Number(d)!==l-s+1)||null!==e.headers.get("content-encoding")&&"identity"!==e.headers.get("content-encoding"))throw new t("download-range-invalid","分段下载响应无效:需要 206、正确 Content-Range、强 ETag 和未压缩字节;请检查下载域名的 CORS ExposeHeaders");if(void 0!==r&&(c!==r.total||i!==r.etag))throw new t("download-object-changed","分段下载期间文件版本发生变化,请重新下载");return{end:l,total:c,etag:i}}(s,l,u,h)}catch(e){throw await(s.body?.cancel().catch(()=>{})),e}if(void 0===h&&(h=b,y=s.headers.get("content-type")??"",i?.record("debug","sdk","media","download-range-started",()=>({data:{bytesTotal:b.total,partSizeBytes:d,concurrency:r}}))),a){if(1!==(await s.arrayBuffer()).byteLength)throw new t("download-range-invalid","下载对象校验响应长度无效")}else await async function(e,n,o){const r=e.body?.getReader();if(void 0===r)throw new t("download-range-invalid","分段下载没有响应字节流");const a=()=>{r.cancel().catch(()=>{})};f.addEventListener("abort",a,{once:!0});let i=0;try{for(;;){if(f.aborted)throw new DOMException("媒体下载已取消","AbortError");const e=await r.read();if(f.aborted)throw new DOMException("媒体下载已取消","AbortError");if(e.done)break;if(i+=e.value.byteLength,i>o)throw new t("download-range-invalid","分段下载字节数超过 Content-Range");const a=w[n];w[n]=new Blob(void 0===a?[e.value]:[a,e.value]),g+=e.value.byteLength,B(),E()}if(i!==o)throw new t("download-range-invalid","分段下载字节数与 Content-Range 不一致");E()}finally{f.removeEventListener("abort",a),await r.cancel().catch(()=>{}),r.releaseLock()}}(s,n,b.end-l+1);return"range"},e.getPriority)}try{if(void 0!==h)for(;m<Math.ceil(h.total/d)&&M(m);)m+=1;const e=void 0!==h&&m===Math.ceil(h.total/d),n=await x(m++,e);if("range"===n){const e=Math.ceil(h.total/d),n=Array.from({length:Math.min(r,Math.max(0,e-m))},async()=>{try{for(;!f.aborted&&m<e;){const e=m++;M(e)||await x(e)}}catch(e){(e=>{!p&&e instanceof t&&("download-range-invalid"===e.code||"download-object-changed"===e.code)&&(p=!0,b=e),v||(v=!0,b=e,a.abort())})(e)}});if(await Promise.allSettled(n),v)throw b}if(f.aborted)throw new DOMException("媒体下载已取消","AbortError");const o=[];if("range"===n)for(let e=0;e<Math.ceil(h.total/d);e+=1){if(!M(e))throw new t("download-range-invalid","下载仍缺少分段,不能交付完整文件");o.push(w[e])}return"single"===n?w[0]:new Blob(o,{type:y})}catch(n){throw a.abort(),p||n instanceof t&&("download-range-invalid"===n.code||"download-object-changed"===n.code)?e.onResumeInvalidated?.():B(),i?.record("warn","sdk","media","download-range-failed",()=>({data:{code:n instanceof t?n.code:"download-failed"}})),n}finally{e.signal?.removeEventListener("abort",u)}}return async function(e){if(void 0!==e.resume&&!a)throw e.onResumeInvalidated?.(),new t("download-range-invalid","当前下载器未开启断点下载,请重新下载");if(a&&(void 0!==e.resume||void 0!==e.onResumable||!0===e.preferBlob&&Number.isFinite(e.expectedBytes)&&e.expectedBytes>d)){const t=await u(e);return!0===e.preferBlob?t:new Uint8Array(await t.arrayBuffer())}return s(e.signal,async()=>{if(void 0!==e.onProgress&&"undefined"!=typeof XMLHttpRequest)return function(e){const t=!0===e.preferBlob;return new Promise((n,o)=>{const r=new XMLHttpRequest;let a=!1,i=()=>{};const d=()=>{e.signal?.removeEventListener("abort",i),r.onprogress=null,r.onload=null,r.onerror=null,r.onabort=null},s=e=>{a||(a=!0,d(),e())};i=()=>{r.abort(),s(()=>o(new DOMException("media download canceled","AbortError")))},r.open("GET",e.url,!0),r.responseType=t?"blob":"arraybuffer",r.onprogress=t=>{const n=void 0!==e.expectedBytes&&Number.isFinite(e.expectedBytes)&&e.expectedBytes>0?Math.floor(e.expectedBytes):0,o=t.lengthComputable&&t.total>0?t.total:n,r=o>0?Math.min(99,Math.round(t.loaded/o*100)):0;e.onProgress?.({percent:r,bytesTransferred:t.loaded,bytesTotal:o})},r.onload=()=>{if(r.status<200||r.status>=300)return void s(()=>o(new Error(`media download 失败:HTTP ${r.status}`)));const e=r.response;if(t)return"undefined"!=typeof Blob&&e instanceof Blob?void s(()=>n(e)):void s(()=>o(new Error("media download 失败:XHR 未返回 Blob")));e instanceof ArrayBuffer?s(()=>n(new Uint8Array(e))):s(()=>o(new Error("media download 失败:XHR 未返回 ArrayBuffer")))},r.onerror=()=>s(()=>o(new Error("media download 失败:network"))),r.onabort=()=>s(()=>o(new DOMException("media download canceled","AbortError"))),e.signal?.aborted?i():(e.signal?.addEventListener("abort",i,{once:!0}),r.send())})}(e);return c(await fetch(e.url,void 0===e.signal?{}:{signal:e.signal}),e)},e.getPriority)}}export{a as createMediaDownloader};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{fileMd5 as e}from"./file-md5.js";const i="image/jpeg";function t(e,i){return""!==e.type||void 0===i||""===i?e:new Blob([e],{type:i})}function a(a){let r=0;return{fileMd5:e,async imageDimensions(e,i,o){const n=await a.prepare({operationId:"core-image-dimensions-"+ ++r,generation:0,kind:"image",file:t(e,i),includePoster:!1},o);return{width:n.width,height:n.height}},async imageThumbnail(e,o,n){const m=await a.prepare({operationId:"core-image-thumbnail-"+ ++r,generation:0,kind:"image",file:t(e,o?.mimeType),...void 0===o?.maxSize?{}:{maxSize:o.maxSize},...void 0===o?.targetBytes?{}:{targetBytes:o.targetBytes},...void 0===o?.maxBytes?{}:{maxBytes:o.maxBytes},...void 0===o?.quality?{}:{quality:o.quality},...void 0===o?.minQuality?{}:{minQuality:o.minQuality}},n);if(void 0===m.posterData)throw new Error("图片缩略图生成失败:执行器未返回 poster");return{data:new Uint8Array(m.posterData),width:m.width,height:m.height,mimeType:i}},async videoPoster(e,o,n){const m=await a.prepare({operationId:"core-video-poster-"+ ++r,generation:0,kind:"video",file:t(e,o?.mimeType),...void 0===o?.maxSize?{}:{maxSize:o.maxSize},...void 0===o?.targetBytes?{}:{targetBytes:o.targetBytes},...void 0===o?.maxBytes?{}:{maxBytes:o.maxBytes},...void 0===o?.quality?{}:{quality:o.quality},...void 0===o?.minQuality?{}:{minQuality:o.minQuality},...void 0===o?.atTime?{}:{atTime:o.atTime}},n);if(void 0===m.posterData)throw new Error("视频封面生成失败:执行器未返回 poster");return{data:new Uint8Array(m.posterData),width:m.width,height:m.height,duration:Math.round(m.duration??0),mimeType:i}}}}export{a as createMediaPreviewAdapter};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readImageDimensionsFromHeader as t}from"./image-header-dimensions.js";function e(t){const e={active:0,disposed:!1},r=[];function i(){for(;!e.disposed&&e.active<t&&r.length>0;){const t=r.shift();if(t.signal?.aborted){t.reject(new DOMException("媒体预览准备已取消","AbortError"));continue}void 0!==t.onAbort&&t.signal?.removeEventListener("abort",t.onAbort),e.active+=1;let o=!1;t.resolve(()=>{o||(o=!0,e.active-=1,i())})}}return{acquire:t=>e.disposed?Promise.reject(new Error("媒体预览执行器已释放")):new Promise((e,o)=>{const a={resolve:e,reject:o,...void 0===t?{}:{signal:t}};void 0!==t&&(a.onAbort=()=>{const t=r.indexOf(a);t>=0&&r.splice(t,1),o(new DOMException("媒体预览准备已取消","AbortError"))},t.addEventListener("abort",a.onAbort,{once:!0})),r.push(a),i()}),dispose(){e.disposed=!0;for(const t of r.splice(0))void 0!==t.onAbort&&t.signal?.removeEventListener("abort",t.onAbort),t.reject(new Error("媒体预览执行器已释放"))}}}function r(t){if(t?.aborted)throw new DOMException("媒体预览准备已取消","AbortError")}const i=16777216;function o(t,e,r){const o=Math.min(1,r/Math.max(t,e));return function(t,e){const r=Math.min(1,4096/Math.max(t,e));let o=Math.max(1,Math.round(t*r)),a=Math.max(1,Math.round(e*r));const n=o*a;if(n>i){const t=Math.sqrt(i/n);o=Math.max(1,Math.floor(o*t)),a=Math.max(1,Math.floor(a*t))}return{width:o,height:a}}(Math.max(1,Math.round(t*o)),Math.max(1,Math.round(e*o)))}async function a(t,e,i){r(i);const o=await new Promise(r=>t.toBlob(r,"image/jpeg",e));if(r(i),null===o)throw new Error("媒体预览准备失败:Canvas 编码返回空结果");return await o.arrayBuffer()}function n(t,e){if(!Number.isInteger(t)||t<=0)throw new RangeError(`${e}必须是正整数`)}function s(t,e){if(!Number.isFinite(t)||t<=0||t>1)throw new RangeError(`${e}必须大于 0 且不超过 1`)}async function d(t,e,i,d,h){const c="video"===d.kind,u=c?"视频封面":"图片缩略图",l=d.maxSize??320,f=d.targetBytes??(c?10240:12288),m=d.maxBytes??(c?16384:20480),w=d.quality??(c?.84:.9),g=d.minQuality??(c?.68:.72);if(n(l,`${u}最大边长`),n(f,`${u}目标字节数`),n(m,`${u}最大字节数`),s(w,`${u}初始质量`),s(g,`${u}最低质量`),f>m)throw new RangeError(`${u}目标字节数不能超过最大字节数`);if(g>w)throw new RangeError(`${u}最低质量不能高于初始质量`);r(h);const v=document.createElement("canvas");try{const n=v.getContext("2d");if(null===n)throw new Error("媒体预览准备失败:无法创建 Canvas 2D 上下文");const s=e=>{r(h),v.width=e.width,v.height=e.height,n.drawImage(t,0,0,e.width,e.height)};let d=o(e,i,l);s(d);const c=Math.min(200,Math.max(d.width,d.height));let y;const b=[.../* @__PURE__ */new Set([w,Math.max(g,w-.12),g])];for(const t of b){const e=await a(v,t,h);if((void 0===y||e.byteLength<y.byteLength)&&(y=e),e.byteLength<=f)return e}const E=Math.max(d.width,d.height);if(E>c&&void 0!==y){const t=Math.sqrt(f/y.byteLength);d=o(e,i,Math.max(c,Math.floor(E*Math.min(.9,Math.max(.5,t))))),s(d);for(const t of[w,g]){const e=await a(v,t,h);if(e.byteLength<y.byteLength&&(y=e),e.byteLength<=f)return e}}if(void 0!==y&&y.byteLength<=m)return y;throw new Error(`${u}生成失败:编码结果超过 ${m} 字节硬上限`)}finally{v.width=0,v.height=0}}function h(t,e,i,o){return r(i),new Promise((r,a)=>{let n,s,d,h;const c=()=>{void 0!==n&&clearTimeout(n),t.removeEventListener(e,s),t.removeEventListener("error",d),i?.removeEventListener("abort",h)};s=()=>{("seeked"===e?!t.seeking:t.readyState>=("loadedmetadata"===e?1:2))&&(c(),r())},d=()=>{c(),a(new Error(`视频预览准备失败:${e} 前解码错误`))},h=()=>{c(),a(new DOMException("媒体预览准备已取消","AbortError"))},n=setTimeout(()=>{c(),a(new Error(`视频预览准备失败:${e} 超时`))},15e3),t.addEventListener(e,s),t.addEventListener("error",d,{once:!0}),i?.addEventListener("abort",h,{once:!0});try{o?.(),i?.aborted?h():null!==t.error?d():s()}catch(t){c(),a(t)}})}function c(i={}){const a=i.maxConcurrency??function(){if("undefined"==typeof navigator)return 2;const t=navigator.userAgent;if(/iPad|iPhone|iPod/.test(t)||/Macintosh/.test(t)&&(navigator.maxTouchPoints??0)>1)return 1;const e=navigator.deviceMemory;return void 0!==e&&e<=2?1:2}();if(!Number.isInteger(a)||a<1||a>4)throw new RangeError("媒体预览并发数必须是 1-4 的整数");const n=e(a),s=e(1);let c=!1;return{async prepare(e,i){if(c)throw new Error("媒体预览执行器已释放");const a="video"===e.kind,u=await(a?s:n).acquire(i);try{return a?await async function(t,e){const r=URL.createObjectURL(t.file),i=document.createElement("video");i.muted=!0,i.preload="metadata",i.playsInline=!0;try{await h(i,"loadedmetadata",e,()=>{i.src=r,i.load()});const o=i.videoWidth,a=i.videoHeight;if(o<=0||a<=0)throw new Error("视频预览准备失败:视频尺寸无效");const n=Number.isFinite(i.duration)&&i.duration>0?i.duration:void 0,s=void 0===t.atTime?void 0===n?0:Math.min(1,n/2):Math.max(0,Math.min(t.atTime,n??t.atTime));s>0&&await h(i,"seeked",e,()=>{i.currentTime=s}),await h(i,"loadeddata",e,()=>{i.preload="auto"});const c=void 0===n?void 0:n;let u,l;try{u=await d(i,o,a,t,e)}catch(t){if(e?.aborted||t instanceof RangeError)throw t}if(t.includeDisplayPoster)try{l=await d(i,o,a,{...t,maxSize:960,targetBytes:163840,maxBytes:262144,quality:.9,minQuality:.8},e)}catch(t){if(e?.aborted||t instanceof RangeError)throw t}return{width:o,height:a,...void 0===c?{}:{duration:c},...void 0===u?{}:{posterData:u},...void 0===l?{}:{displayPosterData:l}}}finally{i.pause(),i.removeAttribute("src"),i.load(),URL.revokeObjectURL(r)}}(e,i):await async function(e,i){r(i);const a=e.maxSize??320,n=e.maxBytes??20480,s=await t(e.file);function h(t,r){return"image/jpeg"===e.file.type&&e.file.size<=n&&Math.max(t,r)<=a}if(r(i),void 0!==s){if(!1===e.includePoster)return s;if(h(s.width,s.height))return{...s,posterData:await e.file.arrayBuffer()}}const c=void 0===s?void 0:o(s.width,s.height,a);let u;try{u=void 0===c?await createImageBitmap(e.file):await createImageBitmap(e.file,{resizeWidth:c.width,resizeHeight:c.height,resizeQuality:"high"})}catch(t){if(i?.aborted)throw t}if(void 0!==u)try{r(i);const t=s??{width:u.width,height:u.height};return!1===e.includePoster?t:void 0===s&&h(u.width,u.height)?{...t,posterData:await e.file.arrayBuffer()}:{...t,posterData:await d(u,u.width,u.height,e,i)}}finally{u.close()}const l=URL.createObjectURL(e.file),f=new Image;try{await new Promise((t,e)=>{let r,o;const a=()=>{void 0!==r&&clearTimeout(r),f.onload=null,f.onerror=null,i?.removeEventListener("abort",o)};o=()=>{a(),e(new DOMException("媒体预览准备已取消","AbortError"))},f.onload=()=>{a(),t()},f.onerror=()=>{a(),e(new Error("图片预览准备失败:Image 解码错误"))},r=setTimeout(()=>{a(),e(new Error("图片预览准备失败:Image 解码超时"))},15e3),i?.addEventListener("abort",o,{once:!0}),f.src=l});const t=s??{width:f.naturalWidth,height:f.naturalHeight};return!1===e.includePoster?t:h(f.naturalWidth,f.naturalHeight)?{...t,posterData:await e.file.arrayBuffer()}:{...t,posterData:await d(f,f.naturalWidth,f.naturalHeight,e,i)}}finally{f.removeAttribute("src"),URL.revokeObjectURL(l)}}(e,i)}finally{u()}},dispose(){c||(c=!0,n.dispose(),s.dispose())}}}export{c as createMediaPreviewPreparationExecutor};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function t(t=6){if(!Number.isSafeInteger(t)||t<1)throw new RangeError("媒体请求并发上限必须为正整数");let r=0;const e=[];function n(){for(;r<t&&e.length>0;){let t=0,n=e[0].getPriority?.()??0;for(let r=1;r<e.length;r+=1){const o=e[r].getPriority?.()??0;o>n&&(t=r,n=o)}const o=e.splice(t,1)[0];o.signal?.removeEventListener("abort",o.cancel),o.signal?.aborted?o.cancel():(r+=1,o.start())}}return async function(t,o,i){if(t?.aborted)throw new DOMException("媒体传输已取消","AbortError");await new Promise((r,o)=>{const a={signal:t,getPriority:i,start:r,cancel:()=>{const t=e.indexOf(a);t>=0&&e.splice(t,1),o(new DOMException("媒体传输已取消","AbortError"))}};t?.addEventListener("abort",a.cancel,{once:!0}),e.push(a),n()});try{if(t?.aborted)throw new DOMException("媒体传输已取消","AbortError");return await o()}finally{r-=1,n()}}}export{t as createMediaRequestLimiter};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createMediaDownloader as e}from"./media-downloader.js";import{createMediaRequestLimiter as t}from"./media-request-limiter.js";import{MediaTransferError as a,recoverableUploadFailure as r}from"./media-transfer-errors.js";import{resolveMediaUploadPlan as o,MEDIA_UPLOAD_PART_CONCURRENCY as n,MEDIA_TRANSFER_REQUEST_CONCURRENCY as i}from"./media-transfer-policy.js";import{createMediaUploadCredentialStore as s}from"./media-upload-credentials.js";import{abortMultipartSession as d,resumableParts as l,putWholeObject as u,uploadInParts as c,isNoSuchUploadError as m,MISSING_ETAG_MESSAGE as p}from"./s3-multipart-uploader.js";import{installUploadIdleTimeout as f}from"./xhr-upload-idle-timeout.js";const b="分片上传要求该 bucket 的 CORS 放行 POST(Create/CompleteMultipartUpload)、DELETE(AbortMultipartUpload)并 ExposeHeaders: ETag";function g(e,t,r){return void 0!==r?new a("multipart-abort-failed",`media upload: 分片上传失败后的 AbortMultipartUpload 清理未成功,已上传分片可能残留在 bucket 中并继续计费(建议桶侧配置 AbortIncompleteMultipartUpload 生命周期规则);${b}`,{cause:r}):e instanceof a?e:function(e){return e instanceof Error&&e.message.includes(p)}(e)?new a("multipart-etag-missing","media upload: 分片响应读不到 ETag,这是 bucket CORS 缺少 ExposeHeaders: ETag 的配置问题,不是网络问题",{cause:e}):!t||e instanceof Error&&"AbortError"===e.name?e:new a("multipart-upload-failed",`media upload: 分片上传失败;${b}`,{cause:e})}const y=/* @__PURE__ */new Set(["upload-source-invalid","upload-resume-unavailable","multipart-etag-missing","multipart-abort-failed"]);function v(e,t){const a=e?.transport;if(null==a||"object"!=typeof a||"string"!=typeof a.logicalBucket||""===a.logicalBucket||"string"!=typeof a.objectName||""===a.objectName||void 0!==t&&a.logicalBucket!==t)return;const r=a.session;if(null==r||"object"!=typeof r||"string"!=typeof r.bucket||""===r.bucket||"string"!=typeof r.key||""===r.key||"string"!=typeof r.uploadId||""===r.uploadId||!Number.isSafeInteger(r.partSize)||r.partSize<=0||!Number.isSafeInteger(r.sourceBytes)||r.sourceBytes<0||!Array.isArray(r.parts))return;const o=/* @__PURE__ */new Set;for(const e of r.parts){if(null===e||"object"!=typeof e||!Number.isSafeInteger(e.partNumber)||e.partNumber<1||e.partNumber>Math.ceil(r.sourceBytes/r.partSize)||o.has(e.partNumber)||"string"!=typeof e.etag||""===e.etag)return;o.add(e.partNumber)}return a}let w;function h(){if(void 0!==w)return w;const e=Promise.all([import("@aws-sdk/client-s3"),import("@aws-sdk/xhr-http-handler")]).then(([e,t])=>({S3Client:e.S3Client,commands:{PutObjectCommand:e.PutObjectCommand,CreateMultipartUploadCommand:e.CreateMultipartUploadCommand,UploadPartCommand:e.UploadPartCommand,CompleteMultipartUploadCommand:e.CompleteMultipartUploadCommand,AbortMultipartUploadCommand:e.AbortMultipartUploadCommand},XhrHttpHandler:t.XhrHttpHandler})).catch(t=>{throw w===e&&(w=void 0),t});return w=e,e}function k(e,t){return new a("multipart-abort-failed","Resource upload failed and incomplete parts could not be removed",{cause:new AggregateError([e,t],"Resource upload and multipart cleanup both failed")})}function C(e,t){const a=e.keyPrefix??"";return""===a||t.startsWith(a)?t:`${a}${t}`}function U(p,b){const w=s(p.getUploadCredentials),U=t(i);function E(e,t,a,r=!1){const{region:o}=t;return f(a,e.XhrHttpHandler),new e.S3Client({region:o,maxAttempts:r?1:3,credentials:{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey,sessionToken:t.sessionToken,...void 0===t.expiresAtSeconds?{}:{expiration:new Date(1e3*t.expiresAtSeconds)}},useAccelerateEndpoint:(p.useAccelerateEndpoint??!0)&&!o.toLowerCase().startsWith("cn-"),requestChecksumCalculation:"WHEN_REQUIRED",requestHandler:a})}async function S(e,t,r,i,s,f,b,y){const{multipart:w,partSize:h}=o(b,!0===p.multipartTransfer&&!1!==p.multipartUpload),C=new e.XhrHttpHandler({}),S=E(e,s,C,!0===t.recoveryManaged),A={client:S,handler:C,commands:e.commands,bucket:s.bucket,key:f,...void 0!==t.mimeType&&""!==t.mimeType?{mimeType:t.mimeType}:{}},M={data:t.data,sourceBytes:b,...void 0===t.onProgress?{}:{onProgress:t.onProgress},...void 0===t.signal?{}:{signal:t.signal},...void 0===t.transformPart?{}:{transformPart:t.transformPart}},P=t.resume,R=v(P),B=w&&R?.logicalBucket===r&&void 0!==l(R.session,A,b,h);let j=B?R?.session:void 0;const H=e=>{j=e;let a=0;for(const t of e.parts)a+=Math.min(e.partSize,e.sourceBytes-(t.partNumber-1)*e.partSize);t.onResumable?.({bytesUploaded:a,transport:{logicalBucket:r,objectName:i,session:e}})},I=()=>{j=void 0,delete t.resume,t.onResumeInvalidated?.()};let x;try{if("retain"===y.mode&&void 0!==P&&!B)throw new a("upload-resume-unavailable","media upload: 上次上传目标或续传记录已失效,需要确认后重新完整上传");if(void 0!==R&&!B){try{R.logicalBucket===r?await d(A,R.session):await T(P)}catch(e){throw y.cleanupFailed=!0,k(y.retryCause,e)}delete t.resume}if(t.signal?.aborted)throw new DOMException("media upload canceled","AbortError");if(!w)return void await u(A,M,U);const e=j;try{await c({target:A,content:M,partSize:h,queueSize:n,runUpload:U,...void 0===e?{}:{resume:e},onResumable:H,onCompleted:I})}catch(r){if(t.signal?.aborted||!m(r)||"discard"===y.mode&&void 0===e)throw r;if("retain"===y.mode)throw new a("upload-resume-unavailable","media upload: 上次上传已无法继续,需要确认后重新完整上传",{cause:r});j=void 0,await c({target:A,content:M,partSize:h,queueSize:n,runUpload:U,onResumable:H,onCompleted:I})}}catch(e){if("retain"===y.mode&&!0===t.signal?.aborted&&!["offline","paused","page-preserve","cancelled-preserve"].includes(t.signal.reason)&&void 0!==j)try{await d(A,j),I()}catch(e){x=e}if(y.cleanupFailed)throw e;throw g(e,w,x)}finally{S.destroy()}}async function A(e,t,n,i={mode:"retain"}){const s=function(e,t){if("avatar"===e)return p.avatarBucket??"";if("channel"===t){const t=p.channelBuckets?.[e]??"";if(""!==t)return t}return p.buckets[e]??""}(t,n);if(""===s)throw new a("bucket-unconfigured",`media upload: kind=${t} 的逻辑桶名未配置(宿主 IM 对象存储配置缺该资源类型)`);const l=(u=e.data)instanceof Uint8Array?u.byteLength:"undefined"!=typeof Blob&&u instanceof Blob?u.size:void 0;var u;if(void 0===l)throw new a("upload-source-invalid","media upload: 上传内容必须是 Uint8Array 或 Blob");o(l,!0===p.multipartTransfer&&!1!==p.multipartUpload);const c=await h();if("discard"===i.mode&&e.signal?.aborted)throw new DOMException("media upload canceled","AbortError");const m=v(e.resume,s)?.objectName??(f=e.filename,globalThis.crypto.randomUUID()+function(e){if(void 0===e)return"";const t=e.lastIndexOf(".");return t>=0?e.slice(t):""}(f));var f;const b={...e,onResumable:t=>{b.resume=t,e.onResumable?.(t)},onResumeInvalidated:()=>{delete b.resume,e.onResumeInvalidated?.()}};let g;try{g=await w.resolve(s,!0===e.forceRefreshCredentials?{forceRefresh:!0}:void 0);let t=C(g,m);try{await S(c,b,s,m,g,t,l,i)}catch(r){if(e.signal?.aborted||!0===e.recoveryManaged)throw r;if(r instanceof a&&y.has(r.code))throw r;i.retryCause=r,g=await w.resolve(s,{forceRefresh:!0}),t=C(g,m),await S(c,b,s,m,g,t,l,i)}if(e.signal?.aborted)throw new DOMException("media upload canceled","AbortError");return e.onProgress?.({percent:100,bytesTransferred:l,bytesTotal:l,phase:"finalizing"}),{url:`${g.dnsPoint}/${t}`}}catch(t){const o=v(b.resume);if("discard"===i.mode&&!i.cleanupFailed&&void 0!==o&&void 0!==g){const e=new c.XhrHttpHandler({}),a=E(c,g,e);try{await d({client:a,commands:c.commands},o.session)}catch(e){throw k(t,e)}finally{a.destroy()}}const n=r(t);throw void 0!==n&&e.onFailure?.(n),t instanceof a&&("upload-resume-unavailable"===t.code?e.onFailure?.("resume-unavailable"):"multipart-abort-failed"===t.code&&e.onFailure?.("cleanup-unconfirmed")),t}}async function T(e){const t=e.transport;if(void 0===t?.session||""===t.session.uploadId)return;const a=await h(),r=await w.resolve(t.logicalBucket),o=new a.XhrHttpHandler({}),n=E(a,r,o);try{await d({client:n,commands:a.commands},t.session)}finally{n.destroy()}}return{upload:function(e){return A(e,e.kind,e.conversationType)},uploadAvatar:function(e){return A(e,"avatar")},uploadResource:function(e){return A({data:e.data,...void 0===e.filename?{}:{filename:e.filename},...void 0===e.mimeType?{}:{mimeType:e.mimeType},...void 0===e.signal?{}:{signal:e.signal},...void 0===e.onProgress?{}:{onProgress:e.onProgress}},e.kind,void 0,{mode:"discard"})},download:e(!0===p.multipartTransfer&&!1!==p.rangeDownload,b),abandonUpload:T}}export{U as createMediaTransferAdapter};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.defineProperty,r=(r,t,o)=>((r,t,o)=>t in r?e(r,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):r[t]=o)(r,"symbol"!=typeof t?t+"":t,o);class t extends Error{constructor(e,t,o){super(t??e,o),r(this,"code"),this.name="MediaTransferError",this.code=e}}function o(e){return e instanceof t?e.code:void 0}function n(e){if(e instanceof t){if("upload-timeout"===e.code)return"timeout";if("multipart-upload-failed"!==e.code)return;return n(e.cause)}if(!(e instanceof Error))return;const r=e;if(["ExpiredToken","ExpiredTokenException","RequestExpired","TokenRefreshRequired"].includes(r.Code??r.name))return"credentials-expired";const o=r.$metadata?.httpStatusCode;return 429===o||void 0!==o&&o>=500&&o<=599||r.message.startsWith("XHR_HTTP_HANDLER_ERROR:")||"NetworkError"===r.name?"network":void 0}export{t as MediaTransferError,o as mediaTransferErrorCodeOf,n as recoverableUploadFailure};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{MediaTransferError as e}from"./media-transfer-errors.js";const r=16777216,i=3,t=3,o=6,n=5*1024**3,a=1e4;function d(i,t){if(!Number.isSafeInteger(i)||i<0)throw new e("upload-source-invalid","媒体上传大小必须为非负安全整数字节数");const o=t&&i>r,a=o?Math.ceil(i/r):1;if(!o&&i>n)throw new e("upload-size-exceeded","单次 PUT 最多支持 5 GiB;更大对象需要显式启用并配置分片上传");if(a>1e4)throw new e("upload-size-exceeded","当前 16 MiB 分片策略最多支持 10,000 片(156.25 GiB)");return{multipart:o,partSize:r,partCount:a}}export{a as MAX_MEDIA_UPLOAD_PARTS,n as MAX_SINGLE_PUT_BYTES,t as MEDIA_DOWNLOAD_PART_CONCURRENCY,r as MEDIA_TRANSFER_PART_BYTES,o as MEDIA_TRANSFER_REQUEST_CONCURRENCY,i as MEDIA_UPLOAD_PART_CONCURRENCY,d as resolveMediaUploadPlan};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{MediaTransferError as e}from"./media-transfer-errors.js";function t(...e){for(const t of e){if("string"!=typeof t&&"number"!=typeof t)continue;const e=String(t).trim();if(""!==e)return e}return""}function n(n){if(null===n||"object"!=typeof n)throw new e("credentials-invalid","S3 上传凭证格式无效:回包不是对象");const r=n,i=t(r.access_key_id,r.accessKeyId),s=t(r.secret_key,r.secretKey,r.secretAccessKey),o=t(r.session_token,r.sessionToken).replace(/\s+/g,""),c=t(r.bucket),d=t(r.region),f=function(e){const t=e.replace(/\/+$/,"");return""===t?"":/^https?:\/\//i.test(t)?t:`https://${t}`}(t(r.dns_point,r.dnsPoint)),a=[""===i?"access_key_id":"",""===s?"secret_key":"",""===o?"session_token":"",""===c?"bucket":"",""===d?"region":"",""===f?"dns_point":""].filter(e=>""!==e);if(a.length>0)throw new e("credentials-invalid",`S3 上传凭证格式无效:缺少 ${a.join("、")}`);const u=function(e){const t=Number(e);if(Number.isFinite(t)&&!(t<=0))return t>1e12?t/1e3:t}(r.expiration??r.expiresAtSeconds),l=t(r.key_prefix,r.keyPrefix),p=t(r.identity_id,r.identityId);return{accessKeyId:i,secretAccessKey:s,sessionToken:o,bucket:c,region:d,dnsPoint:f,...void 0===u?{}:{expiresAtSeconds:u},...""===l?{}:{keyPrefix:l},...""===p?{}:{identityId:p}}}function r(t){const r=/* @__PURE__ */new Map,i=/* @__PURE__ */new Map;return{resolve(s,o){if(void 0===t)return Promise.reject(new e("credentials-provider-missing","media upload: 宿主未注入 getUploadCredentials,无法申请 S3 临时凭证"));const c=!0===o?.forceRefresh,d=c?void 0:r.get(s);if(void 0!==d&&function(e,t){if(t-e.fetchedAtMs>=36e5)return!1;const{expiresAtSeconds:n}=e.credential;return void 0===n||1e3*n-3e5>t}(d,Date.now()))return Promise.resolve(d.credential);r.delete(s);const f=i.get(s);if(void 0!==f)return f;const a=async function(i,s){let o;try{o=await t({bucket:i,forceRefresh:s})}catch(t){const n=t instanceof Error?t.message:String(t);throw new e("credentials-request-failed",`S3 上传凭证获取失败:bucket=${i};原因:${n}`,{cause:t})}const c=n(o);return r.set(i,{credential:c,fetchedAtMs:Date.now()}),c}(s,c).finally(()=>{i.get(s)===a&&i.delete(s)});return i.set(s,a),a}}}export{r as createMediaUploadCredentialStore,n as normalizeMediaUploadCredentials};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.defineProperty,t=(t,r,n)=>((t,r,n)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n)(t,"symbol"!=typeof r?r+"":r,n);class r extends Error{constructor(e,r){super(`Media upload recovery ${e}`,r),t(this,"reason"),t(this,"code"),this.reason=e,this.name="MediaUploadRecoveryError",this.code=`IM_MEDIA_UPLOAD_RECOVERY_${e.toUpperCase()}`}}function n(){throw new r("invalid")}function i(e){return"object"!=typeof e||null===e||Array.isArray(e)?n():e}function o(e,t=4096){return"string"!=typeof e||0===e.length||e.length>t?n():e}function a(e,t=0){return"number"!=typeof e||!Number.isSafeInteger(e)||e<t?n():e}function s(e){return"number"!=typeof e||!Number.isFinite(e)||e<0?n():e}function u(e,t=4096){if(void 0!==e)return"string"!=typeof e||e.length>t?n():e}function c(e){const t=i(e);if(1!==t.version||"video"!==t.kind&&"file"!==t.kind||"boolean"!=typeof t.encrypted)return n();const r=i(t.ref);if("direct"!==r.conversationType&&"group"!==r.conversationType&&"channel"!==r.conversationType)return n();const c=i(t.source),d=a(c.size,1),p=o(c.sha256,64);if(!/^[a-f0-9]{64}$/.test(p))return n();const f=i(t.resume),l=i(f.transport),y=i(l.session),v=a(y.partSize,8);if(v%8!=0||a(y.sourceBytes,1)!==d||!Array.isArray(y.parts)||y.parts.length>1e4)return n();const m=/* @__PURE__ */new Set;let b=0;const h=y.parts.map(e=>{const t=i(e),r=a(t.partNumber,1);return r>Math.ceil(d/v)||m.has(r)?n():(m.add(r),b+=Math.min(v,d-(r-1)*v),{partNumber:r,etag:o(t.etag,1024)})});if(a(f.bytesUploaded)!==b)return n();let g,A;if(t.encrypted){if(!(t.teaKey instanceof Uint8Array)||16!==t.teaKey.length)return n();g=new Uint8Array(t.teaKey)}else if(void 0!==t.teaKey)return n();if(void 0!==t.preview){const e=i(t.preview);let r;if(void 0!==e.thumbData){if(!(e.thumbData instanceof Uint8Array)||e.thumbData.byteLength>16384)return n();r=new Uint8Array(e.thumbData)}A={width:s(e.width),height:s(e.height),...void 0===e.duration?{}:{duration:s(e.duration)},...void 0===r?{}:{thumbData:r}}}if(void 0!==t.filesAlbum&&"boolean"!=typeof t.filesAlbum)return n();const w=u(c.filename),I=u(c.mimeType,256),k=u(t.caption,16384),U=u(t.refMessageId);return{version:1,ref:{conversationType:r.conversationType,conversationId:o(r.conversationId)},messageId:o(t.messageId),kind:t.kind,createdAt:a(t.createdAt),savedAt:a(t.savedAt),encrypted:t.encrypted,source:{size:d,sha256:p,...void 0===w?{}:{filename:w},...void 0===I?{}:{mimeType:I}},...void 0===g?{}:{teaKey:g},...void 0===A?{}:{preview:A},...void 0===k?{}:{caption:k},...void 0===U?{}:{refMessageId:U},...void 0===t.filesAlbum?{}:{filesAlbum:t.filesAlbum},resume:{bytesUploaded:b,transport:{logicalBucket:o(l.logicalBucket),objectName:o(l.objectName),session:{bucket:o(y.bucket),key:o(y.key),uploadId:o(y.uploadId),partSize:v,sourceBytes:d,parts:h}}}}}export{r as MediaUploadRecoveryError,c as decodeMediaUploadRecoveryRecord};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{openDB as e}from"idb";import{MediaUploadRecoveryError as t,decodeMediaUploadRecoveryRecord as a}from"./media-upload-recovery-codec.js";import{fingerprintMediaUploadSource as n}from"./media-upload-source-fingerprint.js";function r(e,a){if(!e.conversationId||!a||!["direct","group","channel"].includes(e.conversationType))throw new t("invalid");return JSON.stringify([e.conversationType,e.conversationId,a])}function o(o){const i=o.namespaceFactory.forAccount(o.accountId),c=i.name("ephemeral","media-upload-recovery","indexed-db"),s=i.name("ephemeral","media-upload-recovery","owner"),d=void 0===o.locks?globalThis.navigator?.locks:o.locks,l=o.now??Date.now;let w,u,f,v,h,y=Promise.resolve(),p=!1,m=!1,b=!1,g=0,A=0;const I=/* @__PURE__ */new Map;let k=/* @__PURE__ */new WeakMap,M=0;function x(){if(p)throw new t("unavailable")}function E(){k=/* @__PURE__ */new WeakMap,M+=1}function j(e,a){if(x(),e?.aborted)throw new DOMException("Source fingerprint cancelled","AbortError");if(a!==M)throw new t("unavailable")}function O(){return w??(w=e(c,1,{upgrade(e){e.createObjectStore("uploads")},blocking(){q()},terminated(){p=!0,E(),z()}})),w}function P(e,a=!1){try{if(x(),a&&(!m||b))throw new t("unavailable")}catch(e){return Promise.reject(e)}const n=A,r=y.then(async()=>{if(a&&(!m||n!==A))throw new t("unavailable");try{return await e()}catch(e){if(e instanceof t)throw e;throw new t("storage",{cause:e})}});return y=r.then(()=>{},()=>{}),r}function z(){m&&!b&&(b=!0,y.then(()=>{m=!1,g=0,A+=1,f?.(),f=void 0}))}function D(e){return l()-e.savedAt>=864e5}function S(e){const t=r(e.ref,e.messageId),a=Math.min(I.get(t)??e.savedAt,e.savedAt);return I.set(t,a),a}async function T(){const e=(await O()).transaction("uploads",m&&!b?"readwrite":"readonly");try{const t=await e.store.getAll(),n=[];for(const o of t){const t=a(o);S(t),D(t)?"readwrite"===e.mode&&await e.store.delete(r(t.ref,t.messageId)):n.push(t)}return await e.done,n}catch(t){try{e.abort()}catch{}throw await e.done.catch(()=>{}),t}}async function q(){return u||(p=!0,E(),u=(async()=>{await y;try{w&&(await w).close()}finally{z(),await h}})(),u)}return{get:(e,t)=>P(async()=>{const a=r(e,t);return(await T()).find(e=>r(e.ref,e.messageId)===a)}),list:()=>P(T),save:function(e){let n;try{n=a(e)}catch(e){return Promise.reject(e)}return P(async()=>{const e=(await O()).transaction("uploads","readwrite");try{const o=r(n.ref,n.messageId),i=await e.store.getAll();let c,s=0;for(const t of i){const n=a(t);S(n),D(n)?await e.store.delete(r(n.ref,n.messageId)):(s+=1,r(n.ref,n.messageId)===o&&(c=n))}if(c){if(c.source.sha256!==n.source.sha256||c.source.size!==n.source.size||c.kind!==n.kind||c.encrypted!==n.encrypted||c.teaKey?.some((e,t)=>e!==n.teaKey?.[t]))throw new t("invalid");n.savedAt=c.savedAt}else if(s>=3)throw new t("capacity");const d=I.get(o);if(void 0!==d&&(n.savedAt=Math.min(d,n.savedAt)),D(n)||n.savedAt>l())throw new t("invalid");await e.store.put(n,o),await e.done,S(n)}catch(t){try{e.abort()}catch{}throw await e.done.catch(()=>{}),t}},!0)},remove:(e,t)=>P(async()=>{const a=r(e,t);await(await O()).delete("uploads",a),I.delete(a)},!0),clear:()=>(E(),P(async()=>{await(await O()).clear("uploads"),I.clear()},!0)),drain:()=>y,fingerprint:async(e,t)=>{const a=M;j(t,a);const r=e instanceof Blob?e:void 0,o=void 0===r?void 0:k.get(r);if(void 0!==o)return{...o};const i=await n(e,t);j(t,a);const c={size:i.size,sha256:i.sha256};return void 0!==r&&k.set(r,c),{...c}},acquireLease:async function(e){if(x(),e?.aborted)throw new DOMException("Recovery lease cancelled","AbortError");if(!d||b)throw new t("unavailable");if(m||(void 0===v&&(v=new Promise((e,a)=>{try{h=d.request(s,{mode:"exclusive",ifAvailable:!0},async n=>{if(!n||p)return void a(new t("unavailable"));m=!0,A+=1;const r=new Promise(e=>{f=e});e(),await r}),h.catch(()=>a(new t("unavailable"))).finally(()=>{v=void 0,b=!1})}catch{a(new t("unavailable"))}})),await v),p||b||e?.aborted){if(0===g&&z(),e?.aborted)throw new DOMException("Recovery lease cancelled","AbortError");throw new t("unavailable")}g+=1;const a=A;let n=!1;return{release(){n||a!==A||(n=!0,g-=1,0===g&&z())}}},close:q}}export{o as createBrowserMediaUploadRecovery};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createSHA256 as e}from"hash-wasm";function r(e){if(e?.aborted)throw new DOMException("Source fingerprint cancelled","AbortError")}async function n(n,t){r(t);const a=n instanceof Uint8Array?n.byteLength:n.size,o=await e();r(t);const i=1048576;let c=performance.now();for(let e=0;e<a;e+=i){r(t);const a=n instanceof Uint8Array?n.subarray(e,e+i):new Uint8Array(await n.slice(e,e+i).arrayBuffer());r(t),o.update(a),performance.now()-c>=8&&(await new Promise(e=>setTimeout(e,0)),r(t),c=performance.now())}return r(t),{size:a,sha256:o.digest("hex")}}export{n as fingerprintMediaUploadSource};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{recoverableUploadFailure as e}from"./media-transfer-errors.js";import{MAX_MEDIA_UPLOAD_PARTS as t,MEDIA_UPLOAD_PART_CONCURRENCY as a}from"./media-transfer-policy.js";const r=async(e,t)=>{if(e?.aborted)throw new DOMException("media upload canceled","AbortError");return await t()},o="is missing ETag in UploadPart response";function n(e){if("object"!=typeof e||null===e)return!1;const t=e;return"NoSuchUpload"===t.name||"NoSuchUpload"===t.Code}function i(e,t,a){return e instanceof Uint8Array?e.subarray(t,a):e.slice(t,a)}async function s(e,t,a){return void 0===e.transformPart?t:await e.transformPart(t instanceof Blob?t:new Blob([t]),a)}function d(e,t){const a=/* @__PURE__ */new Map;let r=t,o=t;function n(){if(void 0===e.onProgress)return;let t=r;for(const e of a.values())t+=e;o=Math.max(o,t);const n=e.sourceBytes,i=n>0?Math.min(99,Math.round(o/n*100)):0;e.onProgress({percent:i,bytesTransferred:o,bytesTotal:n,phase:n>0&&o>=n?"finalizing":"transferring"})}return{trackPart(e,t){a.set(e,t),n()},completePart(e,t){a.delete(e),r+=t,n()},report:n}}function c(e,t){const a=(e,a)=>{if(void 0!==a.query?.uploadId&&void 0===a.query.partNumber)return;const r=a.query?.partNumber,o=void 0===r?0:Number(r);Number.isFinite(o)&&t.trackPart(o,e.loaded)},r=e;return r.on("xhr.upload.progress",a),()=>{r.off?.("xhr.upload.progress",a),r.removeListener?.("xhr.upload.progress",a)}}async function l(e,t,a=r){const o=d(t,0),n=c(e.handler,o);try{await a(t.signal,async()=>{const a=await s(t,t.data,1);if(t.signal?.aborted)throw new DOMException("media upload canceled","AbortError");await e.client.send(new e.commands.PutObjectCommand({Bucket:e.bucket,Key:e.key,Body:a,...void 0!==e.mimeType&&""!==e.mimeType?{ContentType:e.mimeType}:{}}),void 0===t.signal?{}:{abortSignal:t.signal})})}finally{n()}}function u(e,t,a,r){if(void 0!==e&&e.bucket===t.bucket&&e.key===t.key&&e.partSize===r&&e.sourceBytes===a&&""!==e.uploadId)return e.parts}async function p(n){const{target:l,content:p,partSize:m,queueSize:y,runUpload:f=r}=n;if(!0===p.signal?.aborted)throw new DOMException("media upload canceled","AbortError");const b=Math.max(1,Math.ceil(p.sourceBytes/m));if(b>t)throw new Error(`media upload: 分片数 ${b} 超过 S3 上限 ${t},需要放大分片大小`);const w=u(n.resume,l,p.sourceBytes,m),g=/* @__PURE__ */new Map;if(void 0!==w)for(const e of w)g.set(e.partNumber,e);let h=void 0===w?"":n.resume.uploadId;if(""===h){const e=await l.client.send(new l.commands.CreateMultipartUploadCommand({Bucket:l.bucket,Key:l.key,...void 0!==l.mimeType&&""!==l.mimeType?{ContentType:l.mimeType}:{}}));if(void 0===e.UploadId||""===e.UploadId)throw new Error("media upload: CreateMultipartUpload 未返回 UploadId");h=e.UploadId,g.clear()}const k=e=>Math.min(m,p.sourceBytes-(e-1)*m);let v=0;for(const e of g.keys())v+=k(e);const E=d(p,v),M=c(l.handler,E),U=()=>({bucket:l.bucket,key:l.key,uploadId:h,partSize:m,sourceBytes:p.sourceBytes,parts:[...g.values()].sort((e,t)=>e.partNumber-t.partNumber)});n.onResumable?.(U()),E.report();const B=new AbortController,P=()=>B.abort();p.signal?.addEventListener("abort",P,{once:!0}),p.signal?.aborted&&P();let N=1;try{let t;if(await Promise.allSettled(Array.from({length:Math.min(a,b,Math.max(1,y))},async()=>{try{await async function(){for(;;){if(B.signal.aborted)return;const e=N;if(N+=1,e>b)return;if(g.has(e))continue;const t=(e-1)*m,a=Math.min(t+m,p.sourceBytes),r=await f(B.signal,async()=>{const r=await s(p,i(p.data,t,a),e);if(B.signal.aborted)throw new DOMException("media upload canceled","AbortError");return await l.client.send(new l.commands.UploadPartCommand({Bucket:l.bucket,Key:l.key,UploadId:h,PartNumber:e,Body:r}),{abortSignal:B.signal})});if(void 0===r.ETag||""===r.ETag)throw new Error(`media upload: Part ${e} ${o}`);g.set(e,{partNumber:e,etag:r.ETag}),E.completePart(e,a-t),n.onResumable?.(U())}}()}catch(a){const r=a instanceof Error&&"AbortError"===a.name;(void 0===t||!r&&void 0!==e(t.cause)&&void 0===e(a))&&(t={cause:a}),P()}})),void 0!==t)throw t.cause;if(p.signal?.aborted)throw new DOMException("media upload canceled","AbortError");if(await l.client.send(new l.commands.CompleteMultipartUploadCommand({Bucket:l.bucket,Key:l.key,UploadId:h,MultipartUpload:{Parts:[...g.values()].sort((e,t)=>e.partNumber-t.partNumber).map(e=>({PartNumber:e.partNumber,ETag:e.etag}))}}),void 0===p.signal?{}:{abortSignal:p.signal}),n.onCompleted?.(),p.signal?.aborted)throw new DOMException("media upload canceled","AbortError")}finally{p.signal?.removeEventListener("abort",P),M()}}async function m(e,t){try{await e.client.send(new e.commands.AbortMultipartUploadCommand({Bucket:t.bucket,Key:t.key,UploadId:t.uploadId}))}catch(e){if(!n(e))throw e}}export{o as MISSING_ETAG_MESSAGE,m as abortMultipartSession,n as isNoSuchUploadError,l as putWholeObject,u as resumableParts,p as uploadInParts};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{MediaTransferError as e}from"./media-transfer-errors.js";const r=3e4;function o(r,o){r.handle=async(t,a={})=>{const n=new o({}),s=a.abortSignal,d=new AbortController;let i,l,u=!1,c=0,h=0;const m=()=>{clearTimeout(i),i=setTimeout(()=>{u=!0,d.abort()},3e4)},p=()=>d.abort(s?.reason),b=()=>{2===l?.readyState&&m()};n.on("before.xhr.send",e=>{l=e,l.addEventListener("readystatechange",b),m()}),n.on("xhr.upload.progress",e=>{e.loaded>c&&(c=e.loaded,m()),r.emit("xhr.upload.progress",e,t)}),n.on("xhr.progress",e=>{e.loaded>h&&(h=e.loaded,m()),r.emit("xhr.progress",e,t)}),s?.addEventListener("abort",p,{once:!0}),s?.aborted&&p();try{const r=await n.handle(t,{...a,abortSignal:d.signal,requestTimeout:0});if(u)throw new e("upload-timeout");if(d.signal.aborted)throw new DOMException("Request aborted","AbortError");if(0===r.response.statusCode)throw new Error("XHR_HTTP_HANDLER_ERROR: Network request failed before receiving an HTTP response");return r}catch(r){if(u)throw new e("upload-timeout","media upload: 网络连续 30 秒没有推进",{cause:r});throw r}finally{clearTimeout(i),s?.removeEventListener("abort",p),l?.removeEventListener("readystatechange",b),n.removeAllListeners(),n.destroy()}}}export{r as MEDIA_UPLOAD_IDLE_TIMEOUT_MS,o as installUploadIdleTimeout};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(e,t={}){const o=void 0!==t.locks?t.locks:globalThis.navigator?.locks,n=void 0!==t.createChannel?t.createChannel:"function"==typeof globalThis.BroadcastChannel?e=>new BroadcastChannel(e):void 0,r="function"==typeof globalThis.addEventListener?globalThis:void 0,s=void 0!==t.pageLifecycleTarget?t.pageLifecycleTarget:r;let a,c=0;function i(t){try{e.onError(t)}catch{}}function l(t,o=!1,n="stopped"){if(a!==t||o||(a=void 0),t.resolveReady(!1),t.closed)return;t.closed=!0,t.controller.abort();const r=[],s=e=>{try{e()}catch(e){r.push(e)}};for(const e of t.cleanups.splice(0))s(e);s(()=>t.channel.close());const c=t.release;t.release=void 0;const l=t.owned;t.owned=!1;try{const t=l?e.onChange(!1,n):void 0;Promise.resolve(t).then(()=>c?.(),i)}catch(e){i(e)}for(const e of r)i(e)}function d(e,t){l(e,!0),i(t)}return{start(t){if(a?.key===t)return a.ready;const r=++c;if(a&&l(a),r!==c)return Promise.resolve(!1);if(!t||!o||!n)return i(new Error("Browser connection ownership requires a key, Web Locks and BroadcastChannel")),Promise.resolve(!1);let p,u;try{p=n(`im-connection:${t}`)}catch(e){return i(e),Promise.resolve(!1)}const h=new Promise(e=>{u=e}),y={key:t,channel:p,cleanups:[],owned:!1,closed:!1,ready:h,resolveReady:u,controller:new AbortController,claim:{startedAt:Date.now(),id:globalThis.crypto.randomUUID()}};a=y;const v=e=>{if(a!==y||y.closed||"object"!=typeof e.data||null===e.data)return;const t=e.data;if("session-ended"===t.type)l(y);else if("takeover"===t.type&&"number"==typeof t.startedAt&&Number.isFinite(t.startedAt)&&"string"==typeof t.id&&t.id!==y.claim.id){t.startedAt>y.claim.startedAt||t.startedAt===y.claim.startedAt&&t.id>y.claim.id?l(y,!0,"replaced"):p.postMessage({type:"takeover",...y.claim})}},f=e=>{a===y&&!0===e.persisted&&l(y)};try{s&&(y.cleanups.push(()=>s.removeEventListener("pagehide",f)),s.addEventListener("pagehide",f)),y.cleanups.push(()=>p.removeEventListener("message",v)),p.addEventListener("message",v);const n=setTimeout(()=>d(y,new Error("Browser IM takeover timed out while waiting for the previous page to close")),15e3);y.cleanups.push(()=>clearTimeout(n));o.request(`im-connection:${t}`,{mode:"exclusive",signal:y.controller.signal},async t=>{if(a!==y||y.closed||!t)return void y.resolveReady(!1);const o=new Promise(e=>{y.release=e});y.owned=!0,clearTimeout(n);try{await e.onChange(!0)}catch(e){d(y,e)}y.resolveReady(a===y&&y.owned),await o}).catch(e=>{a!==y||y.closed||d(y,e)}),p.postMessage({type:"takeover",...y.claim})}catch(e){d(y,e)}return y.ready},stop(){c++,a&&l(a)},terminate(){c++;const e=a;if(e)try{e.closed||e.channel.postMessage({type:"session-ended"})}catch(e){i(e)}finally{l(e)}},get owned(){return a?.owned??!1}}}export{e as createBrowserConnectionOwnership};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(e,n={}){const i=void 0!==n.target?n.target:function(){const e=globalThis;return"function"==typeof e.addEventListener&&"function"==typeof e.removeEventListener?e:void 0}(),t=void 0!==n.visibilitySource?n.visibilitySource:globalThis.document,l=void 0!==n.pageLifecycleSource?n.pageLifecycleSource:i;let o=!1;const r=()=>e.onOnline?.(),s=()=>e.onOffline?.(),v=()=>{null!=t&&"visible"===t.visibilityState?e.onVisible?.():null!=t&&e.onHidden?.()},d=()=>e.onPageHide?.(),u=()=>e.onPageShow?.();return{start(){o||(o=!0,null!=t&&"visible"!==t.visibilityState&&e.onHidden?.(),null!=i&&(void 0!==e.onOnline&&i.addEventListener("online",r),void 0!==e.onOffline&&i.addEventListener("offline",s)),null!=t&&t.addEventListener("visibilitychange",v),null!=l&&(l.addEventListener("pagehide",d),l.addEventListener("pageshow",u)))},stop(){o&&(o=!1,null!=i&&(i.removeEventListener("online",r),i.removeEventListener("offline",s)),null!=t&&t.removeEventListener("visibilitychange",v),null!=l&&(l.removeEventListener("pagehide",d),l.removeEventListener("pageshow",u)))},supportsLifecycle:null!=t||null!=l,get running(){return o}}}export{e as createNetworkMonitor};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(){const e=globalThis.scheduler;return"function"==typeof e?.yield?e.yield():new Promise(e=>setTimeout(e,0))}export{e as yieldToBrowser};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{openDB as e,deleteDB as t}from"idb";import{encodeConversationKey as a,conversationRefFromPinnedMessage as n,conversationRefFromSession as o,conversationRefFromMessage as s}from"../../../im-core/src/conversation-identity.js";import{createImTextSearchMatcher as r,extractSearchText as i}from"../../../im-core/src/mapping/search-text.js";import{normalizeStoredMessageContent as c}from"../../../im-core/src/mapping/stored-message.js";import{computeMessageSortKey as d}from"../../../im-core/src/mapping/sort.js";import{isStaleMiniProgramShowTypeProjection as l}from"../../../im-core/src/mapping/mini-program-body.js";import{channelSyncCheckpointKey as y}from"../../../im-core/src/sync/channel-sync-checkpoint.js";const u=1073741824,g="channel:list-version",v="schema:conversation-key-v1",m="schema:message-server-order-v1",w="schema:mini-program-game-preview-v1",f="im:membership-reset-sort-keys",p="default",b="";function h(e){if(void 0!==e&&/^\d+$/.test(e))return e.replace(/^0+(?=\d)/,"")}function S(e,t){const a=h(e),n=h(t);return void 0===a?void 0===n?0:-1:void 0===n?1:a.length!==n.length?a.length>n.length?1:-1:a===n?0:a>n?1:-1}function j(e){return`conversation:${a(e)}`}function k(e,t){return`${a(e)}\0${t}`}function M(e){const{key:t,conversationKey:a,...n}=e;return{...n,conversation:{...n.conversation},sContent:n.sContent.slice()}}function A(e,t){return JSON.stringify([a(e),t])}function I(e){const t=s(e);return{...e,messageKey:A(t,e.id),conversationKey:a(t)}}function C(e){const{messageKey:t,conversationKey:a,...n}=e;return n}function P(e){return{...e,id:a(o(e)),conversationId:e.id}}function K(e){if(void 0===e.conversationId)return e;const{conversationId:t,...a}=e;return{...a,id:t}}function x(e){return void 0===e.conversationType?e:{...e,conversationId:a(e),storageConversationId:e.conversationId}}function _(e){if(void 0===e.storageConversationId)return e;const{storageConversationId:t,...a}=e;return{...a,conversationId:t}}function B(e){return{...e,conversationId:a(n(e)),storageConversationId:e.conversationId}}function R(e){if(void 0===e.storageConversationId)return e;const{storageConversationId:t,...a}=e;return{...a,conversationId:t}}function N(e){const{conversationKey:t,...a}=e;return a}function T(e,t){if(new Set(t.map(e=>e.conversationType)).size>1)throw new Error(`裸 conversationId 存在多类型歧义:${e}`)}function O(e){return`${e.kind}:${encodeURIComponent(e.messageId)}:${e.resourceVersion}`}async function D(e,t){const a=e.done;a.catch(()=>{});try{const e=await t();return await a,e}catch(t){try{e.abort()}catch{}throw await a.catch(()=>{}),t}}async function L(e,a){const n=a.namespaceFactory.forAccount(e).name("durable","storage","indexed-db");"undefined"!=typeof indexedDB&&await t(n)}function H(t){const{namespaceFactory:h}=t;let L=null,H=null,E=0,V=Promise.resolve(),$=Promise.resolve(),F=0;const z=t.mediaAssetCache?.maxPendingWriteBytes??268435456;if(!Number.isSafeInteger(z)||z<=0)throw new RangeError("媒体资产缓存待写内存预算必须是正整数");function G(){if(null===L)throw new Error("ImStoragePort 未 open:请先 open({ namespace }) 再读写");return L}function U(e){const t=E,a=H,n=()=>{if(t!==E||a!==H)throw new Error("最近历史缓存操作已失效:账号或存储已改变");G()},o=V.then(async()=>{n();const t=await e();return n(),t});return V=o.then(()=>{},()=>{}),o}function q(e,t){return 2!==e.version||!Number.isFinite(e.fetchedAt)||e.fetchedAt<0||t-e.fetchedAt>=864e5}function J(e){const t=$.then(e,e);return $=t.then(()=>{},()=>{}),t}function Q(e,t){if(e!==E||null===t||t!==H)throw new Error("媒体资产缓存账号代际已失效")}function W(){return Math.max(0,Math.floor(t.mediaAssetCache?.now?.()??Date.now()))}function Y(e,a){const n=t.mediaAssetCache?.strategies.resolve(e.kind)?.maxIdleMs;return void 0!==n&&(!Number.isSafeInteger(e.lastAccessedAt)||e.lastAccessedAt<0||a-e.lastAccessedAt>=n)}async function X(e,t){Q(e,t);const a=await G().getAll("mediaAssetMeta");Q(e,t);const n=W(),o=a.filter(e=>Y(e,n));await ee(o.map(e=>e.key),e,t),Q(e,t);const s=new Set(o.map(e=>e.key));return a.filter(e=>!s.has(e.key))}async function Z(e){const a=t.mediaAssetCache?.estimateStorage??(async()=>"undefined"==typeof navigator||void 0===navigator.storage?.estimate?{}:await navigator.storage.estimate());try{const{quota:t,usage:n}=await a();if(void 0===t||!Number.isFinite(t)||t<=0)return u;const o=e.reduce((e,t)=>e+t.byteLength,0),s=Math.max(0,(n??0)-o),r=Math.max(536870912,Math.floor(.2*t));return Math.max(0,Math.min(2147483648,Math.floor(t-s-r)))}catch{return u}}async function ee(e,t,a){if(0===e.length)return;Q(t,a);const n=G().transaction(["mediaAssets","mediaAssetMeta"],"readwrite");await Promise.all(e.flatMap(e=>[n.objectStore("mediaAssets").delete(e),n.objectStore("mediaAssetMeta").delete(e)])),await n.done}async function te(e,a,n,o){Q(e,a);const s=G(),r=t.mediaAssetCache?.strategies;if(void 0===r)return;const i=o??await s.getAll("mediaAssetMeta");Q(e,a);const c=/* @__PURE__ */new Set;for(const e of r.list()){const t=i.filter(t=>t.kind===e.kind).sort((e,t)=>e.lastAccessedAt-t.lastAccessedAt);let a=t.reduce((e,t)=>e+t.byteLength,0),n=t.length;for(const o of t){if(a<=e.softMaxBytes&&n<=e.maxEntries)break;c.add(o.key),a-=o.byteLength,n-=1}}const d=i.filter(e=>!c.has(e.key)).sort((e,t)=>e.lastAccessedAt-t.lastAccessedAt),l=Math.max(0,Math.min(await Z(i),n??Number.POSITIVE_INFINITY));let y=d.reduce((e,t)=>e+t.byteLength,0);for(const e of d){if(y<=l)break;c.add(e.key),y-=e.byteLength}await ee([...c],e,a)}return{supportsChannelSyncCheckpoint:!0,recentHistoryCache:{get:e=>U(async()=>{const t=a(e),n=G().transaction("recentHistoryPages","readwrite");return D(n,async()=>{const e=await n.store.get(t);if(void 0===e)return null;if(q(e,Date.now()))return await n.store.delete(t),null;const{conversationKey:a,...o}=e;return o})}),async put(e){const t=structuredClone(e);return U(()=>async function(e){if(!Number.isSafeInteger(e.byteLength)||e.byteLength<0)throw new Error("最近历史缓存 byteLength 必须是非负安全整数");const t=Date.now();if(e.byteLength>2097152||q(e,t))return!1;const n=a(e.conversation),o=G().transaction("recentHistoryPages","readwrite");return D(o,async()=>{const a=await o.store.getAll(),s=[];for(const e of a)q(e,t)?await o.store.delete(e.conversationKey):e.conversationKey!==n&&s.push(e);const r={...e,conversationKey:n};s.push(r),s.sort((e,t)=>e.fetchedAt-t.fetchedAt||e.conversationKey.localeCompare(t.conversationKey));let i=s.reduce((e,t)=>e+t.byteLength,0);const c=[];for(;s.length>20||i>8388608;){const e=s.shift();c.push(e),i-=e.byteLength}if(c.includes(r))return!1;await o.store.put(r);for(const e of c)await o.store.delete(e.conversationKey);return!0})}(t))},delete:e=>U(async()=>{await G().delete("recentHistoryPages",a(e))}),clear:()=>U(async()=>{await G().clear("recentHistoryPages")})},async open({namespace:t}){if(null!==L&&H===t)return;null!==L&&(L.close(),L=null),H=t;const n=++E,o=h.forAccount(t).name("durable","storage","indexed-db");let r;const i=await e(o,16,{upgrade(e,t,a,n){if(e.objectStoreNames.contains("messages"))n.objectStore("messages").indexNames.contains("by_conversation_key_sort")||n.objectStore("messages").createIndex("by_conversation_key_sort",["conversationKey","sortKey"]);else{const t=e.createObjectStore("messages",{keyPath:"messageKey"});t.createIndex("by_conv_sort",["conversationId","sortKey"]),t.createIndex("by_conversation_key_sort",["conversationKey","sortKey"])}if(e.objectStoreNames.contains("sessions")||e.createObjectStore("sessions",{keyPath:"id"}),e.objectStoreNames.contains("readStates")||e.createObjectStore("readStates",{keyPath:"conversationId"}),e.objectStoreNames.contains("drafts")||e.createObjectStore("drafts",{keyPath:"conversationKey"}),e.objectStoreNames.contains("outbox")||e.createObjectStore("outbox",{keyPath:"id"}),e.objectStoreNames.contains("meta")||e.createObjectStore("meta",{keyPath:"key"}),e.objectStoreNames.contains("userProfiles")||e.createObjectStore("userProfiles",{keyPath:"id"}),e.objectStoreNames.contains("groupMembers")||e.createObjectStore("groupMembers",{keyPath:"groupId"}),e.objectStoreNames.contains("groupProfiles")||e.createObjectStore("groupProfiles",{keyPath:"id"}),e.objectStoreNames.contains("pinnedMessages")||e.createObjectStore("pinnedMessages",{keyPath:"conversationId"}),e.objectStoreNames.contains("channelProfiles")||e.createObjectStore("channelProfiles",{keyPath:"id"}),e.objectStoreNames.contains("channelMembers")||e.createObjectStore("channelMembers",{keyPath:["channelId","userId"]}),e.objectStoreNames.contains("channelMemberSnapshots")||e.createObjectStore("channelMemberSnapshots",{keyPath:"channelId"}),e.objectStoreNames.contains("channelMentionCandidateSnapshots")||e.createObjectStore("channelMentionCandidateSnapshots",{keyPath:"channelId"}),e.objectStoreNames.contains("conversationBackgrounds")||e.createObjectStore("conversationBackgrounds",{keyPath:"key"}),e.objectStoreNames.contains("mediaAssets")||e.createObjectStore("mediaAssets",{keyPath:"key"}),!e.objectStoreNames.contains("mediaAssetMeta")){const t=e.createObjectStore("mediaAssetMeta",{keyPath:"key"});t.createIndex("by_kind_access",["kind","lastAccessedAt"]),t.createIndex("by_access","lastAccessedAt")}if(!e.objectStoreNames.contains("decryptRecoveries")){e.createObjectStore("decryptRecoveries",{keyPath:"key"}).createIndex("by_conversation","conversationKey")}if(t>0&&t<13&&(n.objectStore("mediaAssets").clear(),n.objectStore("mediaAssetMeta").clear()),e.objectStoreNames.contains("recentHistoryPages")||e.createObjectStore("recentHistoryPages",{keyPath:"conversationKey"}),t>0&&t<16&&"messageKey"!==n.objectStore("messages").keyPath){(async()=>{const t=await n.objectStore("messages").getAll();for(const e of t)e.messageKey=A(s(e),e.id);e.deleteObjectStore("messages");const a=e.createObjectStore("messages",{keyPath:"messageKey"});a.createIndex("by_conv_sort",["conversationId","sortKey"]),a.createIndex("by_conversation_key_sort",["conversationKey","sortKey"]);for(let e=0;e<t.length;e+=128){const n=t.slice(e,e+128);await Promise.all(n.map(async e=>a.put(e)))}})().catch(e=>{r=e,n.done.catch(()=>{});try{n.abort()}catch{}})}}}).catch(e=>{throw r??e});if(n===E){try{await async function(e){const t=e.transaction(["messages","sessions","readStates","pinnedMessages","meta"],"readwrite");try{const e=t.objectStore("meta");if(!0===(await e.get(v))?.value)return void await t.done;const a=t.objectStore("messages");for(const e of await a.getAll())void 0===e.conversationKey&&await a.put(I(e));const n=t.objectStore("sessions"),o=/* @__PURE__ */new Map;for(const e of await n.getAll()){if(void 0!==e.conversationId)continue;const t=K(e);o.set(t.id,t.type),await n.put(P(t)),await n.delete(e.id)}const s=t.objectStore("readStates");for(const e of await s.getAll()){if(void 0!==e.storageConversationId)continue;const t=e.conversationType??o.get(e.conversationId);if(void 0===t)continue;const a={...e,conversationType:t};await s.put(x(a)),await s.delete(e.conversationId)}const r=t.objectStore("pinnedMessages");for(const e of await r.getAll()){if(void 0!==e.storageConversationId)continue;const t=R(e);await r.put(B(t)),await r.delete(e.conversationId)}await e.put({key:v,value:!0}),await t.done}catch(e){try{t.abort()}catch{}try{await t.done}catch{}throw e}}(i),await async function(e){const t=e.transaction(["messages","readStates","meta"],"readwrite");try{const e=t.objectStore("meta");if(!0===(await e.get(m))?.value)return void await t.done;const n=t.objectStore("readStates"),o=await n.getAll(),r=/* @__PURE__ */new Map;for(const e of o){const t=_(e);"channel"===t.conversationType&&void 0!==t.readCursorSortKey&&""!==t.readCursor&&r.set(a(t),{cursor:t.readCursor})}const i=/* @__PURE__ */new Map,c=t.objectStore("messages");let l=await c.openCursor();for(;null!==l;){const e=l.value,t=a(s(e)),n=d(e),o=r.get(t);if(void 0!==o&&e.extensions?.historyCursor===o.cursor&&(o.sortKey=n),n!==e.sortKey){let a=i.get(t);void 0===a&&(a=/* @__PURE__ */new Map,i.set(t,a)),a.set(e.sortKey,n),await l.update({...e,sortKey:n})}l=await l.continue()}for(const e of o){const t=_(e);if(void 0===t.conversationType)continue;const o=a(t);let d=r.get(o)?.sortKey??(void 0===t.readCursorSortKey?void 0:i.get(o)?.get(t.readCursorSortKey));if(void 0===d&&void 0!==t.readCursorSortKey&&"channel"!==t.conversationType&&""!==t.readCursor){const e=await c.get(A(t,t.readCursor));void 0!==e&&a(s(e))===o&&(d=e.sortKey)}void 0!==d&&d!==t.readCursorSortKey&&await n.put({...e,readCursorSortKey:d})}const y=await e.get(f);if(Array.isArray(y?.value)){let t=!1;const a=y.value.map(e=>{if(!Array.isArray(e)||2!==e.length||"string"!=typeof e[0]||"string"!=typeof e[1])return e;const a=i.get(e[0])?.get(e[1]);return void 0===a?e:(t=!0,[e[0],a])});t&&await e.put({key:f,value:a})}await e.put({key:m,value:!0}),await t.done}catch(e){try{t.abort()}catch{}try{await t.done}catch{}throw e}}(i),await async function(e){const t=e.transaction(["messages","meta"],"readwrite");try{const e=t.objectStore("meta");if(!0===(await e.get(w))?.value)return void await t.done;const a=t.objectStore("messages");let n=await a.openCursor();for(;null!==n;){const e=n.value.body?.miniProgram;"miniProgram"===n.value.contentType&&void 0!==e&&l(e)&&await n.delete(),n=await n.continue()}await e.put({key:w,value:!0}),await t.done}catch(e){try{t.abort()}catch{}try{await t.done}catch{}throw e}}(i)}catch(e){throw i.close(),e}if(n===E){L=i;try{await J(()=>X(n,t))}catch(e){if(i.close(),n!==E)return;throw L===i&&(L=null),e}}else i.close()}else i.close()},async close(){const e=$;E+=1,H=null,null!==L&&(L.close(),L=null),await e},clearRebuildableCaches:async()=>U(async()=>{const e=E,t=H;await J(async()=>{Q(e,t);const a=G().transaction(["userProfiles","groupMembers","groupProfiles","channelProfiles","channelMembers","channelMemberSnapshots","channelMentionCandidateSnapshots","mediaAssets","mediaAssetMeta","meta","recentHistoryPages"],"readwrite");await Promise.all([a.objectStore("userProfiles").clear(),a.objectStore("groupMembers").clear(),a.objectStore("groupProfiles").clear(),a.objectStore("channelProfiles").clear(),a.objectStore("channelMembers").clear(),a.objectStore("channelMemberSnapshots").clear(),a.objectStore("channelMentionCandidateSnapshots").clear(),a.objectStore("mediaAssets").clear(),a.objectStore("mediaAssetMeta").clear(),a.objectStore("meta").delete(g),a.objectStore("recentHistoryPages").clear(),a.done])})}),async hasMany(e){const a=E,n=H,o=e.map(e=>({...e}));return await J(async()=>{if(Q(a,n),0===o.length)return Object.freeze([]);const e=G().transaction(["mediaAssets","mediaAssetMeta"],"readonly"),s=W(),r=await D(e,async()=>{const a=/* @__PURE__ */new Map;return await Promise.all(o.map(n=>{if(void 0===t.mediaAssetCache?.strategies.resolve(n.kind))return!1;const o=O(n);let r=a.get(o);return void 0===r&&(r=Promise.all([e.objectStore("mediaAssets").getKey(o),e.objectStore("mediaAssetMeta").get(o)]).then(([e,t])=>void 0!==e&&void 0!==t&&t.kind===n.kind&&t.messageId===n.messageId&&t.resourceVersion===n.resourceVersion&&Number.isSafeInteger(t.byteLength)&&t.byteLength>0&&!Y(t,s)),a.set(o,r)),r}))});return Q(a,n),Object.freeze(r)})},async get(e){const a=E,n=H;return await J(async()=>{if(Q(a,n),void 0===t.mediaAssetCache?.strategies.resolve(e.kind))return null;const o=O(e),s=G(),[r,i]=await Promise.all([s.get("mediaAssets",o),s.get("mediaAssetMeta",o)]);Q(a,n);const c=W();return void 0===r||void 0===i||Y(i,c)?(await ee([o],a,n),null):(await s.put("mediaAssetMeta",{...i,lastAccessedAt:c}),Q(a,n),{kind:i.kind,messageId:i.messageId,resourceVersion:i.resourceVersion,blob:r.blob,...void 0===i.mimeType?{}:{mimeType:i.mimeType}})})},async put(e){const a=E,n=H;Q(a,n);const o=e.blob.size;if(o>z||F+o>z)return"skipped";F+=o;try{return await J(()=>async function(e,a,n){Q(a,n);const o=t.mediaAssetCache?.strategies.resolve(e.kind);if(void 0===o)return"skipped";const s=e.blob,r=s.size,i=await X(a,n),c=await Z(i);if(Q(a,n),0===r||r>o.maxEntryBytes||c<=0||r>Math.floor(c/2))return"skipped";const d=O(e),l=W(),y=i.find(e=>e.key===d),u={key:d,kind:e.kind,messageId:e.messageId,resourceVersion:e.resourceVersion,byteLength:r,...void 0===e.mimeType?{}:{mimeType:e.mimeType},createdAt:y?.createdAt??l,lastAccessedAt:l},g=async()=>{Q(a,n);const e=G().transaction(["mediaAssets","mediaAssetMeta"],"readwrite");await Promise.all([e.objectStore("mediaAssets").put({key:d,blob:s}),e.objectStore("mediaAssetMeta").put(u)]),await e.done};let v=!1;try{await g()}catch(e){if(!(e instanceof DOMException)||"QuotaExceededError"!==e.name)throw e;v=!0,await te(a,n,Math.max(0,c-r)),await g()}const m=void 0===y?[...i,u]:i.map(e=>e.key===d?u:e);return await te(a,n,void 0,v?void 0:m),Q(a,n),void 0===await G().get("mediaAssets",d)?"skipped":"stored"}(e,a,n))}finally{F=Math.max(0,F-o)}},async clear(){const e=E,t=H;await J(async()=>{Q(e,t);const a=G().transaction(["mediaAssets","mediaAssetMeta"],"readwrite");await Promise.all([a.objectStore("mediaAssets").clear(),a.objectStore("mediaAssetMeta").clear(),a.done])})},async prune(){const e=E,t=H;await J(()=>X(e,t))},async getMessage(e,t){const n=await G().get("messages",A(e,t));if(void 0===n)return null;const o=C(n);return a(s(o))===a(e)?o:null},async getMessages(e,t){const n="string"==typeof e?"by_conv_sort":"by_conversation_key_sort",o="string"==typeof e?e:a(e);if(await async function(e){if("string"!=typeof e)return;const t=IDBKeyRange.bound([e,""],[e,b]);T(e,(await G().transaction("messages").store.index("by_conv_sort").getAll(t)).map(C))}(e),void 0===t.beforeSortKey&&void 0!==t.afterSortKey){const e=IDBKeyRange.bound([o,t.afterSortKey],[o,b]),a=[];let s=await G().transaction("messages").store.index(n).openCursor(e,"next");for(;null!==s&&a.length<t.limit;)a.push(s.value),s=await s.continue();return a.map(C)}const s=void 0===t.beforeSortKey?IDBKeyRange.bound([o,""],[o,b]):IDBKeyRange.bound([o,""],[o,t.beforeSortKey],!1,!0),r=[];let i=await G().transaction("messages").store.index(n).openCursor(s,"prev");for(;null!==i&&r.length<t.limit;)r.push(i.value),i=await i.continue();return r.reverse().map(C)},async saveMessages(e){if(0===e.length)return;const t=G().transaction("messages","readwrite");await Promise.all([...e.map(e=>t.store.put(I(e))),t.done])},async searchMessages(e,t){const n=a(e),o=t.keyword?.trim()??"",s=t.contentTypes;if(""===o&&(void 0===s||0===s.length))return{items:[],exhausted:!0};const d=""===o?void 0:await r(o),l=void 0===t.beforeSortKey?IDBKeyRange.bound([n,""],[n,b]):IDBKeyRange.bound([n,""],[n,t.beforeSortKey],!1,!0),y=[];let u,g=0,v=await G().transaction("messages").store.index("by_conversation_key_sort").openCursor(l,"prev");for(;null!==v&&y.length<t.limit&&g<2e3;){const e=c(C(v.value));g+=1,u=e.sortKey;const t=void 0===s||s.includes(e.contentType),a=void 0===d||null!==d.match(i(e));t&&a&&y.push(e),v=await v.continue()}const m=null===v;return{items:y,exhausted:m,...m?{}:{nextBeforeSortKey:u}}},async getDecryptRecoveries(e){const t=a(e);return(await G().getAllFromIndex("decryptRecoveries","by_conversation",t)).map(M)},async saveDecryptRecovery(e){if(0===e.sContent.byteLength||e.sContent.byteLength>65536)throw new Error(`解密恢复密文字节长度非法:${e.sContent.byteLength}`);await G().put("decryptRecoveries",function(e){const t=a(e.conversation);return{...e,key:k(e.conversation,e.messageId),conversationKey:t,conversation:{...e.conversation},sContent:e.sContent.slice()}}(e))},async deleteDecryptRecovery(e,t){await G().delete("decryptRecoveries",k(e,t))},async deleteConversationDecryptRecoveries(e){const t=a(e),n=G().transaction("decryptRecoveries","readwrite");let o=await n.store.index("by_conversation").openCursor(IDBKeyRange.only(t));for(;null!==o;)await o.delete(),o=await o.continue();await n.done},getSessions:async()=>(await G().getAll("sessions")).map(K),async saveSessions(e){if(0===e.length)return;const t=G().transaction("sessions","readwrite");for(const a of e)await t.store.put(P(a)),await t.store.delete(a.id);await t.done},async deleteSession(e){if("string"!=typeof e){const t=G().transaction(["sessions","conversationBackgrounds"],"readwrite");return await t.objectStore("sessions").delete(a(e)),await t.objectStore("conversationBackgrounds").delete(j(e)),void await t.done}const t=(await G().getAll("sessions")).map(K).filter(t=>t.id===e);T(e,t.map(e=>({conversationType:e.type})));const n=G().transaction(["sessions","conversationBackgrounds"],"readwrite");if(void 0!==t[0]){const e=o(t[0]);await n.objectStore("sessions").delete(a(e)),await n.objectStore("conversationBackgrounds").delete(j(e))}await n.objectStore("sessions").delete(e),await n.done},async deleteReadState(e){if("string"!=typeof e)return void await G().delete("readStates",a(e));const t=(await G().getAll("readStates")).map(_).filter(t=>t.conversationId===e).filter(e=>void 0!==e.conversationType);T(e,t),void 0!==t[0]&&await G().delete("readStates",a(t[0])),await G().delete("readStates",e)},deleteMessage:async(e,t,n)=>U(async()=>{if(void 0!==n&&(n.id!==e.conversationId||n.type!==e.conversationType))throw new Error("删除后的会话摘要必须匹配目标会话");const o=G().transaction(["messages","sessions","decryptRecoveries","recentHistoryPages"],"readwrite");return D(o,async()=>{const s=o.objectStore("messages"),r=A(e,t),i=await s.get(r);if(void 0!==i){const t=C(i);if(t.conversationType!==e.conversationType||t.conversationId!==e.conversationId)return!1;await s.delete(r)}return await o.objectStore("decryptRecoveries").delete(k(e,t)),await o.objectStore("recentHistoryPages").delete(a(e)),void 0!==n&&await o.objectStore("sessions").put(P(n)),void 0!==i})}),deleteConversationMessages:async e=>U(async()=>{const t="string"==typeof(n=e)?n:n.conversationId;var n;const o="string"==typeof e?"by_conv_sort":"by_conversation_key_sort",s="string"==typeof e?e:a(e),r=IDBKeyRange.bound([s,""],[s,b]),i=G().transaction(["messages","decryptRecoveries","recentHistoryPages","meta"],"readwrite");return D(i,async()=>{const n=i.objectStore("messages"),s=i.objectStore("decryptRecoveries");let c=[],d=[];if("string"==typeof e){const a=(await n.index("by_conv_sort").getAll(r)).map(C);c=(await s.getAll()).filter(t=>t.conversation.conversationId===e),d=(await i.objectStore("recentHistoryPages").getAll()).filter(e=>e.conversation.conversationId===t);const o=await i.objectStore("meta").get(y({conversationType:"channel",conversationId:t}));T(t,[...void 0===o?[]:[{conversationType:"channel"}],...a,...d.map(e=>({conversationType:e.conversation.conversationType})),...c.map(e=>({conversationType:e.conversation.conversationType}))])}await i.objectStore("meta").delete(y("string"==typeof e?{conversationType:"channel",conversationId:t}:e));let l=await n.index(o).openCursor(r);for(;null!==l;)await l.delete(),l=await l.continue();if("string"==typeof e){for(const e of c)await s.delete(e.key);for(const e of d)await i.objectStore("recentHistoryPages").delete(e.conversationKey)}else{await i.objectStore("recentHistoryPages").delete(a(e));let t=await s.index("by_conversation").openCursor(IDBKeyRange.only(a(e)));for(;null!==t;)await t.delete(),t=await t.continue()}})}),clearConversationHistory:async(e,t,n)=>U(async()=>{const o=a(e),s=IDBKeyRange.bound([o,""],[o,b]),r=G().transaction(["messages","sessions","readStates","decryptRecoveries","recentHistoryPages","meta"],"readwrite");return D(r,async()=>{await r.objectStore("meta").delete(y(e)),await r.objectStore("recentHistoryPages").delete(o);let a=await r.objectStore("messages").index("by_conversation_key_sort").openCursor(s);for(;null!==a;)await a.delete(),a=await a.continue();let i=await r.objectStore("decryptRecoveries").index("by_conversation").openCursor(IDBKeyRange.only(o));for(;null!==i;)await i.delete(),i=await i.continue();void 0!==t&&await r.objectStore("sessions").put(P(t)),void 0!==n&&(await r.objectStore("readStates").put(x(n)),await r.objectStore("readStates").delete(n.conversationId))})}),getReadStates:async()=>(await G().getAll("readStates")).map(_),async saveReadState(e){const t=G().transaction("readStates","readwrite");await t.store.put(x(e)),void 0!==e.conversationType&&await t.store.delete(e.conversationId),await t.done},getDrafts:async()=>(await G().getAll("drafts")).map(N),async saveDraft(e){await G().put("drafts",function(e){return{...e,conversationKey:a(e.ref)}}(e))},async deleteDraft(e){await G().delete("drafts",a(e))},getConversationBackground:async e=>(await G().get("conversationBackgrounds",j(e)))?.background??null,async saveConversationBackground(e,t){const a=j(e);await G().put("conversationBackgrounds",{key:a,background:t})},async deleteConversationBackground(e){await G().delete("conversationBackgrounds",j(e))},getDefaultConversationBackground:async()=>(await G().get("conversationBackgrounds",p))?.background??null,async saveDefaultConversationBackground(e){await G().put("conversationBackgrounds",{key:p,background:e})},async deleteDefaultConversationBackground(){await G().delete("conversationBackgrounds",p)},getOutbox:async()=>G().getAll("outbox"),async saveOutboxMessage(e){await G().put("outbox",e)},async removeOutboxMessage(e){await G().delete("outbox",e)},getPinnedMessages:async()=>(await G().getAll("pinnedMessages")).map(R),async savePinnedMessage(e){const t=G().transaction("pinnedMessages","readwrite");await t.store.put(B(e)),await t.store.delete(e.conversationId),await t.done},async removePinnedMessage(e){if("string"!=typeof e)return void await G().delete("pinnedMessages",a(e));const t=(await G().getAll("pinnedMessages")).map(R).filter(t=>t.conversationId===e);T(e,t),void 0!==t[0]&&await G().delete("pinnedMessages",a(n(t[0]))),await G().delete("pinnedMessages",e)},async getMeta(e){const t=await G().get("meta",e);return void 0===t?null:t.value},async setMeta(e,t){await G().put("meta",{key:e,value:t})},getUserProfile:async e=>await G().get("userProfiles",e)??null,async saveUserProfile(e){await G().put("userProfiles",e)},getGroupMembers:async e=>await G().get("groupMembers",e)??null,async saveGroupMembers(e){await G().put("groupMembers",e)},getGroupProfile:async e=>await G().get("groupProfiles",e)??null,async saveGroupProfile(e){await G().put("groupProfiles",e)},getChannelProfile:async e=>await G().get("channelProfiles",e)??null,getChannelProfiles:async()=>G().getAll("channelProfiles"),async saveChannelProfiles(e){if(0===e.length)return;const t=G().transaction("channelProfiles","readwrite");await Promise.all([...e.map(e=>t.store.put(e)),t.done])},async getChannelListVersion(){const e=await G().get("meta",g);return"string"==typeof e?.value&&/^\d+$/.test(e.value)?e.value:"0"},async saveChannelListVersion(e){if(!/^\d+$/.test(e))throw new Error(`CHANNEL list version 非法:${e}`);await G().put("meta",{key:g,value:e})},async getChannelMembers(e,t){if(0===t.length)return[];const a=G().transaction("channelMembers"),n=await Promise.all(t.map(t=>a.store.get([e,t])));return await a.done,n.filter(e=>void 0!==e)},async saveChannelMembers(e){if(0===e.length)return;const t=G().transaction("channelMembers","readwrite");for(const a of e){const e=await t.store.get([a.channelId,a.userId]);void 0!==e&&S(a.updateVersion,e.updateVersion)<0||await t.store.put(a)}await t.done},async deleteChannelMembers(e){const t=IDBKeyRange.bound([e,""],[e,b]),a=G().transaction("channelMembers","readwrite");let n=await a.store.openCursor(t);for(;null!==n;)await n.delete(),n=await n.continue();await a.done},getChannelMemberSnapshot:async e=>await G().get("channelMemberSnapshots",e)??null,async saveChannelMemberSnapshot(e){await G().put("channelMemberSnapshots",e)},async deleteChannelMemberSnapshot(e){await G().delete("channelMemberSnapshots",e)},getChannelMentionCandidateSnapshot:async e=>await G().get("channelMentionCandidateSnapshots",e)??null,async saveChannelMentionCandidateSnapshot(e){await G().put("channelMentionCandidateSnapshots",e)},async deleteChannelMentionCandidateSnapshot(e){await G().delete("channelMentionCandidateSnapshots",e)}}}export{H as createIndexedDbStorageAdapter,L as deleteIndexedDbNamespace};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(e={}){const n=e.createSocket??(e=>new globalThis.WebSocket(e)),o=e.connectTimeoutMs??1e4,r={open:/* @__PURE__ */new Set,message:/* @__PURE__ */new Set,close:/* @__PURE__ */new Set,error:/* @__PURE__ */new Set};let t,s,c,i="idle";function a(e,n){for(const o of[...r[e]])o(n)}function d(){void 0!==c&&(clearTimeout(c),c=void 0)}function f(e,n){void 0!==n&&(e.removeEventListener("open",n.onOpen),e.removeEventListener("message",n.onMessage),e.removeEventListener("error",n.onError),e.removeEventListener("close",n.onClose))}return{get state(){return i},async connect(e,r){const l=e[0];if(void 0===l)throw new Error("WsTransport.connect:endpoints 为空(P0 single 策略需至少一个端点)");let p;!function(){if(d(),void 0!==t){f(t,s);try{t.close(1e3)}catch{}t=void 0}s=void 0}(),i="connecting";try{p=n(l.url)}catch(e){throw i="closed",e}p.binaryType="arraybuffer",t=p,function(e,n,o){const r={onOpen:()=>{e===t&&(d(),i="open",a("open",{endpoint:n}))},onMessage:n=>{if(e!==t||"open"!==i)return;const o=n?.data;o instanceof ArrayBuffer?a("message",{data:o}):a("error",{error:new Error(`WsTransport:收到非 ArrayBuffer 消息(${typeof o}),已忽略`)})},onError:n=>{e===t&&a("error",{error:new Error(`WsTransport:WebSocket error 事件(${n instanceof Event?n.type:typeof n})`)})},onClose:n=>{e===t&&(d(),f(e,r),t=void 0,s=void 0,i="closed",a("close",{code:n?.code??1006,reason:n?.reason??"",wasClean:n?.wasClean??!1}))}};if(s=r,e.addEventListener("open",r.onOpen),e.addEventListener("message",r.onMessage),e.addEventListener("error",r.onError),e.addEventListener("close",r.onClose),o>0){const n=setTimeout(()=>{if(e===t&&"connecting"===i){a("error",{error:new Error(`WsTransport:连接超时(${o}ms 未 open)`)});try{e.close()}catch{}}},o);n.unref?.(),c=n}}(p,l,r?.connectTimeoutMs??o)},async send(e){if(void 0===t||"open"!==i)throw new Error(`WsTransport.send:连接未就绪(state=${i}),拒绝发送`);t.send(e)},async close(e=1e3,n){d(),void 0===t||"connecting"!==i&&"open"!==i||(i="closing",t.close(e,n))},on:(e,n)=>(r[e].add(n),()=>{r[e].delete(n)})}}export{e as createWsTransport};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var t=Object.defineProperty,e=(e,n,a)=>((e,n,a)=>n in e?t(e,n,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[n]=a)(e,"symbol"!=typeof n?n+"":n,a);function n(t){if(0===t.length)return 0;let e=0;for(let n=0;n<t.length;n+=1){const a=((t[n]??128)-128)/128;e+=a*a}return Math.min(1,Math.sqrt(e/t.length)*Math.SQRT2)}function a(t,e,n){if(0===t.length||e<=0||n<=0)return 0;const a=e/n;let i=0,r=0;for(let e=0;e<t.length;e+=1){const n=e*a;let s=.2;n<200?s=.15:n<300?s=.4:n<=3400?s=1:n<=6e3&&(s=.45),i+=(t[e]??0)/255*s,r+=s}return r>0?i/r:0}function i(t){const e=.55*n(t.timeDomain)+.45*a(t.frequency,t.sampleRate,t.fftSize);return Math.min(1,e*t.boost)**.72}class r{constructor(t=.45,n=.18){e(this,"attack"),e(this,"release"),e(this,"value",0),this.attack=t,this.release=n}next(t){const e=Math.min(1,Math.max(0,t));return e>this.value?this.value+=(e-this.value)*this.attack:this.value+=(e-this.value)*this.release,this.value}}export{r as VoiceAmplitudeEnvelope,a as computeSpeechBandLevel,n as computeTimeDomainRms,i as sampleVoiceAmplitude};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(){if("undefined"==typeof window||"undefined"==typeof document)return{recordingSupported:!1,recordingBlockers:["no-media-devices"],playbackSupported:!1};const e=[];!1===window.isSecureContext&&e.push("insecure-context"),"undefined"!=typeof navigator&&void 0!==navigator.mediaDevices?.getUserMedia||e.push("no-media-devices"),"undefined"==typeof MediaRecorder&&e.push("no-media-recorder");const o=window,d=void 0!==window.AudioContext||void 0!==o.webkitAudioContext,i=void 0!==window.OfflineAudioContext||void 0!==o.webkitOfflineAudioContext;return d&&i||e.push("audio-context-blocked"),{recordingSupported:0===e.length,recordingBlockers:e,playbackSupported:"undefined"!=typeof Audio}}export{e as detectVoiceCapabilities};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{VoiceError as t}from"./voice-errors.js";const e=16e3,n=new URL("../../../../speex-runtime.txt",import.meta.url).href;let r=null;async function o(){const e="undefined"==typeof window?void 0:window;return void 0!==e?.__speexInH5?e.__speexInH5:(r??(r=(async()=>{if(void 0===e||"undefined"==typeof document)throw new t("codec-unavailable","Speex 运行时仅可在浏览器环境加载");if(await async function(){document.querySelector('script[data-speex-runtime="true"]')?.remove();const t=new AbortController,e=setTimeout(()=>t.abort(new Error("Speex runtime fetch timeout")),15e3);let r;try{r=await fetch(n,{signal:t.signal})}finally{clearTimeout(e)}if(!r.ok)throw new Error(`Speex runtime fetch failed: ${r.status}`);const o=await r.text();if(o.trimStart().startsWith("<"))throw new Error("Speex runtime fetch returned HTML instead of script");const a=document.createElement("script");a.dataset.speexRuntime="true",a.text=o,document.head.appendChild(a)}(),void 0===e.__speexInH5&&e.initAudio?.(),void 0===e.__speexInH5)throw new t("codec-unavailable","Speex 运行时初始化失败");return e.__speexInH5})().catch(e=>{throw r=null,e instanceof t?e:new t("codec-unavailable","Speex 运行时加载失败",{cause:e})})),r)}function a(){o().catch(()=>{})}function i(t,e,n){for(let r=0;r<n.length;r+=1)t.setUint8(e+r,n.charCodeAt(r))}function c(t,e){const n=new ArrayBuffer(44+2*t.length),r=new DataView(n);i(r,0,"RIFF"),r.setUint32(4,36+2*t.length,!0),i(r,8,"WAVE"),i(r,12,"fmt "),r.setUint32(16,16,!0),r.setUint16(20,1,!0),r.setUint16(22,1,!0),r.setUint32(24,e,!0),r.setUint32(28,2*e,!0),r.setUint16(32,2,!0),r.setUint16(34,16,!0),i(r,36,"data"),r.setUint32(40,2*t.length,!0);let o=44;for(let e=0;e<t.length;e+=1){const n=Math.max(-1,Math.min(1,t[e]??0));r.setInt16(o,n<0?32768*n:32767*n,!0),o+=2}return n}function s(t){if(t instanceof Int16Array)return t;const e=new Int16Array(t.length);for(let n=0;n<t.length;n+=1){const r=Math.max(-1,Math.min(1,t[n]??0));e[n]=r<0?32768*r:32767*r}return e}const l=120,h=40,u=80;function f(t,e){const n=Math.min(Math.floor(40*e/1e3),Math.floor(t.length/2));for(let e=0;e<n;e+=1){const r=e/n;t[e]=Math.round((t[e]??0)*r);const o=t.length-1-e;t[o]=Math.round((t[o]??0)*r)}return t}function d(t,e){if(0===t.length)return t;const n=Math.min(Math.floor(120*e/1e3),Math.max(0,t.length-1)),r=n>0?t.subarray(n):t,o=new Float32Array(r),a=Math.min(Math.floor(40*e/1e3),Math.floor(o.length/2));for(let t=0;t<a;t+=1){const e=t/a;o[t]=(o[t]??0)*e;const n=o.length-1-t;o[n]=(o[n]??0)*e}return o}function w(t,e){const n=new ArrayBuffer(44+2*t.length),r=new DataView(n);return i(r,0,"RIFF"),r.setUint32(4,36+2*t.length,!0),i(r,8,"WAVE"),i(r,12,"fmt "),r.setUint32(16,16,!0),r.setUint16(20,1,!0),r.setUint16(22,1,!0),r.setUint32(24,e,!0),r.setUint32(28,2*e,!0),r.setUint16(32,2,!0),r.setUint16(34,16,!0),i(r,36,"data"),r.setUint32(40,2*t.length,!0),new Int16Array(n,44).set(t),new Uint8Array(n)}async function m(e,n){const r=await o(),a=Math.floor(80*n/1e3),i=new Float32Array(a+e.length);i.set(e,a);const s=c(i,n);try{return function(t){const e=new Uint8Array(t.length);for(let n=0;n<t.length;n+=1)e[n]=255&t.charCodeAt(n);return e}(r.encodeFile(s))}catch(e){throw new t("encode-failed","语音编码失败",{cause:e})}}async function p(n){const r=await o();try{const[t,o]=r.decodeFile(function(t){let e="";for(let n=0;n<t.length;n+=32768)e+=String.fromCharCode(...t.subarray(n,Math.min(n+32768,t.length)));return e}(n));if(0===t.length)throw new Error("decoded empty pcm");const a=f(s(t),o.rate>0?o.rate:e),i=o.rate>0?o.rate:e;return{samples:a,sampleRate:i,durationMs:Math.round(a.length/i*1e3)}}catch(e){throw e instanceof t?e:new t("decode-failed","语音解码失败",{cause:e})}}export{h as CAPTURE_EDGE_FADE_MS,l as CAPTURE_SKIP_LEADING_MS,u as ENCODER_WARMUP_SILENCE_MS,e as VOICE_SAMPLE_RATE,f as applyEdgeFade,p as decodeSpeexOggToPcm,c as encodePcm16Wav,m as encodePcmToSpeexOgg,o as ensureSpeexRuntime,s as float32ToPcm16,w as pcm16ToWav,d as prepareCapturedPcm,a as prewarmSpeexRuntime};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.defineProperty,r=(r,o,n)=>((r,o,n)=>o in r?e(r,o,{enumerable:!0,configurable:!0,writable:!0,value:n}):r[o]=n)(r,"symbol"!=typeof o?o+"":o,n);class o extends Error{constructor(e,o,n){super(o??e,n),r(this,"code"),this.name="VoiceError",this.code=e}}function n(e){return e instanceof o?e.code:void 0}function c(e){switch(e instanceof DOMException||e instanceof Error?e.name:""){case"NotAllowedError":case"SecurityError":case"PermissionDeniedError":return new o("permission-denied","麦克风权限被拒绝",{cause:e});case"NotFoundError":case"DevicesNotFoundError":return new o("device-not-found","未找到可用麦克风",{cause:e});case"NotReadableError":case"TrackStartError":case"AbortError":return new o("device-busy","麦克风被占用或启动失败",{cause:e});default:return new o("device-busy",e instanceof Error?e.message:"麦克风启动失败",{cause:e})}}export{o as VoiceError,c as mapGetUserMediaError,n as voiceErrorCodeOf};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{decodeSpeexOggToPcm as a,pcm16ToWav as t}from"./voice-codec.js";async function o(o){const s=await a(o);return{wavData:t(s.samples,s.sampleRate),durationMs:s.durationMs}}export{o as decodeVoiceToWav};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{VoiceError as e,voiceErrorCodeOf as t}from"./voice-errors.js";import{decodeVoiceToWav as r}from"./voice-playback.js";function n(t){if("number"!=typeof t||!Number.isFinite(t))throw new e("invalid-playback-rate",`播放速率必须是有限数字,收到 ${String(t)}`);return Math.min(Math.max(t,.5),2)}function a(e={}){const a=e.cacheMax??8,i={activeId:"",isPlaying:!1,loadingId:"",progress:0,currentTimeMs:0,errorIds:/* @__PURE__ */new Set,playbackRate:void 0===e.playbackRate?1:n(e.playbackRate)},o=/* @__PURE__ */new Set;function c(){for(const e of o)e(i)}let u=null;const l=/* @__PURE__ */new Map;let s=0,d=!1,f=!1;function y(e,t){if(d)return URL.revokeObjectURL(t.url),t;const r=l.get(e);if(void 0!==r)return URL.revokeObjectURL(t.url),l.delete(e),l.set(e,r),r;for(l.set(e,t);l.size>a;){let e;for(const t of l.keys())if(t!==i.activeId){e=t;break}if(void 0===e)break;const t=l.get(e);l.delete(e),void 0!==t&&URL.revokeObjectURL(t.url)}return t}function v(e){e.paused||e.pause(),e.removeAttribute("src");try{e.load()}catch{}}function p(e,t){return!d&&e===s&&i.activeId===t}function b(e){e.defaultPlaybackRate=i.playbackRate,e.playbackRate=i.playbackRate}function g(){i.activeId="",i.isPlaying=!1,i.progress=0,i.currentTimeMs=0}function I(){s+=1,f=!1,i.loadingId="",g(),null!==u&&v(u),c()}function m(e){i.errorIds=/* @__PURE__ */new Set([...i.errorIds,e])}async function k(e,n){const a=function(e){const t=l.get(e);return void 0!==t&&(l.delete(e),l.set(e,t)),t}(e);if(void 0!==a)return{entry:a};let i;try{i=await n()}catch(e){return{entry:null,error:{code:t(e),cause:e}}}if(null===i)return{entry:null};try{const{wavData:t,durationMs:n}=await r(i);return{entry:y(e,{url:URL.createObjectURL(new Blob([t],{type:"audio/wav"})),durationMs:n})}}catch(e){return{entry:null,error:{code:t(e),cause:e}}}}return{getState:()=>i,subscribe:e=>(o.add(e),()=>o.delete(e)),toggle:async function(e,t){if(d)return;const r=function(){if(null!==u)return u;const e=new Audio;return e.preload="auto",b(e),e.addEventListener("timeupdate",()=>{""!==i.activeId&&(i.currentTimeMs=1e3*e.currentTime,i.progress=e.duration>0?Math.min(1,e.currentTime/e.duration):0,c())}),e.addEventListener("ended",()=>{g(),v(e),c()}),e.addEventListener("pause",()=>{""!==i.activeId&&(i.isPlaying=!1,c())}),u=e,e}();if(function(e){if(!i.errorIds.has(e))return;const t=new Set(i.errorIds);t.delete(e),i.errorIds=t}(e),i.activeId===e){if(i.isPlaying)return void r.pause();const n=++s;try{await r.play()}catch{if(!p(n,e))return;return m(e),void c()}if(!p(n,e))return;return i.isPlaying=!0,c(),void t.onPlayStart?.()}if(i.loadingId===e)return;I();const n=++s;i.loadingId=e,c();const a=await k(e,t.load);if(n===s){if(i.loadingId="",null===a.entry)return m(e),c(),void(void 0!==a.error&&t.onDecodeError?.(a.error.code,a.error.cause));r.src=a.entry.url,b(r),i.activeId=e,i.progress=0,i.currentTimeMs=0,c();try{await r.play()}catch(a){if(!p(n,e))return;return g(),v(r),m(e),c(),void t.onDecodeError?.(void 0,a)}p(n,e)&&(i.isPlaying=!0,c(),t.onPlayStart?.())}},seek:function(e,t){null===u||i.activeId!==e||!Number.isFinite(u.duration)||u.duration<=0||(u.currentTime=Math.min(Math.max(t,0),.999)*u.duration)},beginScrub:function(e){null!==u&&i.activeId===e&&i.isPlaying&&(f=!0,u.pause())},endScrub:function(e){if(null===u||i.activeId!==e||!f)return;f=!1;const t=++s;u.play().then(()=>{p(t,e)&&(i.isPlaying=!0,c())}).catch(()=>{p(t,e)&&(m(e),c())})},setPlaybackRate:function(e){const t=n(e);t!==i.playbackRate&&(i.playbackRate=t,null!==u&&b(u),c())},stop:I,dispose:function(){if(!d){d=!0,I();for(const e of l.values())URL.revokeObjectURL(e.url);l.clear(),o.clear(),u=null}}}}export{a as createVoicePlayer};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{VoiceAmplitudeEnvelope as e,sampleVoiceAmplitude as t}from"./voice-amplitude.js";import{prewarmSpeexRuntime as n,prepareCapturedPcm as o,VOICE_SAMPLE_RATE as a,pcm16ToWav as i,float32ToPcm16 as r,encodePcmToSpeexOgg as c,ENCODER_WARMUP_SILENCE_MS as s,CAPTURE_SKIP_LEADING_MS as l}from"./voice-codec.js";import{VoiceError as u,mapGetUserMediaError as d}from"./voice-errors.js";const f=15e3;function w(e,t,n){return new Promise((o,a)=>{const i=setTimeout(()=>a(new Error(n)),t);e.then(e=>{clearTimeout(i),o(e)},e=>{clearTimeout(i),a(e)})})}function h(e){let t=0;for(const n of e)t+=n.length;const n=new Float32Array(t);let o=0;for(const t of e)n.set(t,o),o+=t.length;return n}async function m(m={}){if("undefined"==typeof MediaRecorder)throw new u("no-media-recorder","当前浏览器不支持录音");let p;p=void 0!==m.stream?m.stream:await async function(){if("undefined"==typeof navigator||void 0===navigator.mediaDevices?.getUserMedia)throw new u("no-media-devices","当前环境不支持麦克风采集");const e=navigator.mediaDevices.getUserMedia({audio:{channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}});try{return await w(e,25e3,"麦克风授权请求超时")}catch(t){throw e.then(e=>e.getTracks().forEach(e=>e.stop())).catch(()=>{}),d(t)}}(),n();const g="undefined"==typeof MediaRecorder?"":["audio/webm","audio/webm;codecs=opus","audio/mp4","audio/aac","audio/ogg;codecs=opus"].find(e=>MediaRecorder.isTypeSupported(e))??"",y=m.maxDurationMs??6e4;let v="recording";const M=[];let b=0;const x=[];let D=null,A=null,C=null,T=[],R=0,S=!1;function k(){try{let e;try{e=""!==g?new MediaRecorder(p,{mimeType:g}):new MediaRecorder(p)}catch{e=new MediaRecorder(p)}return T=[],e.ondataavailable=e=>{e.data.size>0&&T.push(e.data)},e.start(250),R=Date.now(),e}catch(e){throw e instanceof u?e:new u("device-busy","录音器启动失败",{cause:e})}}const z=m.amplitude?.intervalMs??50,B=m.amplitude?.boost??2.6,I=m.amplitude?.smoothing??.12,U=m.amplitude?.minVolume??.06;function j(){const e=Math.floor(y/1e3*a);let t=0;for(const e of M)t+=e.length;if(t>e){let t=e;const n=[];for(const e of M){if(t<=0)break;e.length<=t?(n.push(e),t-=e.length):(n.push(e.slice(0,t)),t=0)}M.length=0,M.push(...n)}b=Math.min(b,y);const n=Math.max(0,Math.ceil(y/z));x.length>n&&(x.length=n)}let q=setInterval(()=>{!S&&"recording"===v&&E()>=y&&(S=!0,async function(){if("recording"!==v)return void m.onMaxDuration?.();m.onMaxDuration?.(),v="paused";const e=G().then(()=>j());C=e;try{await e}catch(e){console.warn("[im-browser] pauseAtMaxDuration settle failed",e)}}())},250),O=null,P=null;try{const n=window.AudioContext??window.webkitAudioContext;if(void 0!==n){O=new n,"suspended"===O.state&&O.resume().catch(()=>{});const o=O.createMediaStreamSource(p),a=O.createAnalyser();a.fftSize=256,a.smoothingTimeConstant=I,o.connect(a);const i=new Uint8Array(a.frequencyBinCount),r=new Uint8Array(a.fftSize),c=new e;P=setInterval(()=>{if("recording"!==v||null===D)return;a.getByteFrequencyData(i),a.getByteTimeDomainData(r);const e=t({timeDomain:r,frequency:i,sampleRate:O.sampleRate,fftSize:a.fftSize,boost:B}),n=c.next(e),o=n<U?0:n;x.push(Math.round(255*o)),m.onAmplitude?.(o)},z)}}catch(e){console.warn("[im-browser] amplitude analyser setup failed",e)}function E(){const e="recording"===v&&null!==D?Date.now()-R:0;return b+e}function F(){null!==q&&(clearInterval(q),q=null),null!==P&&(clearInterval(P),P=null),O?.close().catch(()=>{}),O=null;for(const e of p.getTracks())e.stop()}function G(){if(null!==A)return A;const e=D;return null===e?Promise.resolve():(D=null,A=(async()=>{await new Promise(t=>{if("inactive"===e.state)return void t();const n=setTimeout(()=>{console.warn("[im-browser] recorder onstop timed out, settling with received chunks"),t()},5e3);e.onstop=()=>{clearTimeout(n),t()},e.stop()});const t=new Blob(T,{type:e.mimeType||g||"audio/webm"});if(T=[],0===t.size)return;const n=await async function(e,t,n){const o=window.AudioContext??window.webkitAudioContext,a=window.OfflineAudioContext??window.webkitOfflineAudioContext;if(void 0===a||null==n&&void 0===o)throw new u("audio-context-blocked","AudioContext 不可用");const i=n??new o,r=null==n;try{"suspended"===i.state&&await w(i.resume(),f,"audioContext.resume timeout").catch(()=>{});const n=await w(i.decodeAudioData(await e.arrayBuffer()),f,"decodeAudioData timeout"),o=new a(1,Math.max(1,Math.ceil(n.duration*t)),t),r=o.createBufferSource();return r.buffer=n,r.connect(o.destination),r.start(0),(await w(o.startRendering(),f,"offlineAudioContext.startRendering timeout")).getChannelData(0).slice()}catch(e){throw e instanceof u?e:new u("decode-failed","录音段解码失败",{cause:e})}finally{r&&i.close().catch(()=>{})}}(t,a,O);0!==n.length&&(M.push(n),b+=n.length/a*1e3)})().finally(()=>{A=null}),A)}try{D=k()}catch(e){throw v="closed",F(),e}return{getState:()=>v,recordedMs:E,async pause(){"recording"===v&&(v="paused",await G(),(S||b>=y)&&j())},async resume(){"paused"!==v||S||(D=k(),v="recording")},async finish(){if("closed"===v)throw new u("empty-recording","录音会话已结束");v="closed";try{return await w((async()=>{try{null!==C?await C:await G(),j()}finally{F()}const e=h(M);if(0===e.length)throw new u("empty-recording","录音内容为空");const t=o(e,a);if(0===t.length)throw new u("empty-recording","录音内容为空");const n=Math.min(x.length,Math.ceil(l/z));return{data:await c(t,a),durationMs:Math.round(t.length/a*1e3)+s,waveform:x.slice(n),filename:`AUDIO_${Date.now()}.ogg`,mimeType:"audio/ogg"}})(),25e3,"录音定稿超时")}catch(e){throw F(),e instanceof u?e:new u("encode-failed","录音定稿失败",{cause:e})}},cancel(){v="closed";const e=D;if(D=null,null!==e&&(e.ondataavailable=null,e.onstop=null,"inactive"!==e.state))try{e.stop()}catch{}M.length=0,F()},async previewWav(){null!==C?await C:null!==A&&await A,j();const e=h(M),t=o(e,a);if(0===t.length)throw new u("empty-recording","暂无可试听的录音内容");return{wavData:i(r(t),a),durationMs:Math.round(t.length/a*1e3)}}}}export{m as createVoiceRecordingSession};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{formatFailure as e}from"../../../im-i18n/src/format/failure.js";import{formatLastMessageSummary as a}from"../../../im-i18n/src/format/last-message.js";import{formatMediaPlaceholder as o}from"../../../im-i18n/src/format/media.js";import{formatSystemMessage as s}from"../../../im-i18n/src/format/system-message.js";function l(e){let a=0,o=0;for(const s of e)"video"===s.kind?o+=1:a+=1;return{imageCount:a,videoCount:o}}function i(i){return{systemMessage:e=>void 0!==e.body.system?s(e.body.system,{locale:i.locale(),resolveName:i.resolveName,selfId:i.selfId()}):"",mediaPlaceholder:e=>o(e.contentType,{locale:i.locale(),durationMs:e.body.voice?.durationMs,stickerImageType:e.body.sticker?.imageType,gameType:e.body.game?.gameType,callKind:e.body.call?.callKind,...void 0===e.body.filesAlbum?{}:{filesAlbum:{count:e.body.filesAlbum.items.length,caption:e.body.filesAlbum.caption}},...void 0===e.body.mediaAlbum?{}:{mediaAlbum:l(e.body.mediaAlbum.items)}}),lastMessage:e=>void 0!==e.lastMessageSummary?a(e.lastMessageSummary,{locale:i.locale(),resolveName:i.resolveName,selfId:i.selfId()}):e.lastMessagePreview,failureText:a=>void 0!==a.failure?.displayCode?e(a.failure.displayCode,{locale:i.locale(),mediaKind:a.failure.mediaKind,params:a.failure.params}):a.failure?.message??""}}export{i as useImText};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{defineStore as e}from"pinia";import{ref as t,shallowRef as o,computed as n}from"vue";import{getImChatKitContext as r,registerImChatKitStoreDisposer as a,resolveImChatKitPinia as i}from"./context.js";function c(e){return`${e.domain}:${e.applicationId}`}function l(e,t){const o="object"==typeof e&&null!==e?e:null;return Object.freeze({code:null!==o&&"string"==typeof o.code?o.code:"IM_CHAT_KIT_APPLICATIONS_ACTION_FAILED",category:null!==o&&(n=o.category,"auth"===n||"network"===n||"protocol"===n||"permission"===n||"validation"===n||"state"===n||"unsupported"===n||"contract"===n)?o.category:"state",operation:null!==o&&"string"==typeof o.operation?o.operation:`applications.${t}`,retryable:null!==o&&"boolean"==typeof o.retryable?o.retryable:"reload"===t});var n}function u(a){return e("k2-im-applications",()=>{const e=r(a).runtime,i=t([]),u=t(!1),p=o(null),s=t({}),f=o({}),d=n(()=>i.value.length),v=n(()=>{let e=0,t=0,o=0;for(const n of i.value)"contact"===n.ref.domain?e+=1:"group"===n.ref.domain?t+=1:o+=1;return Object.freeze({contact:e,group:t,channel:o})});let b=!1,O=0,g=0,j=0,y=!1,z=0;const I=/* @__PURE__ */new Map;function m(){O+=1,g+=1,j+=1,z+=1,y=!1,I.clear(),i.value=[],u.value=!1,p.value=null,s.value={},f.value={}}function k(t){return{client:t,generation:e.getGeneration(),stateEpoch:O}}function A(t){return!b&&t.client===e.getProductClient()&&t.generation===e.getGeneration()&&t.stateEpoch===O}async function _(){if(b)return Object.freeze({ok:!1,operation:"reload",reason:"stale"});const t=++g;let o;try{o=k(e.ensureProductClient())}catch(e){const t=l(e,"reload");return p.value=t,u.value=!1,Object.freeze({ok:!1,operation:"reload",reason:"failed",error:t})}u.value=!0,p.value=null;try{const e=await o.client.applications.listPending();return t===g&&A(o)?(i.value=Object.freeze([...e]),Object.freeze({ok:!0,operation:"reload"})):Object.freeze({ok:!1,operation:"reload",reason:"stale"})}catch(e){if(t!==g||!A(o))return Object.freeze({ok:!1,operation:"reload",reason:"stale"});const n=l(e,"reload");return p.value=n,Object.freeze({ok:!1,operation:"reload",reason:"failed",error:n})}finally{t===g&&A(o)&&(u.value=!1)}}const h=e.subscribeProductEvents(function(e){"contact-application:received"!==e.type&&"channel-join-application:received"!==e.type&&"application:updated"!==e.type||function(){if(b||y)return;y=!0;const e=O,t=++z;queueMicrotask(()=>{t===z&&(y=!1,b||e!==O||_())})}()});async function E(t,o){const n="contact"===(r=t).domain?Object.freeze({domain:"contact",applicationId:r.applicationId}):"group"===r.domain?Object.freeze({domain:"group",applicationId:r.applicationId,conversation:Object.freeze({conversationType:"group",conversationId:r.conversation.conversationId})}):Object.freeze({domain:"channel",applicationId:r.applicationId,conversation:Object.freeze({conversationType:"channel",conversationId:r.conversation.conversationId})});var r;const a=c(n);if(b)return Object.freeze({ok:!1,operation:o,reason:"stale",application:n});const p=++j;I.set(a,p),s.value={...s.value,[a]:o};const{[a]:d,...v}=f.value;let O;f.value=v;try{O=k(e.ensureProductClient())}catch(e){const t=l(e,o);f.value={...f.value,[a]:t};const{[a]:r,...i}=s.value;return s.value=i,I.delete(a),Object.freeze({ok:!1,operation:o,reason:"failed",application:n,error:t})}const y=()=>A(O)&&I.get(a)===p;try{return await O.client.applications[o](n),y()?(g+=1,u.value=!1,i.value=Object.freeze(i.value.filter(e=>c(e.ref)!==a)),Object.freeze({ok:!0,operation:o,application:n})):Object.freeze({ok:!1,operation:o,reason:"stale",application:n})}catch(e){if(!y())return Object.freeze({ok:!1,operation:o,reason:"stale",application:n});const t=l(e,o);return function(e){return"IM_SDK_APPLICATION_REQUEST_ALREADY_HANDLED"===e.code||"IM_SDK_APPLICATION_ALREADY_HANDLED"===e.code}(t)?(g+=1,u.value=!1,i.value=Object.freeze(i.value.filter(e=>c(e.ref)!==a)),Object.freeze({ok:!1,operation:o,reason:"failed",application:n,error:t})):(f.value={...f.value,[a]:t},Object.freeze({ok:!1,operation:o,reason:"failed",application:n,error:t}))}finally{if(y()){I.delete(a);const{[a]:e,...t}=s.value;s.value=t}}}return{items:i,loading:u,error:p,processingKeys:s,itemErrors:f,pendingCount:d,domainCounts:v,reload:_,accept:function(e){return E(e,"accept")},ignore:function(e){return E(e,"ignore")},reset:function(){b||m()},dispose:function(){b||(b=!0,h(),m())}}})}const p=/* @__PURE__ */new WeakMap,s=/* @__PURE__ */new WeakMap;function f(e=i()){r(e);let t=p.get(e);void 0===t&&(t=u(e),p.set(e,t));const o=t(e);return s.get(e)!==o&&(s.set(e,o),a(e,()=>{o.dispose(),o.$dispose(),s.get(e)===o&&s.delete(e)})),o}export{c as applicationKey,f as useImApplicationsStore};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{defineStore as e}from"pinia";import{shallowRef as t,watch as n}from"vue";import{decideMessageAction as i,decideMemberTargetAction as o,decideConversationAction as r}from"../services/capabilities.js";import{getImChatKitContext as a,registerImChatKitStoreDisposer as s,resolveImChatKitPinia as c}from"./context.js";import{useImMessageOperationsStore as u}from"./message-operations.store.js";import{useImThreadStore as l}from"./thread.store.js";const f=Object.freeze({availability:"unknown",reason:"not-ready"});function d(s){return e("k2-im-capabilities",()=>{const e=a(s).runtime,c=e.getDiagnostics(),d=l(s),v=u(s),p=t(null);let m,g,b,h=!1;function w(){void 0!==g&&(clearTimeout(g),g=void 0)}function y(t){w();const n=t.nextEvaluationAt;if(void 0===n)return;const i=Math.max(0,n-Date.now());g=setTimeout(()=>{g=void 0,function(t=Date.now()){const n=d.activeRef,i=e.getProductClient();if(null===n||null===i)return;A(i.capabilities.get(n,{nowMs:t}))}()},i)}function A(e){h||(p.value=e,y(e))}function I(e){const t=d.activeRef;return null!==t&&t.conversationType===e.conversationType&&t.conversationId===e.conversationId}function M(){m?.(),m=void 0,w(),p.value=null;const t=d.activeRef,n=e.getProductClient();null!==t&&null!==n&&(m=n.capabilities.subscribe(t,A))}function j(){m?.(),m=void 0,w(),p.value=null}function C(e){return null===p.value?f:r(p.value,e)}return b=n(()=>d.activeRef,M,{deep:!0,immediate:!0}),{activeSnapshot:p,start:function(){M()},reset:j,refresh:async function(){const t=d.activeRef,n=e.getProductClient();if(null===t||null===n)return;const i=e.getGeneration();try{const o=await n.capabilities.refresh(t);if(h||i!==e.getGeneration()||!I(t))return;A(o)}catch(o){if(h||i!==e.getGeneration()||!I(t))return;c.record("warn","pinia","profile","capability-refresh-failed",()=>({conversation:{...t},error:{message:"刷新会话能力失败,保留当前本机快照",data:o}})),A(n.capabilities.get(t))}},conversationAction:C,profileAction:function(e){return C(e)},memberAction:function(e){return C(e)},memberTargetAction:function(t,n){const i=p.value;return null===i?f:o(t,{snapshot:i,selfId:e.getCredentials().userId,...n})},messageAction:function(t,n){const o=p.value;return null===o?f:i(t,{snapshot:o,message:n,selfId:e.getCredentials().userId,pinnedMessage:v.activePinnedMessage})},dispose:function(){h||(h=!0,b?.(),b=void 0,j())}}})}const v=/* @__PURE__ */new WeakMap,p=/* @__PURE__ */new WeakMap;function m(e=c()){a(e);let t=v.get(e);void 0===t&&(t=d(e),v.set(e,t));const n=t(e);return p.get(e)!==n&&(p.set(e,n),s(e,()=>{n.dispose(),n.$dispose(),p.get(e)===n&&p.delete(e)})),n}export{m as useImCapabilitiesStore};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{defineStore as e}from"pinia";import{shallowRef as n,ref as t,watch as o}from"vue";import{getImChatKitContext as r,registerImChatKitStoreDisposer as a,resolveImChatKitPinia as i}from"./context.js";import{useImThreadStore as s}from"./thread.store.js";const l=/* @__PURE__ */new WeakMap;function u(e){const n=l.get(e);if(void 0===n)throw new Error("当前 Pinia 尚未创建 ImComposerStore");return n}function d(e){return Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function c(e){return{text:e.text,...void 0===e.mentions?{}:{mentions:e.mentions.map(e=>({userId:e.userId,displayName:e.displayName}))},...void 0===e.replyToMessageId?{}:{replyToMessageId:e.replyToMessageId},attachments:[]}}function v(e){return null===e?null:c({text:e.text,mentions:e.mentions,...void 0===e.replyToMessageId?{}:{replyToMessageId:e.replyToMessageId}})}function f(e){return""===e.text&&0===(e.mentions?.length??0)&&void 0===e.replyToMessageId}function p(e,n){return null!==e&&e.text===n.text&&e.replyToMessageId===n.replyToMessageId&&(e.mentions?.length??0)===(n.mentions?.length??0)&&(e.mentions??[]).every((e,t)=>{const o=n.mentions?.[t];return void 0!==o&&e.userId===o.userId&&e.displayName===o.displayName})}function g(e,n,t){return function(e){return"object"==typeof e&&null!==e&&"string"==typeof e.code&&"string"==typeof e.category}(e)?e:Object.freeze({code:"composer.draft"===n?"IM_CHAT_KIT_DRAFT_SAVE_FAILED":"IM_CHAT_KIT_COMPOSER_OPERATION_FAILED",category:"state",operation:n,retryable:"composer.draft"===n,...void 0===t?{}:{conversation:d(t)},cause:e})}function m(e,n){return e.conversationId===n.ref.conversationId&&e.conversationType===n.ref.conversationType}function y(a){return e("k2-im-composer",()=>{const e=r(a).runtime,i=e.getDiagnostics(),u=s(a),y=n(null),h=n(null),I=n(null),T=t(!1),b=t(0),k=n(null);let M,j=!1,w=0,O=0,z=0,x=Promise.resolve(),P=Promise.resolve();const R=/* @__PURE__ */new Set,_=/* @__PURE__ */new Map;let E,G;function A(){return u.getHandle()}function C(n,t){const o=u.activeRef;return!j&&A()===n&&e.getGeneration()===t&&null!==o&&o.conversationId===n.ref.conversationId&&o.conversationType===n.ref.conversationType}function D(n=A()){if(void 0===n)return!1;const t=e.getGeneration();return M?.handle===n&&M.generation===t||[...R].some(e=>e.handle===n&&e.generation===t)}async function N(n=A()){if(void 0===n)return;const t=e.getGeneration(),o=M?.handle===n&&M.generation===t?M:void 0;if(void 0===o){const e=[...R].filter(e=>e.handle===n&&e.generation===t).map(e=>e.promise);return void(e.length>0?await Promise.all(e):await P)}M=void 0;const r=x.then(async()=>{f(o.input)?await n.draft.clear():await n.draft.save(o.input)}),a={handle:n,generation:t,promise:r};R.add(a),P=r,x=r.catch(()=>{});try{await r,C(n,t)&&(k.value=null,b.value+=1,i.record("debug","pinia","draft","composer-draft-flush-complete",()=>({generation:t,conversation:d(n.ref)})))}catch(e){throw C(n,t)&&(void 0===M&&z===o.version&&(M=o),k.value=g(e,"composer.draft",n.ref),i.record("error","pinia","draft","composer-draft-flush-failed",()=>({generation:t,conversation:d(n.ref),error:{message:"Composer 草稿持久化失败",data:k.value}}))),e}finally{R.delete(a)}}function S(n){const t=A(),o=e.getGeneration();if(void 0===t||!C(t,o))return k.value=g(new Error("当前会话尚未就绪"),"composer.draft"),!1;const r=c(n);return z+=1,y.value=f(r)?null:r,M={handle:t,generation:o,version:z,input:r},k.value=null,H(),f(r)&&N(t).catch(()=>{}),!0}async function H(){if(null!==I.value)return;const n=y.value?.replyToMessageId;if(void 0===n)return O+=1,void(h.value=null);const t=A();if(void 0===t)return void(h.value=null);const o=u.messages.find(e=>e.id===n);if(void 0!==o)return O+=1,void(h.value=o);const r=e.getGeneration(),a=++O,i=await t.resolveMessage(n).catch(()=>null);a===O&&C(t,r)&&null===I.value&&y.value?.replyToMessageId===n&&(h.value=i)}function W(){I.value=null,H()}function $(n,t){return!j&&e.getGeneration()===n&&w===t}function F(e,n){return null!==e&&p(v(e),n)}function K(e){if(!C(e.handle,e.generation)||null!==y.value)return;E=void 0;const n=c(e.input);z+=1,y.value=n,M={handle:e.handle,generation:e.generation,version:z,input:n},H()}function L(){const n=A();if(void 0===n)return;const t=E,o=void 0!==t&&t.handle===n&&t.generation===e.getGeneration()&&F(u.draft,t.input);void 0===t||o||(E=void 0),D(n)||function(e){return[..._.values()].some(n=>n.handle===e)}(n)||o||(y.value=v(u.draft)),null===I.value||m(I.value,n)||(I.value=null),H()}function V(){w+=1,O+=1,z+=1,M=void 0,_.clear(),E=void 0,x=Promise.resolve(),P=Promise.resolve(),y.value=null,h.value=null,I.value=null,G=void 0,T.value=!1,b.value=0,k.value=null}const q=o(()=>({ref:null===u.activeRef?null:`${u.activeRef.conversationType}:${u.activeRef.conversationId}`,draft:u.draft,messages:u.messages}),(e,n)=>{if(e.ref!==n?.ref)return V(),void(null!==e.ref&&L());L()},{immediate:!0});return l.set(a,Object.freeze({suspendInteraction:function(){O+=1,h.value=null,I.value=null},syncReplyTarget:H,dispose:function(){j||(j=!0,q(),V())}})),{input:y,replyTo:h,editingMessage:I,submitting:T,draftCommitVersion:b,error:k,updateDraft:S,flush:N,hasPendingWork:D,submitText:async function(n){const t=I.value,o=null===t?"send":"edit";if(null!==t&&void 0!==G)return Object.freeze({ok:!1,operation:"edit",reason:"busy"});const r=A(),a=e.getGeneration();if(void 0===r||!C(r,a))return Object.freeze({ok:!1,operation:o,reason:"not-ready"});const s=n.text.trim();if(""===s)return Object.freeze({ok:!1,operation:o,reason:"empty"});const l=w;if(null!==t&&!m(t,r))return Object.freeze({ok:!1,operation:"edit",reason:"not-ready"});const v=Symbol(o);null!==t&&(G=v),T.value=void 0!==G,k.value=null;const f=u.retainHandle(r);let b;if(null===t){const e=c(n);b={token:v,handle:r,generation:a,input:e},_.set(v,b),function(e,n,t){C(e,n)&&null!==y.value&&p(y.value,t)&&(z+=1,M?.handle===e&&M.generation===n&&p(M.input,t)&&(M=void 0),y.value=null,O+=1,h.value=null)}(r,a,e)}i.record("debug","pinia","message","composer-submit-start",()=>({generation:a,operation:o,conversation:d(r.ref),...null===t?{}:{messageId:t.id}}));try{if(null===t){if(!$(a,l)||!C(r,a))return Object.freeze({ok:!1,operation:"send",reason:"stale"});const e=await r.messages.sendText(s,{...void 0===n.mentions?{}:{mentions:n.mentions},...void 0===n.replyToMessageId?{}:{replyToMessageId:n.replyToMessageId}});if(!$(a,l)||!C(r,a))return Object.freeze({ok:!1,operation:"send",reason:"stale"});if(!e.ok)return void 0!==b&&K(b),k.value=e.error,Object.freeze({ok:!1,operation:"send",reason:"sdk-rejected",error:e.error});if(void 0!==b&&(await async function(e){const n=[...R].filter(n=>n.handle===e.handle&&n.generation===e.generation).map(e=>e.promise.catch(()=>{}));if(n.length>0&&await Promise.all(n),!C(e.handle,e.generation))return;if(F(await e.handle.draft.get(),e.input)){E=e;try{await e.handle.draft.clear(),E?.token===e.token&&(E=void 0)}catch(n){if(C(e.handle,e.generation)){if(null===y.value&&void 0===M){const n={text:"",attachments:[]};z+=1,M={handle:e.handle,generation:e.generation,version:z,input:n}}k.value=g(n,"composer.draft",e.handle.ref),i.record("error","pinia","draft","composer-accepted-draft-clear-failed",()=>({generation:e.generation,conversation:d(e.handle.ref),error:{message:"消息已被发送流程接受,但清理对应草稿失败",data:k.value}}))}}}else E?.token===e.token&&(E=void 0)}(b),!$(a,l)||!C(r,a)))return Object.freeze({ok:!1,operation:"send",reason:"stale"})}else{try{await r.messages.editText(t.id,s,{...void 0===n.mentions?{}:{mentions:n.mentions}})}catch(e){if(!$(a,l)||!C(r,a))return Object.freeze({ok:!1,operation:"edit",reason:"stale"});const n=g(e,"composer.edit",r.ref);return k.value=n,Object.freeze({ok:!1,operation:"edit",reason:"sdk-rejected",error:n})}if(!$(a,l)||!C(r,a))return Object.freeze({ok:!1,operation:"edit",reason:"stale"});I.value===t&&W()}return k.value=null,i.record("debug","pinia","message","composer-submit-complete",()=>({generation:a,operation:o,conversation:d(r.ref)})),Object.freeze({ok:!0,operation:o})}catch(e){if(!$(a,l)||!C(r,a))return Object.freeze({ok:!1,operation:o,reason:"stale"});void 0!==b&&K(b);const n=g(e,`composer.${o}`,r.ref);return k.value=n,Object.freeze({ok:!1,operation:o,reason:"sdk-rejected",error:n})}finally{f(),_.delete(v),G===v&&(G=void 0),T.value=void 0!==G,C(r,a)&&L()}},setReplyTo:function(e){const n=A();return!(void 0===n||!m(e,n))&&(I.value=null,h.value=e,S({...y.value??{text:"",attachments:[]},replyToMessageId:e.id}))},clearReplyTo:function(e){if(void 0!==e&&y.value?.replyToMessageId!==e)return;h.value=null;const n=y.value;if(null===n)return;const{replyToMessageId:t,...o}=n;S({...o})},setEditing:function(e){const n=A();return!(void 0===n||!m(e,n))&&(h.value=null,I.value=e,!0)},clearEditing:W,reset:V}})}const h=/* @__PURE__ */new WeakMap,I=/* @__PURE__ */new WeakMap;function T(e=i()){r(e);let n=h.get(e);void 0===n&&(n=y(e),h.set(e,n));const t=n(e),o=u(e);return I.get(e)!==t&&(I.set(e,t),a(e,()=>{o.dispose(),t.$dispose(),I.get(e)===t&&(I.delete(e),l.get(e)===o&&l.delete(e))})),t}export{u as getInternalImComposerActions,T as useImComposerStore};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getActivePinia as e}from"pinia";import{createChatRuntime as t}from"../runtime/chat-runtime.js";import{ensureSelfProfile as i}from"../services/profile.service.js";function o(e,i,o={}){const n=t(i);try{return p(e,c({runtime:n,...o}))}catch(e){throw n.dispose(),e}}function n(e){i(d(e).runtime)}const s=/* @__PURE__ */new WeakMap;function r(t){const i=t??e();if(void 0===i)throw new Error("未找到当前 Pinia;请在 Vue setup 内调用,或显式传入 Pinia 实例");return i}function c(e){return Object.freeze({runtime:e.runtime,...void 0===e.expressionRecentPersistence?{}:{expressionRecentPersistence:e.expressionRecentPersistence}})}function p(e,t){const i=s.get(e);if(void 0!==i&&!i.disposed){if(i.context===t)return i.installation;throw new Error("当前 Pinia 已安装活动 ImChatKitContext,请先 dispose 再切换 runtime")}const o={context:t,storeDisposers:/* @__PURE__ */new Set,disposed:!1},n=Object.freeze({context:t,dispose:()=>{if(!o.disposed){o.disposed=!0;for(const e of[...o.storeDisposers])e();o.storeDisposers.clear(),t.runtime.dispose(),s.get(e)===o&&s.delete(e)}}});return o.installation=n,s.set(e,o),n}function d(e){const t=s.get(e);if(void 0===t||t.disposed)throw new Error("当前 Pinia 尚未安装活动 ImChatKitContext");return t.context}function u(e,t){const i=s.get(e);if(void 0===i||i.disposed)throw new Error("当前 Pinia 尚未安装活动 ImChatKitContext");return i.storeDisposers.add(t),()=>i.storeDisposers.delete(t)}function f(e){s.get(e)?.installation.dispose()}export{o as createAndInstallImChatKit,c as createImChatKitContext,f as disposeImChatKit,n as ensureImChatKitSelfProfile,d as getImChatKitContext,p as installImChatKit,u as registerImChatKitStoreDisposer,r as resolveImChatKitPinia};
|