@mtcute/core 0.10.2 → 0.11.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/cjs/highlevel/base.d.ts +1 -1
- package/cjs/highlevel/base.js +29 -23
- package/cjs/highlevel/base.js.map +1 -1
- package/cjs/highlevel/client.d.ts +3 -2
- package/cjs/highlevel/client.js +1 -0
- package/cjs/highlevel/client.js.map +1 -1
- package/cjs/highlevel/managers/app-config-manager.js +7 -5
- package/cjs/highlevel/managers/app-config-manager.js.map +1 -1
- package/cjs/highlevel/methods/_init.js.map +1 -1
- package/cjs/highlevel/methods/auth/start-test.js.map +1 -1
- package/cjs/highlevel/methods/auth/start.js.map +1 -1
- package/cjs/highlevel/methods/auth/utils.js.map +1 -1
- package/cjs/highlevel/methods/bots/get-callback-answer.js.map +1 -1
- package/cjs/highlevel/methods/bots/get-game-high-scores.js.map +1 -1
- package/cjs/highlevel/methods/bots/normalize-command-scope.js.map +1 -1
- package/cjs/highlevel/methods/bots/set-my-commands.js.map +1 -1
- package/cjs/highlevel/methods/chats/add-chat-members.js.map +1 -1
- package/cjs/highlevel/methods/chats/ban-chat-member.js.map +1 -1
- package/cjs/highlevel/methods/chats/batched-queries.js.map +1 -1
- package/cjs/highlevel/methods/chats/delete-chat-photo.js.map +1 -1
- package/cjs/highlevel/methods/chats/delete-history.js.map +1 -1
- package/cjs/highlevel/methods/chats/get-chat-event-log.js.map +1 -1
- package/cjs/highlevel/methods/chats/get-chat-member.js.map +1 -1
- package/cjs/highlevel/methods/chats/get-chat-members.js.map +1 -1
- package/cjs/highlevel/methods/chats/get-chat-preview.js.map +1 -1
- package/cjs/highlevel/methods/chats/get-chat.js.map +1 -1
- package/cjs/highlevel/methods/chats/get-full-chat.js.map +1 -1
- package/cjs/highlevel/methods/chats/get-nearby-chats.js.map +1 -1
- package/cjs/highlevel/methods/chats/get-similar-channels.js.map +1 -1
- package/cjs/highlevel/methods/chats/iter-chat-event-log.js.map +1 -1
- package/cjs/highlevel/methods/chats/iter-chat-members.js.map +1 -1
- package/cjs/highlevel/methods/chats/join-chat.js.map +1 -1
- package/cjs/highlevel/methods/chats/kick-chat-member.js.map +1 -1
- package/cjs/highlevel/methods/chats/leave-chat.js.map +1 -1
- package/cjs/highlevel/methods/chats/open-chat.js.map +1 -1
- package/cjs/highlevel/methods/chats/reorder-usernames.js.map +1 -1
- package/cjs/highlevel/methods/chats/restrict-chat-member.js.map +1 -1
- package/cjs/highlevel/methods/chats/save-draft.js.map +1 -1
- package/cjs/highlevel/methods/chats/set-chat-color.js.map +1 -1
- package/cjs/highlevel/methods/chats/set-chat-photo.js.map +1 -1
- package/cjs/highlevel/methods/chats/set-chat-title.js.map +1 -1
- package/cjs/highlevel/methods/chats/toggle-fragment-username.js.map +1 -1
- package/cjs/highlevel/methods/chats/unarchive-chats.js.map +1 -1
- package/cjs/highlevel/methods/chats/unban-chat-member.js.map +1 -1
- package/cjs/highlevel/methods/contacts/delete-contacts.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/create-folder.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/edit-folder.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/find-folder.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/get-folders.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/iter-dialogs.js.map +1 -1
- package/cjs/highlevel/methods/files/download-buffer.js.map +1 -1
- package/cjs/highlevel/methods/files/download-iterable.js +1 -1
- package/cjs/highlevel/methods/files/download-iterable.js.map +1 -1
- package/cjs/highlevel/methods/files/download-node-stream.js.map +1 -1
- package/cjs/highlevel/methods/files/download-stream.js.map +1 -1
- package/cjs/highlevel/methods/files/normalize-file-to-document.js.map +1 -1
- package/cjs/highlevel/methods/files/normalize-input-file.js.map +1 -1
- package/cjs/highlevel/methods/files/normalize-input-media.js +1 -2
- package/cjs/highlevel/methods/files/normalize-input-media.js.map +1 -1
- package/cjs/highlevel/methods/files/upload-file.js +7 -6
- package/cjs/highlevel/methods/files/upload-file.js.map +1 -1
- package/cjs/highlevel/methods/files/upload-media.js.map +1 -1
- package/cjs/highlevel/methods/forums/iter-forum-topics.js.map +1 -1
- package/cjs/highlevel/methods/invite-links/get-primary-invite-link.js.map +1 -1
- package/cjs/highlevel/methods/invite-links/iter-invite-link-members.js.map +1 -1
- package/cjs/highlevel/methods/invite-links/iter-invite-links.js.map +1 -1
- package/cjs/highlevel/methods/messages/close-poll.js.map +1 -1
- package/cjs/highlevel/methods/messages/delete-messages.js.map +1 -1
- package/cjs/highlevel/methods/messages/edit-inline-message.js.map +1 -1
- package/cjs/highlevel/methods/messages/edit-message.js.map +1 -1
- package/cjs/highlevel/methods/messages/find-in-update.js.map +1 -1
- package/cjs/highlevel/methods/messages/forward-messages.js.map +1 -1
- package/cjs/highlevel/methods/messages/get-callback-query-message.js.map +1 -1
- package/cjs/highlevel/methods/messages/get-discussion-message.js.map +1 -1
- package/cjs/highlevel/methods/messages/get-history.js +5 -1
- package/cjs/highlevel/methods/messages/get-history.js.map +1 -1
- package/cjs/highlevel/methods/messages/get-message-by-link.js.map +1 -1
- package/cjs/highlevel/methods/messages/get-message-group.js.map +1 -1
- package/cjs/highlevel/methods/messages/get-message-reactions.js.map +1 -1
- package/cjs/highlevel/methods/messages/get-messages.js.map +1 -1
- package/cjs/highlevel/methods/messages/get-reply-to.js.map +1 -1
- package/cjs/highlevel/methods/messages/iter-history.js.map +1 -1
- package/cjs/highlevel/methods/messages/iter-reaction-users.js.map +1 -1
- package/cjs/highlevel/methods/messages/iter-search-global.js.map +1 -1
- package/cjs/highlevel/methods/messages/iter-search-messages.js.map +1 -1
- package/cjs/highlevel/methods/messages/read-history.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-answer.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-comment.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-common.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-copy-group.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-copy.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-media-group.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-media.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-quote.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-text.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-typing.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-vote.js.map +1 -1
- package/cjs/highlevel/methods/messages/translate-text.js.map +1 -1
- package/cjs/highlevel/methods/messages/unpin-all-messages.js.map +1 -1
- package/cjs/highlevel/methods/misc/normalize-privacy-rules.js.map +1 -1
- package/cjs/highlevel/methods/misc/normalize-text.js.map +1 -1
- package/cjs/highlevel/methods/misc/with-params.js.map +1 -1
- package/cjs/highlevel/methods/password/change-cloud-password.js.map +1 -1
- package/cjs/highlevel/methods/password/enable-cloud-password.js.map +1 -1
- package/cjs/highlevel/methods/password/remove-cloud-password.js.map +1 -1
- package/cjs/highlevel/methods/premium/can-apply-boost.js.map +1 -1
- package/cjs/highlevel/methods/premium/iter-boosters.js.map +1 -1
- package/cjs/highlevel/methods/stickers/create-sticker-set.js.map +1 -1
- package/cjs/highlevel/methods/stickers/delete-sticker-from-set.js.map +1 -1
- package/cjs/highlevel/methods/stickers/get-custom-emojis.js.map +1 -1
- package/cjs/highlevel/methods/stickers/move-sticker-in-set.js.map +1 -1
- package/cjs/highlevel/methods/stories/can-send-story.js.map +1 -1
- package/cjs/highlevel/methods/stories/edit-story.js.map +1 -1
- package/cjs/highlevel/methods/stories/find-in-update.js.map +1 -1
- package/cjs/highlevel/methods/stories/hide-my-stories-views.js.map +1 -1
- package/cjs/highlevel/methods/stories/iter-all-stories.js.map +1 -1
- package/cjs/highlevel/methods/stories/iter-profile-stories.js.map +1 -1
- package/cjs/highlevel/methods/stories/iter-story-viewers.js.map +1 -1
- package/cjs/highlevel/methods/stories/send-story.js.map +1 -1
- package/cjs/highlevel/methods/users/delete-profile-photos.js.map +1 -1
- package/cjs/highlevel/methods/users/get-users.js.map +1 -1
- package/cjs/highlevel/methods/users/iter-profile-photos.js.map +1 -1
- package/cjs/highlevel/methods/users/resolve-peer-many.js.map +1 -1
- package/cjs/highlevel/methods/users/resolve-peer.js.map +1 -1
- package/cjs/highlevel/methods/users/set-my-emoji-status.js.map +1 -1
- package/cjs/highlevel/methods/users/set-my-profile-photo.js.map +1 -1
- package/cjs/highlevel/storage/service/current-user.js +2 -0
- package/cjs/highlevel/storage/service/current-user.js.map +1 -1
- package/cjs/highlevel/storage/service/peers.js +5 -1
- package/cjs/highlevel/storage/service/peers.js.map +1 -1
- package/cjs/highlevel/storage/service/ref-messages.js +3 -0
- package/cjs/highlevel/storage/service/ref-messages.js.map +1 -1
- package/cjs/highlevel/storage/service/updates.js +1 -0
- package/cjs/highlevel/storage/service/updates.js.map +1 -1
- package/cjs/highlevel/storage/storage.d.ts +1 -1
- package/cjs/highlevel/storage/storage.js +17 -4
- package/cjs/highlevel/storage/storage.js.map +1 -1
- package/cjs/highlevel/types/auth/sent-code.js +1 -0
- package/cjs/highlevel/types/auth/sent-code.js.map +1 -1
- package/cjs/highlevel/types/bots/game-high-score.js +2 -0
- package/cjs/highlevel/types/bots/game-high-score.js.map +1 -1
- package/cjs/highlevel/types/bots/inline-message/factories.js.map +1 -1
- package/cjs/highlevel/types/bots/inline-result/factories.js.map +1 -1
- package/cjs/highlevel/types/bots/keyboards/builder.js +2 -1
- package/cjs/highlevel/types/bots/keyboards/builder.js.map +1 -1
- package/cjs/highlevel/types/bots/keyboards/factories.js.map +1 -1
- package/cjs/highlevel/types/calls/discard-reason.js.map +1 -1
- package/cjs/highlevel/types/conversation.js +13 -7
- package/cjs/highlevel/types/conversation.js.map +1 -1
- package/cjs/highlevel/types/errors.js +3 -0
- package/cjs/highlevel/types/errors.js.map +1 -1
- package/cjs/highlevel/types/files/file-location.js +3 -0
- package/cjs/highlevel/types/files/file-location.js.map +1 -1
- package/cjs/highlevel/types/files/uploaded-file.js +1 -1
- package/cjs/highlevel/types/files/uploaded-file.js.map +1 -1
- package/cjs/highlevel/types/files/utils.d.ts +3 -3
- package/cjs/highlevel/types/files/utils.js.map +1 -1
- package/cjs/highlevel/types/files/web-document.js +1 -0
- package/cjs/highlevel/types/files/web-document.js.map +1 -1
- package/cjs/highlevel/types/media/audio.js +3 -2
- package/cjs/highlevel/types/media/audio.js.map +1 -1
- package/cjs/highlevel/types/media/contact.js +2 -1
- package/cjs/highlevel/types/media/contact.js.map +1 -1
- package/cjs/highlevel/types/media/dice.js +125 -124
- package/cjs/highlevel/types/media/dice.js.map +1 -1
- package/cjs/highlevel/types/media/document-utils.js.map +1 -1
- package/cjs/highlevel/types/media/document.js +2 -4
- package/cjs/highlevel/types/media/document.js.map +1 -1
- package/cjs/highlevel/types/media/game.js +2 -1
- package/cjs/highlevel/types/media/game.js.map +1 -1
- package/cjs/highlevel/types/media/invoice.js +4 -1
- package/cjs/highlevel/types/media/invoice.js.map +1 -1
- package/cjs/highlevel/types/media/location.js +4 -5
- package/cjs/highlevel/types/media/location.js.map +1 -1
- package/cjs/highlevel/types/media/photo.js +8 -1
- package/cjs/highlevel/types/media/photo.js.map +1 -1
- package/cjs/highlevel/types/media/poll.js +4 -1
- package/cjs/highlevel/types/media/poll.js.map +1 -1
- package/cjs/highlevel/types/media/sticker.js +3 -1
- package/cjs/highlevel/types/media/sticker.js.map +1 -1
- package/cjs/highlevel/types/media/story.js +3 -1
- package/cjs/highlevel/types/media/story.js.map +1 -1
- package/cjs/highlevel/types/media/thumbnail.js +35 -22
- package/cjs/highlevel/types/media/thumbnail.js.map +1 -1
- package/cjs/highlevel/types/media/venue.js +2 -1
- package/cjs/highlevel/types/media/venue.js.map +1 -1
- package/cjs/highlevel/types/media/video.js +3 -1
- package/cjs/highlevel/types/media/video.js.map +1 -1
- package/cjs/highlevel/types/media/voice.js +2 -1
- package/cjs/highlevel/types/media/voice.js.map +1 -1
- package/cjs/highlevel/types/media/web-page.js +2 -1
- package/cjs/highlevel/types/media/web-page.js.map +1 -1
- package/cjs/highlevel/types/messages/dialog.js +3 -0
- package/cjs/highlevel/types/messages/dialog.js.map +1 -1
- package/cjs/highlevel/types/messages/draft-message.js +1 -0
- package/cjs/highlevel/types/messages/draft-message.js.map +1 -1
- package/cjs/highlevel/types/messages/message-action.js.map +1 -1
- package/cjs/highlevel/types/messages/message-entity.js +2 -0
- package/cjs/highlevel/types/messages/message-entity.js.map +1 -1
- package/cjs/highlevel/types/messages/message-forward.js +2 -0
- package/cjs/highlevel/types/messages/message-forward.js.map +1 -1
- package/cjs/highlevel/types/messages/message-media.js.map +1 -1
- package/cjs/highlevel/types/messages/message-reactions.js +4 -0
- package/cjs/highlevel/types/messages/message-reactions.js.map +1 -1
- package/cjs/highlevel/types/messages/message-replies.js +2 -0
- package/cjs/highlevel/types/messages/message-replies.js.map +1 -1
- package/cjs/highlevel/types/messages/message.js +6 -0
- package/cjs/highlevel/types/messages/message.js.map +1 -1
- package/cjs/highlevel/types/messages/replied-message.js +2 -0
- package/cjs/highlevel/types/messages/replied-message.js.map +1 -1
- package/cjs/highlevel/types/misc/sticker-set.js +7 -1
- package/cjs/highlevel/types/misc/sticker-set.js.map +1 -1
- package/cjs/highlevel/types/misc/takeout-session.js +5 -0
- package/cjs/highlevel/types/misc/takeout-session.js.map +1 -1
- package/cjs/highlevel/types/peers/chat-colors.js +2 -0
- package/cjs/highlevel/types/peers/chat-colors.js.map +1 -1
- package/cjs/highlevel/types/peers/chat-event/actions.js.map +1 -1
- package/cjs/highlevel/types/peers/chat-event/filters.js.map +1 -1
- package/cjs/highlevel/types/peers/chat-event/index.js +2 -0
- package/cjs/highlevel/types/peers/chat-event/index.js.map +1 -1
- package/cjs/highlevel/types/peers/chat-invite-link-member.js +2 -0
- package/cjs/highlevel/types/peers/chat-invite-link-member.js.map +1 -1
- package/cjs/highlevel/types/peers/chat-invite-link.js +2 -0
- package/cjs/highlevel/types/peers/chat-invite-link.js.map +1 -1
- package/cjs/highlevel/types/peers/chat-location.js +1 -0
- package/cjs/highlevel/types/peers/chat-location.js.map +1 -1
- package/cjs/highlevel/types/peers/chat-member.js +2 -0
- package/cjs/highlevel/types/peers/chat-member.js.map +1 -1
- package/cjs/highlevel/types/peers/chat-permissions.js +1 -0
- package/cjs/highlevel/types/peers/chat-permissions.js.map +1 -1
- package/cjs/highlevel/types/peers/chat-photo.js +5 -0
- package/cjs/highlevel/types/peers/chat-photo.js.map +1 -1
- package/cjs/highlevel/types/peers/chat-preview.js +2 -0
- package/cjs/highlevel/types/peers/chat-preview.js.map +1 -1
- package/cjs/highlevel/types/peers/chat.js +12 -1
- package/cjs/highlevel/types/peers/chat.js.map +1 -1
- package/cjs/highlevel/types/peers/forum-topic.js +9 -6
- package/cjs/highlevel/types/peers/forum-topic.js.map +1 -1
- package/cjs/highlevel/types/peers/peer.js.map +1 -1
- package/cjs/highlevel/types/peers/peers-index.js +3 -1
- package/cjs/highlevel/types/peers/peers-index.js.map +1 -1
- package/cjs/highlevel/types/peers/user.js +5 -1
- package/cjs/highlevel/types/peers/user.js.map +1 -1
- package/cjs/highlevel/types/premium/boost-slot.js +2 -0
- package/cjs/highlevel/types/premium/boost-slot.js.map +1 -1
- package/cjs/highlevel/types/premium/boost-stats.js +1 -0
- package/cjs/highlevel/types/premium/boost-stats.js.map +1 -1
- package/cjs/highlevel/types/premium/boost.js +2 -0
- package/cjs/highlevel/types/premium/boost.js.map +1 -1
- package/cjs/highlevel/types/reactions/emoji-status.js +1 -0
- package/cjs/highlevel/types/reactions/emoji-status.js.map +1 -1
- package/cjs/highlevel/types/reactions/peer-reaction.js +2 -0
- package/cjs/highlevel/types/reactions/peer-reaction.js.map +1 -1
- package/cjs/highlevel/types/reactions/reaction-count.js +1 -0
- package/cjs/highlevel/types/reactions/reaction-count.js.map +1 -1
- package/cjs/highlevel/types/reactions/types.js.map +1 -1
- package/cjs/highlevel/types/stories/all-stories.d.ts +2 -2
- package/cjs/highlevel/types/stories/all-stories.js +3 -1
- package/cjs/highlevel/types/stories/all-stories.js.map +1 -1
- package/cjs/highlevel/types/stories/interactive/base.js +1 -0
- package/cjs/highlevel/types/stories/interactive/base.js.map +1 -1
- package/cjs/highlevel/types/stories/interactive/channel-post.js +3 -1
- package/cjs/highlevel/types/stories/interactive/channel-post.js.map +1 -1
- package/cjs/highlevel/types/stories/interactive/index.js.map +1 -1
- package/cjs/highlevel/types/stories/interactive/input.js +1 -0
- package/cjs/highlevel/types/stories/interactive/input.js.map +1 -1
- package/cjs/highlevel/types/stories/interactive/location.js +2 -1
- package/cjs/highlevel/types/stories/interactive/location.js.map +1 -1
- package/cjs/highlevel/types/stories/interactive/reaction.js +2 -1
- package/cjs/highlevel/types/stories/interactive/reaction.js.map +1 -1
- package/cjs/highlevel/types/stories/interactive/venue.js +2 -1
- package/cjs/highlevel/types/stories/interactive/venue.js.map +1 -1
- package/cjs/highlevel/types/stories/peer-stories.js +2 -0
- package/cjs/highlevel/types/stories/peer-stories.js.map +1 -1
- package/cjs/highlevel/types/stories/stealth-mode.js +1 -0
- package/cjs/highlevel/types/stories/stealth-mode.js.map +1 -1
- package/cjs/highlevel/types/stories/story-interactions.js +2 -0
- package/cjs/highlevel/types/stories/story-interactions.js.map +1 -1
- package/cjs/highlevel/types/stories/story-viewer.d.ts +1 -1
- package/cjs/highlevel/types/stories/story-viewer.js +6 -0
- package/cjs/highlevel/types/stories/story-viewer.js.map +1 -1
- package/cjs/highlevel/types/stories/story.js +2 -0
- package/cjs/highlevel/types/stories/story.js.map +1 -1
- package/cjs/highlevel/types/updates/bot-chat-join-request.js +2 -0
- package/cjs/highlevel/types/updates/bot-chat-join-request.js.map +1 -1
- package/cjs/highlevel/types/updates/bot-reaction.js +4 -0
- package/cjs/highlevel/types/updates/bot-reaction.js.map +1 -1
- package/cjs/highlevel/types/updates/bot-stopped.js +2 -0
- package/cjs/highlevel/types/updates/bot-stopped.js.map +1 -1
- package/cjs/highlevel/types/updates/callback-query.js +4 -0
- package/cjs/highlevel/types/updates/callback-query.js.map +1 -1
- package/cjs/highlevel/types/updates/chat-join-request.js +2 -0
- package/cjs/highlevel/types/updates/chat-join-request.js.map +1 -1
- package/cjs/highlevel/types/updates/chat-member-update.js +2 -0
- package/cjs/highlevel/types/updates/chat-member-update.js.map +1 -1
- package/cjs/highlevel/types/updates/chosen-inline-result.js +2 -0
- package/cjs/highlevel/types/updates/chosen-inline-result.js.map +1 -1
- package/cjs/highlevel/types/updates/delete-message-update.js +1 -0
- package/cjs/highlevel/types/updates/delete-message-update.js.map +1 -1
- package/cjs/highlevel/types/updates/delete-story-update.js +2 -0
- package/cjs/highlevel/types/updates/delete-story-update.js.map +1 -1
- package/cjs/highlevel/types/updates/history-read-update.js +1 -0
- package/cjs/highlevel/types/updates/history-read-update.js.map +1 -1
- package/cjs/highlevel/types/updates/inline-query.js +2 -0
- package/cjs/highlevel/types/updates/inline-query.js.map +1 -1
- package/cjs/highlevel/types/updates/parse-update.js.map +1 -1
- package/cjs/highlevel/types/updates/poll-update.js +2 -0
- package/cjs/highlevel/types/updates/poll-update.js.map +1 -1
- package/cjs/highlevel/types/updates/poll-vote.js +2 -0
- package/cjs/highlevel/types/updates/poll-vote.js.map +1 -1
- package/cjs/highlevel/types/updates/pre-checkout-query.js +2 -0
- package/cjs/highlevel/types/updates/pre-checkout-query.js.map +1 -1
- package/cjs/highlevel/types/updates/story-update.js +2 -0
- package/cjs/highlevel/types/updates/story-update.js.map +1 -1
- package/cjs/highlevel/types/updates/user-status-update.js +1 -0
- package/cjs/highlevel/types/updates/user-status-update.js.map +1 -1
- package/cjs/highlevel/types/updates/user-typing-update.js +1 -0
- package/cjs/highlevel/types/updates/user-typing-update.js.map +1 -1
- package/cjs/highlevel/updates/manager.d.ts +1 -1
- package/cjs/highlevel/updates/manager.js +50 -28
- package/cjs/highlevel/updates/manager.js.map +1 -1
- package/cjs/highlevel/updates/parsed.js.map +1 -1
- package/cjs/highlevel/updates/utils.js.map +1 -1
- package/cjs/highlevel/utils/convert-file-id.js.map +1 -1
- package/cjs/highlevel/utils/entities.js.map +1 -1
- package/cjs/highlevel/utils/file-type.d.ts +1 -0
- package/cjs/highlevel/utils/file-type.js +35 -1
- package/cjs/highlevel/utils/file-type.js.map +1 -1
- package/cjs/highlevel/utils/file-utils.js +1 -1
- package/cjs/highlevel/utils/file-utils.js.map +1 -1
- package/cjs/highlevel/utils/inline-utils.js.map +1 -1
- package/cjs/highlevel/utils/inspectable.js.map +1 -1
- package/cjs/highlevel/utils/memoize.js.map +1 -1
- package/cjs/highlevel/utils/peer-utils.js.map +1 -1
- package/cjs/highlevel/utils/query-batcher.js.map +1 -1
- package/cjs/highlevel/utils/rps-meter.js +3 -0
- package/cjs/highlevel/utils/rps-meter.js.map +1 -1
- package/cjs/highlevel/utils/stream-utils.js.map +1 -1
- package/cjs/highlevel/utils/string-session.d.ts +1 -2
- package/cjs/highlevel/utils/string-session.js +27 -7
- package/cjs/highlevel/utils/string-session.js.map +1 -1
- package/cjs/highlevel/utils/voice-utils.js.map +1 -1
- package/cjs/highlevel/worker/app-config.d.ts +2 -3
- package/cjs/highlevel/worker/app-config.js +6 -3
- package/cjs/highlevel/worker/app-config.js.map +1 -1
- package/cjs/highlevel/worker/errors.js.map +1 -1
- package/cjs/highlevel/worker/invoker.js +3 -2
- package/cjs/highlevel/worker/invoker.js.map +1 -1
- package/cjs/highlevel/worker/port.d.ts +16 -17
- package/cjs/highlevel/worker/port.js +74 -49
- package/cjs/highlevel/worker/port.js.map +1 -1
- package/cjs/highlevel/worker/protocol.d.ts +2 -2
- package/cjs/highlevel/worker/protocol.js.map +1 -1
- package/cjs/highlevel/worker/storage.d.ts +9 -13
- package/cjs/highlevel/worker/storage.js +34 -19
- package/cjs/highlevel/worker/storage.js.map +1 -1
- package/cjs/highlevel/worker/worker.js +3 -0
- package/cjs/highlevel/worker/worker.js.map +1 -1
- package/cjs/network/auth-key.js +8 -1
- package/cjs/network/auth-key.js.map +1 -1
- package/cjs/network/authorization.js.map +1 -1
- package/cjs/network/client.d.ts +1 -1
- package/cjs/network/client.js +39 -14
- package/cjs/network/client.js.map +1 -1
- package/cjs/network/config-manager.js.map +1 -1
- package/cjs/network/mtproto-session.d.ts +1 -1
- package/cjs/network/mtproto-session.js +40 -30
- package/cjs/network/mtproto-session.js.map +1 -1
- package/cjs/network/multi-session-connection.d.ts +2 -2
- package/cjs/network/multi-session-connection.js +13 -7
- package/cjs/network/multi-session-connection.js.map +1 -1
- package/cjs/network/network-manager.d.ts +2 -3
- package/cjs/network/network-manager.js +49 -28
- package/cjs/network/network-manager.js.map +1 -1
- package/cjs/network/persistent-connection.d.ts +3 -3
- package/cjs/network/persistent-connection.js +33 -22
- package/cjs/network/persistent-connection.js.map +1 -1
- package/cjs/network/server-salt.js +4 -5
- package/cjs/network/server-salt.js.map +1 -1
- package/cjs/network/session-connection.d.ts +1 -1
- package/cjs/network/session-connection.js +22 -12
- package/cjs/network/session-connection.js.map +1 -1
- package/cjs/network/transports/abstract.d.ts +2 -2
- package/cjs/network/transports/abstract.js +1 -0
- package/cjs/network/transports/abstract.js.map +1 -1
- package/cjs/network/transports/intermediate.js +1 -0
- package/cjs/network/transports/intermediate.js.map +1 -1
- package/cjs/network/transports/obfuscated.js +3 -0
- package/cjs/network/transports/obfuscated.js.map +1 -1
- package/cjs/network/transports/streamed.d.ts +1 -1
- package/cjs/network/transports/streamed.js +1 -4
- package/cjs/network/transports/streamed.js.map +1 -1
- package/cjs/network/transports/wrapped.d.ts +1 -1
- package/cjs/network/transports/wrapped.js +2 -0
- package/cjs/network/transports/wrapped.js.map +1 -1
- package/cjs/platform.js.map +1 -1
- package/cjs/storage/driver.js +3 -4
- package/cjs/storage/driver.js.map +1 -1
- package/cjs/storage/memory/driver.js +1 -3
- package/cjs/storage/memory/driver.js.map +1 -1
- package/cjs/storage/memory/index.js +5 -7
- package/cjs/storage/memory/index.js.map +1 -1
- package/cjs/storage/memory/repository/auth-keys.d.ts +1 -1
- package/cjs/storage/memory/repository/auth-keys.js +2 -0
- package/cjs/storage/memory/repository/auth-keys.js.map +1 -1
- package/cjs/storage/memory/repository/kv.d.ts +1 -1
- package/cjs/storage/memory/repository/kv.js +2 -0
- package/cjs/storage/memory/repository/kv.js.map +1 -1
- package/cjs/storage/memory/repository/peers.d.ts +1 -1
- package/cjs/storage/memory/repository/peers.js +2 -0
- package/cjs/storage/memory/repository/peers.js.map +1 -1
- package/cjs/storage/memory/repository/ref-messages.d.ts +1 -1
- package/cjs/storage/memory/repository/ref-messages.js +2 -0
- package/cjs/storage/memory/repository/ref-messages.js.map +1 -1
- package/cjs/storage/service/auth-keys.js +2 -0
- package/cjs/storage/service/auth-keys.js.map +1 -1
- package/cjs/storage/service/base.js +4 -0
- package/cjs/storage/service/base.js.map +1 -1
- package/cjs/storage/service/default-dcs.js +2 -0
- package/cjs/storage/service/default-dcs.js.map +1 -1
- package/cjs/storage/service/future-salts.js +2 -1
- package/cjs/storage/service/future-salts.js.map +1 -1
- package/cjs/storage/sqlite/driver.js +10 -10
- package/cjs/storage/sqlite/driver.js.map +1 -1
- package/cjs/storage/sqlite/index.d.ts +1 -1
- package/cjs/storage/sqlite/index.js +5 -0
- package/cjs/storage/sqlite/index.js.map +1 -1
- package/cjs/storage/sqlite/repository/auth-keys.js +9 -0
- package/cjs/storage/sqlite/repository/auth-keys.js.map +1 -1
- package/cjs/storage/sqlite/repository/kv.js +5 -0
- package/cjs/storage/sqlite/repository/kv.js.map +1 -1
- package/cjs/storage/sqlite/repository/peers.js +6 -0
- package/cjs/storage/sqlite/repository/peers.js.map +1 -1
- package/cjs/storage/sqlite/repository/ref-messages.d.ts +1 -1
- package/cjs/storage/sqlite/repository/ref-messages.js +6 -0
- package/cjs/storage/sqlite/repository/ref-messages.js.map +1 -1
- package/cjs/storage/storage.d.ts +1 -3
- package/cjs/storage/storage.js +21 -13
- package/cjs/storage/storage.js.map +1 -1
- package/cjs/types/errors.js +13 -0
- package/cjs/types/errors.js.map +1 -1
- package/cjs/utils/async-lock.js +1 -3
- package/cjs/utils/async-lock.js.map +1 -1
- package/cjs/utils/bigint-utils.js.map +1 -1
- package/cjs/utils/binary/asn1-parser.js.map +1 -1
- package/cjs/utils/buffer-utils.js.map +1 -1
- package/cjs/utils/condition-variable.js +2 -0
- package/cjs/utils/condition-variable.js.map +1 -1
- package/cjs/utils/crypto/factorization.js.map +1 -1
- package/cjs/utils/crypto/keys.js.map +1 -1
- package/cjs/utils/crypto/miller-rabin.js.map +1 -1
- package/cjs/utils/crypto/password.js.map +1 -1
- package/cjs/utils/crypto/utils.js.map +1 -1
- package/cjs/utils/dcs.js +1 -1
- package/cjs/utils/dcs.js.map +1 -1
- package/cjs/utils/deque.js +8 -2
- package/cjs/utils/deque.js.map +1 -1
- package/cjs/utils/early-timer.js +4 -1
- package/cjs/utils/early-timer.js.map +1 -1
- package/cjs/utils/error-reporting.js.map +1 -1
- package/cjs/utils/function-utils.js.map +1 -1
- package/cjs/utils/linked-list.js +4 -1
- package/cjs/utils/linked-list.js.map +1 -1
- package/cjs/utils/links/bots.js.map +1 -1
- package/cjs/utils/links/chat.js.map +1 -1
- package/cjs/utils/links/common.js.map +1 -1
- package/cjs/utils/links/misc.js.map +1 -1
- package/cjs/utils/logger.d.ts +2 -2
- package/cjs/utils/logger.js +21 -14
- package/cjs/utils/logger.js.map +1 -1
- package/cjs/utils/long-utils.js +2 -6
- package/cjs/utils/long-utils.js.map +1 -1
- package/cjs/utils/lru-map.js +5 -1
- package/cjs/utils/lru-map.js.map +1 -1
- package/cjs/utils/lru-set.js +4 -0
- package/cjs/utils/lru-set.js.map +1 -1
- package/cjs/utils/peer-utils.js.map +1 -1
- package/cjs/utils/reloadable.d.ts +1 -1
- package/cjs/utils/reloadable.js +10 -7
- package/cjs/utils/reloadable.js.map +1 -1
- package/cjs/utils/sorted-array.js +2 -0
- package/cjs/utils/sorted-array.js.map +1 -1
- package/cjs/utils/tl-json.js.map +1 -1
- package/cjs/utils/type-assertions.js.map +1 -1
- package/esm/highlevel/base.d.ts +1 -1
- package/esm/highlevel/base.js +29 -23
- package/esm/highlevel/base.js.map +1 -1
- package/esm/highlevel/client.d.ts +2 -1
- package/esm/highlevel/client.js +1 -0
- package/esm/highlevel/client.js.map +1 -1
- package/esm/highlevel/managers/app-config-manager.js +7 -5
- package/esm/highlevel/managers/app-config-manager.js.map +1 -1
- package/esm/highlevel/methods/_init.js.map +1 -1
- package/esm/highlevel/methods/auth/start-test.js.map +1 -1
- package/esm/highlevel/methods/auth/start.js.map +1 -1
- package/esm/highlevel/methods/auth/utils.js.map +1 -1
- package/esm/highlevel/methods/bots/get-callback-answer.js.map +1 -1
- package/esm/highlevel/methods/bots/get-game-high-scores.js.map +1 -1
- package/esm/highlevel/methods/bots/normalize-command-scope.js.map +1 -1
- package/esm/highlevel/methods/bots/set-my-commands.js.map +1 -1
- package/esm/highlevel/methods/chats/add-chat-members.js.map +1 -1
- package/esm/highlevel/methods/chats/ban-chat-member.js.map +1 -1
- package/esm/highlevel/methods/chats/batched-queries.js.map +1 -1
- package/esm/highlevel/methods/chats/delete-chat-photo.js.map +1 -1
- package/esm/highlevel/methods/chats/delete-history.js.map +1 -1
- package/esm/highlevel/methods/chats/get-chat-event-log.js.map +1 -1
- package/esm/highlevel/methods/chats/get-chat-member.js.map +1 -1
- package/esm/highlevel/methods/chats/get-chat-members.js.map +1 -1
- package/esm/highlevel/methods/chats/get-chat-preview.js.map +1 -1
- package/esm/highlevel/methods/chats/get-chat.js.map +1 -1
- package/esm/highlevel/methods/chats/get-full-chat.js.map +1 -1
- package/esm/highlevel/methods/chats/get-nearby-chats.js.map +1 -1
- package/esm/highlevel/methods/chats/get-similar-channels.js.map +1 -1
- package/esm/highlevel/methods/chats/iter-chat-event-log.js.map +1 -1
- package/esm/highlevel/methods/chats/iter-chat-members.js.map +1 -1
- package/esm/highlevel/methods/chats/join-chat.js.map +1 -1
- package/esm/highlevel/methods/chats/kick-chat-member.js.map +1 -1
- package/esm/highlevel/methods/chats/leave-chat.js.map +1 -1
- package/esm/highlevel/methods/chats/open-chat.js.map +1 -1
- package/esm/highlevel/methods/chats/reorder-usernames.js.map +1 -1
- package/esm/highlevel/methods/chats/restrict-chat-member.js.map +1 -1
- package/esm/highlevel/methods/chats/save-draft.js.map +1 -1
- package/esm/highlevel/methods/chats/set-chat-color.js.map +1 -1
- package/esm/highlevel/methods/chats/set-chat-photo.js.map +1 -1
- package/esm/highlevel/methods/chats/set-chat-title.js.map +1 -1
- package/esm/highlevel/methods/chats/toggle-fragment-username.js.map +1 -1
- package/esm/highlevel/methods/chats/unarchive-chats.js.map +1 -1
- package/esm/highlevel/methods/chats/unban-chat-member.js.map +1 -1
- package/esm/highlevel/methods/contacts/delete-contacts.js.map +1 -1
- package/esm/highlevel/methods/dialogs/create-folder.js.map +1 -1
- package/esm/highlevel/methods/dialogs/edit-folder.js.map +1 -1
- package/esm/highlevel/methods/dialogs/find-folder.js.map +1 -1
- package/esm/highlevel/methods/dialogs/get-folders.js.map +1 -1
- package/esm/highlevel/methods/dialogs/iter-dialogs.js.map +1 -1
- package/esm/highlevel/methods/files/download-buffer.js.map +1 -1
- package/esm/highlevel/methods/files/download-iterable.js +1 -1
- package/esm/highlevel/methods/files/download-iterable.js.map +1 -1
- package/esm/highlevel/methods/files/download-node-stream.js.map +1 -1
- package/esm/highlevel/methods/files/download-stream.js.map +1 -1
- package/esm/highlevel/methods/files/normalize-file-to-document.js.map +1 -1
- package/esm/highlevel/methods/files/normalize-input-file.js.map +1 -1
- package/esm/highlevel/methods/files/normalize-input-media.js +1 -2
- package/esm/highlevel/methods/files/normalize-input-media.js.map +1 -1
- package/esm/highlevel/methods/files/upload-file.js +8 -7
- package/esm/highlevel/methods/files/upload-file.js.map +1 -1
- package/esm/highlevel/methods/files/upload-media.js.map +1 -1
- package/esm/highlevel/methods/forums/iter-forum-topics.js.map +1 -1
- package/esm/highlevel/methods/invite-links/get-primary-invite-link.js.map +1 -1
- package/esm/highlevel/methods/invite-links/iter-invite-link-members.js.map +1 -1
- package/esm/highlevel/methods/invite-links/iter-invite-links.js.map +1 -1
- package/esm/highlevel/methods/messages/close-poll.js.map +1 -1
- package/esm/highlevel/methods/messages/delete-messages.js.map +1 -1
- package/esm/highlevel/methods/messages/edit-inline-message.js.map +1 -1
- package/esm/highlevel/methods/messages/edit-message.js.map +1 -1
- package/esm/highlevel/methods/messages/find-in-update.js.map +1 -1
- package/esm/highlevel/methods/messages/forward-messages.js.map +1 -1
- package/esm/highlevel/methods/messages/get-callback-query-message.js.map +1 -1
- package/esm/highlevel/methods/messages/get-discussion-message.js.map +1 -1
- package/esm/highlevel/methods/messages/get-history.js +5 -1
- package/esm/highlevel/methods/messages/get-history.js.map +1 -1
- package/esm/highlevel/methods/messages/get-message-by-link.js.map +1 -1
- package/esm/highlevel/methods/messages/get-message-group.js.map +1 -1
- package/esm/highlevel/methods/messages/get-message-reactions.js.map +1 -1
- package/esm/highlevel/methods/messages/get-messages.js.map +1 -1
- package/esm/highlevel/methods/messages/get-reply-to.js.map +1 -1
- package/esm/highlevel/methods/messages/iter-history.js.map +1 -1
- package/esm/highlevel/methods/messages/iter-reaction-users.js.map +1 -1
- package/esm/highlevel/methods/messages/iter-search-global.js.map +1 -1
- package/esm/highlevel/methods/messages/iter-search-messages.js.map +1 -1
- package/esm/highlevel/methods/messages/read-history.js.map +1 -1
- package/esm/highlevel/methods/messages/send-answer.js.map +1 -1
- package/esm/highlevel/methods/messages/send-comment.js.map +1 -1
- package/esm/highlevel/methods/messages/send-common.js.map +1 -1
- package/esm/highlevel/methods/messages/send-copy-group.js.map +1 -1
- package/esm/highlevel/methods/messages/send-copy.js.map +1 -1
- package/esm/highlevel/methods/messages/send-media-group.js.map +1 -1
- package/esm/highlevel/methods/messages/send-media.js.map +1 -1
- package/esm/highlevel/methods/messages/send-quote.js.map +1 -1
- package/esm/highlevel/methods/messages/send-text.js.map +1 -1
- package/esm/highlevel/methods/messages/send-typing.js.map +1 -1
- package/esm/highlevel/methods/messages/send-vote.js.map +1 -1
- package/esm/highlevel/methods/messages/translate-text.js.map +1 -1
- package/esm/highlevel/methods/messages/unpin-all-messages.js.map +1 -1
- package/esm/highlevel/methods/misc/normalize-privacy-rules.js.map +1 -1
- package/esm/highlevel/methods/misc/normalize-text.js.map +1 -1
- package/esm/highlevel/methods/misc/with-params.js.map +1 -1
- package/esm/highlevel/methods/password/change-cloud-password.js.map +1 -1
- package/esm/highlevel/methods/password/enable-cloud-password.js.map +1 -1
- package/esm/highlevel/methods/password/remove-cloud-password.js.map +1 -1
- package/esm/highlevel/methods/premium/can-apply-boost.js.map +1 -1
- package/esm/highlevel/methods/premium/iter-boosters.js.map +1 -1
- package/esm/highlevel/methods/stickers/create-sticker-set.js.map +1 -1
- package/esm/highlevel/methods/stickers/delete-sticker-from-set.js.map +1 -1
- package/esm/highlevel/methods/stickers/get-custom-emojis.js.map +1 -1
- package/esm/highlevel/methods/stickers/move-sticker-in-set.js.map +1 -1
- package/esm/highlevel/methods/stories/can-send-story.js.map +1 -1
- package/esm/highlevel/methods/stories/edit-story.js.map +1 -1
- package/esm/highlevel/methods/stories/find-in-update.js.map +1 -1
- package/esm/highlevel/methods/stories/hide-my-stories-views.js.map +1 -1
- package/esm/highlevel/methods/stories/iter-all-stories.js.map +1 -1
- package/esm/highlevel/methods/stories/iter-profile-stories.js.map +1 -1
- package/esm/highlevel/methods/stories/iter-story-viewers.js.map +1 -1
- package/esm/highlevel/methods/stories/send-story.js.map +1 -1
- package/esm/highlevel/methods/users/delete-profile-photos.js.map +1 -1
- package/esm/highlevel/methods/users/get-users.js.map +1 -1
- package/esm/highlevel/methods/users/iter-profile-photos.js.map +1 -1
- package/esm/highlevel/methods/users/resolve-peer-many.js.map +1 -1
- package/esm/highlevel/methods/users/resolve-peer.js.map +1 -1
- package/esm/highlevel/methods/users/set-my-emoji-status.js.map +1 -1
- package/esm/highlevel/methods/users/set-my-profile-photo.js.map +1 -1
- package/esm/highlevel/storage/service/current-user.js +2 -0
- package/esm/highlevel/storage/service/current-user.js.map +1 -1
- package/esm/highlevel/storage/service/peers.js +5 -1
- package/esm/highlevel/storage/service/peers.js.map +1 -1
- package/esm/highlevel/storage/service/ref-messages.js +3 -0
- package/esm/highlevel/storage/service/ref-messages.js.map +1 -1
- package/esm/highlevel/storage/service/updates.js +1 -0
- package/esm/highlevel/storage/service/updates.js.map +1 -1
- package/esm/highlevel/storage/storage.d.ts +1 -1
- package/esm/highlevel/storage/storage.js +17 -4
- package/esm/highlevel/storage/storage.js.map +1 -1
- package/esm/highlevel/types/auth/sent-code.js +1 -0
- package/esm/highlevel/types/auth/sent-code.js.map +1 -1
- package/esm/highlevel/types/bots/game-high-score.js +2 -0
- package/esm/highlevel/types/bots/game-high-score.js.map +1 -1
- package/esm/highlevel/types/bots/inline-message/factories.js.map +1 -1
- package/esm/highlevel/types/bots/inline-result/factories.js.map +1 -1
- package/esm/highlevel/types/bots/keyboards/builder.js +2 -1
- package/esm/highlevel/types/bots/keyboards/builder.js.map +1 -1
- package/esm/highlevel/types/bots/keyboards/factories.js.map +1 -1
- package/esm/highlevel/types/calls/discard-reason.js.map +1 -1
- package/esm/highlevel/types/conversation.js +13 -7
- package/esm/highlevel/types/conversation.js.map +1 -1
- package/esm/highlevel/types/errors.js +3 -0
- package/esm/highlevel/types/errors.js.map +1 -1
- package/esm/highlevel/types/files/file-location.js +3 -0
- package/esm/highlevel/types/files/file-location.js.map +1 -1
- package/esm/highlevel/types/files/uploaded-file.js +1 -1
- package/esm/highlevel/types/files/uploaded-file.js.map +1 -1
- package/esm/highlevel/types/files/utils.d.ts +1 -1
- package/esm/highlevel/types/files/utils.js.map +1 -1
- package/esm/highlevel/types/files/web-document.js +1 -0
- package/esm/highlevel/types/files/web-document.js.map +1 -1
- package/esm/highlevel/types/media/audio.js +3 -2
- package/esm/highlevel/types/media/audio.js.map +1 -1
- package/esm/highlevel/types/media/contact.js +2 -1
- package/esm/highlevel/types/media/contact.js.map +1 -1
- package/esm/highlevel/types/media/dice.js +125 -124
- package/esm/highlevel/types/media/dice.js.map +1 -1
- package/esm/highlevel/types/media/document-utils.js.map +1 -1
- package/esm/highlevel/types/media/document.js +2 -4
- package/esm/highlevel/types/media/document.js.map +1 -1
- package/esm/highlevel/types/media/game.js +2 -1
- package/esm/highlevel/types/media/game.js.map +1 -1
- package/esm/highlevel/types/media/invoice.js +4 -1
- package/esm/highlevel/types/media/invoice.js.map +1 -1
- package/esm/highlevel/types/media/location.js +4 -5
- package/esm/highlevel/types/media/location.js.map +1 -1
- package/esm/highlevel/types/media/photo.js +8 -1
- package/esm/highlevel/types/media/photo.js.map +1 -1
- package/esm/highlevel/types/media/poll.js +4 -1
- package/esm/highlevel/types/media/poll.js.map +1 -1
- package/esm/highlevel/types/media/sticker.js +3 -1
- package/esm/highlevel/types/media/sticker.js.map +1 -1
- package/esm/highlevel/types/media/story.js +3 -1
- package/esm/highlevel/types/media/story.js.map +1 -1
- package/esm/highlevel/types/media/thumbnail.js +35 -22
- package/esm/highlevel/types/media/thumbnail.js.map +1 -1
- package/esm/highlevel/types/media/venue.js +2 -1
- package/esm/highlevel/types/media/venue.js.map +1 -1
- package/esm/highlevel/types/media/video.js +3 -1
- package/esm/highlevel/types/media/video.js.map +1 -1
- package/esm/highlevel/types/media/voice.js +2 -1
- package/esm/highlevel/types/media/voice.js.map +1 -1
- package/esm/highlevel/types/media/web-page.js +2 -1
- package/esm/highlevel/types/media/web-page.js.map +1 -1
- package/esm/highlevel/types/messages/dialog.js +3 -0
- package/esm/highlevel/types/messages/dialog.js.map +1 -1
- package/esm/highlevel/types/messages/draft-message.js +1 -0
- package/esm/highlevel/types/messages/draft-message.js.map +1 -1
- package/esm/highlevel/types/messages/message-action.js.map +1 -1
- package/esm/highlevel/types/messages/message-entity.js +2 -0
- package/esm/highlevel/types/messages/message-entity.js.map +1 -1
- package/esm/highlevel/types/messages/message-forward.js +2 -0
- package/esm/highlevel/types/messages/message-forward.js.map +1 -1
- package/esm/highlevel/types/messages/message-media.js.map +1 -1
- package/esm/highlevel/types/messages/message-reactions.js +4 -0
- package/esm/highlevel/types/messages/message-reactions.js.map +1 -1
- package/esm/highlevel/types/messages/message-replies.js +2 -0
- package/esm/highlevel/types/messages/message-replies.js.map +1 -1
- package/esm/highlevel/types/messages/message.js +6 -0
- package/esm/highlevel/types/messages/message.js.map +1 -1
- package/esm/highlevel/types/messages/replied-message.js +2 -0
- package/esm/highlevel/types/messages/replied-message.js.map +1 -1
- package/esm/highlevel/types/misc/sticker-set.js +7 -1
- package/esm/highlevel/types/misc/sticker-set.js.map +1 -1
- package/esm/highlevel/types/misc/takeout-session.js +5 -0
- package/esm/highlevel/types/misc/takeout-session.js.map +1 -1
- package/esm/highlevel/types/peers/chat-colors.js +2 -0
- package/esm/highlevel/types/peers/chat-colors.js.map +1 -1
- package/esm/highlevel/types/peers/chat-event/actions.js.map +1 -1
- package/esm/highlevel/types/peers/chat-event/filters.js.map +1 -1
- package/esm/highlevel/types/peers/chat-event/index.js +2 -0
- package/esm/highlevel/types/peers/chat-event/index.js.map +1 -1
- package/esm/highlevel/types/peers/chat-invite-link-member.js +2 -0
- package/esm/highlevel/types/peers/chat-invite-link-member.js.map +1 -1
- package/esm/highlevel/types/peers/chat-invite-link.js +2 -0
- package/esm/highlevel/types/peers/chat-invite-link.js.map +1 -1
- package/esm/highlevel/types/peers/chat-location.js +1 -0
- package/esm/highlevel/types/peers/chat-location.js.map +1 -1
- package/esm/highlevel/types/peers/chat-member.js +2 -0
- package/esm/highlevel/types/peers/chat-member.js.map +1 -1
- package/esm/highlevel/types/peers/chat-permissions.js +1 -0
- package/esm/highlevel/types/peers/chat-permissions.js.map +1 -1
- package/esm/highlevel/types/peers/chat-photo.js +5 -0
- package/esm/highlevel/types/peers/chat-photo.js.map +1 -1
- package/esm/highlevel/types/peers/chat-preview.js +2 -0
- package/esm/highlevel/types/peers/chat-preview.js.map +1 -1
- package/esm/highlevel/types/peers/chat.js +12 -1
- package/esm/highlevel/types/peers/chat.js.map +1 -1
- package/esm/highlevel/types/peers/forum-topic.js +9 -6
- package/esm/highlevel/types/peers/forum-topic.js.map +1 -1
- package/esm/highlevel/types/peers/peer.js.map +1 -1
- package/esm/highlevel/types/peers/peers-index.js +3 -1
- package/esm/highlevel/types/peers/peers-index.js.map +1 -1
- package/esm/highlevel/types/peers/user.js +5 -1
- package/esm/highlevel/types/peers/user.js.map +1 -1
- package/esm/highlevel/types/premium/boost-slot.js +2 -0
- package/esm/highlevel/types/premium/boost-slot.js.map +1 -1
- package/esm/highlevel/types/premium/boost-stats.js +1 -0
- package/esm/highlevel/types/premium/boost-stats.js.map +1 -1
- package/esm/highlevel/types/premium/boost.js +2 -0
- package/esm/highlevel/types/premium/boost.js.map +1 -1
- package/esm/highlevel/types/reactions/emoji-status.js +1 -0
- package/esm/highlevel/types/reactions/emoji-status.js.map +1 -1
- package/esm/highlevel/types/reactions/peer-reaction.js +2 -0
- package/esm/highlevel/types/reactions/peer-reaction.js.map +1 -1
- package/esm/highlevel/types/reactions/reaction-count.js +1 -0
- package/esm/highlevel/types/reactions/reaction-count.js.map +1 -1
- package/esm/highlevel/types/reactions/types.js.map +1 -1
- package/esm/highlevel/types/stories/all-stories.d.ts +2 -2
- package/esm/highlevel/types/stories/all-stories.js +3 -1
- package/esm/highlevel/types/stories/all-stories.js.map +1 -1
- package/esm/highlevel/types/stories/interactive/base.js +1 -0
- package/esm/highlevel/types/stories/interactive/base.js.map +1 -1
- package/esm/highlevel/types/stories/interactive/channel-post.js +3 -1
- package/esm/highlevel/types/stories/interactive/channel-post.js.map +1 -1
- package/esm/highlevel/types/stories/interactive/index.js.map +1 -1
- package/esm/highlevel/types/stories/interactive/input.js +1 -0
- package/esm/highlevel/types/stories/interactive/input.js.map +1 -1
- package/esm/highlevel/types/stories/interactive/location.js +2 -1
- package/esm/highlevel/types/stories/interactive/location.js.map +1 -1
- package/esm/highlevel/types/stories/interactive/reaction.js +2 -1
- package/esm/highlevel/types/stories/interactive/reaction.js.map +1 -1
- package/esm/highlevel/types/stories/interactive/venue.js +2 -1
- package/esm/highlevel/types/stories/interactive/venue.js.map +1 -1
- package/esm/highlevel/types/stories/peer-stories.js +2 -0
- package/esm/highlevel/types/stories/peer-stories.js.map +1 -1
- package/esm/highlevel/types/stories/stealth-mode.js +1 -0
- package/esm/highlevel/types/stories/stealth-mode.js.map +1 -1
- package/esm/highlevel/types/stories/story-interactions.js +2 -0
- package/esm/highlevel/types/stories/story-interactions.js.map +1 -1
- package/esm/highlevel/types/stories/story-viewer.d.ts +1 -1
- package/esm/highlevel/types/stories/story-viewer.js +6 -0
- package/esm/highlevel/types/stories/story-viewer.js.map +1 -1
- package/esm/highlevel/types/stories/story.js +2 -0
- package/esm/highlevel/types/stories/story.js.map +1 -1
- package/esm/highlevel/types/updates/bot-chat-join-request.js +2 -0
- package/esm/highlevel/types/updates/bot-chat-join-request.js.map +1 -1
- package/esm/highlevel/types/updates/bot-reaction.js +4 -0
- package/esm/highlevel/types/updates/bot-reaction.js.map +1 -1
- package/esm/highlevel/types/updates/bot-stopped.js +2 -0
- package/esm/highlevel/types/updates/bot-stopped.js.map +1 -1
- package/esm/highlevel/types/updates/callback-query.js +4 -0
- package/esm/highlevel/types/updates/callback-query.js.map +1 -1
- package/esm/highlevel/types/updates/chat-join-request.js +2 -0
- package/esm/highlevel/types/updates/chat-join-request.js.map +1 -1
- package/esm/highlevel/types/updates/chat-member-update.js +2 -0
- package/esm/highlevel/types/updates/chat-member-update.js.map +1 -1
- package/esm/highlevel/types/updates/chosen-inline-result.js +2 -0
- package/esm/highlevel/types/updates/chosen-inline-result.js.map +1 -1
- package/esm/highlevel/types/updates/delete-message-update.js +1 -0
- package/esm/highlevel/types/updates/delete-message-update.js.map +1 -1
- package/esm/highlevel/types/updates/delete-story-update.js +2 -0
- package/esm/highlevel/types/updates/delete-story-update.js.map +1 -1
- package/esm/highlevel/types/updates/history-read-update.js +1 -0
- package/esm/highlevel/types/updates/history-read-update.js.map +1 -1
- package/esm/highlevel/types/updates/inline-query.js +2 -0
- package/esm/highlevel/types/updates/inline-query.js.map +1 -1
- package/esm/highlevel/types/updates/parse-update.js.map +1 -1
- package/esm/highlevel/types/updates/poll-update.js +2 -0
- package/esm/highlevel/types/updates/poll-update.js.map +1 -1
- package/esm/highlevel/types/updates/poll-vote.js +2 -0
- package/esm/highlevel/types/updates/poll-vote.js.map +1 -1
- package/esm/highlevel/types/updates/pre-checkout-query.js +2 -0
- package/esm/highlevel/types/updates/pre-checkout-query.js.map +1 -1
- package/esm/highlevel/types/updates/story-update.js +2 -0
- package/esm/highlevel/types/updates/story-update.js.map +1 -1
- package/esm/highlevel/types/updates/user-status-update.js +1 -0
- package/esm/highlevel/types/updates/user-status-update.js.map +1 -1
- package/esm/highlevel/types/updates/user-typing-update.js +1 -0
- package/esm/highlevel/types/updates/user-typing-update.js.map +1 -1
- package/esm/highlevel/updates/manager.js +50 -28
- package/esm/highlevel/updates/manager.js.map +1 -1
- package/esm/highlevel/updates/parsed.js.map +1 -1
- package/esm/highlevel/updates/utils.js.map +1 -1
- package/esm/highlevel/utils/convert-file-id.js.map +1 -1
- package/esm/highlevel/utils/entities.js.map +1 -1
- package/esm/highlevel/utils/file-type.d.ts +1 -0
- package/esm/highlevel/utils/file-type.js +34 -0
- package/esm/highlevel/utils/file-type.js.map +1 -1
- package/esm/highlevel/utils/file-utils.js +1 -1
- package/esm/highlevel/utils/file-utils.js.map +1 -1
- package/esm/highlevel/utils/inline-utils.js.map +1 -1
- package/esm/highlevel/utils/inspectable.js.map +1 -1
- package/esm/highlevel/utils/memoize.js.map +1 -1
- package/esm/highlevel/utils/peer-utils.js.map +1 -1
- package/esm/highlevel/utils/query-batcher.js.map +1 -1
- package/esm/highlevel/utils/rps-meter.js +3 -0
- package/esm/highlevel/utils/rps-meter.js.map +1 -1
- package/esm/highlevel/utils/stream-utils.js.map +1 -1
- package/esm/highlevel/utils/string-session.d.ts +1 -2
- package/esm/highlevel/utils/string-session.js +27 -7
- package/esm/highlevel/utils/string-session.js.map +1 -1
- package/esm/highlevel/utils/voice-utils.js.map +1 -1
- package/esm/highlevel/worker/app-config.d.ts +2 -3
- package/esm/highlevel/worker/app-config.js +6 -3
- package/esm/highlevel/worker/app-config.js.map +1 -1
- package/esm/highlevel/worker/errors.js.map +1 -1
- package/esm/highlevel/worker/invoker.js +3 -2
- package/esm/highlevel/worker/invoker.js.map +1 -1
- package/esm/highlevel/worker/port.d.ts +16 -17
- package/esm/highlevel/worker/port.js +74 -49
- package/esm/highlevel/worker/port.js.map +1 -1
- package/esm/highlevel/worker/protocol.d.ts +1 -1
- package/esm/highlevel/worker/protocol.js.map +1 -1
- package/esm/highlevel/worker/storage.d.ts +9 -13
- package/esm/highlevel/worker/storage.js +34 -19
- package/esm/highlevel/worker/storage.js.map +1 -1
- package/esm/highlevel/worker/worker.js +3 -0
- package/esm/highlevel/worker/worker.js.map +1 -1
- package/esm/network/auth-key.js +8 -1
- package/esm/network/auth-key.js.map +1 -1
- package/esm/network/authorization.js.map +1 -1
- package/esm/network/client.js +39 -14
- package/esm/network/client.js.map +1 -1
- package/esm/network/config-manager.js.map +1 -1
- package/esm/network/mtproto-session.js +40 -30
- package/esm/network/mtproto-session.js.map +1 -1
- package/esm/network/multi-session-connection.d.ts +1 -1
- package/esm/network/multi-session-connection.js +13 -7
- package/esm/network/multi-session-connection.js.map +1 -1
- package/esm/network/network-manager.d.ts +2 -3
- package/esm/network/network-manager.js +49 -28
- package/esm/network/network-manager.js.map +1 -1
- package/esm/network/persistent-connection.d.ts +2 -2
- package/esm/network/persistent-connection.js +33 -22
- package/esm/network/persistent-connection.js.map +1 -1
- package/esm/network/server-salt.js +4 -5
- package/esm/network/server-salt.js.map +1 -1
- package/esm/network/session-connection.d.ts +1 -1
- package/esm/network/session-connection.js +22 -12
- package/esm/network/session-connection.js.map +1 -1
- package/esm/network/transports/abstract.d.ts +1 -1
- package/esm/network/transports/abstract.js +1 -0
- package/esm/network/transports/abstract.js.map +1 -1
- package/esm/network/transports/intermediate.js +1 -0
- package/esm/network/transports/intermediate.js.map +1 -1
- package/esm/network/transports/obfuscated.js +3 -0
- package/esm/network/transports/obfuscated.js.map +1 -1
- package/esm/network/transports/streamed.js +1 -4
- package/esm/network/transports/streamed.js.map +1 -1
- package/esm/network/transports/wrapped.js +2 -0
- package/esm/network/transports/wrapped.js.map +1 -1
- package/esm/platform.js.map +1 -1
- package/esm/storage/driver.js +3 -4
- package/esm/storage/driver.js.map +1 -1
- package/esm/storage/memory/driver.js +1 -3
- package/esm/storage/memory/driver.js.map +1 -1
- package/esm/storage/memory/index.js +5 -7
- package/esm/storage/memory/index.js.map +1 -1
- package/esm/storage/memory/repository/auth-keys.d.ts +1 -1
- package/esm/storage/memory/repository/auth-keys.js +2 -0
- package/esm/storage/memory/repository/auth-keys.js.map +1 -1
- package/esm/storage/memory/repository/kv.d.ts +1 -1
- package/esm/storage/memory/repository/kv.js +2 -0
- package/esm/storage/memory/repository/kv.js.map +1 -1
- package/esm/storage/memory/repository/peers.d.ts +1 -1
- package/esm/storage/memory/repository/peers.js +2 -0
- package/esm/storage/memory/repository/peers.js.map +1 -1
- package/esm/storage/memory/repository/ref-messages.d.ts +1 -1
- package/esm/storage/memory/repository/ref-messages.js +2 -0
- package/esm/storage/memory/repository/ref-messages.js.map +1 -1
- package/esm/storage/service/auth-keys.js +2 -0
- package/esm/storage/service/auth-keys.js.map +1 -1
- package/esm/storage/service/base.js +4 -0
- package/esm/storage/service/base.js.map +1 -1
- package/esm/storage/service/default-dcs.js +2 -0
- package/esm/storage/service/default-dcs.js.map +1 -1
- package/esm/storage/service/future-salts.js +2 -1
- package/esm/storage/service/future-salts.js.map +1 -1
- package/esm/storage/sqlite/driver.js +10 -10
- package/esm/storage/sqlite/driver.js.map +1 -1
- package/esm/storage/sqlite/index.d.ts +1 -1
- package/esm/storage/sqlite/index.js +5 -0
- package/esm/storage/sqlite/index.js.map +1 -1
- package/esm/storage/sqlite/repository/auth-keys.js +9 -0
- package/esm/storage/sqlite/repository/auth-keys.js.map +1 -1
- package/esm/storage/sqlite/repository/kv.js +5 -0
- package/esm/storage/sqlite/repository/kv.js.map +1 -1
- package/esm/storage/sqlite/repository/peers.js +6 -0
- package/esm/storage/sqlite/repository/peers.js.map +1 -1
- package/esm/storage/sqlite/repository/ref-messages.d.ts +1 -1
- package/esm/storage/sqlite/repository/ref-messages.js +6 -0
- package/esm/storage/sqlite/repository/ref-messages.js.map +1 -1
- package/esm/storage/storage.d.ts +1 -3
- package/esm/storage/storage.js +21 -13
- package/esm/storage/storage.js.map +1 -1
- package/esm/types/errors.js +13 -0
- package/esm/types/errors.js.map +1 -1
- package/esm/utils/async-lock.js +1 -3
- package/esm/utils/async-lock.js.map +1 -1
- package/esm/utils/bigint-utils.js.map +1 -1
- package/esm/utils/binary/asn1-parser.js.map +1 -1
- package/esm/utils/buffer-utils.js.map +1 -1
- package/esm/utils/condition-variable.js +2 -0
- package/esm/utils/condition-variable.js.map +1 -1
- package/esm/utils/crypto/factorization.js.map +1 -1
- package/esm/utils/crypto/keys.js.map +1 -1
- package/esm/utils/crypto/miller-rabin.js.map +1 -1
- package/esm/utils/crypto/password.js.map +1 -1
- package/esm/utils/crypto/utils.js.map +1 -1
- package/esm/utils/dcs.js +1 -1
- package/esm/utils/dcs.js.map +1 -1
- package/esm/utils/deque.js +8 -2
- package/esm/utils/deque.js.map +1 -1
- package/esm/utils/early-timer.js +4 -1
- package/esm/utils/early-timer.js.map +1 -1
- package/esm/utils/error-reporting.js.map +1 -1
- package/esm/utils/function-utils.js.map +1 -1
- package/esm/utils/linked-list.js +4 -1
- package/esm/utils/linked-list.js.map +1 -1
- package/esm/utils/links/bots.js.map +1 -1
- package/esm/utils/links/chat.js.map +1 -1
- package/esm/utils/links/common.js.map +1 -1
- package/esm/utils/links/misc.js.map +1 -1
- package/esm/utils/logger.d.ts +2 -2
- package/esm/utils/logger.js +21 -14
- package/esm/utils/logger.js.map +1 -1
- package/esm/utils/long-utils.js +2 -6
- package/esm/utils/long-utils.js.map +1 -1
- package/esm/utils/lru-map.js +5 -1
- package/esm/utils/lru-map.js.map +1 -1
- package/esm/utils/lru-set.js +4 -0
- package/esm/utils/lru-set.js.map +1 -1
- package/esm/utils/peer-utils.js.map +1 -1
- package/esm/utils/reloadable.js +10 -7
- package/esm/utils/reloadable.js.map +1 -1
- package/esm/utils/sorted-array.js +2 -0
- package/esm/utils/sorted-array.js.map +1 -1
- package/esm/utils/tl-json.js.map +1 -1
- package/esm/utils/type-assertions.js.map +1 -1
- package/package.json +11 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/highlevel/updates/manager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-depth,max-params */\nimport { tl } from '@mtcute/tl'\n\nimport { MtArgumentError } from '../../types/errors.js'\nimport { assertNever, MaybePromise } from '../../types/utils.js'\nimport {\n AsyncLock,\n ConditionVariable,\n Deque,\n EarlyTimer,\n getBarePeerId,\n getMarkedPeerId,\n parseMarkedPeerId,\n SortedLinkedList,\n toggleChannelIdMark,\n toInputChannel,\n} from '../../utils/index.js'\nimport { BaseTelegramClient } from '../base.js'\nimport { CurrentUserInfo } from '../storage/service/current-user.js'\nimport { PeersIndex } from '../types/peers/peers-index.js'\nimport { PendingUpdate, PendingUpdateContainer, RawUpdateHandler, UpdatesManagerParams } from './types.js'\nimport {\n createDummyUpdatesContainer,\n extractChannelIdFromUpdate,\n isMessageEmpty,\n messageToUpdate,\n toPendingUpdate,\n} from './utils.js'\n\n// code in this file is very bad, thanks to Telegram's awesome updates mechanism\n\n// todo: maybe move to another class?\n// /**\n// * Enable RPS meter.\n// *\n// * > **Note**: This may have negative impact on performance\n// *\n// * @param size Sampling size\n// * @param time Window time\n// */\n// export function enableRps(client: ITelegramClient, size?: number, time?: number): void {\n// const state = getState(client)\n// state.rpsIncoming = new RpsMeter(size, time)\n// state.rpsProcessing = new RpsMeter(size, time)\n// }\n\n// /**\n// * Get current average incoming RPS\n// *\n// * Incoming RPS is calculated based on\n// * incoming update containers. Normally,\n// * they should be around the same, except\n// * rare situations when processing rps\n// * may peak.\n// */\n// export function getCurrentRpsIncoming(client: ITelegramClient): number {\n// const state = getState(client)\n\n// if (!state.rpsIncoming) {\n// throw new MtArgumentError('RPS meter is not enabled, use .enableRps() first')\n// }\n\n// return state.rpsIncoming.getRps()\n// }\n\n// /**\n// * Get current average processing RPS\n// *\n// * Processing RPS is calculated based on\n// * dispatched updates. Normally,\n// * they should be around the same, except\n// * rare situations when processing rps\n// * may peak.\n// */\n// export function getCurrentRpsProcessing(client: ITelegramClient): number {\n// const state = getState(client)\n\n// if (!state.rpsProcessing) {\n// throw new MtArgumentError('RPS meter is not enabled, use .enableRps() first')\n// }\n\n// return state.rpsProcessing.getRps()\n// }\n\nconst KEEP_ALIVE_INTERVAL = 15 * 60 * 1000 // 15 minutes\nconst UPDATES_TOO_LONG = { _: 'updatesTooLong' } as const\n\n// todo: fix docs\nexport class UpdatesManager {\n updatesLoopActive = false\n updatesLoopCv = new ConditionVariable()\n\n postponedTimer = new EarlyTimer()\n hasTimedoutPostponed = false\n\n pendingUpdateContainers = new SortedLinkedList<PendingUpdateContainer>((a, b) => a.seqStart - b.seqStart)\n pendingPtsUpdates = new SortedLinkedList<PendingUpdate>((a, b) => a.ptsBefore! - b.ptsBefore!)\n pendingPtsUpdatesPostponed = new SortedLinkedList<PendingUpdate>((a, b) => a.ptsBefore! - b.ptsBefore!)\n pendingQtsUpdates = new SortedLinkedList<PendingUpdate>((a, b) => a.qtsBefore! - b.qtsBefore!)\n pendingQtsUpdatesPostponed = new SortedLinkedList<PendingUpdate>((a, b) => a.qtsBefore! - b.qtsBefore!)\n pendingUnorderedUpdates = new Deque<PendingUpdate>()\n\n noDispatchEnabled = !this.params.disableNoDispatch\n // channel id or 0 => msg id\n noDispatchMsg = new Map<number, Set<number>>()\n // channel id or 0 => pts\n noDispatchPts = new Map<number, Set<number>>()\n noDispatchQts = new Set<number>()\n\n lock = new AsyncLock()\n // rpsIncoming?: RpsMeter\n // rpsProcessing?: RpsMeter\n\n // accessing storage every time might be expensive,\n // so store everything here, and load & save\n // every time session is loaded & saved.\n pts?: number\n qts?: number\n date?: number\n seq?: number\n\n // old values of the updates state (i.e. as in DB)\n // used to avoid redundant storage calls\n oldPts?: number\n oldQts?: number\n oldDate?: number\n oldSeq?: number\n\n // whether to catch up channels from the locally stored pts\n catchingUp = false\n catchUpOnStart = this.params.catchUp ?? false\n\n cpts = new Map<number, number>()\n cptsMod = new Map<number, number>()\n channelDiffTimeouts = new Map<number, NodeJS.Timeout>()\n channelsOpened = new Map<number, number>()\n\n log = this.client.log.create('updates')\n private _handler: RawUpdateHandler = () => {}\n\n private _onCatchingUp: (catchingUp: boolean) => void = () => {}\n\n auth?: CurrentUserInfo | null // todo: do we need a local copy?\n keepAliveInterval?: NodeJS.Timeout\n\n constructor(\n readonly client: BaseTelegramClient,\n readonly params: UpdatesManagerParams = {},\n ) {\n if (client.params.disableUpdates) {\n throw new MtArgumentError('Updates must be enabled to use updates manager')\n }\n\n this._onKeepAlive = this._onKeepAlive.bind(this)\n\n this.postponedTimer.onTimeout(() => {\n this.hasTimedoutPostponed = true\n this.updatesLoopCv.notify()\n })\n }\n\n setHandler(handler: RawUpdateHandler): void {\n this._handler = handler\n }\n\n onCatchingUp(handler: (catchingUp: boolean) => void): void {\n this._onCatchingUp = handler\n }\n\n destroy() {\n this.stopLoop()\n }\n\n notifyLoggedIn(self: CurrentUserInfo): void {\n this.auth = self\n this.startLoop().catch((err) => this.client.emitError(err))\n }\n\n notifyLoggedOut(): void {\n this.stopLoop()\n this.cpts.clear()\n this.cptsMod.clear()\n this.pts = this.qts = this.date = this.seq = undefined\n }\n\n async prepare(): Promise<void> {\n await this._loadUpdatesStorage()\n }\n\n private _onKeepAlive() {\n this.log.debug('no updates for >15 minutes, catching up')\n this.handleUpdate(UPDATES_TOO_LONG)\n }\n\n /**\n * Start updates loop.\n *\n * You must first call {@link enableUpdatesProcessing} to use this method.\n *\n * It is recommended to use this method in callback to {@link start},\n * or otherwise make sure the user is logged in.\n *\n * > **Note**: If you are using {@link UpdatesManagerParams.catchUp} option,\n * > catching up will be done in background, you can't await it.\n * > Instead, listen for the `updating` and `connected` connection state events.\n */\n async startLoop(): Promise<void> {\n if (this.updatesLoopActive) return\n\n // otherwise we will catch up on the first update\n if (!this.catchUpOnStart) {\n await this._fetchUpdatesState()\n }\n\n // start updates loop in background\n this.updatesLoopActive = true\n clearInterval(this.keepAliveInterval)\n this.keepAliveInterval = setInterval(this._onKeepAlive, KEEP_ALIVE_INTERVAL)\n this._loop().catch((err) => this.client.emitError(err))\n\n if (this.catchUpOnStart) {\n this.catchUp()\n }\n }\n\n /**\n * **ADVANCED**\n *\n * Manually stop updates loop.\n * Usually done automatically when stopping the client with {@link close}\n */\n stopLoop(): void {\n if (!this.updatesLoopActive) return\n\n clearInterval(this.keepAliveInterval)\n\n for (const timer of this.channelDiffTimeouts.values()) {\n clearTimeout(timer)\n }\n this.channelDiffTimeouts.clear()\n\n this.updatesLoopActive = false\n this.pendingUpdateContainers.clear()\n this.pendingUnorderedUpdates.clear()\n this.pendingPtsUpdates.clear()\n this.pendingQtsUpdates.clear()\n this.pendingPtsUpdatesPostponed.clear()\n this.pendingQtsUpdatesPostponed.clear()\n this.postponedTimer.reset()\n this.updatesLoopCv.notify()\n }\n\n /**\n * Catch up with the server by loading missed updates.\n *.\n * > **Note**: In case the storage was not properly\n * > closed the last time, \"catching up\" might\n * > result in duplicate updates.\n */\n catchUp(): void {\n if (!this.updatesLoopActive) {\n this.log.warn('catch up requested, but updates loop is not active, ignoring')\n\n return\n }\n\n this.log.debug('catch up requested')\n\n this._onCatchingUp(true)\n this.catchingUp = true\n this.handleUpdate(UPDATES_TOO_LONG)\n }\n\n handleClientUpdate(update: tl.TypeUpdates, noDispatch = true): void {\n if (noDispatch && this.noDispatchEnabled) {\n this._addToNoDispatchIndex(update)\n }\n\n this.handleUpdate(update)\n }\n\n handleUpdate(update: tl.TypeUpdates): void {\n this.log.debug(\n 'received %s, queueing for processing. containers queue size: %d',\n update._,\n this.pendingUpdateContainers.length,\n )\n // this.rpsIncoming?.hit()\n\n switch (update._) {\n case 'updatesTooLong':\n case 'updateShortMessage':\n case 'updateShortChatMessage':\n case 'updateShort':\n case 'updateShortSentMessage':\n this.pendingUpdateContainers.add({\n upd: update,\n seqStart: 0,\n seqEnd: 0,\n })\n break\n case 'updates':\n case 'updatesCombined':\n this.pendingUpdateContainers.add({\n upd: update,\n seqStart: update._ === 'updatesCombined' ? update.seqStart : update.seq,\n seqEnd: update.seq,\n })\n break\n default:\n assertNever(update)\n }\n\n this.updatesLoopCv.notify()\n }\n\n /**\n * **ADVANCED**\n *\n * Notify the updates manager that some channel was \"opened\".\n * Channel difference for \"opened\" channels will be fetched on a regular basis.\n * This is a low-level method, prefer using {@link openChat} instead.\n *\n * Channel must be resolve-able with `resolvePeer` method (i.e. be in cache);\n * base chat PTS must either be passed (e.g. from {@link Dialog}), or cached in storage.\n *\n * @param channelId Bare ID of the channel\n * @param pts PTS of the channel, if known (e.g. from {@link Dialog})\n * @returns `true` if the channel was opened for the first time, `false` if it is already opened\n */\n notifyChannelOpened(channelId: number, pts?: number): boolean {\n // this method is intentionally very dumb to avoid making this file even more unreadable\n\n if (this.channelsOpened.has(channelId)) {\n this.log.debug('channel %d opened again', channelId)\n this.channelsOpened.set(channelId, this.channelsOpened.get(channelId)! + 1)\n\n return false\n }\n\n this.channelsOpened.set(channelId, 1)\n this.log.debug('channel %d opened (pts=%d)', channelId, pts)\n\n // force fetch channel difference\n this._fetchChannelDifferenceViaUpdate(channelId, pts)\n\n return true\n }\n\n /**\n * **ADVANCED**\n *\n * Notify the updates manager that some channel was \"closed\".\n * Basically the opposite of {@link notifyChannelOpened}.\n * This is a low-level method, prefer using {@link closeChat} instead.\n *\n * @param channelId Bare channel ID\n * @returns `true` if the chat was closed for the last time, `false` otherwise\n */\n notifyChannelClosed(channelId: number): boolean {\n const opened = this.channelsOpened.get(channelId)!\n\n if (opened === undefined) {\n return false\n }\n\n if (opened > 1) {\n this.log.debug('channel %d closed, but is opened %d more times', channelId, opened - 1)\n this.channelsOpened.set(channelId, opened - 1)\n\n return false\n }\n\n this.channelsOpened.delete(channelId)\n this.log.debug('channel %d closed', channelId)\n\n return true\n }\n\n ////////////////////////////////////////////// IMPLEMENTATION //////////////////////////////////////////////\n\n async _fetchUpdatesState(): Promise<void> {\n const { client, lock, log } = this\n\n await lock.acquire()\n\n log.debug('fetching initial state')\n\n try {\n let fetchedState = await client.call({ _: 'updates.getState' })\n\n log.debug(\n 'updates.getState returned state: pts=%d, qts=%d, date=%d, seq=%d',\n fetchedState.pts,\n fetchedState.qts,\n fetchedState.date,\n fetchedState.seq,\n )\n\n // for some unknown fucking reason getState may return old qts\n // call getDifference to get actual values :shrug:\n const diff = await client.call({\n _: 'updates.getDifference',\n pts: fetchedState.pts,\n qts: fetchedState.qts,\n date: fetchedState.date,\n })\n\n switch (diff._) {\n case 'updates.differenceEmpty':\n break\n case 'updates.differenceTooLong': // shouldn't happen, but who knows?\n (fetchedState as tl.Mutable<tl.updates.TypeState>).pts = diff.pts\n break\n case 'updates.differenceSlice':\n fetchedState = diff.intermediateState\n break\n case 'updates.difference':\n fetchedState = diff.state\n break\n default:\n assertNever(diff)\n }\n\n this.qts = fetchedState.qts\n this.pts = fetchedState.pts\n this.date = fetchedState.date\n this.seq = fetchedState.seq\n\n log.debug('loaded initial state: pts=%d, qts=%d, date=%d, seq=%d', this.pts, this.qts, this.date, this.seq)\n } catch (e) {\n if (this.client.isConnected) {\n log.error('failed to fetch updates state: %s', e)\n }\n\n lock.release()\n throw e\n }\n\n lock.release()\n }\n\n async _loadUpdatesStorage(): Promise<void> {\n const storedState = await this.client.storage.updates.getState()\n\n if (storedState) {\n this.pts = this.oldPts = storedState[0]\n this.qts = this.oldQts = storedState[1]\n this.date = this.oldDate = storedState[2]\n this.seq = this.oldSeq = storedState[3]\n\n this.log.debug(\n 'loaded stored state: pts=%d, qts=%d, date=%d, seq=%d',\n storedState[0],\n storedState[1],\n storedState[2],\n storedState[3],\n )\n }\n // if no state, don't bother initializing properties\n // since that means that there is no authorization,\n // and thus fetchUpdatesState will be called\n }\n\n async _saveUpdatesStorage(save = false): Promise<void> {\n const { client } = this\n\n // todo: move this to updates state service\n // before any authorization pts will be undefined\n if (this.pts !== undefined) {\n // if old* value is not available, assume it has changed.\n if (this.oldPts === undefined || this.oldPts !== this.pts) {\n await client.storage.updates.setPts(this.pts)\n }\n if (this.oldQts === undefined || this.oldQts !== this.qts) {\n await client.storage.updates.setQts(this.qts!)\n }\n if (this.oldDate === undefined || this.oldDate !== this.date) {\n await client.storage.updates.setDate(this.date!)\n }\n if (this.oldSeq === undefined || this.oldSeq !== this.seq) {\n await client.storage.updates.setSeq(this.seq!)\n }\n\n // update old* values\n this.oldPts = this.pts\n this.oldQts = this.qts\n this.oldDate = this.date\n this.oldSeq = this.seq\n\n await client.storage.updates.setManyChannelPts(this.cptsMod)\n this.cptsMod.clear()\n\n if (save) {\n await client.mt.storage.save()\n }\n }\n }\n\n _addToNoDispatchIndex(updates?: tl.TypeUpdates): void {\n if (!updates) return\n\n const { noDispatchMsg, noDispatchPts, noDispatchQts } = this\n\n const addUpdate = (upd: tl.TypeUpdate) => {\n const channelId = extractChannelIdFromUpdate(upd) ?? 0\n const pts = 'pts' in upd ? upd.pts : undefined\n\n if (pts) {\n const set = noDispatchPts.get(channelId)\n if (!set) noDispatchPts.set(channelId, new Set([pts]))\n else set.add(pts)\n }\n\n const qts = 'qts' in upd ? upd.qts : undefined\n\n if (qts) {\n noDispatchQts.add(qts)\n }\n\n switch (upd._) {\n case 'updateNewMessage':\n case 'updateNewChannelMessage': {\n const channelId = upd.message.peerId?._ === 'peerChannel' ? upd.message.peerId.channelId : 0\n\n const set = noDispatchMsg.get(channelId)\n if (!set) noDispatchMsg.set(channelId, new Set([upd.message.id]))\n else set.add(upd.message.id)\n\n break\n }\n }\n }\n\n switch (updates._) {\n case 'updates':\n case 'updatesCombined':\n updates.updates.forEach(addUpdate)\n break\n case 'updateShortMessage':\n case 'updateShortChatMessage':\n case 'updateShortSentMessage': {\n // these updates are only used for non-channel messages, so we use 0\n let set = noDispatchMsg.get(0)\n if (!set) noDispatchMsg.set(0, new Set([updates.id]))\n else set.add(updates.id)\n\n set = noDispatchPts.get(0)\n if (!set) noDispatchPts.set(0, new Set([updates.pts]))\n else set.add(updates.pts)\n break\n }\n case 'updateShort':\n addUpdate(updates.update)\n break\n case 'updatesTooLong':\n break\n default:\n assertNever(updates)\n }\n }\n\n async _fetchMissingPeers(upd: tl.TypeUpdate, peers: PeersIndex, allowMissing = false): Promise<Set<number>> {\n const { client } = this\n\n const missing = new Set<number>()\n\n async function fetchPeer(peer?: tl.TypePeer | number) {\n if (!peer) return true\n\n const bare = typeof peer === 'number' ? parseMarkedPeerId(peer)[1] : getBarePeerId(peer)\n\n const marked = typeof peer === 'number' ? peer : getMarkedPeerId(peer)\n const index = marked > 0 ? peers.users : peers.chats\n\n if (index.has(bare)) return true\n if (missing.has(marked)) return false\n\n const cached = await client.storage.peers.getCompleteById(marked)\n\n if (!cached) {\n missing.add(marked)\n\n return allowMissing\n }\n\n // whatever, ts is not smart enough to understand\n (index as Map<number, tl.TypeUser | tl.TypeChat>).set(bare, cached)\n\n return true\n }\n\n switch (upd._) {\n case 'updateNewMessage':\n case 'updateNewChannelMessage':\n case 'updateEditMessage':\n case 'updateEditChannelMessage': {\n const msg = upd.message\n if (msg._ === 'messageEmpty') return missing\n\n // ref: https://github.com/tdlib/td/blob/master/td/telegram/UpdatesManager.cpp\n // (search by UpdatesManager::is_acceptable_update)\n if (!(await fetchPeer(msg.peerId))) return missing\n if (!(await fetchPeer(msg.fromId))) return missing\n\n if (msg.replyTo) {\n if (msg.replyTo._ === 'messageReplyHeader' && !(await fetchPeer(msg.replyTo.replyToPeerId))) {\n return missing\n }\n if (msg.replyTo._ === 'messageReplyStoryHeader' && !(await fetchPeer(msg.replyTo.peer))) {\n return missing\n }\n }\n\n if (msg._ !== 'messageService') {\n if (\n msg.fwdFrom &&\n (!(await fetchPeer(msg.fwdFrom.fromId)) || !(await fetchPeer(msg.fwdFrom.savedFromPeer)))\n ) {\n return missing\n }\n if (!(await fetchPeer(msg.viaBotId))) return missing\n\n if (msg.entities) {\n for (const ent of msg.entities) {\n if (ent._ === 'messageEntityMentionName') {\n if (!(await fetchPeer(ent.userId))) return missing\n }\n }\n }\n\n if (msg.media) {\n switch (msg.media._) {\n case 'messageMediaContact':\n if (msg.media.userId && !(await fetchPeer(msg.media.userId))) {\n return missing\n }\n }\n }\n } else {\n switch (msg.action._) {\n case 'messageActionChatCreate':\n case 'messageActionChatAddUser':\n case 'messageActionInviteToGroupCall':\n for (const user of msg.action.users) {\n if (!(await fetchPeer(user))) return missing\n }\n break\n case 'messageActionChatJoinedByLink':\n if (!(await fetchPeer(msg.action.inviterId))) {\n return missing\n }\n break\n case 'messageActionChatDeleteUser':\n if (!(await fetchPeer(msg.action.userId))) return missing\n break\n case 'messageActionChatMigrateTo':\n if (!(await fetchPeer(toggleChannelIdMark(msg.action.channelId)))) {\n return missing\n }\n break\n case 'messageActionChannelMigrateFrom':\n if (!(await fetchPeer(-msg.action.chatId))) return missing\n break\n case 'messageActionGeoProximityReached':\n if (!(await fetchPeer(msg.action.fromId))) return missing\n if (!(await fetchPeer(msg.action.toId))) return missing\n break\n }\n }\n break\n }\n case 'updateDraftMessage':\n if ('entities' in upd.draft && upd.draft.entities) {\n for (const ent of upd.draft.entities) {\n if (ent._ === 'messageEntityMentionName') {\n if (!(await fetchPeer(ent.userId))) return missing\n }\n }\n }\n }\n\n return missing\n }\n\n async _storeMessageReferences(msg: tl.TypeMessage): Promise<void> {\n if (msg._ === 'messageEmpty') return\n\n const { client } = this\n\n const peerId = msg.peerId\n if (peerId._ !== 'peerChannel') return\n\n const channelId = toggleChannelIdMark(peerId.channelId)\n\n const promises: MaybePromise<void>[] = []\n\n function store(peer?: tl.TypePeer | number | number[]): void {\n if (!peer) return\n\n if (Array.isArray(peer)) {\n peer.forEach(store)\n\n return\n }\n\n const marked = typeof peer === 'number' ? peer : getMarkedPeerId(peer)\n\n promises.push(client.storage.refMsgs.store(marked, channelId, msg.id))\n }\n\n // reference: https://github.com/tdlib/td/blob/master/td/telegram/MessagesManager.cpp\n // (search by get_message_user_ids, get_message_channel_ids)\n store(msg.fromId)\n\n if (msg._ === 'message') {\n store(msg.viaBotId)\n store(msg.fwdFrom?.fromId)\n\n if (msg.media) {\n switch (msg.media._) {\n case 'messageMediaWebPage':\n if (msg.media.webpage._ === 'webPage' && msg.media.webpage.attributes) {\n for (const attr of msg.media.webpage.attributes) {\n if (attr._ === 'webPageAttributeStory') {\n store(attr.peer)\n }\n }\n }\n break\n case 'messageMediaContact':\n store(msg.media.userId)\n break\n case 'messageMediaStory':\n store(msg.media.peer)\n break\n case 'messageMediaGiveaway':\n store(msg.media.channels.map(toggleChannelIdMark))\n break\n }\n }\n } else {\n switch (msg.action._) {\n case 'messageActionChatCreate':\n case 'messageActionChatAddUser':\n case 'messageActionInviteToGroupCall':\n store(msg.action.users)\n break\n case 'messageActionChatDeleteUser':\n store(msg.action.userId)\n break\n }\n }\n\n if (msg.replyTo) {\n switch (msg.replyTo._) {\n case 'messageReplyHeader':\n store(msg.replyTo.replyToPeerId)\n store(msg.replyTo.replyFrom?.fromId)\n break\n case 'messageReplyStoryHeader':\n store(msg.replyTo.peer)\n break\n }\n // in fact, we can also use peers contained in the replied-to message,\n // but we don't fetch it automatically, so we can't know which peers are there\n }\n\n await Promise.all(promises)\n }\n\n async _fetchChannelDifference(channelId: number, fallbackPts?: number): Promise<boolean> {\n const { channelDiffTimeouts, cpts, cptsMod, channelsOpened, client, log, pendingUnorderedUpdates } = this\n\n // clear timeout if any\n if (channelDiffTimeouts.has(channelId)) {\n clearTimeout(channelDiffTimeouts.get(channelId))\n channelDiffTimeouts.delete(channelId)\n }\n\n let _pts: number | null | undefined = cpts.get(channelId)\n\n if (!_pts && this.catchingUp) {\n _pts = await client.storage.updates.getChannelPts(channelId)\n }\n if (!_pts) _pts = fallbackPts\n\n if (!_pts) {\n log.debug('fetchChannelDifference failed for channel %d: base pts not available', channelId)\n\n return false\n }\n\n const channelPeer = await client.storage.peers.getById(toggleChannelIdMark(channelId))\n\n if (!channelPeer) {\n log.debug('fetchChannelDifference failed for channel %d: input peer not found', channelId)\n\n return false\n }\n\n const channel = toInputChannel(channelPeer)\n\n // to make TS happy\n let pts = _pts\n let limit = this.auth?.isBot ? 100000 : 100\n\n if (pts <= 0) {\n pts = 1\n limit = 1\n }\n\n let lastTimeout = 0\n\n for (;;) {\n const diff = await client.call({\n _: 'updates.getChannelDifference',\n force: true, // Set to true to skip some possibly unneeded updates and reduce server-side load\n channel,\n pts,\n limit,\n filter: { _: 'channelMessagesFilterEmpty' },\n })\n\n if (diff.timeout) lastTimeout = diff.timeout\n\n if (diff._ === 'updates.channelDifferenceEmpty') {\n log.debug('getChannelDifference (cid = %d) returned channelDifferenceEmpty', channelId)\n break\n }\n\n const peers = PeersIndex.from(diff)\n\n if (diff._ === 'updates.channelDifferenceTooLong') {\n if (diff.dialog._ === 'dialog') {\n pts = diff.dialog.pts!\n }\n\n log.warn(\n 'getChannelDifference (cid = %d) returned channelDifferenceTooLong. new pts: %d, recent msgs: %d',\n channelId,\n pts,\n diff.messages.length,\n )\n\n diff.messages.forEach((message) => {\n log.debug(\n 'processing message %d (%s) from TooLong diff for channel %d',\n message.id,\n message._,\n channelId,\n )\n\n if (message._ === 'messageEmpty') return\n\n pendingUnorderedUpdates.pushBack(toPendingUpdate(messageToUpdate(message), peers, true))\n })\n break\n }\n\n log.debug(\n 'getChannelDifference (cid = %d) returned %d messages, %d updates. new pts: %d, final: %b',\n channelId,\n diff.newMessages.length,\n diff.otherUpdates.length,\n diff.pts,\n diff.final,\n )\n\n diff.newMessages.forEach((message) => {\n log.debug('processing message %d (%s) from diff for channel %d', message.id, message._, channelId)\n\n if (message._ === 'messageEmpty') return\n\n pendingUnorderedUpdates.pushBack(toPendingUpdate(messageToUpdate(message), peers, true))\n })\n\n diff.otherUpdates.forEach((upd) => {\n const parsed = toPendingUpdate(upd, peers, true)\n\n log.debug(\n 'processing %s from diff for channel %d, pts_before: %d, pts: %d',\n upd._,\n channelId,\n parsed.ptsBefore,\n parsed.pts,\n )\n\n if (isMessageEmpty(upd)) return\n\n pendingUnorderedUpdates.pushBack(parsed)\n })\n\n pts = diff.pts\n\n if (diff.final) break\n }\n\n cpts.set(channelId, pts)\n cptsMod.set(channelId, pts)\n\n // schedule next fetch\n if (lastTimeout !== 0 && channelsOpened.has(channelId)) {\n log.debug('scheduling next fetch for channel %d in %d seconds', channelId, lastTimeout)\n channelDiffTimeouts.set(\n channelId,\n setTimeout(() => this._fetchChannelDifferenceViaUpdate(channelId), lastTimeout * 1000),\n )\n }\n\n return true\n }\n\n _fetchChannelDifferenceLater(\n requestedDiff: Map<number, Promise<void>>,\n channelId: number,\n fallbackPts?: number,\n ): void {\n if (!requestedDiff.has(channelId)) {\n requestedDiff.set(\n channelId,\n this._fetchChannelDifference(channelId, fallbackPts)\n .catch((err) => {\n this.log.warn('error fetching difference for %d: %s', channelId, err)\n })\n .then((ok) => {\n requestedDiff.delete(channelId)\n\n if (!ok) {\n this.log.debug('channel difference for %d failed, falling back to common diff', channelId)\n this._fetchDifferenceLater(requestedDiff)\n }\n }),\n )\n }\n }\n\n _fetchChannelDifferenceViaUpdate(channelId: number, pts?: number): void {\n this.handleUpdate(\n createDummyUpdatesContainer([\n {\n _: 'updateChannelTooLong',\n channelId,\n pts,\n },\n ]),\n )\n }\n\n async _fetchDifference(requestedDiff: Map<number, Promise<void>>): Promise<void> {\n const { client, log, pendingPtsUpdates, pendingUnorderedUpdates } = this\n\n const diff = await client.call({\n _: 'updates.getDifference',\n pts: this.pts!,\n date: this.date!,\n qts: this.qts!,\n })\n\n switch (diff._) {\n case 'updates.differenceEmpty':\n log.debug('updates.getDifference returned updates.differenceEmpty')\n\n return\n case 'updates.differenceTooLong':\n this.pts = diff.pts\n log.debug('updates.getDifference returned updates.differenceTooLong')\n\n return\n }\n\n const fetchedState = diff._ === 'updates.difference' ? diff.state : diff.intermediateState\n\n log.debug(\n 'updates.getDifference returned %d messages, %d updates. new pts: %d, qts: %d, seq: %d, final: %b',\n diff.newMessages.length,\n diff.otherUpdates.length,\n fetchedState.pts,\n fetchedState.qts,\n fetchedState.seq,\n diff._ === 'updates.difference',\n )\n\n const peers = PeersIndex.from(diff)\n\n diff.newMessages.forEach((message) => {\n log.debug('processing message %d in %j (%s) from common diff', message.id, message.peerId, message._)\n\n if (message._ === 'messageEmpty') return\n\n // pts does not need to be checked for them\n pendingUnorderedUpdates.pushBack(toPendingUpdate(messageToUpdate(message), peers, true))\n })\n\n diff.otherUpdates.forEach((upd) => {\n if (upd._ === 'updateChannelTooLong') {\n log.debug(\n 'received updateChannelTooLong for channel %d in common diff (pts = %d), fetching diff',\n upd.channelId,\n upd.pts,\n )\n\n this._fetchChannelDifferenceLater(requestedDiff, upd.channelId, upd.pts)\n\n return\n }\n\n if (isMessageEmpty(upd)) return\n\n const parsed = toPendingUpdate(upd, peers, true)\n\n if (parsed.channelId && parsed.ptsBefore) {\n // we need to check pts for these updates, put into pts queue\n pendingPtsUpdates.add(parsed)\n } else {\n // the updates are in order already, we can treat them as unordered\n pendingUnorderedUpdates.pushBack(parsed)\n }\n\n log.debug(\n 'received %s from common diff, cid: %d, pts_before: %d, pts: %d, qts_before: %d',\n upd._,\n parsed.channelId,\n parsed.ptsBefore,\n parsed.pts,\n parsed.qtsBefore,\n )\n })\n\n this.pts = fetchedState.pts\n this.qts = fetchedState.qts\n this.seq = fetchedState.seq\n this.date = fetchedState.date\n\n if (diff._ === 'updates.difference') {\n return\n }\n\n // fetch the next chunk in next tick\n this.handleUpdate(UPDATES_TOO_LONG)\n }\n\n _fetchDifferenceLater(requestedDiff: Map<number, Promise<void>>): void {\n if (!requestedDiff.has(0)) {\n requestedDiff.set(\n 0,\n this._fetchDifference(requestedDiff)\n .catch((err) => {\n if (tl.RpcError.is(err, 'AUTH_KEY_UNREGISTERED')) {\n // for some reason, when logging out telegram may send updatesTooLong\n // in any case, we need to stop updates loop\n this.stopLoop()\n\n return\n }\n\n this.log.warn('error fetching common difference: %s', err)\n\n if (tl.RpcError.is(err, 'PERSISTENT_TIMESTAMP_INVALID')) {\n // this function never throws\n return this._fetchUpdatesState()\n }\n })\n .then(() => {\n requestedDiff.delete(0)\n }),\n )\n }\n }\n\n async _onUpdate(\n pending: PendingUpdate,\n requestedDiff: Map<number, Promise<void>>,\n postponed = false,\n unordered = false,\n ): Promise<void> {\n const { client, log } = this\n const upd = pending.update\n\n let missing: Set<number> | undefined = undefined\n\n // it is important to do this before updating pts\n if (pending.peers.hasMin || pending.peers.empty) {\n // even if we have min peers in difference, we can't do anything about them.\n // we still want to collect them, so we can fetch them in the background.\n // we won't wait for them, since that would block the updates loop\n\n log.debug('loading missing peers for %s (pts = %d, cid = %d)', upd._, pending.pts, pending.channelId)\n missing = await this._fetchMissingPeers(upd, pending.peers, pending.fromDifference)\n\n if (!pending.fromDifference && missing.size) {\n log.debug(\n 'fetching difference because some peers were min (%J) and not cached for %s (pts = %d, cid = %d)',\n missing,\n upd._,\n pending.pts,\n pending.channelId,\n )\n\n if (pending.channelId && !(upd._ === 'updateNewChannelMessage' && upd.message._ === 'messageService')) {\n // don't replace service messages, because they can be about bot's kicking\n this._fetchChannelDifferenceLater(requestedDiff, pending.channelId, pending.ptsBefore)\n } else {\n this._fetchDifferenceLater(requestedDiff)\n }\n\n return\n }\n\n if (missing.size) {\n log.debug(\n 'peers still missing after fetching difference: %J for %s (pts = %d, cid = %d)',\n missing,\n upd._,\n pending.pts,\n pending.channelId,\n )\n }\n }\n\n // apply new pts/qts, if applicable\n if (!unordered) {\n // because unordered may contain pts/qts values when received from diff\n\n if (pending.pts) {\n const localPts = pending.channelId ? this.cpts.get(pending.channelId) : this.pts\n\n if (localPts && pending.ptsBefore !== localPts) {\n log.warn(\n 'pts_before does not match local_pts for %s (cid = %d, pts_before = %d, pts = %d, local_pts = %d)',\n upd._,\n pending.channelId,\n pending.ptsBefore,\n pending.pts,\n localPts,\n )\n }\n\n log.debug(\n 'applying new pts (cid = %d) because received %s: %d -> %d (before: %d, count: %d) (postponed = %s)',\n pending.channelId,\n upd._,\n localPts,\n pending.pts,\n pending.ptsBefore,\n pending.pts - pending.ptsBefore!,\n postponed,\n )\n\n if (pending.channelId) {\n this.cpts.set(pending.channelId, pending.pts)\n this.cptsMod.set(pending.channelId, pending.pts)\n } else {\n this.pts = pending.pts\n }\n }\n\n if (pending.qtsBefore) {\n log.debug(\n 'applying new qts because received %s: %d -> %d (postponed = %s)',\n upd._,\n this.qts,\n pending.qtsBefore + 1,\n postponed,\n )\n\n this.qts = pending.qts\n }\n }\n\n if (isMessageEmpty(upd)) return\n\n // this.rpsProcessing?.hit()\n\n // updates that are also used internally\n switch (upd._) {\n case 'mtcute.dummyUpdate':\n // we just needed to apply new pts values\n return\n case 'updateDcOptions': {\n const config = client.mt.network.config.getNow()\n\n if (config) {\n client.mt.network.config.setData({\n ...config,\n dcOptions: upd.dcOptions,\n })\n } else {\n client.mt.network.config.update(true).catch((err) => client.emitError(err))\n }\n break\n }\n case 'updateConfig':\n client.mt.network.config.update(true).catch((err) => client.emitError(err))\n break\n case 'updateUserName':\n // todo\n // if (upd.userId === state.auth?.userId) {\n // state.auth.selfUsername = upd.usernames.find((it) => it.active)?.username ?? null\n // }\n break\n case 'updateDeleteChannelMessages':\n if (!this.auth?.isBot) {\n await client.storage.refMsgs.delete(toggleChannelIdMark(upd.channelId), upd.messages)\n }\n break\n case 'updateNewMessage':\n case 'updateEditMessage':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n if (!this.auth?.isBot) {\n await this._storeMessageReferences(upd.message)\n }\n break\n }\n\n if (missing?.size) {\n if (this.auth?.isBot) {\n this.log.warn(\n 'missing peers (%J) after getDifference for %s (pts = %d, cid = %d)',\n missing,\n upd._,\n pending.pts,\n pending.channelId,\n )\n } else {\n // force save storage so the min peers are stored\n await client.mt.storage.save()\n\n for (const id of missing) {\n Promise.resolve(client.storage.peers.getById(id))\n .then((peer): unknown => {\n if (!peer) {\n this.log.warn('cannot fetch full peer %d - getPeerById returned null', id)\n\n return\n }\n\n // the peer will be automatically cached by the `.call()`, we don't have to do anything\n // todo\n // if (isInputPeerChannel(peer)) {\n // return _getChannelsBatched(client, toInputChannel(peer))\n // } else if (isInputPeerUser(peer)) {\n // return _getUsersBatched(client, toInputUser(peer))\n // }\n\n log.warn('cannot fetch full peer %d - unknown peer type %s', id, peer._)\n })\n .catch((err) => {\n log.warn('error fetching full peer %d: %s', id, err)\n })\n }\n }\n }\n\n // dispatch the update\n if (this.noDispatchEnabled) {\n const channelId = pending.channelId ?? 0\n const msgId =\n upd._ === 'updateNewMessage' || upd._ === 'updateNewChannelMessage' ? upd.message.id : undefined\n\n // we first need to remove it from each index, and then check if it was there\n const foundByMsgId = msgId && this.noDispatchMsg.get(channelId)?.delete(msgId)\n const foundByPts = this.noDispatchPts.get(channelId)?.delete(pending.pts!)\n const foundByQts = this.noDispatchQts.delete(pending.qts!)\n\n if (foundByMsgId || foundByPts || foundByQts) {\n log.debug('not dispatching %s because it is in no_dispatch index', upd._)\n\n return\n }\n }\n\n log.debug('dispatching %s (postponed = %s)', upd._, postponed)\n this._handler(upd, pending.peers)\n }\n\n async _loop(): Promise<void> {\n const {\n log,\n client,\n cpts,\n cptsMod,\n pendingUpdateContainers,\n pendingPtsUpdates,\n pendingPtsUpdatesPostponed,\n pendingQtsUpdates,\n pendingQtsUpdatesPostponed,\n pendingUnorderedUpdates,\n updatesLoopCv,\n postponedTimer,\n } = this\n\n log.debug('updates loop started, state available? %b', this.pts)\n\n try {\n if (!this.pts) {\n await this._fetchUpdatesState()\n }\n\n while (this.updatesLoopActive) {\n if (\n !(\n pendingUpdateContainers.length ||\n pendingPtsUpdates.length ||\n pendingQtsUpdates.length ||\n pendingUnorderedUpdates.length ||\n this.hasTimedoutPostponed\n )\n ) {\n if (this.catchingUp) {\n // consider catching up completed if there are no more updates\n this.log.debug('catching up completed')\n this.catchingUp = false\n this._onCatchingUp(false)\n }\n\n await updatesLoopCv.wait()\n }\n if (!this.updatesLoopActive) break\n\n log.debug(\n 'updates loop tick. pending containers: %d, pts: %d, pts_postponed: %d, qts: %d, qts_postponed: %d, unordered: %d',\n pendingUpdateContainers.length,\n pendingPtsUpdates.length,\n pendingPtsUpdatesPostponed.length,\n pendingQtsUpdates.length,\n pendingQtsUpdatesPostponed.length,\n pendingUnorderedUpdates.length,\n )\n\n const requestedDiff = new Map<number, Promise<void>>()\n\n this.log.debug('processing pending containers')\n\n while (pendingUpdateContainers.length) {\n const { upd, seqStart, seqEnd } = pendingUpdateContainers.popFront()!\n\n switch (upd._) {\n case 'updatesTooLong':\n log.debug('received updatesTooLong, fetching difference')\n this._fetchDifferenceLater(requestedDiff)\n break\n case 'updatesCombined':\n case 'updates': {\n if (seqStart !== 0) {\n // https://t.me/tdlibchat/5843\n const nextLocalSeq = this.seq! + 1\n log.debug(\n 'received seq-ordered %s (seq_start = %d, seq_end = %d, size = %d)',\n upd._,\n seqStart,\n seqEnd,\n upd.updates.length,\n )\n\n if (nextLocalSeq > seqStart) {\n log.debug(\n 'ignoring updates group because already applied (by seq: exp %d, got %d)',\n nextLocalSeq,\n seqStart,\n )\n // \"the updates were already applied, and must be ignored\"\n continue\n }\n\n if (nextLocalSeq < seqStart) {\n log.debug(\n 'fetching difference because gap detected (by seq: exp %d, got %d)',\n nextLocalSeq,\n seqStart,\n )\n // \"there's an updates gap that must be filled\"\n this._fetchDifferenceLater(requestedDiff)\n }\n } else {\n log.debug('received %s (size = %d)', upd._, upd.updates.length)\n }\n\n await client.storage.peers.updatePeersFrom(upd)\n\n const peers = PeersIndex.from(upd)\n\n for (const update of upd.updates) {\n switch (update._) {\n case 'updateChannelTooLong':\n log.debug(\n 'received updateChannelTooLong for channel %d (pts = %d) in container, fetching diff',\n update.channelId,\n update.pts,\n )\n this._fetchChannelDifferenceLater(requestedDiff, update.channelId, update.pts)\n continue\n case 'updatePtsChanged':\n // see https://github.com/tdlib/td/blob/07c1d53a6d3cb1fad58d2822e55eef6d57363581/td/telegram/UpdatesManager.cpp#L4051\n if (client.mt.network.getPoolSize('main') > 1) {\n // highload bot\n log.debug(\n 'updatePtsChanged received, resetting pts to 1 and fetching difference',\n )\n this.pts = 1\n this._fetchDifferenceLater(requestedDiff)\n } else {\n log.debug('updatePtsChanged received, fetching updates state')\n await this._fetchUpdatesState()\n }\n continue\n }\n\n const parsed = toPendingUpdate(update, peers)\n\n if (parsed.ptsBefore !== undefined) {\n pendingPtsUpdates.add(parsed)\n } else if (parsed.qtsBefore !== undefined) {\n pendingQtsUpdates.add(parsed)\n } else {\n pendingUnorderedUpdates.pushBack(parsed)\n }\n }\n\n if (seqEnd !== 0 && seqEnd > this.seq!) {\n this.seq = seqEnd\n this.date = upd.date\n }\n\n break\n }\n case 'updateShort': {\n log.debug('received short %s', upd._)\n\n const parsed = toPendingUpdate(upd.update, new PeersIndex())\n\n if (parsed.ptsBefore !== undefined) {\n pendingPtsUpdates.add(parsed)\n } else if (parsed.qtsBefore !== undefined) {\n pendingQtsUpdates.add(parsed)\n } else {\n pendingUnorderedUpdates.pushBack(parsed)\n }\n\n break\n }\n case 'updateShortMessage': {\n log.debug('received updateShortMessage')\n\n const message: tl.RawMessage = {\n _: 'message',\n out: upd.out,\n mentioned: upd.mentioned,\n mediaUnread: upd.mediaUnread,\n silent: upd.silent,\n id: upd.id,\n fromId: {\n _: 'peerUser',\n userId: upd.out ? this.auth!.userId : upd.userId,\n },\n peerId: {\n _: 'peerUser',\n userId: upd.userId,\n },\n fwdFrom: upd.fwdFrom,\n viaBotId: upd.viaBotId,\n replyTo: upd.replyTo,\n date: upd.date,\n message: upd.message,\n entities: upd.entities,\n ttlPeriod: upd.ttlPeriod,\n }\n\n const update: tl.RawUpdateNewMessage = {\n _: 'updateNewMessage',\n message,\n pts: upd.pts,\n ptsCount: upd.ptsCount,\n }\n\n pendingPtsUpdates.add({\n update,\n ptsBefore: upd.pts - upd.ptsCount,\n pts: upd.pts,\n peers: new PeersIndex(),\n fromDifference: false,\n })\n\n break\n }\n case 'updateShortChatMessage': {\n log.debug('received updateShortChatMessage')\n\n const message: tl.RawMessage = {\n _: 'message',\n out: upd.out,\n mentioned: upd.mentioned,\n mediaUnread: upd.mediaUnread,\n silent: upd.silent,\n id: upd.id,\n fromId: {\n _: 'peerUser',\n userId: upd.fromId,\n },\n peerId: {\n _: 'peerChat',\n chatId: upd.chatId,\n },\n fwdFrom: upd.fwdFrom,\n viaBotId: upd.viaBotId,\n replyTo: upd.replyTo,\n date: upd.date,\n message: upd.message,\n entities: upd.entities,\n ttlPeriod: upd.ttlPeriod,\n }\n\n const update: tl.RawUpdateNewMessage = {\n _: 'updateNewMessage',\n message,\n pts: upd.pts,\n ptsCount: upd.ptsCount,\n }\n\n pendingPtsUpdates.add({\n update,\n ptsBefore: upd.pts - upd.ptsCount,\n pts: upd.pts,\n peers: new PeersIndex(),\n fromDifference: false,\n })\n\n break\n }\n case 'updateShortSentMessage': {\n // should not happen\n log.warn('received updateShortSentMessage')\n break\n }\n default:\n assertNever(upd)\n }\n }\n\n this.log.debug('processing pending pts-ordered updates')\n\n while (pendingPtsUpdates.length) {\n const pending = pendingPtsUpdates.popFront()!\n const upd = pending.update\n\n // check pts\n\n let localPts: number | null = null\n\n if (!pending.channelId) localPts = this.pts!\n else if (cpts.has(pending.channelId)) {\n localPts = cpts.get(pending.channelId)!\n } else if (this.catchingUp) {\n // only load stored channel pts in case\n // the user has enabled catching up.\n // not loading stored pts effectively disables\n // catching up, but doesn't interfere with further\n // update gaps (i.e. first update received is considered\n // to be the base state)\n\n const saved = await client.storage.updates.getChannelPts(pending.channelId)\n\n if (saved) {\n cpts.set(pending.channelId, saved)\n localPts = saved\n }\n }\n\n if (localPts) {\n const diff = localPts - pending.ptsBefore!\n // PTS can only go up or drop cardinally\n const isPtsDrop = diff > 1000009\n\n if (diff > 0 && !isPtsDrop) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring %s (cid = %d) because already applied (by pts: exp %d, got %d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n )\n continue\n }\n if (diff < 0) {\n // \"there's an update gap that must be filled\"\n // if the gap is less than 3, put the update into postponed queue\n // otherwise, call getDifference\n if (diff > -3) {\n log.debug(\n 'postponing %s for 0.5s (cid = %d) because small gap detected (by pts: exp %d, got %d, diff=%d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n diff,\n )\n pending.timeout = Date.now() + 500\n pendingPtsUpdatesPostponed.add(pending)\n postponedTimer.emitBefore(pending.timeout)\n } else if (diff > -1000000) {\n log.debug(\n 'fetching difference after %s (cid = %d) because pts gap detected (by pts: exp %d, got %d, diff=%d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n diff,\n )\n\n if (pending.channelId) {\n this._fetchChannelDifferenceLater(requestedDiff, pending.channelId)\n } else {\n this._fetchDifferenceLater(requestedDiff)\n }\n } else {\n log.debug(\n 'skipping all updates because pts gap is too big (by pts: exp %d, got %d, diff=%d)',\n localPts,\n pending.ptsBefore,\n diff,\n )\n\n if (pending.channelId) {\n cpts.set(pending.channelId, 0)\n cptsMod.set(pending.channelId, 0)\n } else {\n await this._fetchUpdatesState()\n }\n }\n continue\n }\n\n if (isPtsDrop) {\n log.debug('pts drop detected (%d -> %d)', localPts, pending.ptsBefore)\n }\n }\n\n await this._onUpdate(pending, requestedDiff)\n }\n\n this.log.debug('processing postponed pts-ordered updates')\n\n for (let item = pendingPtsUpdatesPostponed._first; item; item = item.n) {\n // awesome fucking iteration because i'm so fucking tired and wanna kms\n const pending = item.v\n\n const upd = pending.update\n\n let localPts\n\n if (!pending.channelId) localPts = this.pts!\n else if (cpts.has(pending.channelId)) {\n localPts = cpts.get(pending.channelId)\n }\n\n // channel pts from storage will be available because we loaded it earlier\n if (!localPts) {\n log.warn(\n 'local pts not available for postponed %s (cid = %d), skipping',\n upd._,\n pending.channelId,\n )\n continue\n }\n\n // check the pts to see if the gap was filled\n if (localPts > pending.ptsBefore!) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring postponed %s (cid = %d) because already applied (by pts: exp %d, got %d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n )\n pendingPtsUpdatesPostponed._remove(item)\n continue\n }\n if (localPts < pending.ptsBefore!) {\n // \"there's an update gap that must be filled\"\n // if the timeout has not expired yet, keep the update in the queue\n // otherwise, fetch diff\n const now = Date.now()\n\n if (now < pending.timeout!) {\n log.debug(\n 'postponed %s (cid = %d) is still waiting (%dms left) (current pts %d, need %d)',\n upd._,\n pending.channelId,\n pending.timeout! - now,\n localPts,\n pending.ptsBefore,\n )\n } else {\n log.debug(\n \"gap for postponed %s (cid = %d) wasn't filled, fetching diff (current pts %d, need %d)\",\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n )\n pendingPtsUpdatesPostponed._remove(item)\n\n if (pending.channelId) {\n this._fetchChannelDifferenceLater(requestedDiff, pending.channelId)\n } else {\n this._fetchDifferenceLater(requestedDiff)\n }\n }\n continue\n }\n\n await this._onUpdate(pending, requestedDiff, true)\n pendingPtsUpdatesPostponed._remove(item)\n }\n\n this.log.debug('processing pending qts-ordered updates')\n\n while (pendingQtsUpdates.length) {\n const pending = pendingQtsUpdates.popFront()!\n const upd = pending.update\n\n // check qts\n const diff = this.qts! - pending.qtsBefore!\n const isQtsDrop = diff > 1000009\n\n if (diff > 0 && !isQtsDrop) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring %s because already applied (by qts: exp %d, got %d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n )\n continue\n }\n if (this.qts! < pending.qtsBefore!) {\n // \"there's an update gap that must be filled\"\n // if the gap is less than 3, put the update into postponed queue\n // otherwise, call getDifference\n if (diff > -3) {\n log.debug(\n 'postponing %s for 0.5s because small gap detected (by qts: exp %d, got %d, diff=%d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n diff,\n )\n pending.timeout = Date.now() + 500\n pendingQtsUpdatesPostponed.add(pending)\n postponedTimer.emitBefore(pending.timeout)\n } else {\n log.debug(\n 'fetching difference after %s because qts gap detected (by qts: exp %d, got %d, diff=%d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n diff,\n )\n this._fetchDifferenceLater(requestedDiff)\n }\n continue\n }\n\n if (isQtsDrop) {\n log.debug('qts drop detected (%d -> %d)', this.qts, pending.qtsBefore)\n }\n\n await this._onUpdate(pending, requestedDiff)\n }\n\n this.log.debug('processing postponed qts-ordered updates')\n\n for (let item = pendingQtsUpdatesPostponed._first; item; item = item.n) {\n // awesome fucking iteration because i'm so fucking tired and wanna kms\n const pending = item.v\n const upd = pending.update\n\n // check the pts to see if the gap was filled\n if (this.qts! > pending.qtsBefore!) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring postponed %s because already applied (by qts: exp %d, got %d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n )\n continue\n }\n if (this.qts! < pending.qtsBefore!) {\n // \"there's an update gap that must be filled\"\n // if the timeout has not expired yet, keep the update in the queue\n // otherwise, fetch diff\n const now = Date.now()\n\n if (now < pending.timeout!) {\n log.debug(\n 'postponed %s is still waiting (%dms left) (current qts %d, need %d)',\n upd._,\n pending.timeout! - now,\n this.qts!,\n pending.qtsBefore,\n )\n } else {\n log.debug(\n \"gap for postponed %s wasn't filled, fetching diff (current qts %d, need %d)\",\n upd._,\n this.qts!,\n pending.qtsBefore,\n )\n pendingQtsUpdatesPostponed._remove(item)\n this._fetchDifferenceLater(requestedDiff)\n }\n continue\n }\n\n // gap was filled, and the update can be applied\n await this._onUpdate(pending, requestedDiff, true)\n pendingQtsUpdatesPostponed._remove(item)\n }\n\n this.hasTimedoutPostponed = false\n\n while (requestedDiff.size) {\n log.debug(\n 'waiting for %d pending diffs before processing unordered: %J',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n\n await Promise.all([...requestedDiff.values()])\n\n // diff results may as well contain new diffs to be requested\n log.debug(\n 'pending diffs awaited, new diffs requested: %d (%J)',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n }\n\n this.log.debug('processing pending unordered updates')\n\n while (pendingUnorderedUpdates.length) {\n const pending = pendingUnorderedUpdates.popFront()!\n\n await this._onUpdate(pending, requestedDiff, false, true)\n }\n\n // onUpdate may also call getDiff in some cases, so we also need to check\n // diff may also contain new updates, which will be processed in the next tick,\n // but we don't want to postpone diff fetching\n while (requestedDiff.size) {\n log.debug(\n 'waiting for %d pending diffs after processing unordered: %J',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n\n await Promise.all([...requestedDiff.values()])\n\n // diff results may as well contain new diffs to be requested\n log.debug(\n 'pending diffs awaited, new diffs requested: %d (%j)',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n }\n\n // save new update state\n await this._saveUpdatesStorage(true)\n }\n\n log.debug('updates loop stopped')\n } catch (e) {\n log.error('updates loop encountered error, restarting: %s', e)\n\n return this._loop()\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/highlevel/updates/manager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-depth,max-params */\nimport { tl } from '@mtcute/tl'\n\nimport { MtArgumentError } from '../../types/errors.js'\nimport { assertNever, MaybePromise } from '../../types/utils.js'\nimport {\n AsyncLock,\n ConditionVariable,\n Deque,\n EarlyTimer,\n getBarePeerId,\n getMarkedPeerId,\n parseMarkedPeerId,\n SortedLinkedList,\n toggleChannelIdMark,\n toInputChannel,\n} from '../../utils/index.js'\nimport { BaseTelegramClient } from '../base.js'\nimport { CurrentUserInfo } from '../storage/service/current-user.js'\nimport { PeersIndex } from '../types/peers/peers-index.js'\nimport { PendingUpdate, PendingUpdateContainer, RawUpdateHandler, UpdatesManagerParams } from './types.js'\nimport {\n createDummyUpdatesContainer,\n extractChannelIdFromUpdate,\n isMessageEmpty,\n messageToUpdate,\n toPendingUpdate,\n} from './utils.js'\n\n// code in this file is very bad, thanks to Telegram's awesome updates mechanism\n\n// todo: maybe move to another class?\n// /**\n// * Enable RPS meter.\n// *\n// * > **Note**: This may have negative impact on performance\n// *\n// * @param size Sampling size\n// * @param time Window time\n// */\n// export function enableRps(client: ITelegramClient, size?: number, time?: number): void {\n// const state = getState(client)\n// state.rpsIncoming = new RpsMeter(size, time)\n// state.rpsProcessing = new RpsMeter(size, time)\n// }\n\n// /**\n// * Get current average incoming RPS\n// *\n// * Incoming RPS is calculated based on\n// * incoming update containers. Normally,\n// * they should be around the same, except\n// * rare situations when processing rps\n// * may peak.\n// */\n// export function getCurrentRpsIncoming(client: ITelegramClient): number {\n// const state = getState(client)\n\n// if (!state.rpsIncoming) {\n// throw new MtArgumentError('RPS meter is not enabled, use .enableRps() first')\n// }\n\n// return state.rpsIncoming.getRps()\n// }\n\n// /**\n// * Get current average processing RPS\n// *\n// * Processing RPS is calculated based on\n// * dispatched updates. Normally,\n// * they should be around the same, except\n// * rare situations when processing rps\n// * may peak.\n// */\n// export function getCurrentRpsProcessing(client: ITelegramClient): number {\n// const state = getState(client)\n\n// if (!state.rpsProcessing) {\n// throw new MtArgumentError('RPS meter is not enabled, use .enableRps() first')\n// }\n\n// return state.rpsProcessing.getRps()\n// }\n\nconst KEEP_ALIVE_INTERVAL = 15 * 60 * 1000 // 15 minutes\nconst UPDATES_TOO_LONG = { _: 'updatesTooLong' } as const\n\n// todo: fix docs\nexport class UpdatesManager {\n updatesLoopActive = false\n updatesLoopCv = new ConditionVariable()\n\n postponedTimer = new EarlyTimer()\n hasTimedoutPostponed = false\n\n pendingUpdateContainers = new SortedLinkedList<PendingUpdateContainer>((a, b) => a.seqStart - b.seqStart)\n pendingPtsUpdates = new SortedLinkedList<PendingUpdate>((a, b) => a.ptsBefore! - b.ptsBefore!)\n pendingPtsUpdatesPostponed = new SortedLinkedList<PendingUpdate>((a, b) => a.ptsBefore! - b.ptsBefore!)\n pendingQtsUpdates = new SortedLinkedList<PendingUpdate>((a, b) => a.qtsBefore! - b.qtsBefore!)\n pendingQtsUpdatesPostponed = new SortedLinkedList<PendingUpdate>((a, b) => a.qtsBefore! - b.qtsBefore!)\n pendingUnorderedUpdates = new Deque<PendingUpdate>()\n\n noDispatchEnabled\n // channel id or 0 => msg id\n noDispatchMsg = new Map<number, Set<number>>()\n // channel id or 0 => pts\n noDispatchPts = new Map<number, Set<number>>()\n noDispatchQts = new Set<number>()\n\n lock = new AsyncLock()\n // rpsIncoming?: RpsMeter\n // rpsProcessing?: RpsMeter\n\n // accessing storage every time might be expensive,\n // so store everything here, and load & save\n // every time session is loaded & saved.\n pts?: number\n qts?: number\n date?: number\n seq?: number\n\n // old values of the updates state (i.e. as in DB)\n // used to avoid redundant storage calls\n oldPts?: number\n oldQts?: number\n oldDate?: number\n oldSeq?: number\n\n // whether to catch up channels from the locally stored pts\n catchingUp = false\n catchUpOnStart\n\n cpts = new Map<number, number>()\n cptsMod = new Map<number, number>()\n channelDiffTimeouts = new Map<number, NodeJS.Timeout>()\n channelsOpened = new Map<number, number>()\n\n log\n private _handler: RawUpdateHandler = () => {}\n\n private _onCatchingUp: (catchingUp: boolean) => void = () => {}\n\n auth?: CurrentUserInfo | null // todo: do we need a local copy?\n keepAliveInterval?: NodeJS.Timeout\n\n constructor(\n readonly client: BaseTelegramClient,\n readonly params: UpdatesManagerParams = {},\n ) {\n if (client.params.disableUpdates) {\n throw new MtArgumentError('Updates must be enabled to use updates manager')\n }\n\n this._onKeepAlive = this._onKeepAlive.bind(this)\n\n this.postponedTimer.onTimeout(() => {\n this.hasTimedoutPostponed = true\n this.updatesLoopCv.notify()\n })\n this.log = client.log.create('updates')\n this.catchUpOnStart = params.catchUp ?? false\n this.noDispatchEnabled = !params.disableNoDispatch\n }\n\n setHandler(handler: RawUpdateHandler): void {\n this._handler = handler\n }\n\n onCatchingUp(handler: (catchingUp: boolean) => void): void {\n this._onCatchingUp = handler\n }\n\n destroy() {\n this.stopLoop()\n }\n\n notifyLoggedIn(self: CurrentUserInfo): void {\n this.auth = self\n this.startLoop().catch((err) => this.client.emitError(err))\n }\n\n notifyLoggedOut(): void {\n this.stopLoop()\n this.cpts.clear()\n this.cptsMod.clear()\n this.pts = this.qts = this.date = this.seq = undefined\n }\n\n async prepare(): Promise<void> {\n await this._loadUpdatesStorage()\n }\n\n private _onKeepAlive() {\n this.log.debug('no updates for >15 minutes, catching up')\n this.handleUpdate(UPDATES_TOO_LONG)\n }\n\n /**\n * Start updates loop.\n *\n * You must first call {@link enableUpdatesProcessing} to use this method.\n *\n * It is recommended to use this method in callback to {@link start},\n * or otherwise make sure the user is logged in.\n *\n * > **Note**: If you are using {@link UpdatesManagerParams.catchUp} option,\n * > catching up will be done in background, you can't await it.\n * > Instead, listen for the `updating` and `connected` connection state events.\n */\n async startLoop(): Promise<void> {\n if (this.updatesLoopActive) return\n\n // otherwise we will catch up on the first update\n if (!this.catchUpOnStart) {\n await this._fetchUpdatesState()\n }\n\n // start updates loop in background\n this.updatesLoopActive = true\n clearInterval(this.keepAliveInterval)\n this.keepAliveInterval = setInterval(this._onKeepAlive, KEEP_ALIVE_INTERVAL)\n this._loop().catch((err) => this.client.emitError(err))\n\n if (this.catchUpOnStart) {\n this.catchUp()\n }\n }\n\n /**\n * **ADVANCED**\n *\n * Manually stop updates loop.\n * Usually done automatically when stopping the client with {@link close}\n */\n stopLoop(): void {\n if (!this.updatesLoopActive) return\n\n clearInterval(this.keepAliveInterval)\n\n for (const timer of this.channelDiffTimeouts.values()) {\n clearTimeout(timer)\n }\n this.channelDiffTimeouts.clear()\n\n this.updatesLoopActive = false\n this.pendingUpdateContainers.clear()\n this.pendingUnorderedUpdates.clear()\n this.pendingPtsUpdates.clear()\n this.pendingQtsUpdates.clear()\n this.pendingPtsUpdatesPostponed.clear()\n this.pendingQtsUpdatesPostponed.clear()\n this.postponedTimer.reset()\n this.updatesLoopCv.notify()\n }\n\n /**\n * Catch up with the server by loading missed updates.\n *.\n * > **Note**: In case the storage was not properly\n * > closed the last time, \"catching up\" might\n * > result in duplicate updates.\n */\n catchUp(): void {\n if (!this.updatesLoopActive) {\n this.log.warn('catch up requested, but updates loop is not active, ignoring')\n\n return\n }\n\n this.log.debug('catch up requested')\n\n this._onCatchingUp(true)\n this.catchingUp = true\n this.handleUpdate(UPDATES_TOO_LONG)\n }\n\n handleClientUpdate(update: tl.TypeUpdates, noDispatch = true): void {\n if (noDispatch && this.noDispatchEnabled) {\n this._addToNoDispatchIndex(update)\n }\n\n this.handleUpdate(update)\n }\n\n handleUpdate(update: tl.TypeUpdates): void {\n this.log.debug(\n 'received %s, queueing for processing. containers queue size: %d',\n update._,\n this.pendingUpdateContainers.length,\n )\n // this.rpsIncoming?.hit()\n\n switch (update._) {\n case 'updatesTooLong':\n case 'updateShortMessage':\n case 'updateShortChatMessage':\n case 'updateShort':\n case 'updateShortSentMessage':\n this.pendingUpdateContainers.add({\n upd: update,\n seqStart: 0,\n seqEnd: 0,\n })\n break\n case 'updates':\n case 'updatesCombined':\n this.pendingUpdateContainers.add({\n upd: update,\n seqStart: update._ === 'updatesCombined' ? update.seqStart : update.seq,\n seqEnd: update.seq,\n })\n break\n default:\n assertNever(update)\n }\n\n this.updatesLoopCv.notify()\n }\n\n /**\n * **ADVANCED**\n *\n * Notify the updates manager that some channel was \"opened\".\n * Channel difference for \"opened\" channels will be fetched on a regular basis.\n * This is a low-level method, prefer using {@link openChat} instead.\n *\n * Channel must be resolve-able with `resolvePeer` method (i.e. be in cache);\n * base chat PTS must either be passed (e.g. from {@link Dialog}), or cached in storage.\n *\n * @param channelId Bare ID of the channel\n * @param pts PTS of the channel, if known (e.g. from {@link Dialog})\n * @returns `true` if the channel was opened for the first time, `false` if it is already opened\n */\n notifyChannelOpened(channelId: number, pts?: number): boolean {\n // this method is intentionally very dumb to avoid making this file even more unreadable\n\n if (this.channelsOpened.has(channelId)) {\n this.log.debug('channel %d opened again', channelId)\n this.channelsOpened.set(channelId, this.channelsOpened.get(channelId)! + 1)\n\n return false\n }\n\n this.channelsOpened.set(channelId, 1)\n this.log.debug('channel %d opened (pts=%d)', channelId, pts)\n\n // force fetch channel difference\n this._fetchChannelDifferenceViaUpdate(channelId, pts)\n\n return true\n }\n\n /**\n * **ADVANCED**\n *\n * Notify the updates manager that some channel was \"closed\".\n * Basically the opposite of {@link notifyChannelOpened}.\n * This is a low-level method, prefer using {@link closeChat} instead.\n *\n * @param channelId Bare channel ID\n * @returns `true` if the chat was closed for the last time, `false` otherwise\n */\n notifyChannelClosed(channelId: number): boolean {\n const opened = this.channelsOpened.get(channelId)!\n\n if (opened === undefined) {\n return false\n }\n\n if (opened > 1) {\n this.log.debug('channel %d closed, but is opened %d more times', channelId, opened - 1)\n this.channelsOpened.set(channelId, opened - 1)\n\n return false\n }\n\n this.channelsOpened.delete(channelId)\n this.log.debug('channel %d closed', channelId)\n\n return true\n }\n\n ////////////////////////////////////////////// IMPLEMENTATION //////////////////////////////////////////////\n\n async _fetchUpdatesState(): Promise<void> {\n const { client, lock, log } = this\n\n await lock.acquire()\n\n log.debug('fetching initial state')\n\n try {\n let fetchedState = await client.call({ _: 'updates.getState' })\n\n log.debug(\n 'updates.getState returned state: pts=%d, qts=%d, date=%d, seq=%d',\n fetchedState.pts,\n fetchedState.qts,\n fetchedState.date,\n fetchedState.seq,\n )\n\n // for some unknown fucking reason getState may return old qts\n // call getDifference to get actual values :shrug:\n const diff = await client.call({\n _: 'updates.getDifference',\n pts: fetchedState.pts,\n qts: fetchedState.qts,\n date: fetchedState.date,\n })\n\n switch (diff._) {\n case 'updates.differenceEmpty':\n break\n case 'updates.differenceTooLong': // shouldn't happen, but who knows?\n (fetchedState as tl.Mutable<tl.updates.TypeState>).pts = diff.pts\n break\n case 'updates.differenceSlice':\n fetchedState = diff.intermediateState\n break\n case 'updates.difference':\n fetchedState = diff.state\n break\n default:\n assertNever(diff)\n }\n\n this.qts = fetchedState.qts\n this.pts = fetchedState.pts\n this.date = fetchedState.date\n this.seq = fetchedState.seq\n\n log.debug('loaded initial state: pts=%d, qts=%d, date=%d, seq=%d', this.pts, this.qts, this.date, this.seq)\n } catch (e) {\n if (this.client.isConnected) {\n log.error('failed to fetch updates state: %s', e)\n }\n\n lock.release()\n throw e\n }\n\n lock.release()\n }\n\n async _loadUpdatesStorage(): Promise<void> {\n const storedState = await this.client.storage.updates.getState()\n\n if (storedState) {\n this.pts = this.oldPts = storedState[0]\n this.qts = this.oldQts = storedState[1]\n this.date = this.oldDate = storedState[2]\n this.seq = this.oldSeq = storedState[3]\n\n this.log.debug(\n 'loaded stored state: pts=%d, qts=%d, date=%d, seq=%d',\n storedState[0],\n storedState[1],\n storedState[2],\n storedState[3],\n )\n }\n // if no state, don't bother initializing properties\n // since that means that there is no authorization,\n // and thus fetchUpdatesState will be called\n }\n\n async _saveUpdatesStorage(save = false): Promise<void> {\n const { client } = this\n\n // todo: move this to updates state service\n // before any authorization pts will be undefined\n if (this.pts !== undefined) {\n // if old* value is not available, assume it has changed.\n if (this.oldPts === undefined || this.oldPts !== this.pts) {\n await client.storage.updates.setPts(this.pts)\n }\n if (this.oldQts === undefined || this.oldQts !== this.qts) {\n await client.storage.updates.setQts(this.qts!)\n }\n if (this.oldDate === undefined || this.oldDate !== this.date) {\n await client.storage.updates.setDate(this.date!)\n }\n if (this.oldSeq === undefined || this.oldSeq !== this.seq) {\n await client.storage.updates.setSeq(this.seq!)\n }\n\n // update old* values\n this.oldPts = this.pts\n this.oldQts = this.qts\n this.oldDate = this.date\n this.oldSeq = this.seq\n\n await client.storage.updates.setManyChannelPts(this.cptsMod)\n this.cptsMod.clear()\n\n if (save) {\n await client.mt.storage.save()\n }\n }\n }\n\n _addToNoDispatchIndex(updates?: tl.TypeUpdates): void {\n if (!updates) return\n\n const { noDispatchMsg, noDispatchPts, noDispatchQts } = this\n\n const addUpdate = (upd: tl.TypeUpdate) => {\n const channelId = extractChannelIdFromUpdate(upd) ?? 0\n const pts = 'pts' in upd ? upd.pts : undefined\n\n if (pts) {\n const set = noDispatchPts.get(channelId)\n if (!set) noDispatchPts.set(channelId, new Set([pts]))\n else set.add(pts)\n }\n\n const qts = 'qts' in upd ? upd.qts : undefined\n\n if (qts) {\n noDispatchQts.add(qts)\n }\n\n switch (upd._) {\n case 'updateNewMessage':\n case 'updateNewChannelMessage': {\n const channelId = upd.message.peerId?._ === 'peerChannel' ? upd.message.peerId.channelId : 0\n\n const set = noDispatchMsg.get(channelId)\n if (!set) noDispatchMsg.set(channelId, new Set([upd.message.id]))\n else set.add(upd.message.id)\n\n break\n }\n }\n }\n\n switch (updates._) {\n case 'updates':\n case 'updatesCombined':\n updates.updates.forEach(addUpdate)\n break\n case 'updateShortMessage':\n case 'updateShortChatMessage':\n case 'updateShortSentMessage': {\n // these updates are only used for non-channel messages, so we use 0\n let set = noDispatchMsg.get(0)\n if (!set) noDispatchMsg.set(0, new Set([updates.id]))\n else set.add(updates.id)\n\n set = noDispatchPts.get(0)\n if (!set) noDispatchPts.set(0, new Set([updates.pts]))\n else set.add(updates.pts)\n break\n }\n case 'updateShort':\n addUpdate(updates.update)\n break\n case 'updatesTooLong':\n break\n default:\n assertNever(updates)\n }\n }\n\n async _fetchMissingPeers(upd: tl.TypeUpdate, peers: PeersIndex, allowMissing = false): Promise<Set<number>> {\n const { client } = this\n\n const missing = new Set<number>()\n\n async function fetchPeer(peer?: tl.TypePeer | number) {\n if (!peer) return true\n\n const bare = typeof peer === 'number' ? parseMarkedPeerId(peer)[1] : getBarePeerId(peer)\n\n const marked = typeof peer === 'number' ? peer : getMarkedPeerId(peer)\n const index = marked > 0 ? peers.users : peers.chats\n\n if (index.has(bare)) return true\n if (missing.has(marked)) return false\n\n const cached = await client.storage.peers.getCompleteById(marked)\n\n if (!cached) {\n missing.add(marked)\n\n return allowMissing\n }\n\n // whatever, ts is not smart enough to understand\n (index as Map<number, tl.TypeUser | tl.TypeChat>).set(bare, cached)\n\n return true\n }\n\n switch (upd._) {\n case 'updateNewMessage':\n case 'updateNewChannelMessage':\n case 'updateEditMessage':\n case 'updateEditChannelMessage': {\n const msg = upd.message\n if (msg._ === 'messageEmpty') return missing\n\n // ref: https://github.com/tdlib/td/blob/master/td/telegram/UpdatesManager.cpp\n // (search by UpdatesManager::is_acceptable_update)\n if (!(await fetchPeer(msg.peerId))) return missing\n if (!(await fetchPeer(msg.fromId))) return missing\n\n if (msg.replyTo) {\n if (msg.replyTo._ === 'messageReplyHeader' && !(await fetchPeer(msg.replyTo.replyToPeerId))) {\n return missing\n }\n if (msg.replyTo._ === 'messageReplyStoryHeader' && !(await fetchPeer(msg.replyTo.peer))) {\n return missing\n }\n }\n\n if (msg._ !== 'messageService') {\n if (\n msg.fwdFrom &&\n (!(await fetchPeer(msg.fwdFrom.fromId)) || !(await fetchPeer(msg.fwdFrom.savedFromPeer)))\n ) {\n return missing\n }\n if (!(await fetchPeer(msg.viaBotId))) return missing\n\n if (msg.entities) {\n for (const ent of msg.entities) {\n if (ent._ === 'messageEntityMentionName') {\n if (!(await fetchPeer(ent.userId))) return missing\n }\n }\n }\n\n if (msg.media) {\n switch (msg.media._) {\n case 'messageMediaContact':\n if (msg.media.userId && !(await fetchPeer(msg.media.userId))) {\n return missing\n }\n }\n }\n } else {\n switch (msg.action._) {\n case 'messageActionChatCreate':\n case 'messageActionChatAddUser':\n case 'messageActionInviteToGroupCall':\n for (const user of msg.action.users) {\n if (!(await fetchPeer(user))) return missing\n }\n break\n case 'messageActionChatJoinedByLink':\n if (!(await fetchPeer(msg.action.inviterId))) {\n return missing\n }\n break\n case 'messageActionChatDeleteUser':\n if (!(await fetchPeer(msg.action.userId))) return missing\n break\n case 'messageActionChatMigrateTo':\n if (!(await fetchPeer(toggleChannelIdMark(msg.action.channelId)))) {\n return missing\n }\n break\n case 'messageActionChannelMigrateFrom':\n if (!(await fetchPeer(-msg.action.chatId))) return missing\n break\n case 'messageActionGeoProximityReached':\n if (!(await fetchPeer(msg.action.fromId))) return missing\n if (!(await fetchPeer(msg.action.toId))) return missing\n break\n }\n }\n break\n }\n case 'updateDraftMessage':\n if ('entities' in upd.draft && upd.draft.entities) {\n for (const ent of upd.draft.entities) {\n if (ent._ === 'messageEntityMentionName') {\n if (!(await fetchPeer(ent.userId))) return missing\n }\n }\n }\n }\n\n return missing\n }\n\n async _storeMessageReferences(msg: tl.TypeMessage): Promise<void> {\n if (msg._ === 'messageEmpty') return\n\n const { client } = this\n\n const peerId = msg.peerId\n if (peerId._ !== 'peerChannel') return\n\n const channelId = toggleChannelIdMark(peerId.channelId)\n\n const promises: MaybePromise<void>[] = []\n\n function store(peer?: tl.TypePeer | number | number[]): void {\n if (!peer) return\n\n if (Array.isArray(peer)) {\n peer.forEach(store)\n\n return\n }\n\n const marked = typeof peer === 'number' ? peer : getMarkedPeerId(peer)\n\n promises.push(client.storage.refMsgs.store(marked, channelId, msg.id))\n }\n\n // reference: https://github.com/tdlib/td/blob/master/td/telegram/MessagesManager.cpp\n // (search by get_message_user_ids, get_message_channel_ids)\n store(msg.fromId)\n\n if (msg._ === 'message') {\n store(msg.viaBotId)\n store(msg.fwdFrom?.fromId)\n\n if (msg.media) {\n switch (msg.media._) {\n case 'messageMediaWebPage':\n if (msg.media.webpage._ === 'webPage' && msg.media.webpage.attributes) {\n for (const attr of msg.media.webpage.attributes) {\n if (attr._ === 'webPageAttributeStory') {\n store(attr.peer)\n }\n }\n }\n break\n case 'messageMediaContact':\n store(msg.media.userId)\n break\n case 'messageMediaStory':\n store(msg.media.peer)\n break\n case 'messageMediaGiveaway':\n store(msg.media.channels.map(toggleChannelIdMark))\n break\n }\n }\n } else {\n switch (msg.action._) {\n case 'messageActionChatCreate':\n case 'messageActionChatAddUser':\n case 'messageActionInviteToGroupCall':\n store(msg.action.users)\n break\n case 'messageActionChatDeleteUser':\n store(msg.action.userId)\n break\n }\n }\n\n if (msg.replyTo) {\n switch (msg.replyTo._) {\n case 'messageReplyHeader':\n store(msg.replyTo.replyToPeerId)\n store(msg.replyTo.replyFrom?.fromId)\n break\n case 'messageReplyStoryHeader':\n store(msg.replyTo.peer)\n break\n }\n // in fact, we can also use peers contained in the replied-to message,\n // but we don't fetch it automatically, so we can't know which peers are there\n }\n\n await Promise.all(promises)\n }\n\n async _fetchChannelDifference(channelId: number, fallbackPts?: number): Promise<boolean> {\n const { channelDiffTimeouts, cpts, cptsMod, channelsOpened, client, log, pendingUnorderedUpdates } = this\n\n // clear timeout if any\n if (channelDiffTimeouts.has(channelId)) {\n clearTimeout(channelDiffTimeouts.get(channelId))\n channelDiffTimeouts.delete(channelId)\n }\n\n let _pts: number | null | undefined = cpts.get(channelId)\n\n if (!_pts && this.catchingUp) {\n _pts = await client.storage.updates.getChannelPts(channelId)\n }\n if (!_pts) _pts = fallbackPts\n\n if (!_pts) {\n log.debug('fetchChannelDifference failed for channel %d: base pts not available', channelId)\n\n return false\n }\n\n const channelPeer = await client.storage.peers.getById(toggleChannelIdMark(channelId))\n\n if (!channelPeer) {\n log.debug('fetchChannelDifference failed for channel %d: input peer not found', channelId)\n\n return false\n }\n\n const channel = toInputChannel(channelPeer)\n\n // to make TS happy\n let pts = _pts\n let limit = this.auth?.isBot ? 100000 : 100\n\n if (pts <= 0) {\n pts = 1\n limit = 1\n }\n\n let lastTimeout = 0\n\n for (;;) {\n const diff = await client.call({\n _: 'updates.getChannelDifference',\n force: true, // Set to true to skip some possibly unneeded updates and reduce server-side load\n channel,\n pts,\n limit,\n filter: { _: 'channelMessagesFilterEmpty' },\n })\n\n if (diff.timeout) lastTimeout = diff.timeout\n\n if (diff._ === 'updates.channelDifferenceEmpty') {\n log.debug('getChannelDifference (cid = %d) returned channelDifferenceEmpty', channelId)\n break\n }\n\n const peers = PeersIndex.from(diff)\n\n if (diff._ === 'updates.channelDifferenceTooLong') {\n if (diff.dialog._ === 'dialog') {\n pts = diff.dialog.pts!\n }\n\n log.warn(\n 'getChannelDifference (cid = %d) returned channelDifferenceTooLong. new pts: %d, recent msgs: %d',\n channelId,\n pts,\n diff.messages.length,\n )\n\n diff.messages.forEach((message) => {\n log.debug(\n 'processing message %d (%s) from TooLong diff for channel %d',\n message.id,\n message._,\n channelId,\n )\n\n if (message._ === 'messageEmpty') return\n\n pendingUnorderedUpdates.pushBack(toPendingUpdate(messageToUpdate(message), peers, true))\n })\n break\n }\n\n log.debug(\n 'getChannelDifference (cid = %d) returned %d messages, %d updates. new pts: %d, final: %b',\n channelId,\n diff.newMessages.length,\n diff.otherUpdates.length,\n diff.pts,\n diff.final,\n )\n\n diff.newMessages.forEach((message) => {\n log.debug('processing message %d (%s) from diff for channel %d', message.id, message._, channelId)\n\n if (message._ === 'messageEmpty') return\n\n pendingUnorderedUpdates.pushBack(toPendingUpdate(messageToUpdate(message), peers, true))\n })\n\n diff.otherUpdates.forEach((upd) => {\n const parsed = toPendingUpdate(upd, peers, true)\n\n log.debug(\n 'processing %s from diff for channel %d, pts_before: %d, pts: %d',\n upd._,\n channelId,\n parsed.ptsBefore,\n parsed.pts,\n )\n\n if (isMessageEmpty(upd)) return\n\n pendingUnorderedUpdates.pushBack(parsed)\n })\n\n pts = diff.pts\n\n if (diff.final) break\n }\n\n cpts.set(channelId, pts)\n cptsMod.set(channelId, pts)\n\n // schedule next fetch\n if (lastTimeout !== 0 && channelsOpened.has(channelId)) {\n log.debug('scheduling next fetch for channel %d in %d seconds', channelId, lastTimeout)\n channelDiffTimeouts.set(\n channelId,\n setTimeout(() => this._fetchChannelDifferenceViaUpdate(channelId), lastTimeout * 1000),\n )\n }\n\n return true\n }\n\n _fetchChannelDifferenceLater(\n requestedDiff: Map<number, Promise<void>>,\n channelId: number,\n fallbackPts?: number,\n ): void {\n if (!requestedDiff.has(channelId)) {\n requestedDiff.set(\n channelId,\n this._fetchChannelDifference(channelId, fallbackPts)\n .catch((err) => {\n this.log.warn('error fetching difference for %d: %s', channelId, err)\n })\n .then((ok) => {\n requestedDiff.delete(channelId)\n\n if (!ok) {\n this.log.debug('channel difference for %d failed, falling back to common diff', channelId)\n this._fetchDifferenceLater(requestedDiff)\n }\n }),\n )\n }\n }\n\n _fetchChannelDifferenceViaUpdate(channelId: number, pts?: number): void {\n this.handleUpdate(\n createDummyUpdatesContainer([\n {\n _: 'updateChannelTooLong',\n channelId,\n pts,\n },\n ]),\n )\n }\n\n async _fetchDifference(requestedDiff: Map<number, Promise<void>>): Promise<void> {\n const { client, log, pendingPtsUpdates, pendingUnorderedUpdates } = this\n\n const diff = await client.call({\n _: 'updates.getDifference',\n pts: this.pts!,\n date: this.date!,\n qts: this.qts!,\n })\n\n switch (diff._) {\n case 'updates.differenceEmpty':\n log.debug('updates.getDifference returned updates.differenceEmpty')\n\n return\n case 'updates.differenceTooLong':\n this.pts = diff.pts\n log.debug('updates.getDifference returned updates.differenceTooLong')\n\n return\n }\n\n const fetchedState = diff._ === 'updates.difference' ? diff.state : diff.intermediateState\n\n log.debug(\n 'updates.getDifference returned %d messages, %d updates. new pts: %d, qts: %d, seq: %d, final: %b',\n diff.newMessages.length,\n diff.otherUpdates.length,\n fetchedState.pts,\n fetchedState.qts,\n fetchedState.seq,\n diff._ === 'updates.difference',\n )\n\n const peers = PeersIndex.from(diff)\n\n diff.newMessages.forEach((message) => {\n log.debug('processing message %d in %j (%s) from common diff', message.id, message.peerId, message._)\n\n if (message._ === 'messageEmpty') return\n\n // pts does not need to be checked for them\n pendingUnorderedUpdates.pushBack(toPendingUpdate(messageToUpdate(message), peers, true))\n })\n\n diff.otherUpdates.forEach((upd) => {\n if (upd._ === 'updateChannelTooLong') {\n log.debug(\n 'received updateChannelTooLong for channel %d in common diff (pts = %d), fetching diff',\n upd.channelId,\n upd.pts,\n )\n\n this._fetchChannelDifferenceLater(requestedDiff, upd.channelId, upd.pts)\n\n return\n }\n\n if (isMessageEmpty(upd)) return\n\n const parsed = toPendingUpdate(upd, peers, true)\n\n if (parsed.channelId && parsed.ptsBefore) {\n // we need to check pts for these updates, put into pts queue\n pendingPtsUpdates.add(parsed)\n } else {\n // the updates are in order already, we can treat them as unordered\n pendingUnorderedUpdates.pushBack(parsed)\n }\n\n log.debug(\n 'received %s from common diff, cid: %d, pts_before: %d, pts: %d, qts_before: %d',\n upd._,\n parsed.channelId,\n parsed.ptsBefore,\n parsed.pts,\n parsed.qtsBefore,\n )\n })\n\n this.pts = fetchedState.pts\n this.qts = fetchedState.qts\n this.seq = fetchedState.seq\n this.date = fetchedState.date\n\n if (diff._ === 'updates.difference') {\n return\n }\n\n // fetch the next chunk in next tick\n this.handleUpdate(UPDATES_TOO_LONG)\n }\n\n _fetchDifferenceLater(requestedDiff: Map<number, Promise<void>>): void {\n if (!requestedDiff.has(0)) {\n requestedDiff.set(\n 0,\n this._fetchDifference(requestedDiff)\n .catch((err) => {\n if (tl.RpcError.is(err, 'AUTH_KEY_UNREGISTERED')) {\n // for some reason, when logging out telegram may send updatesTooLong\n // in any case, we need to stop updates loop\n this.stopLoop()\n\n return\n }\n\n this.log.warn('error fetching common difference: %s', err)\n\n if (tl.RpcError.is(err, 'PERSISTENT_TIMESTAMP_INVALID')) {\n // this function never throws\n return this._fetchUpdatesState()\n }\n })\n .then(() => {\n requestedDiff.delete(0)\n }),\n )\n }\n }\n\n async _onUpdate(\n pending: PendingUpdate,\n requestedDiff: Map<number, Promise<void>>,\n postponed = false,\n unordered = false,\n ): Promise<void> {\n const { client, log } = this\n const upd = pending.update\n\n let missing: Set<number> | undefined = undefined\n\n // it is important to do this before updating pts\n if (pending.peers.hasMin || pending.peers.empty) {\n // even if we have min peers in difference, we can't do anything about them.\n // we still want to collect them, so we can fetch them in the background.\n // we won't wait for them, since that would block the updates loop\n\n log.debug('loading missing peers for %s (pts = %d, cid = %d)', upd._, pending.pts, pending.channelId)\n missing = await this._fetchMissingPeers(upd, pending.peers, pending.fromDifference)\n\n if (!pending.fromDifference && missing.size) {\n log.debug(\n 'fetching difference because some peers were min (%J) and not cached for %s (pts = %d, cid = %d)',\n missing,\n upd._,\n pending.pts,\n pending.channelId,\n )\n\n if (pending.channelId && !(upd._ === 'updateNewChannelMessage' && upd.message._ === 'messageService')) {\n // don't replace service messages, because they can be about bot's kicking\n this._fetchChannelDifferenceLater(requestedDiff, pending.channelId, pending.ptsBefore)\n } else {\n this._fetchDifferenceLater(requestedDiff)\n }\n\n return\n }\n\n if (missing.size) {\n log.debug(\n 'peers still missing after fetching difference: %J for %s (pts = %d, cid = %d)',\n missing,\n upd._,\n pending.pts,\n pending.channelId,\n )\n }\n }\n\n // apply new pts/qts, if applicable\n if (!unordered) {\n // because unordered may contain pts/qts values when received from diff\n\n if (pending.pts) {\n const localPts = pending.channelId ? this.cpts.get(pending.channelId) : this.pts\n\n if (localPts && pending.ptsBefore !== localPts) {\n log.warn(\n 'pts_before does not match local_pts for %s (cid = %d, pts_before = %d, pts = %d, local_pts = %d)',\n upd._,\n pending.channelId,\n pending.ptsBefore,\n pending.pts,\n localPts,\n )\n }\n\n log.debug(\n 'applying new pts (cid = %d) because received %s: %d -> %d (before: %d, count: %d) (postponed = %s)',\n pending.channelId,\n upd._,\n localPts,\n pending.pts,\n pending.ptsBefore,\n pending.pts - pending.ptsBefore!,\n postponed,\n )\n\n if (pending.channelId) {\n this.cpts.set(pending.channelId, pending.pts)\n this.cptsMod.set(pending.channelId, pending.pts)\n } else {\n this.pts = pending.pts\n }\n }\n\n if (pending.qtsBefore) {\n log.debug(\n 'applying new qts because received %s: %d -> %d (postponed = %s)',\n upd._,\n this.qts,\n pending.qtsBefore + 1,\n postponed,\n )\n\n this.qts = pending.qts\n }\n }\n\n if (isMessageEmpty(upd)) return\n\n // this.rpsProcessing?.hit()\n\n // updates that are also used internally\n switch (upd._) {\n case 'mtcute.dummyUpdate':\n // we just needed to apply new pts values\n return\n case 'updateDcOptions': {\n const config = client.mt.network.config.getNow()\n\n if (config) {\n client.mt.network.config.setData({\n ...config,\n dcOptions: upd.dcOptions,\n })\n } else {\n client.mt.network.config.update(true).catch((err) => client.emitError(err))\n }\n break\n }\n case 'updateConfig':\n client.mt.network.config.update(true).catch((err) => client.emitError(err))\n break\n case 'updateUserName':\n // todo\n // if (upd.userId === state.auth?.userId) {\n // state.auth.selfUsername = upd.usernames.find((it) => it.active)?.username ?? null\n // }\n break\n case 'updateDeleteChannelMessages':\n if (!this.auth?.isBot) {\n await client.storage.refMsgs.delete(toggleChannelIdMark(upd.channelId), upd.messages)\n }\n break\n case 'updateNewMessage':\n case 'updateEditMessage':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n if (!this.auth?.isBot) {\n await this._storeMessageReferences(upd.message)\n }\n break\n }\n\n if (missing?.size) {\n if (this.auth?.isBot) {\n this.log.warn(\n 'missing peers (%J) after getDifference for %s (pts = %d, cid = %d)',\n missing,\n upd._,\n pending.pts,\n pending.channelId,\n )\n } else {\n // force save storage so the min peers are stored\n await client.mt.storage.save()\n\n for (const id of missing) {\n Promise.resolve(client.storage.peers.getById(id))\n .then((peer): unknown => {\n if (!peer) {\n this.log.warn('cannot fetch full peer %d - getPeerById returned null', id)\n\n return\n }\n\n // the peer will be automatically cached by the `.call()`, we don't have to do anything\n // todo\n // if (isInputPeerChannel(peer)) {\n // return _getChannelsBatched(client, toInputChannel(peer))\n // } else if (isInputPeerUser(peer)) {\n // return _getUsersBatched(client, toInputUser(peer))\n // }\n\n log.warn('cannot fetch full peer %d - unknown peer type %s', id, peer._)\n })\n .catch((err) => {\n log.warn('error fetching full peer %d: %s', id, err)\n })\n }\n }\n }\n\n // dispatch the update\n if (this.noDispatchEnabled) {\n const channelId = pending.channelId ?? 0\n const msgId =\n upd._ === 'updateNewMessage' || upd._ === 'updateNewChannelMessage' ? upd.message.id : undefined\n\n // we first need to remove it from each index, and then check if it was there\n const foundByMsgId = msgId && this.noDispatchMsg.get(channelId)?.delete(msgId)\n const foundByPts = this.noDispatchPts.get(channelId)?.delete(pending.pts!)\n const foundByQts = this.noDispatchQts.delete(pending.qts!)\n\n if (foundByMsgId || foundByPts || foundByQts) {\n log.debug('not dispatching %s because it is in no_dispatch index', upd._)\n\n return\n }\n }\n\n log.debug('dispatching %s (postponed = %s)', upd._, postponed)\n this._handler(upd, pending.peers)\n }\n\n async _loop(): Promise<void> {\n const {\n log,\n client,\n cpts,\n cptsMod,\n pendingUpdateContainers,\n pendingPtsUpdates,\n pendingPtsUpdatesPostponed,\n pendingQtsUpdates,\n pendingQtsUpdatesPostponed,\n pendingUnorderedUpdates,\n updatesLoopCv,\n postponedTimer,\n } = this\n\n log.debug('updates loop started, state available? %b', this.pts)\n\n try {\n if (!this.pts) {\n await this._fetchUpdatesState()\n }\n\n while (this.updatesLoopActive) {\n if (\n !(\n pendingUpdateContainers.length ||\n pendingPtsUpdates.length ||\n pendingQtsUpdates.length ||\n pendingUnorderedUpdates.length ||\n this.hasTimedoutPostponed\n )\n ) {\n if (this.catchingUp) {\n // consider catching up completed if there are no more updates\n this.log.debug('catching up completed')\n this.catchingUp = false\n this._onCatchingUp(false)\n }\n\n await updatesLoopCv.wait()\n }\n if (!this.updatesLoopActive) break\n\n log.debug(\n 'updates loop tick. pending containers: %d, pts: %d, pts_postponed: %d, qts: %d, qts_postponed: %d, unordered: %d',\n pendingUpdateContainers.length,\n pendingPtsUpdates.length,\n pendingPtsUpdatesPostponed.length,\n pendingQtsUpdates.length,\n pendingQtsUpdatesPostponed.length,\n pendingUnorderedUpdates.length,\n )\n\n const requestedDiff = new Map<number, Promise<void>>()\n\n this.log.debug('processing pending containers')\n\n while (pendingUpdateContainers.length) {\n const { upd, seqStart, seqEnd } = pendingUpdateContainers.popFront()!\n\n switch (upd._) {\n case 'updatesTooLong':\n log.debug('received updatesTooLong, fetching difference')\n this._fetchDifferenceLater(requestedDiff)\n break\n case 'updatesCombined':\n case 'updates': {\n if (seqStart !== 0) {\n // https://t.me/tdlibchat/5843\n const nextLocalSeq = this.seq! + 1\n log.debug(\n 'received seq-ordered %s (seq_start = %d, seq_end = %d, size = %d)',\n upd._,\n seqStart,\n seqEnd,\n upd.updates.length,\n )\n\n if (nextLocalSeq > seqStart) {\n log.debug(\n 'ignoring updates group because already applied (by seq: exp %d, got %d)',\n nextLocalSeq,\n seqStart,\n )\n // \"the updates were already applied, and must be ignored\"\n continue\n }\n\n if (nextLocalSeq < seqStart) {\n log.debug(\n 'fetching difference because gap detected (by seq: exp %d, got %d)',\n nextLocalSeq,\n seqStart,\n )\n // \"there's an updates gap that must be filled\"\n this._fetchDifferenceLater(requestedDiff)\n }\n } else {\n log.debug('received %s (size = %d)', upd._, upd.updates.length)\n }\n\n await client.storage.peers.updatePeersFrom(upd)\n\n const peers = PeersIndex.from(upd)\n\n for (const update of upd.updates) {\n switch (update._) {\n case 'updateChannelTooLong':\n log.debug(\n 'received updateChannelTooLong for channel %d (pts = %d) in container, fetching diff',\n update.channelId,\n update.pts,\n )\n this._fetchChannelDifferenceLater(requestedDiff, update.channelId, update.pts)\n continue\n case 'updatePtsChanged':\n // see https://github.com/tdlib/td/blob/07c1d53a6d3cb1fad58d2822e55eef6d57363581/td/telegram/UpdatesManager.cpp#L4051\n if (client.mt.network.getPoolSize('main') > 1) {\n // highload bot\n log.debug(\n 'updatePtsChanged received, resetting pts to 1 and fetching difference',\n )\n this.pts = 1\n this._fetchDifferenceLater(requestedDiff)\n } else {\n log.debug('updatePtsChanged received, fetching updates state')\n await this._fetchUpdatesState()\n }\n continue\n }\n\n const parsed = toPendingUpdate(update, peers)\n\n if (parsed.ptsBefore !== undefined) {\n pendingPtsUpdates.add(parsed)\n } else if (parsed.qtsBefore !== undefined) {\n pendingQtsUpdates.add(parsed)\n } else {\n pendingUnorderedUpdates.pushBack(parsed)\n }\n }\n\n if (seqEnd !== 0 && seqEnd > this.seq!) {\n this.seq = seqEnd\n this.date = upd.date\n }\n\n break\n }\n case 'updateShort': {\n log.debug('received short %s', upd._)\n\n const parsed = toPendingUpdate(upd.update, new PeersIndex())\n\n if (parsed.ptsBefore !== undefined) {\n pendingPtsUpdates.add(parsed)\n } else if (parsed.qtsBefore !== undefined) {\n pendingQtsUpdates.add(parsed)\n } else {\n pendingUnorderedUpdates.pushBack(parsed)\n }\n\n break\n }\n case 'updateShortMessage': {\n log.debug('received updateShortMessage')\n\n const message: tl.RawMessage = {\n _: 'message',\n out: upd.out,\n mentioned: upd.mentioned,\n mediaUnread: upd.mediaUnread,\n silent: upd.silent,\n id: upd.id,\n fromId: {\n _: 'peerUser',\n userId: upd.out ? this.auth!.userId : upd.userId,\n },\n peerId: {\n _: 'peerUser',\n userId: upd.userId,\n },\n fwdFrom: upd.fwdFrom,\n viaBotId: upd.viaBotId,\n replyTo: upd.replyTo,\n date: upd.date,\n message: upd.message,\n entities: upd.entities,\n ttlPeriod: upd.ttlPeriod,\n }\n\n const update: tl.RawUpdateNewMessage = {\n _: 'updateNewMessage',\n message,\n pts: upd.pts,\n ptsCount: upd.ptsCount,\n }\n\n pendingPtsUpdates.add({\n update,\n ptsBefore: upd.pts - upd.ptsCount,\n pts: upd.pts,\n peers: new PeersIndex(),\n fromDifference: false,\n })\n\n break\n }\n case 'updateShortChatMessage': {\n log.debug('received updateShortChatMessage')\n\n const message: tl.RawMessage = {\n _: 'message',\n out: upd.out,\n mentioned: upd.mentioned,\n mediaUnread: upd.mediaUnread,\n silent: upd.silent,\n id: upd.id,\n fromId: {\n _: 'peerUser',\n userId: upd.fromId,\n },\n peerId: {\n _: 'peerChat',\n chatId: upd.chatId,\n },\n fwdFrom: upd.fwdFrom,\n viaBotId: upd.viaBotId,\n replyTo: upd.replyTo,\n date: upd.date,\n message: upd.message,\n entities: upd.entities,\n ttlPeriod: upd.ttlPeriod,\n }\n\n const update: tl.RawUpdateNewMessage = {\n _: 'updateNewMessage',\n message,\n pts: upd.pts,\n ptsCount: upd.ptsCount,\n }\n\n pendingPtsUpdates.add({\n update,\n ptsBefore: upd.pts - upd.ptsCount,\n pts: upd.pts,\n peers: new PeersIndex(),\n fromDifference: false,\n })\n\n break\n }\n case 'updateShortSentMessage': {\n // should not happen\n log.warn('received updateShortSentMessage')\n break\n }\n default:\n assertNever(upd)\n }\n }\n\n this.log.debug('processing pending pts-ordered updates')\n\n while (pendingPtsUpdates.length) {\n const pending = pendingPtsUpdates.popFront()!\n const upd = pending.update\n\n // check pts\n\n let localPts: number | null = null\n\n if (!pending.channelId) localPts = this.pts!\n else if (cpts.has(pending.channelId)) {\n localPts = cpts.get(pending.channelId)!\n } else if (this.catchingUp) {\n // only load stored channel pts in case\n // the user has enabled catching up.\n // not loading stored pts effectively disables\n // catching up, but doesn't interfere with further\n // update gaps (i.e. first update received is considered\n // to be the base state)\n\n const saved = await client.storage.updates.getChannelPts(pending.channelId)\n\n if (saved) {\n cpts.set(pending.channelId, saved)\n localPts = saved\n }\n }\n\n if (localPts) {\n const diff = localPts - pending.ptsBefore!\n // PTS can only go up or drop cardinally\n const isPtsDrop = diff > 1000009\n\n if (diff > 0 && !isPtsDrop) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring %s (cid = %d) because already applied (by pts: exp %d, got %d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n )\n continue\n }\n if (diff < 0) {\n // \"there's an update gap that must be filled\"\n // if the gap is less than 3, put the update into postponed queue\n // otherwise, call getDifference\n if (diff > -3) {\n log.debug(\n 'postponing %s for 0.5s (cid = %d) because small gap detected (by pts: exp %d, got %d, diff=%d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n diff,\n )\n pending.timeout = Date.now() + 500\n pendingPtsUpdatesPostponed.add(pending)\n postponedTimer.emitBefore(pending.timeout)\n } else if (diff > -1000000) {\n log.debug(\n 'fetching difference after %s (cid = %d) because pts gap detected (by pts: exp %d, got %d, diff=%d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n diff,\n )\n\n if (pending.channelId) {\n this._fetchChannelDifferenceLater(requestedDiff, pending.channelId)\n } else {\n this._fetchDifferenceLater(requestedDiff)\n }\n } else {\n log.debug(\n 'skipping all updates because pts gap is too big (by pts: exp %d, got %d, diff=%d)',\n localPts,\n pending.ptsBefore,\n diff,\n )\n\n if (pending.channelId) {\n cpts.set(pending.channelId, 0)\n cptsMod.set(pending.channelId, 0)\n } else {\n await this._fetchUpdatesState()\n }\n }\n continue\n }\n\n if (isPtsDrop) {\n log.debug('pts drop detected (%d -> %d)', localPts, pending.ptsBefore)\n }\n }\n\n await this._onUpdate(pending, requestedDiff)\n }\n\n this.log.debug('processing postponed pts-ordered updates')\n\n for (let item = pendingPtsUpdatesPostponed._first; item; item = item.n) {\n // awesome fucking iteration because i'm so fucking tired and wanna kms\n const pending = item.v\n\n const upd = pending.update\n\n let localPts\n\n if (!pending.channelId) localPts = this.pts!\n else if (cpts.has(pending.channelId)) {\n localPts = cpts.get(pending.channelId)\n }\n\n // channel pts from storage will be available because we loaded it earlier\n if (!localPts) {\n log.warn(\n 'local pts not available for postponed %s (cid = %d), skipping',\n upd._,\n pending.channelId,\n )\n continue\n }\n\n // check the pts to see if the gap was filled\n if (localPts > pending.ptsBefore!) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring postponed %s (cid = %d) because already applied (by pts: exp %d, got %d)',\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n )\n pendingPtsUpdatesPostponed._remove(item)\n continue\n }\n if (localPts < pending.ptsBefore!) {\n // \"there's an update gap that must be filled\"\n // if the timeout has not expired yet, keep the update in the queue\n // otherwise, fetch diff\n const now = Date.now()\n\n if (now < pending.timeout!) {\n log.debug(\n 'postponed %s (cid = %d) is still waiting (%dms left) (current pts %d, need %d)',\n upd._,\n pending.channelId,\n pending.timeout! - now,\n localPts,\n pending.ptsBefore,\n )\n } else {\n log.debug(\n \"gap for postponed %s (cid = %d) wasn't filled, fetching diff (current pts %d, need %d)\",\n upd._,\n pending.channelId,\n localPts,\n pending.ptsBefore,\n )\n pendingPtsUpdatesPostponed._remove(item)\n\n if (pending.channelId) {\n this._fetchChannelDifferenceLater(requestedDiff, pending.channelId)\n } else {\n this._fetchDifferenceLater(requestedDiff)\n }\n }\n continue\n }\n\n await this._onUpdate(pending, requestedDiff, true)\n pendingPtsUpdatesPostponed._remove(item)\n }\n\n this.log.debug('processing pending qts-ordered updates')\n\n while (pendingQtsUpdates.length) {\n const pending = pendingQtsUpdates.popFront()!\n const upd = pending.update\n\n // check qts\n const diff = this.qts! - pending.qtsBefore!\n const isQtsDrop = diff > 1000009\n\n if (diff > 0 && !isQtsDrop) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring %s because already applied (by qts: exp %d, got %d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n )\n continue\n }\n if (this.qts! < pending.qtsBefore!) {\n // \"there's an update gap that must be filled\"\n // if the gap is less than 3, put the update into postponed queue\n // otherwise, call getDifference\n if (diff > -3) {\n log.debug(\n 'postponing %s for 0.5s because small gap detected (by qts: exp %d, got %d, diff=%d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n diff,\n )\n pending.timeout = Date.now() + 500\n pendingQtsUpdatesPostponed.add(pending)\n postponedTimer.emitBefore(pending.timeout)\n } else {\n log.debug(\n 'fetching difference after %s because qts gap detected (by qts: exp %d, got %d, diff=%d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n diff,\n )\n this._fetchDifferenceLater(requestedDiff)\n }\n continue\n }\n\n if (isQtsDrop) {\n log.debug('qts drop detected (%d -> %d)', this.qts, pending.qtsBefore)\n }\n\n await this._onUpdate(pending, requestedDiff)\n }\n\n this.log.debug('processing postponed qts-ordered updates')\n\n for (let item = pendingQtsUpdatesPostponed._first; item; item = item.n) {\n // awesome fucking iteration because i'm so fucking tired and wanna kms\n const pending = item.v\n const upd = pending.update\n\n // check the pts to see if the gap was filled\n if (this.qts! > pending.qtsBefore!) {\n // \"the update was already applied, and must be ignored\"\n log.debug(\n 'ignoring postponed %s because already applied (by qts: exp %d, got %d)',\n upd._,\n this.qts!,\n pending.qtsBefore,\n )\n continue\n }\n if (this.qts! < pending.qtsBefore!) {\n // \"there's an update gap that must be filled\"\n // if the timeout has not expired yet, keep the update in the queue\n // otherwise, fetch diff\n const now = Date.now()\n\n if (now < pending.timeout!) {\n log.debug(\n 'postponed %s is still waiting (%dms left) (current qts %d, need %d)',\n upd._,\n pending.timeout! - now,\n this.qts!,\n pending.qtsBefore,\n )\n } else {\n log.debug(\n \"gap for postponed %s wasn't filled, fetching diff (current qts %d, need %d)\",\n upd._,\n this.qts!,\n pending.qtsBefore,\n )\n pendingQtsUpdatesPostponed._remove(item)\n this._fetchDifferenceLater(requestedDiff)\n }\n continue\n }\n\n // gap was filled, and the update can be applied\n await this._onUpdate(pending, requestedDiff, true)\n pendingQtsUpdatesPostponed._remove(item)\n }\n\n this.hasTimedoutPostponed = false\n\n while (requestedDiff.size) {\n log.debug(\n 'waiting for %d pending diffs before processing unordered: %J',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n\n await Promise.all([...requestedDiff.values()])\n\n // diff results may as well contain new diffs to be requested\n log.debug(\n 'pending diffs awaited, new diffs requested: %d (%J)',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n }\n\n this.log.debug('processing pending unordered updates')\n\n while (pendingUnorderedUpdates.length) {\n const pending = pendingUnorderedUpdates.popFront()!\n\n await this._onUpdate(pending, requestedDiff, false, true)\n }\n\n // onUpdate may also call getDiff in some cases, so we also need to check\n // diff may also contain new updates, which will be processed in the next tick,\n // but we don't want to postpone diff fetching\n while (requestedDiff.size) {\n log.debug(\n 'waiting for %d pending diffs after processing unordered: %J',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n\n await Promise.all([...requestedDiff.values()])\n\n // diff results may as well contain new diffs to be requested\n log.debug(\n 'pending diffs awaited, new diffs requested: %d (%j)',\n requestedDiff.size,\n requestedDiff.keys(),\n )\n }\n\n // save new update state\n await this._saveUpdatesStorage(true)\n }\n\n log.debug('updates loop stopped')\n } catch (e) {\n log.error('updates loop encountered error, restarting: %s', e)\n\n return this._loop()\n }\n }\n}\n"]}
|