@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.
Files changed (963) hide show
  1. package/cjs/highlevel/base.d.ts +1 -1
  2. package/cjs/highlevel/base.js +29 -23
  3. package/cjs/highlevel/base.js.map +1 -1
  4. package/cjs/highlevel/client.d.ts +3 -2
  5. package/cjs/highlevel/client.js +1 -0
  6. package/cjs/highlevel/client.js.map +1 -1
  7. package/cjs/highlevel/managers/app-config-manager.js +7 -5
  8. package/cjs/highlevel/managers/app-config-manager.js.map +1 -1
  9. package/cjs/highlevel/methods/_init.js.map +1 -1
  10. package/cjs/highlevel/methods/auth/start-test.js.map +1 -1
  11. package/cjs/highlevel/methods/auth/start.js.map +1 -1
  12. package/cjs/highlevel/methods/auth/utils.js.map +1 -1
  13. package/cjs/highlevel/methods/bots/get-callback-answer.js.map +1 -1
  14. package/cjs/highlevel/methods/bots/get-game-high-scores.js.map +1 -1
  15. package/cjs/highlevel/methods/bots/normalize-command-scope.js.map +1 -1
  16. package/cjs/highlevel/methods/bots/set-my-commands.js.map +1 -1
  17. package/cjs/highlevel/methods/chats/add-chat-members.js.map +1 -1
  18. package/cjs/highlevel/methods/chats/ban-chat-member.js.map +1 -1
  19. package/cjs/highlevel/methods/chats/batched-queries.js.map +1 -1
  20. package/cjs/highlevel/methods/chats/delete-chat-photo.js.map +1 -1
  21. package/cjs/highlevel/methods/chats/delete-history.js.map +1 -1
  22. package/cjs/highlevel/methods/chats/get-chat-event-log.js.map +1 -1
  23. package/cjs/highlevel/methods/chats/get-chat-member.js.map +1 -1
  24. package/cjs/highlevel/methods/chats/get-chat-members.js.map +1 -1
  25. package/cjs/highlevel/methods/chats/get-chat-preview.js.map +1 -1
  26. package/cjs/highlevel/methods/chats/get-chat.js.map +1 -1
  27. package/cjs/highlevel/methods/chats/get-full-chat.js.map +1 -1
  28. package/cjs/highlevel/methods/chats/get-nearby-chats.js.map +1 -1
  29. package/cjs/highlevel/methods/chats/get-similar-channels.js.map +1 -1
  30. package/cjs/highlevel/methods/chats/iter-chat-event-log.js.map +1 -1
  31. package/cjs/highlevel/methods/chats/iter-chat-members.js.map +1 -1
  32. package/cjs/highlevel/methods/chats/join-chat.js.map +1 -1
  33. package/cjs/highlevel/methods/chats/kick-chat-member.js.map +1 -1
  34. package/cjs/highlevel/methods/chats/leave-chat.js.map +1 -1
  35. package/cjs/highlevel/methods/chats/open-chat.js.map +1 -1
  36. package/cjs/highlevel/methods/chats/reorder-usernames.js.map +1 -1
  37. package/cjs/highlevel/methods/chats/restrict-chat-member.js.map +1 -1
  38. package/cjs/highlevel/methods/chats/save-draft.js.map +1 -1
  39. package/cjs/highlevel/methods/chats/set-chat-color.js.map +1 -1
  40. package/cjs/highlevel/methods/chats/set-chat-photo.js.map +1 -1
  41. package/cjs/highlevel/methods/chats/set-chat-title.js.map +1 -1
  42. package/cjs/highlevel/methods/chats/toggle-fragment-username.js.map +1 -1
  43. package/cjs/highlevel/methods/chats/unarchive-chats.js.map +1 -1
  44. package/cjs/highlevel/methods/chats/unban-chat-member.js.map +1 -1
  45. package/cjs/highlevel/methods/contacts/delete-contacts.js.map +1 -1
  46. package/cjs/highlevel/methods/dialogs/create-folder.js.map +1 -1
  47. package/cjs/highlevel/methods/dialogs/edit-folder.js.map +1 -1
  48. package/cjs/highlevel/methods/dialogs/find-folder.js.map +1 -1
  49. package/cjs/highlevel/methods/dialogs/get-folders.js.map +1 -1
  50. package/cjs/highlevel/methods/dialogs/iter-dialogs.js.map +1 -1
  51. package/cjs/highlevel/methods/files/download-buffer.js.map +1 -1
  52. package/cjs/highlevel/methods/files/download-iterable.js +1 -1
  53. package/cjs/highlevel/methods/files/download-iterable.js.map +1 -1
  54. package/cjs/highlevel/methods/files/download-node-stream.js.map +1 -1
  55. package/cjs/highlevel/methods/files/download-stream.js.map +1 -1
  56. package/cjs/highlevel/methods/files/normalize-file-to-document.js.map +1 -1
  57. package/cjs/highlevel/methods/files/normalize-input-file.js.map +1 -1
  58. package/cjs/highlevel/methods/files/normalize-input-media.js +1 -2
  59. package/cjs/highlevel/methods/files/normalize-input-media.js.map +1 -1
  60. package/cjs/highlevel/methods/files/upload-file.js +7 -6
  61. package/cjs/highlevel/methods/files/upload-file.js.map +1 -1
  62. package/cjs/highlevel/methods/files/upload-media.js.map +1 -1
  63. package/cjs/highlevel/methods/forums/iter-forum-topics.js.map +1 -1
  64. package/cjs/highlevel/methods/invite-links/get-primary-invite-link.js.map +1 -1
  65. package/cjs/highlevel/methods/invite-links/iter-invite-link-members.js.map +1 -1
  66. package/cjs/highlevel/methods/invite-links/iter-invite-links.js.map +1 -1
  67. package/cjs/highlevel/methods/messages/close-poll.js.map +1 -1
  68. package/cjs/highlevel/methods/messages/delete-messages.js.map +1 -1
  69. package/cjs/highlevel/methods/messages/edit-inline-message.js.map +1 -1
  70. package/cjs/highlevel/methods/messages/edit-message.js.map +1 -1
  71. package/cjs/highlevel/methods/messages/find-in-update.js.map +1 -1
  72. package/cjs/highlevel/methods/messages/forward-messages.js.map +1 -1
  73. package/cjs/highlevel/methods/messages/get-callback-query-message.js.map +1 -1
  74. package/cjs/highlevel/methods/messages/get-discussion-message.js.map +1 -1
  75. package/cjs/highlevel/methods/messages/get-history.js +5 -1
  76. package/cjs/highlevel/methods/messages/get-history.js.map +1 -1
  77. package/cjs/highlevel/methods/messages/get-message-by-link.js.map +1 -1
  78. package/cjs/highlevel/methods/messages/get-message-group.js.map +1 -1
  79. package/cjs/highlevel/methods/messages/get-message-reactions.js.map +1 -1
  80. package/cjs/highlevel/methods/messages/get-messages.js.map +1 -1
  81. package/cjs/highlevel/methods/messages/get-reply-to.js.map +1 -1
  82. package/cjs/highlevel/methods/messages/iter-history.js.map +1 -1
  83. package/cjs/highlevel/methods/messages/iter-reaction-users.js.map +1 -1
  84. package/cjs/highlevel/methods/messages/iter-search-global.js.map +1 -1
  85. package/cjs/highlevel/methods/messages/iter-search-messages.js.map +1 -1
  86. package/cjs/highlevel/methods/messages/read-history.js.map +1 -1
  87. package/cjs/highlevel/methods/messages/send-answer.js.map +1 -1
  88. package/cjs/highlevel/methods/messages/send-comment.js.map +1 -1
  89. package/cjs/highlevel/methods/messages/send-common.js.map +1 -1
  90. package/cjs/highlevel/methods/messages/send-copy-group.js.map +1 -1
  91. package/cjs/highlevel/methods/messages/send-copy.js.map +1 -1
  92. package/cjs/highlevel/methods/messages/send-media-group.js.map +1 -1
  93. package/cjs/highlevel/methods/messages/send-media.js.map +1 -1
  94. package/cjs/highlevel/methods/messages/send-quote.js.map +1 -1
  95. package/cjs/highlevel/methods/messages/send-text.js.map +1 -1
  96. package/cjs/highlevel/methods/messages/send-typing.js.map +1 -1
  97. package/cjs/highlevel/methods/messages/send-vote.js.map +1 -1
  98. package/cjs/highlevel/methods/messages/translate-text.js.map +1 -1
  99. package/cjs/highlevel/methods/messages/unpin-all-messages.js.map +1 -1
  100. package/cjs/highlevel/methods/misc/normalize-privacy-rules.js.map +1 -1
  101. package/cjs/highlevel/methods/misc/normalize-text.js.map +1 -1
  102. package/cjs/highlevel/methods/misc/with-params.js.map +1 -1
  103. package/cjs/highlevel/methods/password/change-cloud-password.js.map +1 -1
  104. package/cjs/highlevel/methods/password/enable-cloud-password.js.map +1 -1
  105. package/cjs/highlevel/methods/password/remove-cloud-password.js.map +1 -1
  106. package/cjs/highlevel/methods/premium/can-apply-boost.js.map +1 -1
  107. package/cjs/highlevel/methods/premium/iter-boosters.js.map +1 -1
  108. package/cjs/highlevel/methods/stickers/create-sticker-set.js.map +1 -1
  109. package/cjs/highlevel/methods/stickers/delete-sticker-from-set.js.map +1 -1
  110. package/cjs/highlevel/methods/stickers/get-custom-emojis.js.map +1 -1
  111. package/cjs/highlevel/methods/stickers/move-sticker-in-set.js.map +1 -1
  112. package/cjs/highlevel/methods/stories/can-send-story.js.map +1 -1
  113. package/cjs/highlevel/methods/stories/edit-story.js.map +1 -1
  114. package/cjs/highlevel/methods/stories/find-in-update.js.map +1 -1
  115. package/cjs/highlevel/methods/stories/hide-my-stories-views.js.map +1 -1
  116. package/cjs/highlevel/methods/stories/iter-all-stories.js.map +1 -1
  117. package/cjs/highlevel/methods/stories/iter-profile-stories.js.map +1 -1
  118. package/cjs/highlevel/methods/stories/iter-story-viewers.js.map +1 -1
  119. package/cjs/highlevel/methods/stories/send-story.js.map +1 -1
  120. package/cjs/highlevel/methods/users/delete-profile-photos.js.map +1 -1
  121. package/cjs/highlevel/methods/users/get-users.js.map +1 -1
  122. package/cjs/highlevel/methods/users/iter-profile-photos.js.map +1 -1
  123. package/cjs/highlevel/methods/users/resolve-peer-many.js.map +1 -1
  124. package/cjs/highlevel/methods/users/resolve-peer.js.map +1 -1
  125. package/cjs/highlevel/methods/users/set-my-emoji-status.js.map +1 -1
  126. package/cjs/highlevel/methods/users/set-my-profile-photo.js.map +1 -1
  127. package/cjs/highlevel/storage/service/current-user.js +2 -0
  128. package/cjs/highlevel/storage/service/current-user.js.map +1 -1
  129. package/cjs/highlevel/storage/service/peers.js +5 -1
  130. package/cjs/highlevel/storage/service/peers.js.map +1 -1
  131. package/cjs/highlevel/storage/service/ref-messages.js +3 -0
  132. package/cjs/highlevel/storage/service/ref-messages.js.map +1 -1
  133. package/cjs/highlevel/storage/service/updates.js +1 -0
  134. package/cjs/highlevel/storage/service/updates.js.map +1 -1
  135. package/cjs/highlevel/storage/storage.d.ts +1 -1
  136. package/cjs/highlevel/storage/storage.js +17 -4
  137. package/cjs/highlevel/storage/storage.js.map +1 -1
  138. package/cjs/highlevel/types/auth/sent-code.js +1 -0
  139. package/cjs/highlevel/types/auth/sent-code.js.map +1 -1
  140. package/cjs/highlevel/types/bots/game-high-score.js +2 -0
  141. package/cjs/highlevel/types/bots/game-high-score.js.map +1 -1
  142. package/cjs/highlevel/types/bots/inline-message/factories.js.map +1 -1
  143. package/cjs/highlevel/types/bots/inline-result/factories.js.map +1 -1
  144. package/cjs/highlevel/types/bots/keyboards/builder.js +2 -1
  145. package/cjs/highlevel/types/bots/keyboards/builder.js.map +1 -1
  146. package/cjs/highlevel/types/bots/keyboards/factories.js.map +1 -1
  147. package/cjs/highlevel/types/calls/discard-reason.js.map +1 -1
  148. package/cjs/highlevel/types/conversation.js +13 -7
  149. package/cjs/highlevel/types/conversation.js.map +1 -1
  150. package/cjs/highlevel/types/errors.js +3 -0
  151. package/cjs/highlevel/types/errors.js.map +1 -1
  152. package/cjs/highlevel/types/files/file-location.js +3 -0
  153. package/cjs/highlevel/types/files/file-location.js.map +1 -1
  154. package/cjs/highlevel/types/files/uploaded-file.js +1 -1
  155. package/cjs/highlevel/types/files/uploaded-file.js.map +1 -1
  156. package/cjs/highlevel/types/files/utils.d.ts +3 -3
  157. package/cjs/highlevel/types/files/utils.js.map +1 -1
  158. package/cjs/highlevel/types/files/web-document.js +1 -0
  159. package/cjs/highlevel/types/files/web-document.js.map +1 -1
  160. package/cjs/highlevel/types/media/audio.js +3 -2
  161. package/cjs/highlevel/types/media/audio.js.map +1 -1
  162. package/cjs/highlevel/types/media/contact.js +2 -1
  163. package/cjs/highlevel/types/media/contact.js.map +1 -1
  164. package/cjs/highlevel/types/media/dice.js +125 -124
  165. package/cjs/highlevel/types/media/dice.js.map +1 -1
  166. package/cjs/highlevel/types/media/document-utils.js.map +1 -1
  167. package/cjs/highlevel/types/media/document.js +2 -4
  168. package/cjs/highlevel/types/media/document.js.map +1 -1
  169. package/cjs/highlevel/types/media/game.js +2 -1
  170. package/cjs/highlevel/types/media/game.js.map +1 -1
  171. package/cjs/highlevel/types/media/invoice.js +4 -1
  172. package/cjs/highlevel/types/media/invoice.js.map +1 -1
  173. package/cjs/highlevel/types/media/location.js +4 -5
  174. package/cjs/highlevel/types/media/location.js.map +1 -1
  175. package/cjs/highlevel/types/media/photo.js +8 -1
  176. package/cjs/highlevel/types/media/photo.js.map +1 -1
  177. package/cjs/highlevel/types/media/poll.js +4 -1
  178. package/cjs/highlevel/types/media/poll.js.map +1 -1
  179. package/cjs/highlevel/types/media/sticker.js +3 -1
  180. package/cjs/highlevel/types/media/sticker.js.map +1 -1
  181. package/cjs/highlevel/types/media/story.js +3 -1
  182. package/cjs/highlevel/types/media/story.js.map +1 -1
  183. package/cjs/highlevel/types/media/thumbnail.js +35 -22
  184. package/cjs/highlevel/types/media/thumbnail.js.map +1 -1
  185. package/cjs/highlevel/types/media/venue.js +2 -1
  186. package/cjs/highlevel/types/media/venue.js.map +1 -1
  187. package/cjs/highlevel/types/media/video.js +3 -1
  188. package/cjs/highlevel/types/media/video.js.map +1 -1
  189. package/cjs/highlevel/types/media/voice.js +2 -1
  190. package/cjs/highlevel/types/media/voice.js.map +1 -1
  191. package/cjs/highlevel/types/media/web-page.js +2 -1
  192. package/cjs/highlevel/types/media/web-page.js.map +1 -1
  193. package/cjs/highlevel/types/messages/dialog.js +3 -0
  194. package/cjs/highlevel/types/messages/dialog.js.map +1 -1
  195. package/cjs/highlevel/types/messages/draft-message.js +1 -0
  196. package/cjs/highlevel/types/messages/draft-message.js.map +1 -1
  197. package/cjs/highlevel/types/messages/message-action.js.map +1 -1
  198. package/cjs/highlevel/types/messages/message-entity.js +2 -0
  199. package/cjs/highlevel/types/messages/message-entity.js.map +1 -1
  200. package/cjs/highlevel/types/messages/message-forward.js +2 -0
  201. package/cjs/highlevel/types/messages/message-forward.js.map +1 -1
  202. package/cjs/highlevel/types/messages/message-media.js.map +1 -1
  203. package/cjs/highlevel/types/messages/message-reactions.js +4 -0
  204. package/cjs/highlevel/types/messages/message-reactions.js.map +1 -1
  205. package/cjs/highlevel/types/messages/message-replies.js +2 -0
  206. package/cjs/highlevel/types/messages/message-replies.js.map +1 -1
  207. package/cjs/highlevel/types/messages/message.js +6 -0
  208. package/cjs/highlevel/types/messages/message.js.map +1 -1
  209. package/cjs/highlevel/types/messages/replied-message.js +2 -0
  210. package/cjs/highlevel/types/messages/replied-message.js.map +1 -1
  211. package/cjs/highlevel/types/misc/sticker-set.js +7 -1
  212. package/cjs/highlevel/types/misc/sticker-set.js.map +1 -1
  213. package/cjs/highlevel/types/misc/takeout-session.js +5 -0
  214. package/cjs/highlevel/types/misc/takeout-session.js.map +1 -1
  215. package/cjs/highlevel/types/peers/chat-colors.js +2 -0
  216. package/cjs/highlevel/types/peers/chat-colors.js.map +1 -1
  217. package/cjs/highlevel/types/peers/chat-event/actions.js.map +1 -1
  218. package/cjs/highlevel/types/peers/chat-event/filters.js.map +1 -1
  219. package/cjs/highlevel/types/peers/chat-event/index.js +2 -0
  220. package/cjs/highlevel/types/peers/chat-event/index.js.map +1 -1
  221. package/cjs/highlevel/types/peers/chat-invite-link-member.js +2 -0
  222. package/cjs/highlevel/types/peers/chat-invite-link-member.js.map +1 -1
  223. package/cjs/highlevel/types/peers/chat-invite-link.js +2 -0
  224. package/cjs/highlevel/types/peers/chat-invite-link.js.map +1 -1
  225. package/cjs/highlevel/types/peers/chat-location.js +1 -0
  226. package/cjs/highlevel/types/peers/chat-location.js.map +1 -1
  227. package/cjs/highlevel/types/peers/chat-member.js +2 -0
  228. package/cjs/highlevel/types/peers/chat-member.js.map +1 -1
  229. package/cjs/highlevel/types/peers/chat-permissions.js +1 -0
  230. package/cjs/highlevel/types/peers/chat-permissions.js.map +1 -1
  231. package/cjs/highlevel/types/peers/chat-photo.js +5 -0
  232. package/cjs/highlevel/types/peers/chat-photo.js.map +1 -1
  233. package/cjs/highlevel/types/peers/chat-preview.js +2 -0
  234. package/cjs/highlevel/types/peers/chat-preview.js.map +1 -1
  235. package/cjs/highlevel/types/peers/chat.js +12 -1
  236. package/cjs/highlevel/types/peers/chat.js.map +1 -1
  237. package/cjs/highlevel/types/peers/forum-topic.js +9 -6
  238. package/cjs/highlevel/types/peers/forum-topic.js.map +1 -1
  239. package/cjs/highlevel/types/peers/peer.js.map +1 -1
  240. package/cjs/highlevel/types/peers/peers-index.js +3 -1
  241. package/cjs/highlevel/types/peers/peers-index.js.map +1 -1
  242. package/cjs/highlevel/types/peers/user.js +5 -1
  243. package/cjs/highlevel/types/peers/user.js.map +1 -1
  244. package/cjs/highlevel/types/premium/boost-slot.js +2 -0
  245. package/cjs/highlevel/types/premium/boost-slot.js.map +1 -1
  246. package/cjs/highlevel/types/premium/boost-stats.js +1 -0
  247. package/cjs/highlevel/types/premium/boost-stats.js.map +1 -1
  248. package/cjs/highlevel/types/premium/boost.js +2 -0
  249. package/cjs/highlevel/types/premium/boost.js.map +1 -1
  250. package/cjs/highlevel/types/reactions/emoji-status.js +1 -0
  251. package/cjs/highlevel/types/reactions/emoji-status.js.map +1 -1
  252. package/cjs/highlevel/types/reactions/peer-reaction.js +2 -0
  253. package/cjs/highlevel/types/reactions/peer-reaction.js.map +1 -1
  254. package/cjs/highlevel/types/reactions/reaction-count.js +1 -0
  255. package/cjs/highlevel/types/reactions/reaction-count.js.map +1 -1
  256. package/cjs/highlevel/types/reactions/types.js.map +1 -1
  257. package/cjs/highlevel/types/stories/all-stories.d.ts +2 -2
  258. package/cjs/highlevel/types/stories/all-stories.js +3 -1
  259. package/cjs/highlevel/types/stories/all-stories.js.map +1 -1
  260. package/cjs/highlevel/types/stories/interactive/base.js +1 -0
  261. package/cjs/highlevel/types/stories/interactive/base.js.map +1 -1
  262. package/cjs/highlevel/types/stories/interactive/channel-post.js +3 -1
  263. package/cjs/highlevel/types/stories/interactive/channel-post.js.map +1 -1
  264. package/cjs/highlevel/types/stories/interactive/index.js.map +1 -1
  265. package/cjs/highlevel/types/stories/interactive/input.js +1 -0
  266. package/cjs/highlevel/types/stories/interactive/input.js.map +1 -1
  267. package/cjs/highlevel/types/stories/interactive/location.js +2 -1
  268. package/cjs/highlevel/types/stories/interactive/location.js.map +1 -1
  269. package/cjs/highlevel/types/stories/interactive/reaction.js +2 -1
  270. package/cjs/highlevel/types/stories/interactive/reaction.js.map +1 -1
  271. package/cjs/highlevel/types/stories/interactive/venue.js +2 -1
  272. package/cjs/highlevel/types/stories/interactive/venue.js.map +1 -1
  273. package/cjs/highlevel/types/stories/peer-stories.js +2 -0
  274. package/cjs/highlevel/types/stories/peer-stories.js.map +1 -1
  275. package/cjs/highlevel/types/stories/stealth-mode.js +1 -0
  276. package/cjs/highlevel/types/stories/stealth-mode.js.map +1 -1
  277. package/cjs/highlevel/types/stories/story-interactions.js +2 -0
  278. package/cjs/highlevel/types/stories/story-interactions.js.map +1 -1
  279. package/cjs/highlevel/types/stories/story-viewer.d.ts +1 -1
  280. package/cjs/highlevel/types/stories/story-viewer.js +6 -0
  281. package/cjs/highlevel/types/stories/story-viewer.js.map +1 -1
  282. package/cjs/highlevel/types/stories/story.js +2 -0
  283. package/cjs/highlevel/types/stories/story.js.map +1 -1
  284. package/cjs/highlevel/types/updates/bot-chat-join-request.js +2 -0
  285. package/cjs/highlevel/types/updates/bot-chat-join-request.js.map +1 -1
  286. package/cjs/highlevel/types/updates/bot-reaction.js +4 -0
  287. package/cjs/highlevel/types/updates/bot-reaction.js.map +1 -1
  288. package/cjs/highlevel/types/updates/bot-stopped.js +2 -0
  289. package/cjs/highlevel/types/updates/bot-stopped.js.map +1 -1
  290. package/cjs/highlevel/types/updates/callback-query.js +4 -0
  291. package/cjs/highlevel/types/updates/callback-query.js.map +1 -1
  292. package/cjs/highlevel/types/updates/chat-join-request.js +2 -0
  293. package/cjs/highlevel/types/updates/chat-join-request.js.map +1 -1
  294. package/cjs/highlevel/types/updates/chat-member-update.js +2 -0
  295. package/cjs/highlevel/types/updates/chat-member-update.js.map +1 -1
  296. package/cjs/highlevel/types/updates/chosen-inline-result.js +2 -0
  297. package/cjs/highlevel/types/updates/chosen-inline-result.js.map +1 -1
  298. package/cjs/highlevel/types/updates/delete-message-update.js +1 -0
  299. package/cjs/highlevel/types/updates/delete-message-update.js.map +1 -1
  300. package/cjs/highlevel/types/updates/delete-story-update.js +2 -0
  301. package/cjs/highlevel/types/updates/delete-story-update.js.map +1 -1
  302. package/cjs/highlevel/types/updates/history-read-update.js +1 -0
  303. package/cjs/highlevel/types/updates/history-read-update.js.map +1 -1
  304. package/cjs/highlevel/types/updates/inline-query.js +2 -0
  305. package/cjs/highlevel/types/updates/inline-query.js.map +1 -1
  306. package/cjs/highlevel/types/updates/parse-update.js.map +1 -1
  307. package/cjs/highlevel/types/updates/poll-update.js +2 -0
  308. package/cjs/highlevel/types/updates/poll-update.js.map +1 -1
  309. package/cjs/highlevel/types/updates/poll-vote.js +2 -0
  310. package/cjs/highlevel/types/updates/poll-vote.js.map +1 -1
  311. package/cjs/highlevel/types/updates/pre-checkout-query.js +2 -0
  312. package/cjs/highlevel/types/updates/pre-checkout-query.js.map +1 -1
  313. package/cjs/highlevel/types/updates/story-update.js +2 -0
  314. package/cjs/highlevel/types/updates/story-update.js.map +1 -1
  315. package/cjs/highlevel/types/updates/user-status-update.js +1 -0
  316. package/cjs/highlevel/types/updates/user-status-update.js.map +1 -1
  317. package/cjs/highlevel/types/updates/user-typing-update.js +1 -0
  318. package/cjs/highlevel/types/updates/user-typing-update.js.map +1 -1
  319. package/cjs/highlevel/updates/manager.d.ts +1 -1
  320. package/cjs/highlevel/updates/manager.js +50 -28
  321. package/cjs/highlevel/updates/manager.js.map +1 -1
  322. package/cjs/highlevel/updates/parsed.js.map +1 -1
  323. package/cjs/highlevel/updates/utils.js.map +1 -1
  324. package/cjs/highlevel/utils/convert-file-id.js.map +1 -1
  325. package/cjs/highlevel/utils/entities.js.map +1 -1
  326. package/cjs/highlevel/utils/file-type.d.ts +1 -0
  327. package/cjs/highlevel/utils/file-type.js +35 -1
  328. package/cjs/highlevel/utils/file-type.js.map +1 -1
  329. package/cjs/highlevel/utils/file-utils.js +1 -1
  330. package/cjs/highlevel/utils/file-utils.js.map +1 -1
  331. package/cjs/highlevel/utils/inline-utils.js.map +1 -1
  332. package/cjs/highlevel/utils/inspectable.js.map +1 -1
  333. package/cjs/highlevel/utils/memoize.js.map +1 -1
  334. package/cjs/highlevel/utils/peer-utils.js.map +1 -1
  335. package/cjs/highlevel/utils/query-batcher.js.map +1 -1
  336. package/cjs/highlevel/utils/rps-meter.js +3 -0
  337. package/cjs/highlevel/utils/rps-meter.js.map +1 -1
  338. package/cjs/highlevel/utils/stream-utils.js.map +1 -1
  339. package/cjs/highlevel/utils/string-session.d.ts +1 -2
  340. package/cjs/highlevel/utils/string-session.js +27 -7
  341. package/cjs/highlevel/utils/string-session.js.map +1 -1
  342. package/cjs/highlevel/utils/voice-utils.js.map +1 -1
  343. package/cjs/highlevel/worker/app-config.d.ts +2 -3
  344. package/cjs/highlevel/worker/app-config.js +6 -3
  345. package/cjs/highlevel/worker/app-config.js.map +1 -1
  346. package/cjs/highlevel/worker/errors.js.map +1 -1
  347. package/cjs/highlevel/worker/invoker.js +3 -2
  348. package/cjs/highlevel/worker/invoker.js.map +1 -1
  349. package/cjs/highlevel/worker/port.d.ts +16 -17
  350. package/cjs/highlevel/worker/port.js +74 -49
  351. package/cjs/highlevel/worker/port.js.map +1 -1
  352. package/cjs/highlevel/worker/protocol.d.ts +2 -2
  353. package/cjs/highlevel/worker/protocol.js.map +1 -1
  354. package/cjs/highlevel/worker/storage.d.ts +9 -13
  355. package/cjs/highlevel/worker/storage.js +34 -19
  356. package/cjs/highlevel/worker/storage.js.map +1 -1
  357. package/cjs/highlevel/worker/worker.js +3 -0
  358. package/cjs/highlevel/worker/worker.js.map +1 -1
  359. package/cjs/network/auth-key.js +8 -1
  360. package/cjs/network/auth-key.js.map +1 -1
  361. package/cjs/network/authorization.js.map +1 -1
  362. package/cjs/network/client.d.ts +1 -1
  363. package/cjs/network/client.js +39 -14
  364. package/cjs/network/client.js.map +1 -1
  365. package/cjs/network/config-manager.js.map +1 -1
  366. package/cjs/network/mtproto-session.d.ts +1 -1
  367. package/cjs/network/mtproto-session.js +40 -30
  368. package/cjs/network/mtproto-session.js.map +1 -1
  369. package/cjs/network/multi-session-connection.d.ts +2 -2
  370. package/cjs/network/multi-session-connection.js +13 -7
  371. package/cjs/network/multi-session-connection.js.map +1 -1
  372. package/cjs/network/network-manager.d.ts +2 -3
  373. package/cjs/network/network-manager.js +49 -28
  374. package/cjs/network/network-manager.js.map +1 -1
  375. package/cjs/network/persistent-connection.d.ts +3 -3
  376. package/cjs/network/persistent-connection.js +33 -22
  377. package/cjs/network/persistent-connection.js.map +1 -1
  378. package/cjs/network/server-salt.js +4 -5
  379. package/cjs/network/server-salt.js.map +1 -1
  380. package/cjs/network/session-connection.d.ts +1 -1
  381. package/cjs/network/session-connection.js +22 -12
  382. package/cjs/network/session-connection.js.map +1 -1
  383. package/cjs/network/transports/abstract.d.ts +2 -2
  384. package/cjs/network/transports/abstract.js +1 -0
  385. package/cjs/network/transports/abstract.js.map +1 -1
  386. package/cjs/network/transports/intermediate.js +1 -0
  387. package/cjs/network/transports/intermediate.js.map +1 -1
  388. package/cjs/network/transports/obfuscated.js +3 -0
  389. package/cjs/network/transports/obfuscated.js.map +1 -1
  390. package/cjs/network/transports/streamed.d.ts +1 -1
  391. package/cjs/network/transports/streamed.js +1 -4
  392. package/cjs/network/transports/streamed.js.map +1 -1
  393. package/cjs/network/transports/wrapped.d.ts +1 -1
  394. package/cjs/network/transports/wrapped.js +2 -0
  395. package/cjs/network/transports/wrapped.js.map +1 -1
  396. package/cjs/platform.js.map +1 -1
  397. package/cjs/storage/driver.js +3 -4
  398. package/cjs/storage/driver.js.map +1 -1
  399. package/cjs/storage/memory/driver.js +1 -3
  400. package/cjs/storage/memory/driver.js.map +1 -1
  401. package/cjs/storage/memory/index.js +5 -7
  402. package/cjs/storage/memory/index.js.map +1 -1
  403. package/cjs/storage/memory/repository/auth-keys.d.ts +1 -1
  404. package/cjs/storage/memory/repository/auth-keys.js +2 -0
  405. package/cjs/storage/memory/repository/auth-keys.js.map +1 -1
  406. package/cjs/storage/memory/repository/kv.d.ts +1 -1
  407. package/cjs/storage/memory/repository/kv.js +2 -0
  408. package/cjs/storage/memory/repository/kv.js.map +1 -1
  409. package/cjs/storage/memory/repository/peers.d.ts +1 -1
  410. package/cjs/storage/memory/repository/peers.js +2 -0
  411. package/cjs/storage/memory/repository/peers.js.map +1 -1
  412. package/cjs/storage/memory/repository/ref-messages.d.ts +1 -1
  413. package/cjs/storage/memory/repository/ref-messages.js +2 -0
  414. package/cjs/storage/memory/repository/ref-messages.js.map +1 -1
  415. package/cjs/storage/service/auth-keys.js +2 -0
  416. package/cjs/storage/service/auth-keys.js.map +1 -1
  417. package/cjs/storage/service/base.js +4 -0
  418. package/cjs/storage/service/base.js.map +1 -1
  419. package/cjs/storage/service/default-dcs.js +2 -0
  420. package/cjs/storage/service/default-dcs.js.map +1 -1
  421. package/cjs/storage/service/future-salts.js +2 -1
  422. package/cjs/storage/service/future-salts.js.map +1 -1
  423. package/cjs/storage/sqlite/driver.js +10 -10
  424. package/cjs/storage/sqlite/driver.js.map +1 -1
  425. package/cjs/storage/sqlite/index.d.ts +1 -1
  426. package/cjs/storage/sqlite/index.js +5 -0
  427. package/cjs/storage/sqlite/index.js.map +1 -1
  428. package/cjs/storage/sqlite/repository/auth-keys.js +9 -0
  429. package/cjs/storage/sqlite/repository/auth-keys.js.map +1 -1
  430. package/cjs/storage/sqlite/repository/kv.js +5 -0
  431. package/cjs/storage/sqlite/repository/kv.js.map +1 -1
  432. package/cjs/storage/sqlite/repository/peers.js +6 -0
  433. package/cjs/storage/sqlite/repository/peers.js.map +1 -1
  434. package/cjs/storage/sqlite/repository/ref-messages.d.ts +1 -1
  435. package/cjs/storage/sqlite/repository/ref-messages.js +6 -0
  436. package/cjs/storage/sqlite/repository/ref-messages.js.map +1 -1
  437. package/cjs/storage/storage.d.ts +1 -3
  438. package/cjs/storage/storage.js +21 -13
  439. package/cjs/storage/storage.js.map +1 -1
  440. package/cjs/types/errors.js +13 -0
  441. package/cjs/types/errors.js.map +1 -1
  442. package/cjs/utils/async-lock.js +1 -3
  443. package/cjs/utils/async-lock.js.map +1 -1
  444. package/cjs/utils/bigint-utils.js.map +1 -1
  445. package/cjs/utils/binary/asn1-parser.js.map +1 -1
  446. package/cjs/utils/buffer-utils.js.map +1 -1
  447. package/cjs/utils/condition-variable.js +2 -0
  448. package/cjs/utils/condition-variable.js.map +1 -1
  449. package/cjs/utils/crypto/factorization.js.map +1 -1
  450. package/cjs/utils/crypto/keys.js.map +1 -1
  451. package/cjs/utils/crypto/miller-rabin.js.map +1 -1
  452. package/cjs/utils/crypto/password.js.map +1 -1
  453. package/cjs/utils/crypto/utils.js.map +1 -1
  454. package/cjs/utils/dcs.js +1 -1
  455. package/cjs/utils/dcs.js.map +1 -1
  456. package/cjs/utils/deque.js +8 -2
  457. package/cjs/utils/deque.js.map +1 -1
  458. package/cjs/utils/early-timer.js +4 -1
  459. package/cjs/utils/early-timer.js.map +1 -1
  460. package/cjs/utils/error-reporting.js.map +1 -1
  461. package/cjs/utils/function-utils.js.map +1 -1
  462. package/cjs/utils/linked-list.js +4 -1
  463. package/cjs/utils/linked-list.js.map +1 -1
  464. package/cjs/utils/links/bots.js.map +1 -1
  465. package/cjs/utils/links/chat.js.map +1 -1
  466. package/cjs/utils/links/common.js.map +1 -1
  467. package/cjs/utils/links/misc.js.map +1 -1
  468. package/cjs/utils/logger.d.ts +2 -2
  469. package/cjs/utils/logger.js +21 -14
  470. package/cjs/utils/logger.js.map +1 -1
  471. package/cjs/utils/long-utils.js +2 -6
  472. package/cjs/utils/long-utils.js.map +1 -1
  473. package/cjs/utils/lru-map.js +5 -1
  474. package/cjs/utils/lru-map.js.map +1 -1
  475. package/cjs/utils/lru-set.js +4 -0
  476. package/cjs/utils/lru-set.js.map +1 -1
  477. package/cjs/utils/peer-utils.js.map +1 -1
  478. package/cjs/utils/reloadable.d.ts +1 -1
  479. package/cjs/utils/reloadable.js +10 -7
  480. package/cjs/utils/reloadable.js.map +1 -1
  481. package/cjs/utils/sorted-array.js +2 -0
  482. package/cjs/utils/sorted-array.js.map +1 -1
  483. package/cjs/utils/tl-json.js.map +1 -1
  484. package/cjs/utils/type-assertions.js.map +1 -1
  485. package/esm/highlevel/base.d.ts +1 -1
  486. package/esm/highlevel/base.js +29 -23
  487. package/esm/highlevel/base.js.map +1 -1
  488. package/esm/highlevel/client.d.ts +2 -1
  489. package/esm/highlevel/client.js +1 -0
  490. package/esm/highlevel/client.js.map +1 -1
  491. package/esm/highlevel/managers/app-config-manager.js +7 -5
  492. package/esm/highlevel/managers/app-config-manager.js.map +1 -1
  493. package/esm/highlevel/methods/_init.js.map +1 -1
  494. package/esm/highlevel/methods/auth/start-test.js.map +1 -1
  495. package/esm/highlevel/methods/auth/start.js.map +1 -1
  496. package/esm/highlevel/methods/auth/utils.js.map +1 -1
  497. package/esm/highlevel/methods/bots/get-callback-answer.js.map +1 -1
  498. package/esm/highlevel/methods/bots/get-game-high-scores.js.map +1 -1
  499. package/esm/highlevel/methods/bots/normalize-command-scope.js.map +1 -1
  500. package/esm/highlevel/methods/bots/set-my-commands.js.map +1 -1
  501. package/esm/highlevel/methods/chats/add-chat-members.js.map +1 -1
  502. package/esm/highlevel/methods/chats/ban-chat-member.js.map +1 -1
  503. package/esm/highlevel/methods/chats/batched-queries.js.map +1 -1
  504. package/esm/highlevel/methods/chats/delete-chat-photo.js.map +1 -1
  505. package/esm/highlevel/methods/chats/delete-history.js.map +1 -1
  506. package/esm/highlevel/methods/chats/get-chat-event-log.js.map +1 -1
  507. package/esm/highlevel/methods/chats/get-chat-member.js.map +1 -1
  508. package/esm/highlevel/methods/chats/get-chat-members.js.map +1 -1
  509. package/esm/highlevel/methods/chats/get-chat-preview.js.map +1 -1
  510. package/esm/highlevel/methods/chats/get-chat.js.map +1 -1
  511. package/esm/highlevel/methods/chats/get-full-chat.js.map +1 -1
  512. package/esm/highlevel/methods/chats/get-nearby-chats.js.map +1 -1
  513. package/esm/highlevel/methods/chats/get-similar-channels.js.map +1 -1
  514. package/esm/highlevel/methods/chats/iter-chat-event-log.js.map +1 -1
  515. package/esm/highlevel/methods/chats/iter-chat-members.js.map +1 -1
  516. package/esm/highlevel/methods/chats/join-chat.js.map +1 -1
  517. package/esm/highlevel/methods/chats/kick-chat-member.js.map +1 -1
  518. package/esm/highlevel/methods/chats/leave-chat.js.map +1 -1
  519. package/esm/highlevel/methods/chats/open-chat.js.map +1 -1
  520. package/esm/highlevel/methods/chats/reorder-usernames.js.map +1 -1
  521. package/esm/highlevel/methods/chats/restrict-chat-member.js.map +1 -1
  522. package/esm/highlevel/methods/chats/save-draft.js.map +1 -1
  523. package/esm/highlevel/methods/chats/set-chat-color.js.map +1 -1
  524. package/esm/highlevel/methods/chats/set-chat-photo.js.map +1 -1
  525. package/esm/highlevel/methods/chats/set-chat-title.js.map +1 -1
  526. package/esm/highlevel/methods/chats/toggle-fragment-username.js.map +1 -1
  527. package/esm/highlevel/methods/chats/unarchive-chats.js.map +1 -1
  528. package/esm/highlevel/methods/chats/unban-chat-member.js.map +1 -1
  529. package/esm/highlevel/methods/contacts/delete-contacts.js.map +1 -1
  530. package/esm/highlevel/methods/dialogs/create-folder.js.map +1 -1
  531. package/esm/highlevel/methods/dialogs/edit-folder.js.map +1 -1
  532. package/esm/highlevel/methods/dialogs/find-folder.js.map +1 -1
  533. package/esm/highlevel/methods/dialogs/get-folders.js.map +1 -1
  534. package/esm/highlevel/methods/dialogs/iter-dialogs.js.map +1 -1
  535. package/esm/highlevel/methods/files/download-buffer.js.map +1 -1
  536. package/esm/highlevel/methods/files/download-iterable.js +1 -1
  537. package/esm/highlevel/methods/files/download-iterable.js.map +1 -1
  538. package/esm/highlevel/methods/files/download-node-stream.js.map +1 -1
  539. package/esm/highlevel/methods/files/download-stream.js.map +1 -1
  540. package/esm/highlevel/methods/files/normalize-file-to-document.js.map +1 -1
  541. package/esm/highlevel/methods/files/normalize-input-file.js.map +1 -1
  542. package/esm/highlevel/methods/files/normalize-input-media.js +1 -2
  543. package/esm/highlevel/methods/files/normalize-input-media.js.map +1 -1
  544. package/esm/highlevel/methods/files/upload-file.js +8 -7
  545. package/esm/highlevel/methods/files/upload-file.js.map +1 -1
  546. package/esm/highlevel/methods/files/upload-media.js.map +1 -1
  547. package/esm/highlevel/methods/forums/iter-forum-topics.js.map +1 -1
  548. package/esm/highlevel/methods/invite-links/get-primary-invite-link.js.map +1 -1
  549. package/esm/highlevel/methods/invite-links/iter-invite-link-members.js.map +1 -1
  550. package/esm/highlevel/methods/invite-links/iter-invite-links.js.map +1 -1
  551. package/esm/highlevel/methods/messages/close-poll.js.map +1 -1
  552. package/esm/highlevel/methods/messages/delete-messages.js.map +1 -1
  553. package/esm/highlevel/methods/messages/edit-inline-message.js.map +1 -1
  554. package/esm/highlevel/methods/messages/edit-message.js.map +1 -1
  555. package/esm/highlevel/methods/messages/find-in-update.js.map +1 -1
  556. package/esm/highlevel/methods/messages/forward-messages.js.map +1 -1
  557. package/esm/highlevel/methods/messages/get-callback-query-message.js.map +1 -1
  558. package/esm/highlevel/methods/messages/get-discussion-message.js.map +1 -1
  559. package/esm/highlevel/methods/messages/get-history.js +5 -1
  560. package/esm/highlevel/methods/messages/get-history.js.map +1 -1
  561. package/esm/highlevel/methods/messages/get-message-by-link.js.map +1 -1
  562. package/esm/highlevel/methods/messages/get-message-group.js.map +1 -1
  563. package/esm/highlevel/methods/messages/get-message-reactions.js.map +1 -1
  564. package/esm/highlevel/methods/messages/get-messages.js.map +1 -1
  565. package/esm/highlevel/methods/messages/get-reply-to.js.map +1 -1
  566. package/esm/highlevel/methods/messages/iter-history.js.map +1 -1
  567. package/esm/highlevel/methods/messages/iter-reaction-users.js.map +1 -1
  568. package/esm/highlevel/methods/messages/iter-search-global.js.map +1 -1
  569. package/esm/highlevel/methods/messages/iter-search-messages.js.map +1 -1
  570. package/esm/highlevel/methods/messages/read-history.js.map +1 -1
  571. package/esm/highlevel/methods/messages/send-answer.js.map +1 -1
  572. package/esm/highlevel/methods/messages/send-comment.js.map +1 -1
  573. package/esm/highlevel/methods/messages/send-common.js.map +1 -1
  574. package/esm/highlevel/methods/messages/send-copy-group.js.map +1 -1
  575. package/esm/highlevel/methods/messages/send-copy.js.map +1 -1
  576. package/esm/highlevel/methods/messages/send-media-group.js.map +1 -1
  577. package/esm/highlevel/methods/messages/send-media.js.map +1 -1
  578. package/esm/highlevel/methods/messages/send-quote.js.map +1 -1
  579. package/esm/highlevel/methods/messages/send-text.js.map +1 -1
  580. package/esm/highlevel/methods/messages/send-typing.js.map +1 -1
  581. package/esm/highlevel/methods/messages/send-vote.js.map +1 -1
  582. package/esm/highlevel/methods/messages/translate-text.js.map +1 -1
  583. package/esm/highlevel/methods/messages/unpin-all-messages.js.map +1 -1
  584. package/esm/highlevel/methods/misc/normalize-privacy-rules.js.map +1 -1
  585. package/esm/highlevel/methods/misc/normalize-text.js.map +1 -1
  586. package/esm/highlevel/methods/misc/with-params.js.map +1 -1
  587. package/esm/highlevel/methods/password/change-cloud-password.js.map +1 -1
  588. package/esm/highlevel/methods/password/enable-cloud-password.js.map +1 -1
  589. package/esm/highlevel/methods/password/remove-cloud-password.js.map +1 -1
  590. package/esm/highlevel/methods/premium/can-apply-boost.js.map +1 -1
  591. package/esm/highlevel/methods/premium/iter-boosters.js.map +1 -1
  592. package/esm/highlevel/methods/stickers/create-sticker-set.js.map +1 -1
  593. package/esm/highlevel/methods/stickers/delete-sticker-from-set.js.map +1 -1
  594. package/esm/highlevel/methods/stickers/get-custom-emojis.js.map +1 -1
  595. package/esm/highlevel/methods/stickers/move-sticker-in-set.js.map +1 -1
  596. package/esm/highlevel/methods/stories/can-send-story.js.map +1 -1
  597. package/esm/highlevel/methods/stories/edit-story.js.map +1 -1
  598. package/esm/highlevel/methods/stories/find-in-update.js.map +1 -1
  599. package/esm/highlevel/methods/stories/hide-my-stories-views.js.map +1 -1
  600. package/esm/highlevel/methods/stories/iter-all-stories.js.map +1 -1
  601. package/esm/highlevel/methods/stories/iter-profile-stories.js.map +1 -1
  602. package/esm/highlevel/methods/stories/iter-story-viewers.js.map +1 -1
  603. package/esm/highlevel/methods/stories/send-story.js.map +1 -1
  604. package/esm/highlevel/methods/users/delete-profile-photos.js.map +1 -1
  605. package/esm/highlevel/methods/users/get-users.js.map +1 -1
  606. package/esm/highlevel/methods/users/iter-profile-photos.js.map +1 -1
  607. package/esm/highlevel/methods/users/resolve-peer-many.js.map +1 -1
  608. package/esm/highlevel/methods/users/resolve-peer.js.map +1 -1
  609. package/esm/highlevel/methods/users/set-my-emoji-status.js.map +1 -1
  610. package/esm/highlevel/methods/users/set-my-profile-photo.js.map +1 -1
  611. package/esm/highlevel/storage/service/current-user.js +2 -0
  612. package/esm/highlevel/storage/service/current-user.js.map +1 -1
  613. package/esm/highlevel/storage/service/peers.js +5 -1
  614. package/esm/highlevel/storage/service/peers.js.map +1 -1
  615. package/esm/highlevel/storage/service/ref-messages.js +3 -0
  616. package/esm/highlevel/storage/service/ref-messages.js.map +1 -1
  617. package/esm/highlevel/storage/service/updates.js +1 -0
  618. package/esm/highlevel/storage/service/updates.js.map +1 -1
  619. package/esm/highlevel/storage/storage.d.ts +1 -1
  620. package/esm/highlevel/storage/storage.js +17 -4
  621. package/esm/highlevel/storage/storage.js.map +1 -1
  622. package/esm/highlevel/types/auth/sent-code.js +1 -0
  623. package/esm/highlevel/types/auth/sent-code.js.map +1 -1
  624. package/esm/highlevel/types/bots/game-high-score.js +2 -0
  625. package/esm/highlevel/types/bots/game-high-score.js.map +1 -1
  626. package/esm/highlevel/types/bots/inline-message/factories.js.map +1 -1
  627. package/esm/highlevel/types/bots/inline-result/factories.js.map +1 -1
  628. package/esm/highlevel/types/bots/keyboards/builder.js +2 -1
  629. package/esm/highlevel/types/bots/keyboards/builder.js.map +1 -1
  630. package/esm/highlevel/types/bots/keyboards/factories.js.map +1 -1
  631. package/esm/highlevel/types/calls/discard-reason.js.map +1 -1
  632. package/esm/highlevel/types/conversation.js +13 -7
  633. package/esm/highlevel/types/conversation.js.map +1 -1
  634. package/esm/highlevel/types/errors.js +3 -0
  635. package/esm/highlevel/types/errors.js.map +1 -1
  636. package/esm/highlevel/types/files/file-location.js +3 -0
  637. package/esm/highlevel/types/files/file-location.js.map +1 -1
  638. package/esm/highlevel/types/files/uploaded-file.js +1 -1
  639. package/esm/highlevel/types/files/uploaded-file.js.map +1 -1
  640. package/esm/highlevel/types/files/utils.d.ts +1 -1
  641. package/esm/highlevel/types/files/utils.js.map +1 -1
  642. package/esm/highlevel/types/files/web-document.js +1 -0
  643. package/esm/highlevel/types/files/web-document.js.map +1 -1
  644. package/esm/highlevel/types/media/audio.js +3 -2
  645. package/esm/highlevel/types/media/audio.js.map +1 -1
  646. package/esm/highlevel/types/media/contact.js +2 -1
  647. package/esm/highlevel/types/media/contact.js.map +1 -1
  648. package/esm/highlevel/types/media/dice.js +125 -124
  649. package/esm/highlevel/types/media/dice.js.map +1 -1
  650. package/esm/highlevel/types/media/document-utils.js.map +1 -1
  651. package/esm/highlevel/types/media/document.js +2 -4
  652. package/esm/highlevel/types/media/document.js.map +1 -1
  653. package/esm/highlevel/types/media/game.js +2 -1
  654. package/esm/highlevel/types/media/game.js.map +1 -1
  655. package/esm/highlevel/types/media/invoice.js +4 -1
  656. package/esm/highlevel/types/media/invoice.js.map +1 -1
  657. package/esm/highlevel/types/media/location.js +4 -5
  658. package/esm/highlevel/types/media/location.js.map +1 -1
  659. package/esm/highlevel/types/media/photo.js +8 -1
  660. package/esm/highlevel/types/media/photo.js.map +1 -1
  661. package/esm/highlevel/types/media/poll.js +4 -1
  662. package/esm/highlevel/types/media/poll.js.map +1 -1
  663. package/esm/highlevel/types/media/sticker.js +3 -1
  664. package/esm/highlevel/types/media/sticker.js.map +1 -1
  665. package/esm/highlevel/types/media/story.js +3 -1
  666. package/esm/highlevel/types/media/story.js.map +1 -1
  667. package/esm/highlevel/types/media/thumbnail.js +35 -22
  668. package/esm/highlevel/types/media/thumbnail.js.map +1 -1
  669. package/esm/highlevel/types/media/venue.js +2 -1
  670. package/esm/highlevel/types/media/venue.js.map +1 -1
  671. package/esm/highlevel/types/media/video.js +3 -1
  672. package/esm/highlevel/types/media/video.js.map +1 -1
  673. package/esm/highlevel/types/media/voice.js +2 -1
  674. package/esm/highlevel/types/media/voice.js.map +1 -1
  675. package/esm/highlevel/types/media/web-page.js +2 -1
  676. package/esm/highlevel/types/media/web-page.js.map +1 -1
  677. package/esm/highlevel/types/messages/dialog.js +3 -0
  678. package/esm/highlevel/types/messages/dialog.js.map +1 -1
  679. package/esm/highlevel/types/messages/draft-message.js +1 -0
  680. package/esm/highlevel/types/messages/draft-message.js.map +1 -1
  681. package/esm/highlevel/types/messages/message-action.js.map +1 -1
  682. package/esm/highlevel/types/messages/message-entity.js +2 -0
  683. package/esm/highlevel/types/messages/message-entity.js.map +1 -1
  684. package/esm/highlevel/types/messages/message-forward.js +2 -0
  685. package/esm/highlevel/types/messages/message-forward.js.map +1 -1
  686. package/esm/highlevel/types/messages/message-media.js.map +1 -1
  687. package/esm/highlevel/types/messages/message-reactions.js +4 -0
  688. package/esm/highlevel/types/messages/message-reactions.js.map +1 -1
  689. package/esm/highlevel/types/messages/message-replies.js +2 -0
  690. package/esm/highlevel/types/messages/message-replies.js.map +1 -1
  691. package/esm/highlevel/types/messages/message.js +6 -0
  692. package/esm/highlevel/types/messages/message.js.map +1 -1
  693. package/esm/highlevel/types/messages/replied-message.js +2 -0
  694. package/esm/highlevel/types/messages/replied-message.js.map +1 -1
  695. package/esm/highlevel/types/misc/sticker-set.js +7 -1
  696. package/esm/highlevel/types/misc/sticker-set.js.map +1 -1
  697. package/esm/highlevel/types/misc/takeout-session.js +5 -0
  698. package/esm/highlevel/types/misc/takeout-session.js.map +1 -1
  699. package/esm/highlevel/types/peers/chat-colors.js +2 -0
  700. package/esm/highlevel/types/peers/chat-colors.js.map +1 -1
  701. package/esm/highlevel/types/peers/chat-event/actions.js.map +1 -1
  702. package/esm/highlevel/types/peers/chat-event/filters.js.map +1 -1
  703. package/esm/highlevel/types/peers/chat-event/index.js +2 -0
  704. package/esm/highlevel/types/peers/chat-event/index.js.map +1 -1
  705. package/esm/highlevel/types/peers/chat-invite-link-member.js +2 -0
  706. package/esm/highlevel/types/peers/chat-invite-link-member.js.map +1 -1
  707. package/esm/highlevel/types/peers/chat-invite-link.js +2 -0
  708. package/esm/highlevel/types/peers/chat-invite-link.js.map +1 -1
  709. package/esm/highlevel/types/peers/chat-location.js +1 -0
  710. package/esm/highlevel/types/peers/chat-location.js.map +1 -1
  711. package/esm/highlevel/types/peers/chat-member.js +2 -0
  712. package/esm/highlevel/types/peers/chat-member.js.map +1 -1
  713. package/esm/highlevel/types/peers/chat-permissions.js +1 -0
  714. package/esm/highlevel/types/peers/chat-permissions.js.map +1 -1
  715. package/esm/highlevel/types/peers/chat-photo.js +5 -0
  716. package/esm/highlevel/types/peers/chat-photo.js.map +1 -1
  717. package/esm/highlevel/types/peers/chat-preview.js +2 -0
  718. package/esm/highlevel/types/peers/chat-preview.js.map +1 -1
  719. package/esm/highlevel/types/peers/chat.js +12 -1
  720. package/esm/highlevel/types/peers/chat.js.map +1 -1
  721. package/esm/highlevel/types/peers/forum-topic.js +9 -6
  722. package/esm/highlevel/types/peers/forum-topic.js.map +1 -1
  723. package/esm/highlevel/types/peers/peer.js.map +1 -1
  724. package/esm/highlevel/types/peers/peers-index.js +3 -1
  725. package/esm/highlevel/types/peers/peers-index.js.map +1 -1
  726. package/esm/highlevel/types/peers/user.js +5 -1
  727. package/esm/highlevel/types/peers/user.js.map +1 -1
  728. package/esm/highlevel/types/premium/boost-slot.js +2 -0
  729. package/esm/highlevel/types/premium/boost-slot.js.map +1 -1
  730. package/esm/highlevel/types/premium/boost-stats.js +1 -0
  731. package/esm/highlevel/types/premium/boost-stats.js.map +1 -1
  732. package/esm/highlevel/types/premium/boost.js +2 -0
  733. package/esm/highlevel/types/premium/boost.js.map +1 -1
  734. package/esm/highlevel/types/reactions/emoji-status.js +1 -0
  735. package/esm/highlevel/types/reactions/emoji-status.js.map +1 -1
  736. package/esm/highlevel/types/reactions/peer-reaction.js +2 -0
  737. package/esm/highlevel/types/reactions/peer-reaction.js.map +1 -1
  738. package/esm/highlevel/types/reactions/reaction-count.js +1 -0
  739. package/esm/highlevel/types/reactions/reaction-count.js.map +1 -1
  740. package/esm/highlevel/types/reactions/types.js.map +1 -1
  741. package/esm/highlevel/types/stories/all-stories.d.ts +2 -2
  742. package/esm/highlevel/types/stories/all-stories.js +3 -1
  743. package/esm/highlevel/types/stories/all-stories.js.map +1 -1
  744. package/esm/highlevel/types/stories/interactive/base.js +1 -0
  745. package/esm/highlevel/types/stories/interactive/base.js.map +1 -1
  746. package/esm/highlevel/types/stories/interactive/channel-post.js +3 -1
  747. package/esm/highlevel/types/stories/interactive/channel-post.js.map +1 -1
  748. package/esm/highlevel/types/stories/interactive/index.js.map +1 -1
  749. package/esm/highlevel/types/stories/interactive/input.js +1 -0
  750. package/esm/highlevel/types/stories/interactive/input.js.map +1 -1
  751. package/esm/highlevel/types/stories/interactive/location.js +2 -1
  752. package/esm/highlevel/types/stories/interactive/location.js.map +1 -1
  753. package/esm/highlevel/types/stories/interactive/reaction.js +2 -1
  754. package/esm/highlevel/types/stories/interactive/reaction.js.map +1 -1
  755. package/esm/highlevel/types/stories/interactive/venue.js +2 -1
  756. package/esm/highlevel/types/stories/interactive/venue.js.map +1 -1
  757. package/esm/highlevel/types/stories/peer-stories.js +2 -0
  758. package/esm/highlevel/types/stories/peer-stories.js.map +1 -1
  759. package/esm/highlevel/types/stories/stealth-mode.js +1 -0
  760. package/esm/highlevel/types/stories/stealth-mode.js.map +1 -1
  761. package/esm/highlevel/types/stories/story-interactions.js +2 -0
  762. package/esm/highlevel/types/stories/story-interactions.js.map +1 -1
  763. package/esm/highlevel/types/stories/story-viewer.d.ts +1 -1
  764. package/esm/highlevel/types/stories/story-viewer.js +6 -0
  765. package/esm/highlevel/types/stories/story-viewer.js.map +1 -1
  766. package/esm/highlevel/types/stories/story.js +2 -0
  767. package/esm/highlevel/types/stories/story.js.map +1 -1
  768. package/esm/highlevel/types/updates/bot-chat-join-request.js +2 -0
  769. package/esm/highlevel/types/updates/bot-chat-join-request.js.map +1 -1
  770. package/esm/highlevel/types/updates/bot-reaction.js +4 -0
  771. package/esm/highlevel/types/updates/bot-reaction.js.map +1 -1
  772. package/esm/highlevel/types/updates/bot-stopped.js +2 -0
  773. package/esm/highlevel/types/updates/bot-stopped.js.map +1 -1
  774. package/esm/highlevel/types/updates/callback-query.js +4 -0
  775. package/esm/highlevel/types/updates/callback-query.js.map +1 -1
  776. package/esm/highlevel/types/updates/chat-join-request.js +2 -0
  777. package/esm/highlevel/types/updates/chat-join-request.js.map +1 -1
  778. package/esm/highlevel/types/updates/chat-member-update.js +2 -0
  779. package/esm/highlevel/types/updates/chat-member-update.js.map +1 -1
  780. package/esm/highlevel/types/updates/chosen-inline-result.js +2 -0
  781. package/esm/highlevel/types/updates/chosen-inline-result.js.map +1 -1
  782. package/esm/highlevel/types/updates/delete-message-update.js +1 -0
  783. package/esm/highlevel/types/updates/delete-message-update.js.map +1 -1
  784. package/esm/highlevel/types/updates/delete-story-update.js +2 -0
  785. package/esm/highlevel/types/updates/delete-story-update.js.map +1 -1
  786. package/esm/highlevel/types/updates/history-read-update.js +1 -0
  787. package/esm/highlevel/types/updates/history-read-update.js.map +1 -1
  788. package/esm/highlevel/types/updates/inline-query.js +2 -0
  789. package/esm/highlevel/types/updates/inline-query.js.map +1 -1
  790. package/esm/highlevel/types/updates/parse-update.js.map +1 -1
  791. package/esm/highlevel/types/updates/poll-update.js +2 -0
  792. package/esm/highlevel/types/updates/poll-update.js.map +1 -1
  793. package/esm/highlevel/types/updates/poll-vote.js +2 -0
  794. package/esm/highlevel/types/updates/poll-vote.js.map +1 -1
  795. package/esm/highlevel/types/updates/pre-checkout-query.js +2 -0
  796. package/esm/highlevel/types/updates/pre-checkout-query.js.map +1 -1
  797. package/esm/highlevel/types/updates/story-update.js +2 -0
  798. package/esm/highlevel/types/updates/story-update.js.map +1 -1
  799. package/esm/highlevel/types/updates/user-status-update.js +1 -0
  800. package/esm/highlevel/types/updates/user-status-update.js.map +1 -1
  801. package/esm/highlevel/types/updates/user-typing-update.js +1 -0
  802. package/esm/highlevel/types/updates/user-typing-update.js.map +1 -1
  803. package/esm/highlevel/updates/manager.js +50 -28
  804. package/esm/highlevel/updates/manager.js.map +1 -1
  805. package/esm/highlevel/updates/parsed.js.map +1 -1
  806. package/esm/highlevel/updates/utils.js.map +1 -1
  807. package/esm/highlevel/utils/convert-file-id.js.map +1 -1
  808. package/esm/highlevel/utils/entities.js.map +1 -1
  809. package/esm/highlevel/utils/file-type.d.ts +1 -0
  810. package/esm/highlevel/utils/file-type.js +34 -0
  811. package/esm/highlevel/utils/file-type.js.map +1 -1
  812. package/esm/highlevel/utils/file-utils.js +1 -1
  813. package/esm/highlevel/utils/file-utils.js.map +1 -1
  814. package/esm/highlevel/utils/inline-utils.js.map +1 -1
  815. package/esm/highlevel/utils/inspectable.js.map +1 -1
  816. package/esm/highlevel/utils/memoize.js.map +1 -1
  817. package/esm/highlevel/utils/peer-utils.js.map +1 -1
  818. package/esm/highlevel/utils/query-batcher.js.map +1 -1
  819. package/esm/highlevel/utils/rps-meter.js +3 -0
  820. package/esm/highlevel/utils/rps-meter.js.map +1 -1
  821. package/esm/highlevel/utils/stream-utils.js.map +1 -1
  822. package/esm/highlevel/utils/string-session.d.ts +1 -2
  823. package/esm/highlevel/utils/string-session.js +27 -7
  824. package/esm/highlevel/utils/string-session.js.map +1 -1
  825. package/esm/highlevel/utils/voice-utils.js.map +1 -1
  826. package/esm/highlevel/worker/app-config.d.ts +2 -3
  827. package/esm/highlevel/worker/app-config.js +6 -3
  828. package/esm/highlevel/worker/app-config.js.map +1 -1
  829. package/esm/highlevel/worker/errors.js.map +1 -1
  830. package/esm/highlevel/worker/invoker.js +3 -2
  831. package/esm/highlevel/worker/invoker.js.map +1 -1
  832. package/esm/highlevel/worker/port.d.ts +16 -17
  833. package/esm/highlevel/worker/port.js +74 -49
  834. package/esm/highlevel/worker/port.js.map +1 -1
  835. package/esm/highlevel/worker/protocol.d.ts +1 -1
  836. package/esm/highlevel/worker/protocol.js.map +1 -1
  837. package/esm/highlevel/worker/storage.d.ts +9 -13
  838. package/esm/highlevel/worker/storage.js +34 -19
  839. package/esm/highlevel/worker/storage.js.map +1 -1
  840. package/esm/highlevel/worker/worker.js +3 -0
  841. package/esm/highlevel/worker/worker.js.map +1 -1
  842. package/esm/network/auth-key.js +8 -1
  843. package/esm/network/auth-key.js.map +1 -1
  844. package/esm/network/authorization.js.map +1 -1
  845. package/esm/network/client.js +39 -14
  846. package/esm/network/client.js.map +1 -1
  847. package/esm/network/config-manager.js.map +1 -1
  848. package/esm/network/mtproto-session.js +40 -30
  849. package/esm/network/mtproto-session.js.map +1 -1
  850. package/esm/network/multi-session-connection.d.ts +1 -1
  851. package/esm/network/multi-session-connection.js +13 -7
  852. package/esm/network/multi-session-connection.js.map +1 -1
  853. package/esm/network/network-manager.d.ts +2 -3
  854. package/esm/network/network-manager.js +49 -28
  855. package/esm/network/network-manager.js.map +1 -1
  856. package/esm/network/persistent-connection.d.ts +2 -2
  857. package/esm/network/persistent-connection.js +33 -22
  858. package/esm/network/persistent-connection.js.map +1 -1
  859. package/esm/network/server-salt.js +4 -5
  860. package/esm/network/server-salt.js.map +1 -1
  861. package/esm/network/session-connection.d.ts +1 -1
  862. package/esm/network/session-connection.js +22 -12
  863. package/esm/network/session-connection.js.map +1 -1
  864. package/esm/network/transports/abstract.d.ts +1 -1
  865. package/esm/network/transports/abstract.js +1 -0
  866. package/esm/network/transports/abstract.js.map +1 -1
  867. package/esm/network/transports/intermediate.js +1 -0
  868. package/esm/network/transports/intermediate.js.map +1 -1
  869. package/esm/network/transports/obfuscated.js +3 -0
  870. package/esm/network/transports/obfuscated.js.map +1 -1
  871. package/esm/network/transports/streamed.js +1 -4
  872. package/esm/network/transports/streamed.js.map +1 -1
  873. package/esm/network/transports/wrapped.js +2 -0
  874. package/esm/network/transports/wrapped.js.map +1 -1
  875. package/esm/platform.js.map +1 -1
  876. package/esm/storage/driver.js +3 -4
  877. package/esm/storage/driver.js.map +1 -1
  878. package/esm/storage/memory/driver.js +1 -3
  879. package/esm/storage/memory/driver.js.map +1 -1
  880. package/esm/storage/memory/index.js +5 -7
  881. package/esm/storage/memory/index.js.map +1 -1
  882. package/esm/storage/memory/repository/auth-keys.d.ts +1 -1
  883. package/esm/storage/memory/repository/auth-keys.js +2 -0
  884. package/esm/storage/memory/repository/auth-keys.js.map +1 -1
  885. package/esm/storage/memory/repository/kv.d.ts +1 -1
  886. package/esm/storage/memory/repository/kv.js +2 -0
  887. package/esm/storage/memory/repository/kv.js.map +1 -1
  888. package/esm/storage/memory/repository/peers.d.ts +1 -1
  889. package/esm/storage/memory/repository/peers.js +2 -0
  890. package/esm/storage/memory/repository/peers.js.map +1 -1
  891. package/esm/storage/memory/repository/ref-messages.d.ts +1 -1
  892. package/esm/storage/memory/repository/ref-messages.js +2 -0
  893. package/esm/storage/memory/repository/ref-messages.js.map +1 -1
  894. package/esm/storage/service/auth-keys.js +2 -0
  895. package/esm/storage/service/auth-keys.js.map +1 -1
  896. package/esm/storage/service/base.js +4 -0
  897. package/esm/storage/service/base.js.map +1 -1
  898. package/esm/storage/service/default-dcs.js +2 -0
  899. package/esm/storage/service/default-dcs.js.map +1 -1
  900. package/esm/storage/service/future-salts.js +2 -1
  901. package/esm/storage/service/future-salts.js.map +1 -1
  902. package/esm/storage/sqlite/driver.js +10 -10
  903. package/esm/storage/sqlite/driver.js.map +1 -1
  904. package/esm/storage/sqlite/index.d.ts +1 -1
  905. package/esm/storage/sqlite/index.js +5 -0
  906. package/esm/storage/sqlite/index.js.map +1 -1
  907. package/esm/storage/sqlite/repository/auth-keys.js +9 -0
  908. package/esm/storage/sqlite/repository/auth-keys.js.map +1 -1
  909. package/esm/storage/sqlite/repository/kv.js +5 -0
  910. package/esm/storage/sqlite/repository/kv.js.map +1 -1
  911. package/esm/storage/sqlite/repository/peers.js +6 -0
  912. package/esm/storage/sqlite/repository/peers.js.map +1 -1
  913. package/esm/storage/sqlite/repository/ref-messages.d.ts +1 -1
  914. package/esm/storage/sqlite/repository/ref-messages.js +6 -0
  915. package/esm/storage/sqlite/repository/ref-messages.js.map +1 -1
  916. package/esm/storage/storage.d.ts +1 -3
  917. package/esm/storage/storage.js +21 -13
  918. package/esm/storage/storage.js.map +1 -1
  919. package/esm/types/errors.js +13 -0
  920. package/esm/types/errors.js.map +1 -1
  921. package/esm/utils/async-lock.js +1 -3
  922. package/esm/utils/async-lock.js.map +1 -1
  923. package/esm/utils/bigint-utils.js.map +1 -1
  924. package/esm/utils/binary/asn1-parser.js.map +1 -1
  925. package/esm/utils/buffer-utils.js.map +1 -1
  926. package/esm/utils/condition-variable.js +2 -0
  927. package/esm/utils/condition-variable.js.map +1 -1
  928. package/esm/utils/crypto/factorization.js.map +1 -1
  929. package/esm/utils/crypto/keys.js.map +1 -1
  930. package/esm/utils/crypto/miller-rabin.js.map +1 -1
  931. package/esm/utils/crypto/password.js.map +1 -1
  932. package/esm/utils/crypto/utils.js.map +1 -1
  933. package/esm/utils/dcs.js +1 -1
  934. package/esm/utils/dcs.js.map +1 -1
  935. package/esm/utils/deque.js +8 -2
  936. package/esm/utils/deque.js.map +1 -1
  937. package/esm/utils/early-timer.js +4 -1
  938. package/esm/utils/early-timer.js.map +1 -1
  939. package/esm/utils/error-reporting.js.map +1 -1
  940. package/esm/utils/function-utils.js.map +1 -1
  941. package/esm/utils/linked-list.js +4 -1
  942. package/esm/utils/linked-list.js.map +1 -1
  943. package/esm/utils/links/bots.js.map +1 -1
  944. package/esm/utils/links/chat.js.map +1 -1
  945. package/esm/utils/links/common.js.map +1 -1
  946. package/esm/utils/links/misc.js.map +1 -1
  947. package/esm/utils/logger.d.ts +2 -2
  948. package/esm/utils/logger.js +21 -14
  949. package/esm/utils/logger.js.map +1 -1
  950. package/esm/utils/long-utils.js +2 -6
  951. package/esm/utils/long-utils.js.map +1 -1
  952. package/esm/utils/lru-map.js +5 -1
  953. package/esm/utils/lru-map.js.map +1 -1
  954. package/esm/utils/lru-set.js +4 -0
  955. package/esm/utils/lru-set.js.map +1 -1
  956. package/esm/utils/peer-utils.js.map +1 -1
  957. package/esm/utils/reloadable.js +10 -7
  958. package/esm/utils/reloadable.js.map +1 -1
  959. package/esm/utils/sorted-array.js +2 -0
  960. package/esm/utils/sorted-array.js.map +1 -1
  961. package/esm/utils/tl-json.js.map +1 -1
  962. package/esm/utils/type-assertions.js.map +1 -1
  963. 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"]}