@mtcute/core 0.11.0 → 0.12.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 (467) hide show
  1. package/cjs/highlevel/client.d.ts +198 -18
  2. package/cjs/highlevel/client.js +53 -0
  3. package/cjs/highlevel/client.js.map +1 -1
  4. package/cjs/highlevel/methods/_imports.js.map +1 -1
  5. package/cjs/highlevel/methods/auth/utils.d.ts +3 -0
  6. package/cjs/highlevel/methods/bots/normalize-command-scope.d.ts +5 -1
  7. package/cjs/highlevel/methods/chats/batched-queries.d.ts +10 -1
  8. package/cjs/highlevel/methods/chats/get-full-chat.d.ts +2 -2
  9. package/cjs/highlevel/methods/chats/get-full-chat.js +1 -1
  10. package/cjs/highlevel/methods/chats/get-full-chat.js.map +1 -1
  11. package/cjs/highlevel/methods/dialogs/get-folders.d.ts +3 -0
  12. package/cjs/highlevel/methods/files/normalize-file-to-document.d.ts +9 -1
  13. package/cjs/highlevel/methods/files/normalize-input-media.d.ts +1 -0
  14. package/cjs/highlevel/methods/files/normalize-input-media.js +11 -10
  15. package/cjs/highlevel/methods/files/normalize-input-media.js.map +1 -1
  16. package/cjs/highlevel/methods/messages/_business-connection.d.ts +7 -0
  17. package/cjs/highlevel/methods/messages/_business-connection.js +42 -0
  18. package/cjs/highlevel/methods/messages/_business-connection.js.map +1 -0
  19. package/cjs/highlevel/methods/messages/close-poll.js +1 -1
  20. package/cjs/highlevel/methods/messages/close-poll.js.map +1 -1
  21. package/cjs/highlevel/methods/messages/edit-message.d.ts +1 -0
  22. package/cjs/highlevel/methods/messages/edit-message.js +2 -1
  23. package/cjs/highlevel/methods/messages/edit-message.js.map +1 -1
  24. package/cjs/highlevel/methods/messages/find-in-update.d.ts +13 -1
  25. package/cjs/highlevel/methods/messages/find-in-update.js +7 -2
  26. package/cjs/highlevel/methods/messages/find-in-update.js.map +1 -1
  27. package/cjs/highlevel/methods/messages/forward-messages.d.ts +5 -0
  28. package/cjs/highlevel/methods/messages/forward-messages.js +2 -0
  29. package/cjs/highlevel/methods/messages/forward-messages.js.map +1 -1
  30. package/cjs/highlevel/methods/messages/get-all-scheduled-messages.d.ts +8 -0
  31. package/cjs/highlevel/methods/messages/get-all-scheduled-messages.js +32 -0
  32. package/cjs/highlevel/methods/messages/get-all-scheduled-messages.js.map +1 -0
  33. package/cjs/highlevel/methods/messages/get-discussion-message.d.ts +4 -0
  34. package/cjs/highlevel/methods/messages/iter-search-global.js +2 -1
  35. package/cjs/highlevel/methods/messages/iter-search-global.js.map +1 -1
  36. package/cjs/highlevel/methods/messages/search-global.d.ts +4 -0
  37. package/cjs/highlevel/methods/messages/search-global.js +2 -1
  38. package/cjs/highlevel/methods/messages/search-global.js.map +1 -1
  39. package/cjs/highlevel/methods/messages/send-common.d.ts +28 -0
  40. package/cjs/highlevel/methods/messages/send-common.js +21 -1
  41. package/cjs/highlevel/methods/messages/send-common.js.map +1 -1
  42. package/cjs/highlevel/methods/messages/send-media-group.js +5 -2
  43. package/cjs/highlevel/methods/messages/send-media-group.js.map +1 -1
  44. package/cjs/highlevel/methods/messages/send-media.js +4 -2
  45. package/cjs/highlevel/methods/messages/send-media.js.map +1 -1
  46. package/cjs/highlevel/methods/messages/send-text.js +4 -2
  47. package/cjs/highlevel/methods/messages/send-text.js.map +1 -1
  48. package/cjs/highlevel/methods/messages/send-typing.d.ts +4 -0
  49. package/cjs/highlevel/methods/messages/send-typing.js +2 -1
  50. package/cjs/highlevel/methods/messages/send-typing.js.map +1 -1
  51. package/cjs/highlevel/methods/misc/chain-id.d.ts +4 -1
  52. package/cjs/highlevel/methods/misc/get-collectible-info.d.ts +6 -0
  53. package/cjs/highlevel/methods/misc/get-collectible-info.js +26 -0
  54. package/cjs/highlevel/methods/misc/get-collectible-info.js.map +1 -0
  55. package/cjs/highlevel/methods/misc/normalize-text.d.ts +5 -1
  56. package/cjs/highlevel/methods/premium/create-business-chat-link.d.ts +12 -0
  57. package/cjs/highlevel/methods/premium/create-business-chat-link.js +26 -0
  58. package/cjs/highlevel/methods/premium/create-business-chat-link.js.map +1 -0
  59. package/cjs/highlevel/methods/premium/edit-business-chat-link.d.ts +20 -0
  60. package/cjs/highlevel/methods/premium/edit-business-chat-link.js +42 -0
  61. package/cjs/highlevel/methods/premium/edit-business-chat-link.js.map +1 -0
  62. package/cjs/highlevel/methods/premium/get-business-chat-links.d.ts +6 -0
  63. package/cjs/highlevel/methods/premium/get-business-chat-links.js +14 -0
  64. package/cjs/highlevel/methods/premium/get-business-chat-links.js.map +1 -0
  65. package/cjs/highlevel/methods/premium/get-business-connection.d.ts +8 -0
  66. package/cjs/highlevel/methods/premium/get-business-connection.js +25 -0
  67. package/cjs/highlevel/methods/premium/get-business-connection.js.map +1 -0
  68. package/cjs/highlevel/methods/premium/set-business-intro.d.ts +22 -0
  69. package/cjs/highlevel/methods/premium/set-business-intro.js +42 -0
  70. package/cjs/highlevel/methods/premium/set-business-intro.js.map +1 -0
  71. package/cjs/highlevel/methods/premium/set-business-work-hours.d.ts +18 -0
  72. package/cjs/highlevel/methods/premium/set-business-work-hours.js +33 -0
  73. package/cjs/highlevel/methods/premium/set-business-work-hours.js.map +1 -0
  74. package/cjs/highlevel/methods/stickers/_utils.d.ts +10 -0
  75. package/cjs/highlevel/methods/stickers/_utils.js +27 -0
  76. package/cjs/highlevel/methods/stickers/_utils.js.map +1 -0
  77. package/cjs/highlevel/methods/stickers/add-sticker-to-set.d.ts +1 -2
  78. package/cjs/highlevel/methods/stickers/add-sticker-to-set.js +3 -17
  79. package/cjs/highlevel/methods/stickers/add-sticker-to-set.js.map +1 -1
  80. package/cjs/highlevel/methods/stickers/create-sticker-set.d.ts +0 -3
  81. package/cjs/highlevel/methods/stickers/create-sticker-set.js +2 -19
  82. package/cjs/highlevel/methods/stickers/create-sticker-set.js.map +1 -1
  83. package/cjs/highlevel/methods/stickers/delete-sticker-from-set.d.ts +1 -2
  84. package/cjs/highlevel/methods/stickers/delete-sticker-from-set.js +1 -2
  85. package/cjs/highlevel/methods/stickers/delete-sticker-from-set.js.map +1 -1
  86. package/cjs/highlevel/methods/stickers/get-installed-stickers.d.ts +1 -2
  87. package/cjs/highlevel/methods/stickers/get-installed-stickers.js +1 -2
  88. package/cjs/highlevel/methods/stickers/get-installed-stickers.js.map +1 -1
  89. package/cjs/highlevel/methods/stickers/get-my-sticker-sets.d.ts +13 -0
  90. package/cjs/highlevel/methods/stickers/get-my-sticker-sets.js +24 -0
  91. package/cjs/highlevel/methods/stickers/get-my-sticker-sets.js.map +1 -0
  92. package/cjs/highlevel/methods/stickers/get-sticker-set.d.ts +2 -2
  93. package/cjs/highlevel/methods/stickers/get-sticker-set.js +2 -2
  94. package/cjs/highlevel/methods/stickers/get-sticker-set.js.map +1 -1
  95. package/cjs/highlevel/methods/stickers/move-sticker-in-set.d.ts +2 -3
  96. package/cjs/highlevel/methods/stickers/move-sticker-in-set.js +2 -3
  97. package/cjs/highlevel/methods/stickers/move-sticker-in-set.js.map +1 -1
  98. package/cjs/highlevel/methods/stickers/replace-sticker-in-set.d.ts +24 -0
  99. package/cjs/highlevel/methods/stickers/replace-sticker-in-set.js +32 -0
  100. package/cjs/highlevel/methods/stickers/replace-sticker-in-set.js.map +1 -0
  101. package/cjs/highlevel/methods/stories/find-in-update.d.ts +5 -1
  102. package/cjs/highlevel/methods/users/set-my-birthday.d.ts +12 -0
  103. package/cjs/highlevel/methods/users/set-my-birthday.js +22 -0
  104. package/cjs/highlevel/methods/users/set-my-birthday.js.map +1 -0
  105. package/cjs/highlevel/methods.d.ts +12 -0
  106. package/cjs/highlevel/methods.js +33 -3
  107. package/cjs/highlevel/methods.js.map +1 -1
  108. package/cjs/highlevel/storage/storage.d.ts +7 -2
  109. package/cjs/highlevel/types/auth/sent-code.d.ts +7 -2
  110. package/cjs/highlevel/types/auth/sent-code.js +14 -0
  111. package/cjs/highlevel/types/auth/sent-code.js.map +1 -1
  112. package/cjs/highlevel/types/bots/inline-message/factories.d.ts +5 -1
  113. package/cjs/highlevel/types/bots/inline-result/factories.d.ts +4 -1
  114. package/cjs/highlevel/types/bots/keyboards/factories.d.ts +7 -1
  115. package/cjs/highlevel/types/calls/discard-reason.d.ts +5 -0
  116. package/cjs/highlevel/types/files/uploaded-file.d.ts +2 -0
  117. package/cjs/highlevel/types/files/utils.d.ts +6 -5
  118. package/cjs/highlevel/types/files/utils.js.map +1 -1
  119. package/cjs/highlevel/types/media/document-utils.d.ts +5 -0
  120. package/cjs/highlevel/types/media/document-utils.js +9 -2
  121. package/cjs/highlevel/types/media/document-utils.js.map +1 -1
  122. package/cjs/highlevel/types/media/input-media/types.d.ts +2 -2
  123. package/cjs/highlevel/types/media/input-media/types.js.map +1 -1
  124. package/cjs/highlevel/types/media/poll.d.ts +17 -6
  125. package/cjs/highlevel/types/media/poll.js +65 -18
  126. package/cjs/highlevel/types/media/poll.js.map +1 -1
  127. package/cjs/highlevel/types/messages/dialog.js +1 -12
  128. package/cjs/highlevel/types/messages/dialog.js.map +1 -1
  129. package/cjs/highlevel/types/messages/input-message-id.d.ts +5 -0
  130. package/cjs/highlevel/types/messages/message-action.d.ts +19 -2
  131. package/cjs/highlevel/types/messages/message-action.js +6 -0
  132. package/cjs/highlevel/types/messages/message-action.js.map +1 -1
  133. package/cjs/highlevel/types/messages/message-media.d.ts +4 -0
  134. package/cjs/highlevel/types/messages/message.d.ts +59 -1
  135. package/cjs/highlevel/types/messages/message.js +96 -1
  136. package/cjs/highlevel/types/messages/message.js.map +1 -1
  137. package/cjs/highlevel/types/misc/collectible-info.d.ts +27 -0
  138. package/cjs/highlevel/types/misc/collectible-info.js +46 -0
  139. package/cjs/highlevel/types/misc/collectible-info.js.map +1 -0
  140. package/cjs/highlevel/types/misc/entities.d.ts +7 -0
  141. package/cjs/highlevel/types/misc/entities.js +15 -0
  142. package/cjs/highlevel/types/misc/entities.js.map +1 -1
  143. package/cjs/highlevel/types/misc/index.d.ts +1 -0
  144. package/cjs/highlevel/types/misc/index.js +1 -0
  145. package/cjs/highlevel/types/misc/index.js.map +1 -1
  146. package/cjs/highlevel/types/misc/sticker-set.d.ts +8 -1
  147. package/cjs/highlevel/types/misc/sticker-set.js +36 -5
  148. package/cjs/highlevel/types/misc/sticker-set.js.map +1 -1
  149. package/cjs/highlevel/types/peers/chat-event/actions.d.ts +3 -0
  150. package/cjs/highlevel/types/peers/chat-event/filters.d.ts +2 -0
  151. package/cjs/highlevel/types/peers/chat.d.ts +7 -93
  152. package/cjs/highlevel/types/peers/chat.js +2 -195
  153. package/cjs/highlevel/types/peers/chat.js.map +1 -1
  154. package/cjs/highlevel/types/peers/full-chat.d.ts +103 -0
  155. package/cjs/highlevel/types/peers/full-chat.js +237 -0
  156. package/cjs/highlevel/types/peers/full-chat.js.map +1 -0
  157. package/cjs/highlevel/types/peers/index.d.ts +1 -0
  158. package/cjs/highlevel/types/peers/index.js +1 -0
  159. package/cjs/highlevel/types/peers/index.js.map +1 -1
  160. package/cjs/highlevel/types/peers/user.d.ts +5 -0
  161. package/cjs/highlevel/types/peers/user.js +7 -0
  162. package/cjs/highlevel/types/peers/user.js.map +1 -1
  163. package/cjs/highlevel/types/premium/business-account.d.ts +19 -0
  164. package/cjs/highlevel/types/premium/business-account.js +45 -0
  165. package/cjs/highlevel/types/premium/business-account.js.map +1 -0
  166. package/cjs/highlevel/types/premium/business-chat-link.d.ts +19 -0
  167. package/cjs/highlevel/types/premium/business-chat-link.js +39 -0
  168. package/cjs/highlevel/types/premium/business-chat-link.js.map +1 -0
  169. package/cjs/highlevel/types/premium/business-connection.d.ts +23 -0
  170. package/cjs/highlevel/types/premium/business-connection.js +45 -0
  171. package/cjs/highlevel/types/premium/business-connection.js.map +1 -0
  172. package/cjs/highlevel/types/premium/business-intro.d.ts +22 -0
  173. package/cjs/highlevel/types/premium/business-intro.js +43 -0
  174. package/cjs/highlevel/types/premium/business-intro.js.map +1 -0
  175. package/cjs/highlevel/types/premium/business-location.d.ts +10 -0
  176. package/cjs/highlevel/types/premium/business-location.js +26 -0
  177. package/cjs/highlevel/types/premium/business-location.js.map +1 -0
  178. package/cjs/highlevel/types/premium/business-work-hours.d.ts +42 -0
  179. package/cjs/highlevel/types/premium/business-work-hours.js +141 -0
  180. package/cjs/highlevel/types/premium/business-work-hours.js.map +1 -0
  181. package/cjs/highlevel/types/premium/index.d.ts +5 -0
  182. package/cjs/highlevel/types/premium/index.js +5 -0
  183. package/cjs/highlevel/types/premium/index.js.map +1 -1
  184. package/cjs/highlevel/types/updates/business-message.d.ts +18 -0
  185. package/cjs/highlevel/types/updates/business-message.js +35 -0
  186. package/cjs/highlevel/types/updates/business-message.js.map +1 -0
  187. package/cjs/highlevel/types/updates/delete-business-message-update.d.ts +21 -0
  188. package/cjs/highlevel/types/updates/delete-business-message-update.js +37 -0
  189. package/cjs/highlevel/types/updates/delete-business-message-update.js.map +1 -0
  190. package/cjs/highlevel/types/updates/index.d.ts +19 -2
  191. package/cjs/highlevel/types/updates/index.js +5 -1
  192. package/cjs/highlevel/types/updates/index.js.map +1 -1
  193. package/cjs/highlevel/types/updates/parse-update.d.ts +4 -1
  194. package/cjs/highlevel/types/updates/parse-update.js +8 -0
  195. package/cjs/highlevel/types/updates/parse-update.js.map +1 -1
  196. package/cjs/highlevel/types/updates/poll-update.js +2 -2
  197. package/cjs/highlevel/types/updates/poll-update.js.map +1 -1
  198. package/cjs/highlevel/updates/manager.d.ts +0 -1
  199. package/cjs/highlevel/updates/manager.js +7 -2
  200. package/cjs/highlevel/updates/manager.js.map +1 -1
  201. package/cjs/highlevel/updates/parsed.js +8 -2
  202. package/cjs/highlevel/updates/parsed.js.map +1 -1
  203. package/cjs/highlevel/updates/types.d.ts +57 -0
  204. package/cjs/highlevel/updates/utils.d.ts +2 -0
  205. package/cjs/highlevel/utils/inspectable.js +7 -0
  206. package/cjs/highlevel/utils/inspectable.js.map +1 -1
  207. package/cjs/highlevel/worker/index.js +6 -0
  208. package/cjs/highlevel/worker/protocol.d.ts +0 -1
  209. package/cjs/index.js +6 -0
  210. package/cjs/network/client.d.ts +0 -1
  211. package/cjs/network/mtproto-session.d.ts +0 -1
  212. package/cjs/network/multi-session-connection.d.ts +0 -1
  213. package/cjs/network/network-manager.d.ts +8 -0
  214. package/cjs/network/network-manager.js +9 -4
  215. package/cjs/network/network-manager.js.map +1 -1
  216. package/cjs/network/persistent-connection.d.ts +0 -1
  217. package/cjs/network/session-connection.js +10 -0
  218. package/cjs/network/session-connection.js.map +1 -1
  219. package/cjs/network/transports/abstract.d.ts +0 -1
  220. package/cjs/network/transports/streamed.d.ts +0 -1
  221. package/cjs/network/transports/wrapped.d.ts +0 -1
  222. package/cjs/platform.js +6 -0
  223. package/cjs/storage/sqlite/repository/peers.js +1 -2
  224. package/cjs/storage/sqlite/repository/peers.js.map +1 -1
  225. package/cjs/storage/storage.d.ts +21 -0
  226. package/cjs/types/utils.d.ts +1 -0
  227. package/cjs/types/utils.js.map +1 -1
  228. package/cjs/utils/index.js +6 -0
  229. package/cjs/utils/reloadable.d.ts +0 -1
  230. package/client.d.ts +1 -0
  231. package/client.js +1 -0
  232. package/esm/highlevel/client.d.ts +198 -18
  233. package/esm/highlevel/client.js +47 -0
  234. package/esm/highlevel/client.js.map +1 -1
  235. package/esm/highlevel/methods/_imports.js.map +1 -1
  236. package/esm/highlevel/methods/auth/utils.d.ts +3 -0
  237. package/esm/highlevel/methods/bots/normalize-command-scope.d.ts +5 -1
  238. package/esm/highlevel/methods/chats/batched-queries.d.ts +10 -1
  239. package/esm/highlevel/methods/chats/get-full-chat.d.ts +2 -2
  240. package/esm/highlevel/methods/chats/get-full-chat.js +2 -2
  241. package/esm/highlevel/methods/chats/get-full-chat.js.map +1 -1
  242. package/esm/highlevel/methods/dialogs/get-folders.d.ts +3 -0
  243. package/esm/highlevel/methods/files/normalize-file-to-document.d.ts +9 -1
  244. package/esm/highlevel/methods/files/normalize-input-media.d.ts +1 -0
  245. package/esm/highlevel/methods/files/normalize-input-media.js +11 -10
  246. package/esm/highlevel/methods/files/normalize-input-media.js.map +1 -1
  247. package/esm/highlevel/methods/messages/_business-connection.d.ts +7 -0
  248. package/esm/highlevel/methods/messages/_business-connection.js +38 -0
  249. package/esm/highlevel/methods/messages/_business-connection.js.map +1 -0
  250. package/esm/highlevel/methods/messages/close-poll.js +1 -1
  251. package/esm/highlevel/methods/messages/close-poll.js.map +1 -1
  252. package/esm/highlevel/methods/messages/edit-message.d.ts +1 -0
  253. package/esm/highlevel/methods/messages/edit-message.js +2 -1
  254. package/esm/highlevel/methods/messages/edit-message.js.map +1 -1
  255. package/esm/highlevel/methods/messages/find-in-update.d.ts +13 -1
  256. package/esm/highlevel/methods/messages/find-in-update.js +7 -2
  257. package/esm/highlevel/methods/messages/find-in-update.js.map +1 -1
  258. package/esm/highlevel/methods/messages/forward-messages.d.ts +5 -0
  259. package/esm/highlevel/methods/messages/forward-messages.js +2 -0
  260. package/esm/highlevel/methods/messages/forward-messages.js.map +1 -1
  261. package/esm/highlevel/methods/messages/get-all-scheduled-messages.d.ts +8 -0
  262. package/esm/highlevel/methods/messages/get-all-scheduled-messages.js +25 -0
  263. package/esm/highlevel/methods/messages/get-all-scheduled-messages.js.map +1 -0
  264. package/esm/highlevel/methods/messages/get-discussion-message.d.ts +4 -0
  265. package/esm/highlevel/methods/messages/iter-search-global.js +2 -1
  266. package/esm/highlevel/methods/messages/iter-search-global.js.map +1 -1
  267. package/esm/highlevel/methods/messages/search-global.d.ts +4 -0
  268. package/esm/highlevel/methods/messages/search-global.js +2 -1
  269. package/esm/highlevel/methods/messages/search-global.js.map +1 -1
  270. package/esm/highlevel/methods/messages/send-common.d.ts +28 -0
  271. package/esm/highlevel/methods/messages/send-common.js +19 -0
  272. package/esm/highlevel/methods/messages/send-common.js.map +1 -1
  273. package/esm/highlevel/methods/messages/send-media-group.js +5 -2
  274. package/esm/highlevel/methods/messages/send-media-group.js.map +1 -1
  275. package/esm/highlevel/methods/messages/send-media.js +4 -2
  276. package/esm/highlevel/methods/messages/send-media.js.map +1 -1
  277. package/esm/highlevel/methods/messages/send-text.js +4 -2
  278. package/esm/highlevel/methods/messages/send-text.js.map +1 -1
  279. package/esm/highlevel/methods/messages/send-typing.d.ts +4 -0
  280. package/esm/highlevel/methods/messages/send-typing.js +2 -1
  281. package/esm/highlevel/methods/messages/send-typing.js.map +1 -1
  282. package/esm/highlevel/methods/misc/chain-id.d.ts +4 -1
  283. package/esm/highlevel/methods/misc/get-collectible-info.d.ts +6 -0
  284. package/esm/highlevel/methods/misc/get-collectible-info.js +22 -0
  285. package/esm/highlevel/methods/misc/get-collectible-info.js.map +1 -0
  286. package/esm/highlevel/methods/misc/normalize-text.d.ts +5 -1
  287. package/esm/highlevel/methods/premium/create-business-chat-link.d.ts +12 -0
  288. package/esm/highlevel/methods/premium/create-business-chat-link.js +22 -0
  289. package/esm/highlevel/methods/premium/create-business-chat-link.js.map +1 -0
  290. package/esm/highlevel/methods/premium/edit-business-chat-link.d.ts +20 -0
  291. package/esm/highlevel/methods/premium/edit-business-chat-link.js +37 -0
  292. package/esm/highlevel/methods/premium/edit-business-chat-link.js.map +1 -0
  293. package/esm/highlevel/methods/premium/get-business-chat-links.d.ts +6 -0
  294. package/esm/highlevel/methods/premium/get-business-chat-links.js +10 -0
  295. package/esm/highlevel/methods/premium/get-business-chat-links.js.map +1 -0
  296. package/esm/highlevel/methods/premium/get-business-connection.d.ts +8 -0
  297. package/esm/highlevel/methods/premium/get-business-connection.js +21 -0
  298. package/esm/highlevel/methods/premium/get-business-connection.js.map +1 -0
  299. package/esm/highlevel/methods/premium/set-business-intro.d.ts +22 -0
  300. package/esm/highlevel/methods/premium/set-business-intro.js +38 -0
  301. package/esm/highlevel/methods/premium/set-business-intro.js.map +1 -0
  302. package/esm/highlevel/methods/premium/set-business-work-hours.d.ts +18 -0
  303. package/esm/highlevel/methods/premium/set-business-work-hours.js +29 -0
  304. package/esm/highlevel/methods/premium/set-business-work-hours.js.map +1 -0
  305. package/esm/highlevel/methods/stickers/_utils.d.ts +10 -0
  306. package/esm/highlevel/methods/stickers/_utils.js +23 -0
  307. package/esm/highlevel/methods/stickers/_utils.js.map +1 -0
  308. package/esm/highlevel/methods/stickers/add-sticker-to-set.d.ts +1 -2
  309. package/esm/highlevel/methods/stickers/add-sticker-to-set.js +4 -18
  310. package/esm/highlevel/methods/stickers/add-sticker-to-set.js.map +1 -1
  311. package/esm/highlevel/methods/stickers/create-sticker-set.d.ts +0 -3
  312. package/esm/highlevel/methods/stickers/create-sticker-set.js +3 -20
  313. package/esm/highlevel/methods/stickers/create-sticker-set.js.map +1 -1
  314. package/esm/highlevel/methods/stickers/delete-sticker-from-set.d.ts +1 -2
  315. package/esm/highlevel/methods/stickers/delete-sticker-from-set.js +1 -2
  316. package/esm/highlevel/methods/stickers/delete-sticker-from-set.js.map +1 -1
  317. package/esm/highlevel/methods/stickers/get-installed-stickers.d.ts +1 -2
  318. package/esm/highlevel/methods/stickers/get-installed-stickers.js +1 -2
  319. package/esm/highlevel/methods/stickers/get-installed-stickers.js.map +1 -1
  320. package/esm/highlevel/methods/stickers/get-my-sticker-sets.d.ts +13 -0
  321. package/esm/highlevel/methods/stickers/get-my-sticker-sets.js +17 -0
  322. package/esm/highlevel/methods/stickers/get-my-sticker-sets.js.map +1 -0
  323. package/esm/highlevel/methods/stickers/get-sticker-set.d.ts +2 -2
  324. package/esm/highlevel/methods/stickers/get-sticker-set.js +2 -2
  325. package/esm/highlevel/methods/stickers/get-sticker-set.js.map +1 -1
  326. package/esm/highlevel/methods/stickers/move-sticker-in-set.d.ts +2 -3
  327. package/esm/highlevel/methods/stickers/move-sticker-in-set.js +2 -3
  328. package/esm/highlevel/methods/stickers/move-sticker-in-set.js.map +1 -1
  329. package/esm/highlevel/methods/stickers/replace-sticker-in-set.d.ts +24 -0
  330. package/esm/highlevel/methods/stickers/replace-sticker-in-set.js +28 -0
  331. package/esm/highlevel/methods/stickers/replace-sticker-in-set.js.map +1 -0
  332. package/esm/highlevel/methods/stories/find-in-update.d.ts +5 -1
  333. package/esm/highlevel/methods/users/set-my-birthday.d.ts +12 -0
  334. package/esm/highlevel/methods/users/set-my-birthday.js +18 -0
  335. package/esm/highlevel/methods/users/set-my-birthday.js.map +1 -0
  336. package/esm/highlevel/methods.d.ts +12 -0
  337. package/esm/highlevel/methods.js +12 -0
  338. package/esm/highlevel/methods.js.map +1 -1
  339. package/esm/highlevel/storage/storage.d.ts +7 -2
  340. package/esm/highlevel/types/auth/sent-code.d.ts +7 -2
  341. package/esm/highlevel/types/auth/sent-code.js +14 -0
  342. package/esm/highlevel/types/auth/sent-code.js.map +1 -1
  343. package/esm/highlevel/types/bots/inline-message/factories.d.ts +5 -1
  344. package/esm/highlevel/types/bots/inline-result/factories.d.ts +4 -1
  345. package/esm/highlevel/types/bots/keyboards/factories.d.ts +7 -1
  346. package/esm/highlevel/types/calls/discard-reason.d.ts +5 -0
  347. package/esm/highlevel/types/files/uploaded-file.d.ts +2 -0
  348. package/esm/highlevel/types/files/utils.d.ts +6 -5
  349. package/esm/highlevel/types/files/utils.js.map +1 -1
  350. package/esm/highlevel/types/media/document-utils.d.ts +5 -0
  351. package/esm/highlevel/types/media/document-utils.js +7 -1
  352. package/esm/highlevel/types/media/document-utils.js.map +1 -1
  353. package/esm/highlevel/types/media/input-media/types.d.ts +2 -2
  354. package/esm/highlevel/types/media/input-media/types.js.map +1 -1
  355. package/esm/highlevel/types/media/poll.d.ts +17 -6
  356. package/esm/highlevel/types/media/poll.js +64 -17
  357. package/esm/highlevel/types/media/poll.js.map +1 -1
  358. package/esm/highlevel/types/messages/dialog.js +1 -12
  359. package/esm/highlevel/types/messages/dialog.js.map +1 -1
  360. package/esm/highlevel/types/messages/input-message-id.d.ts +5 -0
  361. package/esm/highlevel/types/messages/message-action.d.ts +19 -2
  362. package/esm/highlevel/types/messages/message-action.js +6 -0
  363. package/esm/highlevel/types/messages/message-action.js.map +1 -1
  364. package/esm/highlevel/types/messages/message-media.d.ts +4 -0
  365. package/esm/highlevel/types/messages/message.d.ts +59 -1
  366. package/esm/highlevel/types/messages/message.js +96 -1
  367. package/esm/highlevel/types/messages/message.js.map +1 -1
  368. package/esm/highlevel/types/misc/collectible-info.d.ts +27 -0
  369. package/esm/highlevel/types/misc/collectible-info.js +43 -0
  370. package/esm/highlevel/types/misc/collectible-info.js.map +1 -0
  371. package/esm/highlevel/types/misc/entities.d.ts +7 -0
  372. package/esm/highlevel/types/misc/entities.js +13 -1
  373. package/esm/highlevel/types/misc/entities.js.map +1 -1
  374. package/esm/highlevel/types/misc/index.d.ts +1 -0
  375. package/esm/highlevel/types/misc/index.js +1 -0
  376. package/esm/highlevel/types/misc/index.js.map +1 -1
  377. package/esm/highlevel/types/misc/sticker-set.d.ts +8 -1
  378. package/esm/highlevel/types/misc/sticker-set.js +38 -7
  379. package/esm/highlevel/types/misc/sticker-set.js.map +1 -1
  380. package/esm/highlevel/types/peers/chat-event/actions.d.ts +3 -0
  381. package/esm/highlevel/types/peers/chat-event/filters.d.ts +2 -0
  382. package/esm/highlevel/types/peers/chat.d.ts +7 -93
  383. package/esm/highlevel/types/peers/chat.js +2 -195
  384. package/esm/highlevel/types/peers/chat.js.map +1 -1
  385. package/esm/highlevel/types/peers/full-chat.d.ts +103 -0
  386. package/esm/highlevel/types/peers/full-chat.js +234 -0
  387. package/esm/highlevel/types/peers/full-chat.js.map +1 -0
  388. package/esm/highlevel/types/peers/index.d.ts +1 -0
  389. package/esm/highlevel/types/peers/index.js +1 -0
  390. package/esm/highlevel/types/peers/index.js.map +1 -1
  391. package/esm/highlevel/types/peers/user.d.ts +5 -0
  392. package/esm/highlevel/types/peers/user.js +7 -0
  393. package/esm/highlevel/types/peers/user.js.map +1 -1
  394. package/esm/highlevel/types/premium/business-account.d.ts +19 -0
  395. package/esm/highlevel/types/premium/business-account.js +42 -0
  396. package/esm/highlevel/types/premium/business-account.js.map +1 -0
  397. package/esm/highlevel/types/premium/business-chat-link.d.ts +19 -0
  398. package/esm/highlevel/types/premium/business-chat-link.js +36 -0
  399. package/esm/highlevel/types/premium/business-chat-link.js.map +1 -0
  400. package/esm/highlevel/types/premium/business-connection.d.ts +23 -0
  401. package/esm/highlevel/types/premium/business-connection.js +42 -0
  402. package/esm/highlevel/types/premium/business-connection.js.map +1 -0
  403. package/esm/highlevel/types/premium/business-intro.d.ts +22 -0
  404. package/esm/highlevel/types/premium/business-intro.js +40 -0
  405. package/esm/highlevel/types/premium/business-intro.js.map +1 -0
  406. package/esm/highlevel/types/premium/business-location.d.ts +10 -0
  407. package/esm/highlevel/types/premium/business-location.js +23 -0
  408. package/esm/highlevel/types/premium/business-location.js.map +1 -0
  409. package/esm/highlevel/types/premium/business-work-hours.d.ts +42 -0
  410. package/esm/highlevel/types/premium/business-work-hours.js +137 -0
  411. package/esm/highlevel/types/premium/business-work-hours.js.map +1 -0
  412. package/esm/highlevel/types/premium/index.d.ts +5 -0
  413. package/esm/highlevel/types/premium/index.js +5 -0
  414. package/esm/highlevel/types/premium/index.js.map +1 -1
  415. package/esm/highlevel/types/updates/business-message.d.ts +18 -0
  416. package/esm/highlevel/types/updates/business-message.js +31 -0
  417. package/esm/highlevel/types/updates/business-message.js.map +1 -0
  418. package/esm/highlevel/types/updates/delete-business-message-update.d.ts +21 -0
  419. package/esm/highlevel/types/updates/delete-business-message-update.js +34 -0
  420. package/esm/highlevel/types/updates/delete-business-message-update.js.map +1 -0
  421. package/esm/highlevel/types/updates/index.d.ts +19 -2
  422. package/esm/highlevel/types/updates/index.js +3 -1
  423. package/esm/highlevel/types/updates/index.js.map +1 -1
  424. package/esm/highlevel/types/updates/parse-update.d.ts +4 -1
  425. package/esm/highlevel/types/updates/parse-update.js +9 -1
  426. package/esm/highlevel/types/updates/parse-update.js.map +1 -1
  427. package/esm/highlevel/types/updates/poll-update.js +2 -2
  428. package/esm/highlevel/types/updates/poll-update.js.map +1 -1
  429. package/esm/highlevel/updates/manager.d.ts +0 -1
  430. package/esm/highlevel/updates/manager.js +7 -2
  431. package/esm/highlevel/updates/manager.js.map +1 -1
  432. package/esm/highlevel/updates/parsed.js +8 -2
  433. package/esm/highlevel/updates/parsed.js.map +1 -1
  434. package/esm/highlevel/updates/types.d.ts +57 -0
  435. package/esm/highlevel/updates/utils.d.ts +2 -0
  436. package/esm/highlevel/utils/inspectable.js +4 -0
  437. package/esm/highlevel/utils/inspectable.js.map +1 -1
  438. package/esm/highlevel/worker/protocol.d.ts +0 -1
  439. package/esm/network/client.d.ts +0 -1
  440. package/esm/network/mtproto-session.d.ts +0 -1
  441. package/esm/network/multi-session-connection.d.ts +0 -1
  442. package/esm/network/network-manager.d.ts +8 -0
  443. package/esm/network/network-manager.js +9 -4
  444. package/esm/network/network-manager.js.map +1 -1
  445. package/esm/network/persistent-connection.d.ts +0 -1
  446. package/esm/network/session-connection.js +10 -0
  447. package/esm/network/session-connection.js.map +1 -1
  448. package/esm/network/transports/abstract.d.ts +0 -1
  449. package/esm/network/transports/streamed.d.ts +0 -1
  450. package/esm/network/transports/wrapped.d.ts +0 -1
  451. package/esm/storage/sqlite/repository/peers.js +1 -2
  452. package/esm/storage/sqlite/repository/peers.js.map +1 -1
  453. package/esm/storage/storage.d.ts +21 -0
  454. package/esm/types/utils.d.ts +1 -0
  455. package/esm/types/utils.js.map +1 -1
  456. package/esm/utils/reloadable.d.ts +0 -1
  457. package/index.d.ts +1 -0
  458. package/index.js +1 -0
  459. package/methods.d.ts +1 -0
  460. package/methods.js +1 -0
  461. package/package.json +5 -5
  462. package/platform.d.ts +1 -0
  463. package/platform.js +1 -0
  464. package/utils.d.ts +1 -0
  465. package/utils.js +1 -0
  466. package/worker.d.ts +1 -0
  467. package/worker.js +1 -0
@@ -14,9 +14,10 @@ export function makeParsedUpdateHandler(params) {
14
14
  const parsed = _parseUpdate(update, peers);
15
15
  onRawUpdate(update, peers);
16
16
  if (parsed) {
17
- if (parsed.name === 'new_message') {
17
+ if (parsed.name === 'new_message' || parsed.name === 'new_business_message') {
18
18
  const group = parsed.data.groupedIdUnique;
19
19
  if (group) {
20
+ const isBusiness = parsed.name === 'new_business_message';
20
21
  const pendingGroup = pending.get(group);
21
22
  if (pendingGroup) {
22
23
  pendingGroup[0].push(parsed.data);
@@ -25,7 +26,12 @@ export function makeParsedUpdateHandler(params) {
25
26
  const messages = [parsed.data];
26
27
  const timeout = setTimeout(() => {
27
28
  pending.delete(group);
28
- onUpdate({ name: 'message_group', data: messages });
29
+ if (isBusiness) {
30
+ onUpdate({ name: 'business_message_group', data: messages });
31
+ }
32
+ else {
33
+ onUpdate({ name: 'message_group', data: messages });
34
+ }
29
35
  }, messageGroupingInterval);
30
36
  pending.set(group, [messages, timeout]);
31
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parsed.js","sourceRoot":"","sources":["../../../../src/highlevel/updates/parsed.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAkC/D,MAAM,UAAU,uBAAuB,CAAC,MAAiC;IACrE,MAAM,EAAE,uBAAuB,EAAE,QAAQ,EAAE,WAAW,GAAG,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,MAAM,CAAA;IAE5E,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACrB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YAE1C,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YAC1B,IAAI,MAAM;gBAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;QAChC,CAAC,CAAA;IACL,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuC,CAAA;IAE9D,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAE1C,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAE1B,IAAI,MAAM,EAAE,CAAC;YACT,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAA;gBAEzC,IAAI,KAAK,EAAE,CAAC;oBACR,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;oBAEvC,IAAI,YAAY,EAAE,CAAC;wBACf,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;oBACrC,CAAC;yBAAM,CAAC;wBACJ,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;wBAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;4BAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;4BACrB,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;wBACvD,CAAC,EAAE,uBAAuB,CAAC,CAAA;wBAE3B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;oBAC3C,CAAC;oBAED,OAAM;gBACV,CAAC;YACL,CAAC;YAED,QAAQ,CAAC,MAAM,CAAC,CAAA;QACpB,CAAC;IACL,CAAC,CAAA;AACL,CAAC","sourcesContent":["import { Message } from '../types/messages/index.js'\nimport { ParsedUpdate } from '../types/updates/index.js'\nimport { _parseUpdate } from '../types/updates/parse-update.js'\nimport { RawUpdateHandler } from './types.js'\n\nexport interface ParsedUpdateHandlerParams {\n /**\n * When non-zero, allows the library to automatically handle Telegram\n * media groups (e.g. albums) in {@link MessageGroup} updates\n * in a given time interval (in ms).\n *\n * > **Note**: this does not catch messages that happen to be consecutive,\n * > only messages belonging to the same \"media group\".\n *\n * This will cause up to `messageGroupingInterval` delay\n * in handling media group messages.\n *\n * This option only applies to `new_message` updates,\n * and the updates being grouped **will not** be dispatched on their own.\n *\n * Recommended value is 250 ms.\n *\n * @default 0 (disabled)\n */\n messageGroupingInterval?: number\n\n /** Handler for parsed updates */\n onUpdate: (update: ParsedUpdate) => void\n /**\n * Handler for raw updates.\n *\n * Note that this handler will be called **before** the parsed update handler.\n */\n onRawUpdate?: RawUpdateHandler\n}\n\nexport function makeParsedUpdateHandler(params: ParsedUpdateHandlerParams): RawUpdateHandler {\n const { messageGroupingInterval, onUpdate, onRawUpdate = () => {} } = params\n\n if (!messageGroupingInterval) {\n return (update, peers) => {\n const parsed = _parseUpdate(update, peers)\n\n onRawUpdate(update, peers)\n if (parsed) onUpdate(parsed)\n }\n }\n\n const pending = new Map<string, [Message[], NodeJS.Timeout]>()\n\n return (update, peers) => {\n const parsed = _parseUpdate(update, peers)\n\n onRawUpdate(update, peers)\n\n if (parsed) {\n if (parsed.name === 'new_message') {\n const group = parsed.data.groupedIdUnique\n\n if (group) {\n const pendingGroup = pending.get(group)\n\n if (pendingGroup) {\n pendingGroup[0].push(parsed.data)\n } else {\n const messages = [parsed.data]\n const timeout = setTimeout(() => {\n pending.delete(group)\n onUpdate({ name: 'message_group', data: messages })\n }, messageGroupingInterval)\n\n pending.set(group, [messages, timeout])\n }\n\n return\n }\n }\n\n onUpdate(parsed)\n }\n }\n}\n"]}
1
+ {"version":3,"file":"parsed.js","sourceRoot":"","sources":["../../../../src/highlevel/updates/parsed.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAkC/D,MAAM,UAAU,uBAAuB,CAAC,MAAiC;IACrE,MAAM,EAAE,uBAAuB,EAAE,QAAQ,EAAE,WAAW,GAAG,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,MAAM,CAAA;IAE5E,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACrB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YAE1C,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YAC1B,IAAI,MAAM;gBAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;QAChC,CAAC,CAAA;IACL,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuC,CAAA;IAE9D,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAE1C,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAE1B,IAAI,MAAM,EAAE,CAAC;YACT,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,IAAI,MAAM,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;gBAC1E,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAA;gBAEzC,IAAI,KAAK,EAAE,CAAC;oBACR,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,KAAK,sBAAsB,CAAA;oBACzD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;oBAEvC,IAAI,YAAY,EAAE,CAAC;wBACf,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;oBACrC,CAAC;yBAAM,CAAC;wBACJ,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;wBAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;4BAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;4BAErB,IAAI,UAAU,EAAE,CAAC;gCACb,QAAQ,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,QAA6B,EAAE,CAAC,CAAA;4BACrF,CAAC;iCAAM,CAAC;gCACJ,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;4BACvD,CAAC;wBACL,CAAC,EAAE,uBAAuB,CAAC,CAAA;wBAE3B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;oBAC3C,CAAC;oBAED,OAAM;gBACV,CAAC;YACL,CAAC;YAED,QAAQ,CAAC,MAAM,CAAC,CAAA;QACpB,CAAC;IACL,CAAC,CAAA;AACL,CAAC","sourcesContent":["import { Message } from '../types/messages/index.js'\nimport { BusinessMessage, ParsedUpdate } from '../types/updates/index.js'\nimport { _parseUpdate } from '../types/updates/parse-update.js'\nimport { RawUpdateHandler } from './types.js'\n\nexport interface ParsedUpdateHandlerParams {\n /**\n * When non-zero, allows the library to automatically handle Telegram\n * media groups (e.g. albums) in {@link MessageGroup} updates\n * in a given time interval (in ms).\n *\n * > **Note**: this does not catch messages that happen to be consecutive,\n * > only messages belonging to the same \"media group\".\n *\n * This will cause up to `messageGroupingInterval` delay\n * in handling media group messages.\n *\n * This option only applies to `new_message` updates,\n * and the updates being grouped **will not** be dispatched on their own.\n *\n * Recommended value is 250 ms.\n *\n * @default 0 (disabled)\n */\n messageGroupingInterval?: number\n\n /** Handler for parsed updates */\n onUpdate: (update: ParsedUpdate) => void\n /**\n * Handler for raw updates.\n *\n * Note that this handler will be called **before** the parsed update handler.\n */\n onRawUpdate?: RawUpdateHandler\n}\n\nexport function makeParsedUpdateHandler(params: ParsedUpdateHandlerParams): RawUpdateHandler {\n const { messageGroupingInterval, onUpdate, onRawUpdate = () => {} } = params\n\n if (!messageGroupingInterval) {\n return (update, peers) => {\n const parsed = _parseUpdate(update, peers)\n\n onRawUpdate(update, peers)\n if (parsed) onUpdate(parsed)\n }\n }\n\n const pending = new Map<string, [Message[], NodeJS.Timeout]>()\n\n return (update, peers) => {\n const parsed = _parseUpdate(update, peers)\n\n onRawUpdate(update, peers)\n\n if (parsed) {\n if (parsed.name === 'new_message' || parsed.name === 'new_business_message') {\n const group = parsed.data.groupedIdUnique\n\n if (group) {\n const isBusiness = parsed.name === 'new_business_message'\n const pendingGroup = pending.get(group)\n\n if (pendingGroup) {\n pendingGroup[0].push(parsed.data)\n } else {\n const messages = [parsed.data]\n const timeout = setTimeout(() => {\n pending.delete(group)\n\n if (isBusiness) {\n onUpdate({ name: 'business_message_group', data: messages as BusinessMessage[] })\n } else {\n onUpdate({ name: 'message_group', data: messages })\n }\n }, messageGroupingInterval)\n\n pending.set(group, [messages, timeout])\n }\n\n return\n }\n }\n\n onUpdate(parsed)\n }\n }\n}\n"]}
@@ -1,4 +1,6 @@
1
1
  import { tl } from '@mtcute/tl';
2
+ import { AsyncLock, ConditionVariable, Deque, EarlyTimer, Logger, SortedLinkedList } from '../../utils/index.js';
3
+ import { CurrentUserInfo } from '../storage/service/current-user.js';
2
4
  import { PeersIndex } from '../types/peers/peers-index.js';
3
5
  /**
4
6
  * Function to be called for each update.
@@ -46,3 +48,58 @@ export interface UpdatesManagerParams {
46
48
  */
47
49
  catchUp?: boolean;
48
50
  }
51
+ /** @internal */
52
+ export interface PendingUpdateContainer {
53
+ upd: tl.TypeUpdates;
54
+ seqStart: number;
55
+ seqEnd: number;
56
+ }
57
+ /** @internal */
58
+ export interface PendingUpdate {
59
+ update: tl.TypeUpdate;
60
+ channelId?: number;
61
+ pts?: number;
62
+ ptsBefore?: number;
63
+ qts?: number;
64
+ qtsBefore?: number;
65
+ timeout?: number;
66
+ peers: PeersIndex;
67
+ fromDifference: boolean;
68
+ }
69
+ /** @internal */
70
+ export interface UpdatesState {
71
+ updatesLoopActive: boolean;
72
+ updatesLoopCv: ConditionVariable;
73
+ postponedTimer: EarlyTimer;
74
+ hasTimedoutPostponed: boolean;
75
+ pendingUpdateContainers: SortedLinkedList<PendingUpdateContainer>;
76
+ pendingPtsUpdates: SortedLinkedList<PendingUpdate>;
77
+ pendingPtsUpdatesPostponed: SortedLinkedList<PendingUpdate>;
78
+ pendingQtsUpdates: SortedLinkedList<PendingUpdate>;
79
+ pendingQtsUpdatesPostponed: SortedLinkedList<PendingUpdate>;
80
+ pendingUnorderedUpdates: Deque<PendingUpdate>;
81
+ noDispatchEnabled: boolean;
82
+ noDispatchMsg: Map<number, Set<number>>;
83
+ noDispatchPts: Map<number, Set<number>>;
84
+ noDispatchQts: Set<number>;
85
+ lock: AsyncLock;
86
+ pts?: number;
87
+ qts?: number;
88
+ date?: number;
89
+ seq?: number;
90
+ oldPts?: number;
91
+ oldQts?: number;
92
+ oldDate?: number;
93
+ oldSeq?: number;
94
+ selfChanged: boolean;
95
+ catchUpChannels: boolean;
96
+ catchUpOnStart: boolean;
97
+ cpts: Map<number, number>;
98
+ cptsMod: Map<number, number>;
99
+ channelDiffTimeouts: Map<number, NodeJS.Timeout>;
100
+ channelsOpened: Map<number, number>;
101
+ log: Logger;
102
+ stop: () => void;
103
+ handler: RawUpdateHandler;
104
+ auth: CurrentUserInfo | null;
105
+ }
@@ -17,3 +17,5 @@ export declare function createDummyUpdatesContainer(updates: tl.TypeUpdate[], se
17
17
  * @param channelId Channel ID (bare), if applicable
18
18
  */
19
19
  export declare function createDummyUpdate(pts: number, ptsCount: number, channelId?: number): tl.TypeUpdates;
20
+ /** @internal */
21
+ export declare function assertIsUpdatesGroup(ctx: string, upd: tl.TypeUpdates): asserts upd is tl.RawUpdates | tl.RawUpdatesCombined;
@@ -1,5 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-assignment */
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-argument */
3
+ import Long from 'long';
3
4
  import { getPlatform } from '../../platform.js';
4
5
  const customInspectSymbol = Symbol.for('nodejs.util.inspect.custom');
5
6
  // get all property names. unlike Object.getOwnPropertyNames,
@@ -43,6 +44,9 @@ export function makeInspectable(obj, props, hide) {
43
44
  if (val instanceof Uint8Array) {
44
45
  val = getPlatform().base64Encode(val);
45
46
  }
47
+ else if (Long.isLong(val)) {
48
+ val = val.toString();
49
+ }
46
50
  else if (typeof val.toJSON === 'function') {
47
51
  val = val.toJSON(true);
48
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"inspectable.js","sourceRoot":"","sources":["../../../../src/highlevel/utils/inspectable.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,4FAA4F;AAE5F,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;AAEpE,6DAA6D;AAC7D,qCAAqC;AACrC,SAAS,kBAAkB,CAAI,GAAM;IACjC,MAAM,OAAO,GAAgB,EAAE,CAAA;IAE/B,GAAG,CAAC;QACA,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC7C,IACI,IAAI,KAAK,WAAW;gBACpB,MAAM,CAAC,wBAAwB,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG;gBAC/C,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAW,CAAC,EAChC,CAAC;gBACC,OAAO,CAAC,IAAI,CAAC,IAAW,CAAC,CAAA;YAC7B,CAAC;QACL,CAAC,CAAC,CAAA;IACN,CAAC,QAAQ,CAAC,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAC;IAE5C,OAAO,OAAO,CAAA;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC3B,GAA8B,EAC9B,KAAmB,EACnB,IAAkB;IAElB,MAAM,OAAO,GAAgB,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IAE/C,KAAK,MAAM,GAAG,IAAI,kBAAkB,CAAI,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACvD,CAAC;IAED,4CAA4C;IAC5C,8DAA8D;IAC9D,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,mBAAmB,GAAG,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,SAAS,CAAA;IAEzE,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG;QACnB,MAAM,GAAG,GAAQ,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACrC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACnB,IAAI,CAAC;gBACD,IAAI,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;gBAElB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;oBACjC,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;wBAC5B,GAAG,GAAG,WAAW,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;oBACzC,CAAC;yBAAM,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;wBAC1C,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;oBAC1B,CAAC;gBACL,CAAC;gBACD,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;YACjB,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,OAAO,CAAA;YACnC,CAAC;QACL,CAAC,CAAC,CAAA;QAEF,+DAA+D;QAC/D,OAAO,GAAG,CAAA;IACd,CAAC,CAAA;IACD,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAA;IAEzD,OAAO,GAAG,CAAA;AACd,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-argument */\n\nimport { getPlatform } from '../../platform.js'\n\nconst customInspectSymbol = Symbol.for('nodejs.util.inspect.custom')\n\n// get all property names. unlike Object.getOwnPropertyNames,\n// also gets inherited property names\nfunction getAllGettersNames<T>(obj: T): (keyof T)[] {\n const getters: (keyof T)[] = []\n\n do {\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n if (\n prop !== '__proto__' &&\n Object.getOwnPropertyDescriptor(obj, prop)?.get &&\n !getters.includes(prop as any)\n ) {\n getters.push(prop as any)\n }\n })\n } while ((obj = Object.getPrototypeOf(obj)))\n\n return getters\n}\n\n/**\n * Small helper function that adds `toJSON` and `util.custom.inspect`\n * methods to a given class based on its getters\n *\n * > **Note**: This means that all getters must be pure!\n * > (getter that caches after its first invocation is also\n * > considered pure in this case)\n */\nexport function makeInspectable<T>(\n obj: new (...args: any[]) => T,\n props?: (keyof T)[],\n hide?: (keyof T)[],\n): typeof obj {\n const getters: (keyof T)[] = props ? props : []\n\n for (const key of getAllGettersNames<T>(obj.prototype)) {\n if (!hide || !hide.includes(key)) getters.push(key)\n }\n\n // dirty hack to set name for inspect result\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const proto = new Function(`return function ${obj.name}(){}`)().prototype\n\n obj.prototype.toJSON = function () {\n const ret: any = Object.create(proto)\n getters.forEach((it) => {\n try {\n let val = this[it]\n\n if (val && typeof val === 'object') {\n if (val instanceof Uint8Array) {\n val = getPlatform().base64Encode(val)\n } else if (typeof val.toJSON === 'function') {\n val = val.toJSON(true)\n }\n }\n ret[it] = val\n } catch (e: any) {\n ret[it] = 'Error: ' + e.message\n }\n })\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return ret\n }\n obj.prototype[customInspectSymbol] = obj.prototype.toJSON\n\n return obj\n}\n"]}
1
+ {"version":3,"file":"inspectable.js","sourceRoot":"","sources":["../../../../src/highlevel/utils/inspectable.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,4FAA4F;AAE5F,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;AAEpE,6DAA6D;AAC7D,qCAAqC;AACrC,SAAS,kBAAkB,CAAI,GAAM;IACjC,MAAM,OAAO,GAAgB,EAAE,CAAA;IAE/B,GAAG,CAAC;QACA,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC7C,IACI,IAAI,KAAK,WAAW;gBACpB,MAAM,CAAC,wBAAwB,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG;gBAC/C,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAW,CAAC,EAChC,CAAC;gBACC,OAAO,CAAC,IAAI,CAAC,IAAW,CAAC,CAAA;YAC7B,CAAC;QACL,CAAC,CAAC,CAAA;IACN,CAAC,QAAQ,CAAC,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAC;IAE5C,OAAO,OAAO,CAAA;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC3B,GAA8B,EAC9B,KAAmB,EACnB,IAAkB;IAElB,MAAM,OAAO,GAAgB,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IAE/C,KAAK,MAAM,GAAG,IAAI,kBAAkB,CAAI,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACvD,CAAC;IAED,4CAA4C;IAC5C,8DAA8D;IAC9D,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,mBAAmB,GAAG,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,SAAS,CAAA;IAEzE,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG;QACnB,MAAM,GAAG,GAAQ,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACrC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACnB,IAAI,CAAC;gBACD,IAAI,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;gBAElB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;oBACjC,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;wBAC5B,GAAG,GAAG,WAAW,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;oBACzC,CAAC;yBAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC1B,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAA;oBACxB,CAAC;yBAAM,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;wBAC1C,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;oBAC1B,CAAC;gBACL,CAAC;gBACD,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;YACjB,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBACd,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,OAAO,CAAA;YACnC,CAAC;QACL,CAAC,CAAC,CAAA;QAEF,+DAA+D;QAC/D,OAAO,GAAG,CAAA;IACd,CAAC,CAAA;IACD,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAA;IAEzD,OAAO,GAAG,CAAA;AACd,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-argument */\n\nimport Long from 'long'\n\nimport { getPlatform } from '../../platform.js'\n\nconst customInspectSymbol = Symbol.for('nodejs.util.inspect.custom')\n\n// get all property names. unlike Object.getOwnPropertyNames,\n// also gets inherited property names\nfunction getAllGettersNames<T>(obj: T): (keyof T)[] {\n const getters: (keyof T)[] = []\n\n do {\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n if (\n prop !== '__proto__' &&\n Object.getOwnPropertyDescriptor(obj, prop)?.get &&\n !getters.includes(prop as any)\n ) {\n getters.push(prop as any)\n }\n })\n } while ((obj = Object.getPrototypeOf(obj)))\n\n return getters\n}\n\n/**\n * Small helper function that adds `toJSON` and `util.custom.inspect`\n * methods to a given class based on its getters\n *\n * > **Note**: This means that all getters must be pure!\n * > (getter that caches after its first invocation is also\n * > considered pure in this case)\n */\nexport function makeInspectable<T>(\n obj: new (...args: any[]) => T,\n props?: (keyof T)[],\n hide?: (keyof T)[],\n): typeof obj {\n const getters: (keyof T)[] = props ? props : []\n\n for (const key of getAllGettersNames<T>(obj.prototype)) {\n if (!hide || !hide.includes(key)) getters.push(key)\n }\n\n // dirty hack to set name for inspect result\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const proto = new Function(`return function ${obj.name}(){}`)().prototype\n\n obj.prototype.toJSON = function () {\n const ret: any = Object.create(proto)\n getters.forEach((it) => {\n try {\n let val = this[it]\n\n if (val && typeof val === 'object') {\n if (val instanceof Uint8Array) {\n val = getPlatform().base64Encode(val)\n } else if (Long.isLong(val)) {\n val = val.toString()\n } else if (typeof val.toJSON === 'function') {\n val = val.toJSON(true)\n }\n }\n ret[it] = val\n } catch (e: any) {\n ret[it] = 'Error: ' + e.message\n }\n })\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return ret\n }\n obj.prototype[customInspectSymbol] = obj.prototype.toJSON\n\n return obj\n}\n"]}
@@ -1,4 +1,3 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
1
  import type { Worker as NodeWorker } from 'node:worker_threads';
3
2
  import { tl } from '@mtcute/tl';
4
3
  import { ConnectionState } from '../client.types.js';
@@ -1,4 +1,3 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
1
  import EventEmitter from 'events';
3
2
  import { tl } from '@mtcute/tl';
4
3
  import { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime';
@@ -1,4 +1,3 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
1
  import Long from 'long';
3
2
  import { mtp, tl } from '@mtcute/tl';
4
3
  import { TlBinaryWriter, TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime';
@@ -1,4 +1,3 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
1
  import EventEmitter from 'events';
3
2
  import { tl } from '@mtcute/tl';
4
3
  import { Logger } from '../utils/index.js';
@@ -122,6 +122,14 @@ export interface RpcCallOptions {
122
122
  * -503 in case the upstream bot failed to respond.
123
123
  */
124
124
  throw503?: boolean;
125
+ /**
126
+ * Whether the `X_MIGRATE_%d` errors should be handled locally on request level
127
+ * instead of changing the default datacenter for the entire client.
128
+ *
129
+ * Useful for `invokeWithBusinessConnection`, as it returns a `USER_MIGRATE_%d` error
130
+ * that is in fact not related to the user, but to the specific request.
131
+ */
132
+ localMigrate?: boolean;
125
133
  /**
126
134
  * Some requests should be processed consecutively, and not in parallel.
127
135
  * Using the same `chainId` for multiple requests will ensure that they are processed in the order
@@ -244,7 +244,7 @@ export class NetworkManager {
244
244
  _: 'initConnection',
245
245
  deviceModel,
246
246
  systemVersion: '1.0',
247
- appVersion: '0.11.0',
247
+ appVersion: '0.12.0',
248
248
  systemLangCode: 'en',
249
249
  langPack: '', // "langPacks are for official apps only"
250
250
  langCode: 'en',
@@ -528,9 +528,14 @@ export class NetworkManager {
528
528
  }
529
529
  if (manager === this._primaryDc) {
530
530
  if (e.is('PHONE_MIGRATE_%d') || e.is('NETWORK_MIGRATE_%d') || e.is('USER_MIGRATE_%d')) {
531
- this._log.info('Migrate error, new dc = %d', e.newDc);
532
- await this.changePrimaryDc(e.newDc);
533
- manager = this._primaryDc;
531
+ if (params?.localMigrate) {
532
+ manager = await this._getOtherDc(e.newDc);
533
+ }
534
+ else {
535
+ this._log.info('Migrate error, new dc = %d', e.newDc);
536
+ await this.changePrimaryDc(e.newDc);
537
+ manager = this._primaryDc;
538
+ }
534
539
  multi = manager[kind];
535
540
  continue;
536
541
  }
@@ -1 +1 @@
1
- {"version":3,"file":"network-manager.js","sourceRoot":"","sources":["../../../src/network/network-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { mtp, tl } from '@mtcute/tl'\nimport { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime'\n\nimport { getPlatform } from '../platform.js'\nimport { StorageManager } from '../storage/storage.js'\nimport { MtArgumentError, MtcuteError, MtTimeoutError, MtUnsupportedError } from '../types/index.js'\nimport {\n ControllablePromise,\n createControllablePromise,\n DcOptions,\n ICryptoProvider,\n Logger,\n sleep,\n} from '../utils/index.js'\nimport { assertTypeIs } from '../utils/type-assertions.js'\nimport { ConfigManager } from './config-manager.js'\nimport { MultiSessionConnection } from './multi-session-connection.js'\nimport { PersistentConnectionParams } from './persistent-connection.js'\nimport { defaultReconnectionStrategy, ReconnectionStrategy } from './reconnection.js'\nimport { ServerSaltManager } from './server-salt.js'\nimport { SessionConnection, SessionConnectionParams } from './session-connection.js'\nimport { TransportFactory } from './transports/index.js'\n\nexport type ConnectionKind = 'main' | 'upload' | 'download' | 'downloadSmall'\n\nconst CLIENT_ERRORS = {\n [tl.RpcError.BAD_REQUEST]: 1,\n [tl.RpcError.UNAUTHORIZED]: 1,\n [tl.RpcError.FORBIDDEN]: 1,\n [tl.RpcError.NOT_FOUND]: 1,\n [tl.RpcError.FLOOD]: 1,\n [tl.RpcError.SEE_OTHER]: 1,\n [tl.RpcError.NOT_ACCEPTABLE]: 1,\n}\n\n/**\n * Params passed into {@link NetworkManager} by {@link TelegramClient}.\n * This type is intended for internal usage only.\n */\nexport interface NetworkManagerParams {\n storage: StorageManager\n crypto: ICryptoProvider\n log: Logger\n\n enableErrorReporting: boolean\n apiId: number\n initConnectionOptions?: Partial<Omit<tl.RawInitConnectionRequest, 'apiId' | 'query'>>\n transport: TransportFactory\n reconnectionStrategy?: ReconnectionStrategy<PersistentConnectionParams>\n floodSleepThreshold: number\n maxRetryCount: number\n disableUpdates?: boolean\n testMode: boolean\n layer: number\n useIpv6: boolean\n readerMap: TlReaderMap\n writerMap: TlWriterMap\n isPremium: boolean\n emitError: (err: Error, connection?: SessionConnection) => void\n onUpdate: (upd: tl.TypeUpdates) => void\n onUsable: () => void\n onConnecting: () => void\n onNetworkChanged: (connected: boolean) => void\n}\n\nexport type ConnectionCountDelegate = (kind: ConnectionKind, dcId: number, isPremium: boolean) => number\n\nconst defaultConnectionCountDelegate: ConnectionCountDelegate = (kind, dcId, isPremium) => {\n switch (kind) {\n case 'main':\n return 1\n case 'upload':\n return isPremium || (dcId !== 2 && dcId !== 4) ? 8 : 4\n case 'download':\n return isPremium ? 8 : 2\n case 'downloadSmall':\n return 2\n }\n}\n\n/**\n * Additional params passed into {@link NetworkManager} by the user\n * that customize the behavior of the manager\n */\nexport interface NetworkManagerExtraParams {\n /**\n * Whether to use PFS (Perfect Forward Secrecy) for all connections.\n * This is disabled by default\n */\n usePfs?: boolean\n\n /**\n * Connection count for each connection kind.\n * The function should be pure to avoid unexpected behavior.\n *\n * Defaults to TDLib logic:\n * - main: handled internally, **cannot be changed here**\n * - upload: if premium or dc id is other than 2 or 4, then 8, otherwise 4\n * - download: if premium then 8, otherwise 2\n * - downloadSmall: 2\n */\n connectionCount?: ConnectionCountDelegate\n\n /**\n * Idle timeout for non-main connections, in ms\n *\n * @default 60000 (60 seconds).\n */\n inactivityTimeout?: number\n}\n\n/** Options that can be customized when making an RPC call */\nexport interface RpcCallOptions {\n /**\n * If the call results in a `FLOOD_WAIT_X` error,\n * the maximum amount of time to wait before retrying.\n *\n * If set to `0`, the call will not be retried.\n *\n * @default {@link BaseTelegramClientOptions.floodSleepThreshold}\n */\n floodSleepThreshold?: number\n\n /**\n * If the call results in an internal server error or a flood wait,\n * the maximum amount of times to retry the call.\n *\n * @default {@link BaseTelegramClientOptions.maxRetryCount}\n */\n maxRetryCount?: number\n\n /**\n * Timeout for the call, in milliseconds.\n *\n * @default Infinity\n */\n timeout?: number\n\n /**\n * **ADVANCED**\n *\n * Kind of connection to use for this call.\n *\n * @default 'main'\n */\n kind?: ConnectionKind\n\n /**\n * **ADVANCED**\n *\n * ID of the DC to use for this call\n */\n dcId?: number\n\n /**\n * **ADVANCED**\n *\n * DC connection manager to use for this call.\n * Overrides `dcId` if set.\n */\n manager?: DcConnectionManager\n\n /**\n * Abort signal for the call.\n */\n abortSignal?: AbortSignal\n\n /**\n * Whether we should not retry on -503 errors and throw {@link MtTimeoutError} immediately instead.\n *\n * Useful for methods like `messages.getBotCallbackAnswer` that reliably return\n * -503 in case the upstream bot failed to respond.\n */\n throw503?: boolean\n\n /**\n * Some requests should be processed consecutively, and not in parallel.\n * Using the same `chainId` for multiple requests will ensure that they are processed in the order\n * of calling `.call()`.\n *\n * Particularly useful for `messages.sendMessage` and alike.\n */\n chainId?: string | number\n}\n\n/**\n * Wrapper over all connection pools for a single DC.\n */\nexport class DcConnectionManager {\n private _salts = new ServerSaltManager()\n private _log\n\n /** Main connection pool */\n main: MultiSessionConnection\n /** Upload connection pool */\n upload: MultiSessionConnection\n /** Download connection pool */\n download: MultiSessionConnection\n /** Download connection pool (for small files) */\n downloadSmall: MultiSessionConnection\n\n private get _mainConnectionCount() {\n if (!this.isPrimary) return 1\n\n return this.manager.config.getNow()?.tmpSessions ?? 1\n }\n\n constructor(\n /** Network manager instance */\n readonly manager: NetworkManager,\n /** DC ID */\n readonly dcId: number,\n /** DC options to use */\n readonly _dcs: DcOptions,\n /** Whether this DC is the primary one */\n public isPrimary = false,\n ) {\n this._log = this.manager._log.create('dc-manager')\n this._log.prefix = `[DC ${dcId}] `\n\n const baseConnectionParams = (): SessionConnectionParams => ({\n crypto: this.manager.params.crypto,\n initConnection: this.manager._initConnectionParams,\n transportFactory: this.manager._transportFactory,\n dc: this._dcs.media,\n testMode: this.manager.params.testMode,\n reconnectionStrategy: this.manager._reconnectionStrategy,\n layer: this.manager.params.layer,\n disableUpdates: this.manager.params.disableUpdates,\n readerMap: this.manager.params.readerMap,\n writerMap: this.manager.params.writerMap,\n usePfs: this.manager.params.usePfs,\n isMainConnection: false,\n isMainDcConnection: this.isPrimary,\n inactivityTimeout: this.manager.params.inactivityTimeout ?? 60_000,\n enableErrorReporting: this.manager.params.enableErrorReporting,\n salts: this._salts,\n })\n\n const mainParams = baseConnectionParams()\n mainParams.isMainConnection = true\n mainParams.dc = _dcs.main\n\n if (isPrimary) {\n mainParams.inactivityTimeout = undefined\n }\n\n this.main = new MultiSessionConnection(mainParams, this._mainConnectionCount, this._log, 'MAIN')\n this.upload = new MultiSessionConnection(\n baseConnectionParams(),\n this.manager._connectionCount('upload', this.dcId, this.manager.params.isPremium),\n this._log,\n 'UPLOAD',\n )\n this.download = new MultiSessionConnection(\n baseConnectionParams(),\n this.manager._connectionCount('download', this.dcId, this.manager.params.isPremium),\n this._log,\n 'DOWNLOAD',\n )\n this.downloadSmall = new MultiSessionConnection(\n baseConnectionParams(),\n this.manager._connectionCount('downloadSmall', this.dcId, this.manager.params.isPremium),\n this._log,\n 'DOWNLOAD_SMALL',\n )\n\n this._setupMulti('main')\n this._setupMulti('upload')\n this._setupMulti('download')\n this._setupMulti('downloadSmall')\n }\n\n private _setupMulti(kind: ConnectionKind): void {\n const connection = this[kind]\n\n connection.on('key-change', (idx, key: Uint8Array | null) => {\n if (kind !== 'main') {\n // main connection is responsible for authorization,\n // and keys are then sent to other connections\n this.manager._log.warn('got key-change from non-main connection, ignoring')\n\n return\n }\n\n this.manager._log.debug('key change for dc %d from connection %d', this.dcId, idx)\n\n // send key to other connections\n this.upload.setAuthKey(key)\n this.download.setAuthKey(key)\n this.downloadSmall.setAuthKey(key)\n Promise.resolve(this.manager._storage.provider.authKeys.set(this.dcId, key))\n .then(() => {\n this.upload.notifyKeyChange()\n this.download.notifyKeyChange()\n this.downloadSmall.notifyKeyChange()\n })\n .catch((e: Error) => this.manager.params.emitError(e))\n })\n connection.on('tmp-key-change', (idx: number, key: Uint8Array | null, expires: number) => {\n if (kind !== 'main') {\n this.manager._log.warn('got tmp-key-change from non-main connection, ignoring')\n\n return\n }\n\n this.manager._log.debug('temp key change for dc %d from connection %d', this.dcId, idx)\n\n // send key to other connections\n this.upload.setAuthKey(key, true)\n this.download.setAuthKey(key, true)\n this.downloadSmall.setAuthKey(key, true)\n\n Promise.resolve(this.manager._storage.provider.authKeys.setTemp(this.dcId, idx, key, expires * 1000))\n .then(() => {\n this.upload.notifyKeyChange()\n this.download.notifyKeyChange()\n this.downloadSmall.notifyKeyChange()\n })\n .catch((e: Error) => this.manager.params.emitError(e))\n })\n connection.on('future-salts', (salts: mtp.RawMt_future_salt[]) => {\n Promise.resolve(this.manager._storage.salts.store(this.dcId, salts)).catch((e: Error) =>\n this.manager.params.emitError(e),\n )\n })\n\n connection.on('auth-begin', () => {\n // we need to propagate auth-begin to all connections\n // to avoid them sending requests before auth is complete\n if (kind !== 'main') {\n this.manager._log.warn('got auth-begin from non-main connection, ignoring')\n\n return\n }\n\n // reset key on non-main connections\n // this event was already propagated to additional main connections\n this.upload.resetAuthKeys()\n this.download.resetAuthKeys()\n this.downloadSmall.resetAuthKeys()\n })\n\n connection.on('request-auth', () => {\n this.main.requestAuth()\n })\n\n // fucking awesome architecture, but whatever\n connection.on('request-keys', (promise: ControllablePromise<void>) => {\n this.loadKeys(true)\n .then(() => promise.resolve())\n .catch((e: Error) => promise.reject(e))\n })\n\n connection.on('error', (err: Error, conn: SessionConnection) => {\n this.manager.params.emitError(err, conn)\n })\n }\n\n setIsPrimary(isPrimary: boolean): void {\n if (this.isPrimary === isPrimary) return\n this.isPrimary = isPrimary\n this.main.params.isMainDcConnection = isPrimary\n\n if (isPrimary) {\n this.main.setInactivityTimeout(undefined)\n } else {\n this.main.setInactivityTimeout(this.manager.params.inactivityTimeout ?? 60_000)\n }\n }\n\n setIsPremium(isPremium: boolean): void {\n this.upload.setCount(this.manager._connectionCount('upload', this.dcId, isPremium))\n this.download.setCount(this.manager._connectionCount('download', this.dcId, isPremium))\n this.downloadSmall.setCount(this.manager._connectionCount('downloadSmall', this.dcId, isPremium))\n }\n\n async loadKeys(forcePfs = false): Promise<boolean> {\n const [permanent, salts] = await Promise.all([\n this.manager._storage.provider.authKeys.get(this.dcId),\n this.manager._storage.salts.fetch(this.dcId),\n ])\n\n this.main.setAuthKey(permanent)\n this.upload.setAuthKey(permanent)\n this.download.setAuthKey(permanent)\n this.downloadSmall.setAuthKey(permanent)\n\n if (salts) {\n this._salts.setFutureSalts(salts)\n }\n\n if (!permanent) {\n return false\n }\n\n if (this.manager.params.usePfs || forcePfs) {\n const now = Date.now()\n await Promise.all(\n this.main._sessions.map(async (_, i) => {\n const temp = await this.manager._storage.provider.authKeys.getTemp(this.dcId, i, now)\n this.main.setAuthKey(temp, true, i)\n\n if (i === 0) {\n this.upload.setAuthKey(temp, true)\n this.download.setAuthKey(temp, true)\n this.downloadSmall.setAuthKey(temp, true)\n }\n }),\n )\n }\n\n return true\n }\n\n async destroy() {\n await this.main.destroy()\n await this.upload.destroy()\n await this.download.destroy()\n await this.downloadSmall.destroy()\n this._salts.destroy()\n }\n}\n\n/**\n * Class that manages all connections to Telegram servers.\n */\nexport class NetworkManager {\n readonly _log\n readonly _storage\n\n readonly _initConnectionParams: tl.RawInitConnectionRequest\n readonly _transportFactory: TransportFactory\n readonly _reconnectionStrategy: ReconnectionStrategy<PersistentConnectionParams>\n readonly _connectionCount: ConnectionCountDelegate\n\n protected readonly _dcConnections = new Map<number, DcConnectionManager>()\n protected _primaryDc?: DcConnectionManager\n\n private _updateHandler: (upd: tl.TypeUpdates, fromClient: boolean) => void\n\n constructor(\n readonly params: NetworkManagerParams & NetworkManagerExtraParams,\n readonly config: ConfigManager,\n ) {\n const deviceModel = `mtcute on ${getPlatform().getDeviceModel()}`\n\n this._initConnectionParams = {\n _: 'initConnection',\n deviceModel,\n systemVersion: '1.0',\n appVersion: '%VERSION%',\n systemLangCode: 'en',\n langPack: '', // \"langPacks are for official apps only\"\n langCode: 'en',\n ...(params.initConnectionOptions ?? {}),\n apiId: params.apiId,\n // eslint-disable-next-line\n query: null as any,\n }\n\n this._transportFactory = params.transport\n this._reconnectionStrategy = params.reconnectionStrategy ?? defaultReconnectionStrategy\n this._connectionCount = params.connectionCount ?? defaultConnectionCountDelegate\n this._updateHandler = params.onUpdate\n\n this._onConfigChanged = this._onConfigChanged.bind(this)\n config.onReload(this._onConfigChanged)\n\n this._log = params.log.create('network')\n this._storage = params.storage\n }\n\n private async _findDcOptions(dcId: number): Promise<DcOptions> {\n const main = await this.config.findOption({\n dcId,\n allowIpv6: this.params.useIpv6,\n preferIpv6: this.params.useIpv6,\n allowMedia: false,\n cdn: false,\n })\n\n const media = await this.config.findOption({\n dcId,\n allowIpv6: this.params.useIpv6,\n preferIpv6: this.params.useIpv6,\n allowMedia: true,\n preferMedia: true,\n cdn: false,\n })\n\n if (!main || !media) {\n throw new MtArgumentError(`Could not find DC ${dcId}`)\n }\n\n return { main, media }\n }\n\n private _resetOnNetworkChange?: () => void\n\n private _switchPrimaryDc(dc: DcConnectionManager) {\n if (this._primaryDc && this._primaryDc !== dc) {\n this._primaryDc.setIsPrimary(false)\n }\n\n this._primaryDc = dc\n dc.setIsPrimary(true)\n\n this.params.onConnecting()\n\n dc.main.on('usable', () => {\n if (dc !== this._primaryDc) return\n this.params.onUsable()\n })\n dc.main.on('wait', () => {\n if (dc !== this._primaryDc) return\n this.params.onConnecting()\n })\n dc.main.on('update', (update: tl.TypeUpdates) => {\n this._updateHandler(update, false)\n })\n\n return dc.loadKeys().then(() => dc.main.ensureConnected())\n }\n\n private _dcCreationPromise = new Map<number, Promise<void>>()\n async _getOtherDc(dcId: number): Promise<DcConnectionManager> {\n if (!this._dcConnections.has(dcId)) {\n if (this._dcCreationPromise.has(dcId)) {\n this._log.debug('waiting for DC %d to be created', dcId)\n await this._dcCreationPromise.get(dcId)\n\n return this._dcConnections.get(dcId)!\n }\n\n const promise = createControllablePromise<void>()\n this._dcCreationPromise.set(dcId, promise)\n\n this._log.debug('creating new DC %d', dcId)\n\n try {\n const dcOptions = await this._findDcOptions(dcId)\n\n const dc = new DcConnectionManager(this, dcId, dcOptions)\n\n if (!(await dc.loadKeys())) {\n dc.main.requestAuth()\n }\n\n this._dcConnections.set(dcId, dc)\n promise.resolve()\n } catch (e) {\n promise.reject(e)\n }\n }\n\n return this._dcConnections.get(dcId)!\n }\n\n /**\n * Perform initial connection to the default DC\n *\n * @param defaultDcs Default DCs to connect to\n */\n async connect(defaultDcs: DcOptions): Promise<void> {\n if (defaultDcs.main.id !== defaultDcs.media.id) {\n throw new MtArgumentError('Default DCs must be the same')\n }\n\n if (this._dcConnections.has(defaultDcs.main.id)) {\n // shouldn't happen\n throw new MtArgumentError('DC manager already exists')\n }\n\n this._resetOnNetworkChange = getPlatform().onNetworkChanged?.(this.notifyNetworkChanged.bind(this))\n\n const dc = new DcConnectionManager(this, defaultDcs.main.id, defaultDcs, true)\n this._dcConnections.set(defaultDcs.main.id, dc)\n await this._switchPrimaryDc(dc)\n }\n\n private _pendingExports: Record<number, Promise<void>> = {}\n private async _exportAuthTo(manager: DcConnectionManager): Promise<void> {\n if (manager.dcId in this._pendingExports) {\n this._log.debug('waiting for auth export to dc %d', manager.dcId)\n\n return this._pendingExports[manager.dcId]\n }\n\n this._log.debug('exporting auth to dc %d', manager.dcId)\n const promise = createControllablePromise<void>()\n this._pendingExports[manager.dcId] = promise\n\n try {\n const auth = await this.call({\n _: 'auth.exportAuthorization',\n dcId: manager.dcId,\n })\n\n const res = await this.call(\n {\n _: 'auth.importAuthorization',\n id: auth.id,\n bytes: auth.bytes,\n },\n { manager },\n )\n\n assertTypeIs('auth.importAuthorization', res, 'auth.authorization')\n\n promise.resolve()\n delete this._pendingExports[manager.dcId]\n } catch (e) {\n this._log.warn('failed to export auth to dc %d: %s', manager.dcId, e)\n promise.reject(e)\n throw e\n }\n }\n\n setIsPremium(isPremium: boolean): void {\n this._log.debug('setting isPremium to %s', isPremium)\n this.params.isPremium = isPremium\n\n for (const dc of this._dcConnections.values()) {\n dc.setIsPremium(isPremium)\n }\n }\n\n notifyLoggedIn(auth: tl.auth.TypeAuthorization | tl.RawUser): tl.RawUser {\n if (auth._ === 'auth.authorizationSignUpRequired') {\n throw new MtUnsupportedError(\n 'Signup is no longer supported by Telegram for non-official clients. Please use your mobile device to sign up.',\n )\n }\n\n let user: tl.RawUser\n\n if (auth._ === 'auth.authorization') {\n if (auth.tmpSessions) {\n this._primaryDc?.main.setCount(auth.tmpSessions)\n }\n\n user = auth.user as tl.RawUser\n } else {\n if (auth.bot) {\n // bots may receive tmpSessions, which we should respect\n this.config.update(true).catch((e: Error) => this.params.emitError(e))\n }\n\n user = auth\n }\n\n this.setIsPremium(user.premium!)\n\n // telegram ignores invokeWithoutUpdates for auth methods\n if (auth._ === 'auth.authorization' && this.params.disableUpdates) {\n this.resetSessions()\n }\n\n return user\n }\n\n notifyLoggedOut(): void {\n this.setIsPremium(false)\n this.resetSessions()\n }\n\n notifyNetworkChanged(connected: boolean): void {\n this._log.debug('network changed: %s', connected ? 'connected' : 'disconnected')\n this.params.onNetworkChanged(connected)\n\n for (const dc of this._dcConnections.values()) {\n dc.main.notifyNetworkChanged(connected)\n dc.upload.notifyNetworkChanged(connected)\n dc.download.notifyNetworkChanged(connected)\n dc.downloadSmall.notifyNetworkChanged(connected)\n }\n }\n\n resetSessions(): void {\n const dc = this._primaryDc\n if (!dc) return\n\n dc.main.resetSessions()\n dc.upload.resetSessions()\n dc.download.resetSessions()\n dc.downloadSmall.resetSessions()\n }\n\n private _onConfigChanged(config: tl.RawConfig): void {\n if (config.tmpSessions) {\n this._primaryDc?.main.setCount(config.tmpSessions)\n }\n }\n\n async changePrimaryDc(newDc: number): Promise<void> {\n if (newDc === this._primaryDc?.dcId) return\n\n const options = await this._findDcOptions(newDc)\n\n if (!this._dcConnections.has(newDc)) {\n this._dcConnections.set(newDc, new DcConnectionManager(this, newDc, options, true))\n }\n\n await this._storage.dcs.store(options)\n\n await this._switchPrimaryDc(this._dcConnections.get(newDc)!)\n }\n\n private _floodWaitedRequests = new Map<string, number>()\n async call<T extends tl.RpcMethod>(\n message: T,\n params?: RpcCallOptions,\n stack?: string,\n ): Promise<tl.RpcCallReturn[T['_']]> {\n if (!this._primaryDc) {\n throw new MtcuteError('Not connected to any DC')\n }\n\n const floodSleepThreshold = params?.floodSleepThreshold ?? this.params.floodSleepThreshold\n const maxRetryCount = params?.maxRetryCount ?? this.params.maxRetryCount\n const throw503 = params?.throw503 ?? false\n\n // do not send requests that are in flood wait\n if (this._floodWaitedRequests.has(message._)) {\n const delta = this._floodWaitedRequests.get(message._)! - Date.now()\n\n if (delta <= 3000) {\n // flood waits below 3 seconds are \"ignored\"\n this._floodWaitedRequests.delete(message._)\n } else if (delta <= this.params.floodSleepThreshold) {\n await sleep(delta)\n this._floodWaitedRequests.delete(message._)\n } else {\n const err = tl.RpcError.create(tl.RpcError.FLOOD, 'FLOOD_WAIT_%d')\n err.seconds = Math.ceil(delta / 1000)\n throw err\n }\n }\n\n let lastError: Error | null = null\n\n const kind = params?.kind ?? 'main'\n let manager: DcConnectionManager\n\n if (params?.manager) {\n manager = params.manager\n } else if (params?.dcId && params.dcId !== this._primaryDc.dcId) {\n manager = await this._getOtherDc(params.dcId)\n } else {\n manager = this._primaryDc\n }\n\n let multi = manager[kind]\n\n for (let i = 0; i < maxRetryCount; i++) {\n try {\n const res = await multi.sendRpc(message, stack, params?.timeout, params?.abortSignal, params?.chainId)\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return res\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n lastError = e as Error\n\n if (!tl.RpcError.is(e)) {\n throw e\n }\n\n if (!(e.code in CLIENT_ERRORS)) {\n if (throw503 && e.code === -503) {\n throw new MtTimeoutError()\n }\n\n this._log.warn(\n 'Telegram is having internal issues: %d:%s (%s), retrying',\n e.code,\n e.text,\n e.message,\n )\n\n if (e.text === 'WORKER_BUSY_TOO_LONG_RETRY') {\n // according to tdlib, \"it is dangerous to resend query without timeout, so use 1\"\n await sleep(1000)\n }\n continue\n }\n\n if (e.is('FLOOD_WAIT_%d') || e.is('SLOWMODE_WAIT_%d') || e.is('FLOOD_TEST_PHONE_WAIT_%d')) {\n if (e.text !== 'SLOWMODE_WAIT_%d') {\n // SLOW_MODE_WAIT is chat-specific, not request-specific\n this._floodWaitedRequests.set(message._, Date.now() + e.seconds * 1000)\n }\n\n // In test servers, FLOOD_WAIT_0 has been observed, and sleeping for\n // such a short amount will cause retries very fast leading to issues\n if (e.seconds === 0) {\n e.seconds = 1\n }\n\n if (e.seconds <= floodSleepThreshold) {\n this._log.info('Flood wait for %d seconds', e.seconds)\n await sleep(e.seconds * 1000)\n continue\n }\n }\n\n if (manager === this._primaryDc) {\n if (e.is('PHONE_MIGRATE_%d') || e.is('NETWORK_MIGRATE_%d') || e.is('USER_MIGRATE_%d')) {\n this._log.info('Migrate error, new dc = %d', e.newDc)\n\n await this.changePrimaryDc(e.newDc)\n manager = this._primaryDc!\n multi = manager[kind]\n\n continue\n }\n } else if (e.is('AUTH_KEY_UNREGISTERED')) {\n // we can try re-exporting auth from the primary connection\n this._log.warn('exported auth key error, trying re-exporting..')\n\n await this._exportAuthTo(manager)\n continue\n }\n\n throw e\n }\n }\n\n throw lastError!\n }\n\n changeTransport(factory: TransportFactory): void {\n for (const dc of this._dcConnections.values()) {\n dc.main.changeTransport(factory)\n dc.upload.changeTransport(factory)\n dc.download.changeTransport(factory)\n dc.downloadSmall.changeTransport(factory)\n }\n }\n\n getPoolSize(kind: ConnectionKind, dcId?: number) {\n const dc = dcId ? this._dcConnections.get(dcId) : this._primaryDc\n\n if (!dc) {\n if (!this._primaryDc) {\n throw new MtcuteError('Not connected to any DC')\n }\n\n // guess based on the provided delegate. it is most likely correct,\n // but we should give actual values if possible\n return this._connectionCount(kind, dcId ?? this._primaryDc.dcId, this.params.isPremium)\n }\n\n return dc[kind].getPoolSize()\n }\n\n getPrimaryDcId() {\n if (!this._primaryDc) throw new MtcuteError('Not connected to any DC')\n\n return this._primaryDc.dcId\n }\n\n async destroy(): Promise<void> {\n for (const dc of this._dcConnections.values()) {\n await dc.destroy()\n }\n this.config.offReload(this._onConfigChanged)\n this._resetOnNetworkChange?.()\n }\n}\n"]}
1
+ {"version":3,"file":"network-manager.js","sourceRoot":"","sources":["../../../src/network/network-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { mtp, tl } from '@mtcute/tl'\nimport { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime'\n\nimport { getPlatform } from '../platform.js'\nimport { StorageManager } from '../storage/storage.js'\nimport { MtArgumentError, MtcuteError, MtTimeoutError, MtUnsupportedError } from '../types/index.js'\nimport {\n ControllablePromise,\n createControllablePromise,\n DcOptions,\n ICryptoProvider,\n Logger,\n sleep,\n} from '../utils/index.js'\nimport { assertTypeIs } from '../utils/type-assertions.js'\nimport { ConfigManager } from './config-manager.js'\nimport { MultiSessionConnection } from './multi-session-connection.js'\nimport { PersistentConnectionParams } from './persistent-connection.js'\nimport { defaultReconnectionStrategy, ReconnectionStrategy } from './reconnection.js'\nimport { ServerSaltManager } from './server-salt.js'\nimport { SessionConnection, SessionConnectionParams } from './session-connection.js'\nimport { TransportFactory } from './transports/index.js'\n\nexport type ConnectionKind = 'main' | 'upload' | 'download' | 'downloadSmall'\n\nconst CLIENT_ERRORS = {\n [tl.RpcError.BAD_REQUEST]: 1,\n [tl.RpcError.UNAUTHORIZED]: 1,\n [tl.RpcError.FORBIDDEN]: 1,\n [tl.RpcError.NOT_FOUND]: 1,\n [tl.RpcError.FLOOD]: 1,\n [tl.RpcError.SEE_OTHER]: 1,\n [tl.RpcError.NOT_ACCEPTABLE]: 1,\n}\n\n/**\n * Params passed into {@link NetworkManager} by {@link TelegramClient}.\n * This type is intended for internal usage only.\n */\nexport interface NetworkManagerParams {\n storage: StorageManager\n crypto: ICryptoProvider\n log: Logger\n\n enableErrorReporting: boolean\n apiId: number\n initConnectionOptions?: Partial<Omit<tl.RawInitConnectionRequest, 'apiId' | 'query'>>\n transport: TransportFactory\n reconnectionStrategy?: ReconnectionStrategy<PersistentConnectionParams>\n floodSleepThreshold: number\n maxRetryCount: number\n disableUpdates?: boolean\n testMode: boolean\n layer: number\n useIpv6: boolean\n readerMap: TlReaderMap\n writerMap: TlWriterMap\n isPremium: boolean\n emitError: (err: Error, connection?: SessionConnection) => void\n onUpdate: (upd: tl.TypeUpdates) => void\n onUsable: () => void\n onConnecting: () => void\n onNetworkChanged: (connected: boolean) => void\n}\n\nexport type ConnectionCountDelegate = (kind: ConnectionKind, dcId: number, isPremium: boolean) => number\n\nconst defaultConnectionCountDelegate: ConnectionCountDelegate = (kind, dcId, isPremium) => {\n switch (kind) {\n case 'main':\n return 1\n case 'upload':\n return isPremium || (dcId !== 2 && dcId !== 4) ? 8 : 4\n case 'download':\n return isPremium ? 8 : 2\n case 'downloadSmall':\n return 2\n }\n}\n\n/**\n * Additional params passed into {@link NetworkManager} by the user\n * that customize the behavior of the manager\n */\nexport interface NetworkManagerExtraParams {\n /**\n * Whether to use PFS (Perfect Forward Secrecy) for all connections.\n * This is disabled by default\n */\n usePfs?: boolean\n\n /**\n * Connection count for each connection kind.\n * The function should be pure to avoid unexpected behavior.\n *\n * Defaults to TDLib logic:\n * - main: handled internally, **cannot be changed here**\n * - upload: if premium or dc id is other than 2 or 4, then 8, otherwise 4\n * - download: if premium then 8, otherwise 2\n * - downloadSmall: 2\n */\n connectionCount?: ConnectionCountDelegate\n\n /**\n * Idle timeout for non-main connections, in ms\n *\n * @default 60000 (60 seconds).\n */\n inactivityTimeout?: number\n}\n\n/** Options that can be customized when making an RPC call */\nexport interface RpcCallOptions {\n /**\n * If the call results in a `FLOOD_WAIT_X` error,\n * the maximum amount of time to wait before retrying.\n *\n * If set to `0`, the call will not be retried.\n *\n * @default {@link BaseTelegramClientOptions.floodSleepThreshold}\n */\n floodSleepThreshold?: number\n\n /**\n * If the call results in an internal server error or a flood wait,\n * the maximum amount of times to retry the call.\n *\n * @default {@link BaseTelegramClientOptions.maxRetryCount}\n */\n maxRetryCount?: number\n\n /**\n * Timeout for the call, in milliseconds.\n *\n * @default Infinity\n */\n timeout?: number\n\n /**\n * **ADVANCED**\n *\n * Kind of connection to use for this call.\n *\n * @default 'main'\n */\n kind?: ConnectionKind\n\n /**\n * **ADVANCED**\n *\n * ID of the DC to use for this call\n */\n dcId?: number\n\n /**\n * **ADVANCED**\n *\n * DC connection manager to use for this call.\n * Overrides `dcId` if set.\n */\n manager?: DcConnectionManager\n\n /**\n * Abort signal for the call.\n */\n abortSignal?: AbortSignal\n\n /**\n * Whether we should not retry on -503 errors and throw {@link MtTimeoutError} immediately instead.\n *\n * Useful for methods like `messages.getBotCallbackAnswer` that reliably return\n * -503 in case the upstream bot failed to respond.\n */\n throw503?: boolean\n\n /**\n * Whether the `X_MIGRATE_%d` errors should be handled locally on request level\n * instead of changing the default datacenter for the entire client.\n *\n * Useful for `invokeWithBusinessConnection`, as it returns a `USER_MIGRATE_%d` error\n * that is in fact not related to the user, but to the specific request.\n */\n localMigrate?: boolean\n\n /**\n * Some requests should be processed consecutively, and not in parallel.\n * Using the same `chainId` for multiple requests will ensure that they are processed in the order\n * of calling `.call()`.\n *\n * Particularly useful for `messages.sendMessage` and alike.\n */\n chainId?: string | number\n}\n\n/**\n * Wrapper over all connection pools for a single DC.\n */\nexport class DcConnectionManager {\n private _salts = new ServerSaltManager()\n private _log\n\n /** Main connection pool */\n main: MultiSessionConnection\n /** Upload connection pool */\n upload: MultiSessionConnection\n /** Download connection pool */\n download: MultiSessionConnection\n /** Download connection pool (for small files) */\n downloadSmall: MultiSessionConnection\n\n private get _mainConnectionCount() {\n if (!this.isPrimary) return 1\n\n return this.manager.config.getNow()?.tmpSessions ?? 1\n }\n\n constructor(\n /** Network manager instance */\n readonly manager: NetworkManager,\n /** DC ID */\n readonly dcId: number,\n /** DC options to use */\n readonly _dcs: DcOptions,\n /** Whether this DC is the primary one */\n public isPrimary = false,\n ) {\n this._log = this.manager._log.create('dc-manager')\n this._log.prefix = `[DC ${dcId}] `\n\n const baseConnectionParams = (): SessionConnectionParams => ({\n crypto: this.manager.params.crypto,\n initConnection: this.manager._initConnectionParams,\n transportFactory: this.manager._transportFactory,\n dc: this._dcs.media,\n testMode: this.manager.params.testMode,\n reconnectionStrategy: this.manager._reconnectionStrategy,\n layer: this.manager.params.layer,\n disableUpdates: this.manager.params.disableUpdates,\n readerMap: this.manager.params.readerMap,\n writerMap: this.manager.params.writerMap,\n usePfs: this.manager.params.usePfs,\n isMainConnection: false,\n isMainDcConnection: this.isPrimary,\n inactivityTimeout: this.manager.params.inactivityTimeout ?? 60_000,\n enableErrorReporting: this.manager.params.enableErrorReporting,\n salts: this._salts,\n })\n\n const mainParams = baseConnectionParams()\n mainParams.isMainConnection = true\n mainParams.dc = _dcs.main\n\n if (isPrimary) {\n mainParams.inactivityTimeout = undefined\n }\n\n this.main = new MultiSessionConnection(mainParams, this._mainConnectionCount, this._log, 'MAIN')\n this.upload = new MultiSessionConnection(\n baseConnectionParams(),\n this.manager._connectionCount('upload', this.dcId, this.manager.params.isPremium),\n this._log,\n 'UPLOAD',\n )\n this.download = new MultiSessionConnection(\n baseConnectionParams(),\n this.manager._connectionCount('download', this.dcId, this.manager.params.isPremium),\n this._log,\n 'DOWNLOAD',\n )\n this.downloadSmall = new MultiSessionConnection(\n baseConnectionParams(),\n this.manager._connectionCount('downloadSmall', this.dcId, this.manager.params.isPremium),\n this._log,\n 'DOWNLOAD_SMALL',\n )\n\n this._setupMulti('main')\n this._setupMulti('upload')\n this._setupMulti('download')\n this._setupMulti('downloadSmall')\n }\n\n private _setupMulti(kind: ConnectionKind): void {\n const connection = this[kind]\n\n connection.on('key-change', (idx, key: Uint8Array | null) => {\n if (kind !== 'main') {\n // main connection is responsible for authorization,\n // and keys are then sent to other connections\n this.manager._log.warn('got key-change from non-main connection, ignoring')\n\n return\n }\n\n this.manager._log.debug('key change for dc %d from connection %d', this.dcId, idx)\n\n // send key to other connections\n this.upload.setAuthKey(key)\n this.download.setAuthKey(key)\n this.downloadSmall.setAuthKey(key)\n Promise.resolve(this.manager._storage.provider.authKeys.set(this.dcId, key))\n .then(() => {\n this.upload.notifyKeyChange()\n this.download.notifyKeyChange()\n this.downloadSmall.notifyKeyChange()\n })\n .catch((e: Error) => this.manager.params.emitError(e))\n })\n connection.on('tmp-key-change', (idx: number, key: Uint8Array | null, expires: number) => {\n if (kind !== 'main') {\n this.manager._log.warn('got tmp-key-change from non-main connection, ignoring')\n\n return\n }\n\n this.manager._log.debug('temp key change for dc %d from connection %d', this.dcId, idx)\n\n // send key to other connections\n this.upload.setAuthKey(key, true)\n this.download.setAuthKey(key, true)\n this.downloadSmall.setAuthKey(key, true)\n\n Promise.resolve(this.manager._storage.provider.authKeys.setTemp(this.dcId, idx, key, expires * 1000))\n .then(() => {\n this.upload.notifyKeyChange()\n this.download.notifyKeyChange()\n this.downloadSmall.notifyKeyChange()\n })\n .catch((e: Error) => this.manager.params.emitError(e))\n })\n connection.on('future-salts', (salts: mtp.RawMt_future_salt[]) => {\n Promise.resolve(this.manager._storage.salts.store(this.dcId, salts)).catch((e: Error) =>\n this.manager.params.emitError(e),\n )\n })\n\n connection.on('auth-begin', () => {\n // we need to propagate auth-begin to all connections\n // to avoid them sending requests before auth is complete\n if (kind !== 'main') {\n this.manager._log.warn('got auth-begin from non-main connection, ignoring')\n\n return\n }\n\n // reset key on non-main connections\n // this event was already propagated to additional main connections\n this.upload.resetAuthKeys()\n this.download.resetAuthKeys()\n this.downloadSmall.resetAuthKeys()\n })\n\n connection.on('request-auth', () => {\n this.main.requestAuth()\n })\n\n // fucking awesome architecture, but whatever\n connection.on('request-keys', (promise: ControllablePromise<void>) => {\n this.loadKeys(true)\n .then(() => promise.resolve())\n .catch((e: Error) => promise.reject(e))\n })\n\n connection.on('error', (err: Error, conn: SessionConnection) => {\n this.manager.params.emitError(err, conn)\n })\n }\n\n setIsPrimary(isPrimary: boolean): void {\n if (this.isPrimary === isPrimary) return\n this.isPrimary = isPrimary\n this.main.params.isMainDcConnection = isPrimary\n\n if (isPrimary) {\n this.main.setInactivityTimeout(undefined)\n } else {\n this.main.setInactivityTimeout(this.manager.params.inactivityTimeout ?? 60_000)\n }\n }\n\n setIsPremium(isPremium: boolean): void {\n this.upload.setCount(this.manager._connectionCount('upload', this.dcId, isPremium))\n this.download.setCount(this.manager._connectionCount('download', this.dcId, isPremium))\n this.downloadSmall.setCount(this.manager._connectionCount('downloadSmall', this.dcId, isPremium))\n }\n\n async loadKeys(forcePfs = false): Promise<boolean> {\n const [permanent, salts] = await Promise.all([\n this.manager._storage.provider.authKeys.get(this.dcId),\n this.manager._storage.salts.fetch(this.dcId),\n ])\n\n this.main.setAuthKey(permanent)\n this.upload.setAuthKey(permanent)\n this.download.setAuthKey(permanent)\n this.downloadSmall.setAuthKey(permanent)\n\n if (salts) {\n this._salts.setFutureSalts(salts)\n }\n\n if (!permanent) {\n return false\n }\n\n if (this.manager.params.usePfs || forcePfs) {\n const now = Date.now()\n await Promise.all(\n this.main._sessions.map(async (_, i) => {\n const temp = await this.manager._storage.provider.authKeys.getTemp(this.dcId, i, now)\n this.main.setAuthKey(temp, true, i)\n\n if (i === 0) {\n this.upload.setAuthKey(temp, true)\n this.download.setAuthKey(temp, true)\n this.downloadSmall.setAuthKey(temp, true)\n }\n }),\n )\n }\n\n return true\n }\n\n async destroy() {\n await this.main.destroy()\n await this.upload.destroy()\n await this.download.destroy()\n await this.downloadSmall.destroy()\n this._salts.destroy()\n }\n}\n\n/**\n * Class that manages all connections to Telegram servers.\n */\nexport class NetworkManager {\n readonly _log\n readonly _storage\n\n readonly _initConnectionParams: tl.RawInitConnectionRequest\n readonly _transportFactory: TransportFactory\n readonly _reconnectionStrategy: ReconnectionStrategy<PersistentConnectionParams>\n readonly _connectionCount: ConnectionCountDelegate\n\n protected readonly _dcConnections = new Map<number, DcConnectionManager>()\n protected _primaryDc?: DcConnectionManager\n\n private _updateHandler: (upd: tl.TypeUpdates, fromClient: boolean) => void\n\n constructor(\n readonly params: NetworkManagerParams & NetworkManagerExtraParams,\n readonly config: ConfigManager,\n ) {\n const deviceModel = `mtcute on ${getPlatform().getDeviceModel()}`\n\n this._initConnectionParams = {\n _: 'initConnection',\n deviceModel,\n systemVersion: '1.0',\n appVersion: '%VERSION%',\n systemLangCode: 'en',\n langPack: '', // \"langPacks are for official apps only\"\n langCode: 'en',\n ...(params.initConnectionOptions ?? {}),\n apiId: params.apiId,\n // eslint-disable-next-line\n query: null as any,\n }\n\n this._transportFactory = params.transport\n this._reconnectionStrategy = params.reconnectionStrategy ?? defaultReconnectionStrategy\n this._connectionCount = params.connectionCount ?? defaultConnectionCountDelegate\n this._updateHandler = params.onUpdate\n\n this._onConfigChanged = this._onConfigChanged.bind(this)\n config.onReload(this._onConfigChanged)\n\n this._log = params.log.create('network')\n this._storage = params.storage\n }\n\n private async _findDcOptions(dcId: number): Promise<DcOptions> {\n const main = await this.config.findOption({\n dcId,\n allowIpv6: this.params.useIpv6,\n preferIpv6: this.params.useIpv6,\n allowMedia: false,\n cdn: false,\n })\n\n const media = await this.config.findOption({\n dcId,\n allowIpv6: this.params.useIpv6,\n preferIpv6: this.params.useIpv6,\n allowMedia: true,\n preferMedia: true,\n cdn: false,\n })\n\n if (!main || !media) {\n throw new MtArgumentError(`Could not find DC ${dcId}`)\n }\n\n return { main, media }\n }\n\n private _resetOnNetworkChange?: () => void\n\n private _switchPrimaryDc(dc: DcConnectionManager) {\n if (this._primaryDc && this._primaryDc !== dc) {\n this._primaryDc.setIsPrimary(false)\n }\n\n this._primaryDc = dc\n dc.setIsPrimary(true)\n\n this.params.onConnecting()\n\n dc.main.on('usable', () => {\n if (dc !== this._primaryDc) return\n this.params.onUsable()\n })\n dc.main.on('wait', () => {\n if (dc !== this._primaryDc) return\n this.params.onConnecting()\n })\n dc.main.on('update', (update: tl.TypeUpdates) => {\n this._updateHandler(update, false)\n })\n\n return dc.loadKeys().then(() => dc.main.ensureConnected())\n }\n\n private _dcCreationPromise = new Map<number, Promise<void>>()\n async _getOtherDc(dcId: number): Promise<DcConnectionManager> {\n if (!this._dcConnections.has(dcId)) {\n if (this._dcCreationPromise.has(dcId)) {\n this._log.debug('waiting for DC %d to be created', dcId)\n await this._dcCreationPromise.get(dcId)\n\n return this._dcConnections.get(dcId)!\n }\n\n const promise = createControllablePromise<void>()\n this._dcCreationPromise.set(dcId, promise)\n\n this._log.debug('creating new DC %d', dcId)\n\n try {\n const dcOptions = await this._findDcOptions(dcId)\n\n const dc = new DcConnectionManager(this, dcId, dcOptions)\n\n if (!(await dc.loadKeys())) {\n dc.main.requestAuth()\n }\n\n this._dcConnections.set(dcId, dc)\n promise.resolve()\n } catch (e) {\n promise.reject(e)\n }\n }\n\n return this._dcConnections.get(dcId)!\n }\n\n /**\n * Perform initial connection to the default DC\n *\n * @param defaultDcs Default DCs to connect to\n */\n async connect(defaultDcs: DcOptions): Promise<void> {\n if (defaultDcs.main.id !== defaultDcs.media.id) {\n throw new MtArgumentError('Default DCs must be the same')\n }\n\n if (this._dcConnections.has(defaultDcs.main.id)) {\n // shouldn't happen\n throw new MtArgumentError('DC manager already exists')\n }\n\n this._resetOnNetworkChange = getPlatform().onNetworkChanged?.(this.notifyNetworkChanged.bind(this))\n\n const dc = new DcConnectionManager(this, defaultDcs.main.id, defaultDcs, true)\n this._dcConnections.set(defaultDcs.main.id, dc)\n await this._switchPrimaryDc(dc)\n }\n\n private _pendingExports: Record<number, Promise<void>> = {}\n private async _exportAuthTo(manager: DcConnectionManager): Promise<void> {\n if (manager.dcId in this._pendingExports) {\n this._log.debug('waiting for auth export to dc %d', manager.dcId)\n\n return this._pendingExports[manager.dcId]\n }\n\n this._log.debug('exporting auth to dc %d', manager.dcId)\n const promise = createControllablePromise<void>()\n this._pendingExports[manager.dcId] = promise\n\n try {\n const auth = await this.call({\n _: 'auth.exportAuthorization',\n dcId: manager.dcId,\n })\n\n const res = await this.call(\n {\n _: 'auth.importAuthorization',\n id: auth.id,\n bytes: auth.bytes,\n },\n { manager },\n )\n\n assertTypeIs('auth.importAuthorization', res, 'auth.authorization')\n\n promise.resolve()\n delete this._pendingExports[manager.dcId]\n } catch (e) {\n this._log.warn('failed to export auth to dc %d: %s', manager.dcId, e)\n promise.reject(e)\n throw e\n }\n }\n\n setIsPremium(isPremium: boolean): void {\n this._log.debug('setting isPremium to %s', isPremium)\n this.params.isPremium = isPremium\n\n for (const dc of this._dcConnections.values()) {\n dc.setIsPremium(isPremium)\n }\n }\n\n notifyLoggedIn(auth: tl.auth.TypeAuthorization | tl.RawUser): tl.RawUser {\n if (auth._ === 'auth.authorizationSignUpRequired') {\n throw new MtUnsupportedError(\n 'Signup is no longer supported by Telegram for non-official clients. Please use your mobile device to sign up.',\n )\n }\n\n let user: tl.RawUser\n\n if (auth._ === 'auth.authorization') {\n if (auth.tmpSessions) {\n this._primaryDc?.main.setCount(auth.tmpSessions)\n }\n\n user = auth.user as tl.RawUser\n } else {\n if (auth.bot) {\n // bots may receive tmpSessions, which we should respect\n this.config.update(true).catch((e: Error) => this.params.emitError(e))\n }\n\n user = auth\n }\n\n this.setIsPremium(user.premium!)\n\n // telegram ignores invokeWithoutUpdates for auth methods\n if (auth._ === 'auth.authorization' && this.params.disableUpdates) {\n this.resetSessions()\n }\n\n return user\n }\n\n notifyLoggedOut(): void {\n this.setIsPremium(false)\n this.resetSessions()\n }\n\n notifyNetworkChanged(connected: boolean): void {\n this._log.debug('network changed: %s', connected ? 'connected' : 'disconnected')\n this.params.onNetworkChanged(connected)\n\n for (const dc of this._dcConnections.values()) {\n dc.main.notifyNetworkChanged(connected)\n dc.upload.notifyNetworkChanged(connected)\n dc.download.notifyNetworkChanged(connected)\n dc.downloadSmall.notifyNetworkChanged(connected)\n }\n }\n\n resetSessions(): void {\n const dc = this._primaryDc\n if (!dc) return\n\n dc.main.resetSessions()\n dc.upload.resetSessions()\n dc.download.resetSessions()\n dc.downloadSmall.resetSessions()\n }\n\n private _onConfigChanged(config: tl.RawConfig): void {\n if (config.tmpSessions) {\n this._primaryDc?.main.setCount(config.tmpSessions)\n }\n }\n\n async changePrimaryDc(newDc: number): Promise<void> {\n if (newDc === this._primaryDc?.dcId) return\n\n const options = await this._findDcOptions(newDc)\n\n if (!this._dcConnections.has(newDc)) {\n this._dcConnections.set(newDc, new DcConnectionManager(this, newDc, options, true))\n }\n\n await this._storage.dcs.store(options)\n\n await this._switchPrimaryDc(this._dcConnections.get(newDc)!)\n }\n\n private _floodWaitedRequests = new Map<string, number>()\n async call<T extends tl.RpcMethod>(\n message: T,\n params?: RpcCallOptions,\n stack?: string,\n ): Promise<tl.RpcCallReturn[T['_']]> {\n if (!this._primaryDc) {\n throw new MtcuteError('Not connected to any DC')\n }\n\n const floodSleepThreshold = params?.floodSleepThreshold ?? this.params.floodSleepThreshold\n const maxRetryCount = params?.maxRetryCount ?? this.params.maxRetryCount\n const throw503 = params?.throw503 ?? false\n\n // do not send requests that are in flood wait\n if (this._floodWaitedRequests.has(message._)) {\n const delta = this._floodWaitedRequests.get(message._)! - Date.now()\n\n if (delta <= 3000) {\n // flood waits below 3 seconds are \"ignored\"\n this._floodWaitedRequests.delete(message._)\n } else if (delta <= this.params.floodSleepThreshold) {\n await sleep(delta)\n this._floodWaitedRequests.delete(message._)\n } else {\n const err = tl.RpcError.create(tl.RpcError.FLOOD, 'FLOOD_WAIT_%d')\n err.seconds = Math.ceil(delta / 1000)\n throw err\n }\n }\n\n let lastError: Error | null = null\n\n const kind = params?.kind ?? 'main'\n let manager: DcConnectionManager\n\n if (params?.manager) {\n manager = params.manager\n } else if (params?.dcId && params.dcId !== this._primaryDc.dcId) {\n manager = await this._getOtherDc(params.dcId)\n } else {\n manager = this._primaryDc\n }\n\n let multi = manager[kind]\n\n for (let i = 0; i < maxRetryCount; i++) {\n try {\n const res = await multi.sendRpc(message, stack, params?.timeout, params?.abortSignal, params?.chainId)\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return res\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n lastError = e as Error\n\n if (!tl.RpcError.is(e)) {\n throw e\n }\n\n if (!(e.code in CLIENT_ERRORS)) {\n if (throw503 && e.code === -503) {\n throw new MtTimeoutError()\n }\n\n this._log.warn(\n 'Telegram is having internal issues: %d:%s (%s), retrying',\n e.code,\n e.text,\n e.message,\n )\n\n if (e.text === 'WORKER_BUSY_TOO_LONG_RETRY') {\n // according to tdlib, \"it is dangerous to resend query without timeout, so use 1\"\n await sleep(1000)\n }\n continue\n }\n\n if (e.is('FLOOD_WAIT_%d') || e.is('SLOWMODE_WAIT_%d') || e.is('FLOOD_TEST_PHONE_WAIT_%d')) {\n if (e.text !== 'SLOWMODE_WAIT_%d') {\n // SLOW_MODE_WAIT is chat-specific, not request-specific\n this._floodWaitedRequests.set(message._, Date.now() + e.seconds * 1000)\n }\n\n // In test servers, FLOOD_WAIT_0 has been observed, and sleeping for\n // such a short amount will cause retries very fast leading to issues\n if (e.seconds === 0) {\n e.seconds = 1\n }\n\n if (e.seconds <= floodSleepThreshold) {\n this._log.info('Flood wait for %d seconds', e.seconds)\n await sleep(e.seconds * 1000)\n continue\n }\n }\n\n if (manager === this._primaryDc) {\n if (e.is('PHONE_MIGRATE_%d') || e.is('NETWORK_MIGRATE_%d') || e.is('USER_MIGRATE_%d')) {\n if (params?.localMigrate) {\n manager = await this._getOtherDc(e.newDc)\n } else {\n this._log.info('Migrate error, new dc = %d', e.newDc)\n\n await this.changePrimaryDc(e.newDc)\n manager = this._primaryDc!\n }\n\n multi = manager[kind]\n\n continue\n }\n } else if (e.is('AUTH_KEY_UNREGISTERED')) {\n // we can try re-exporting auth from the primary connection\n this._log.warn('exported auth key error, trying re-exporting..')\n\n await this._exportAuthTo(manager)\n continue\n }\n\n throw e\n }\n }\n\n throw lastError!\n }\n\n changeTransport(factory: TransportFactory): void {\n for (const dc of this._dcConnections.values()) {\n dc.main.changeTransport(factory)\n dc.upload.changeTransport(factory)\n dc.download.changeTransport(factory)\n dc.downloadSmall.changeTransport(factory)\n }\n }\n\n getPoolSize(kind: ConnectionKind, dcId?: number) {\n const dc = dcId ? this._dcConnections.get(dcId) : this._primaryDc\n\n if (!dc) {\n if (!this._primaryDc) {\n throw new MtcuteError('Not connected to any DC')\n }\n\n // guess based on the provided delegate. it is most likely correct,\n // but we should give actual values if possible\n return this._connectionCount(kind, dcId ?? this._primaryDc.dcId, this.params.isPremium)\n }\n\n return dc[kind].getPoolSize()\n }\n\n getPrimaryDcId() {\n if (!this._primaryDc) throw new MtcuteError('Not connected to any DC')\n\n return this._primaryDc.dcId\n }\n\n async destroy(): Promise<void> {\n for (const dc of this._dcConnections.values()) {\n await dc.destroy()\n }\n this.config.offReload(this._onConfigChanged)\n this._resetOnNetworkChange?.()\n }\n}\n"]}
@@ -1,4 +1,3 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
1
  import EventEmitter from 'events';
3
2
  import { BasicDcOption, ICryptoProvider, Logger } from '../utils/index.js';
4
3
  import { ReconnectionStrategy } from './reconnection.js';
@@ -107,6 +107,9 @@ export class SessionConnection extends PersistentConnection {
107
107
  this._salts.isFetching = false;
108
108
  if (forever) {
109
109
  this.removeAllListeners();
110
+ this.on('error', (err) => {
111
+ this.log.warn('caught error after destroying: %s', err);
112
+ });
110
113
  }
111
114
  }
112
115
  onConnected() {
@@ -219,6 +222,8 @@ export class SessionConnection extends PersistentConnection {
219
222
  })
220
223
  .catch((err) => {
221
224
  this._session.authorizationPending = false;
225
+ if (this._destroyed)
226
+ return;
222
227
  this.log.error('Authorization error: %s', err.message);
223
228
  this.onError(err);
224
229
  this.reconnect();
@@ -342,6 +347,8 @@ export class SessionConnection extends PersistentConnection {
342
347
  }, (TEMP_AUTH_KEY_EXPIRY - 60) * 1000);
343
348
  })
344
349
  .catch((err) => {
350
+ if (this._destroyed)
351
+ return;
345
352
  this.log.error('PFS Authorization error: %s', err.message);
346
353
  if (this._isPfsBindingPendingInBackground) {
347
354
  this._isPfsBindingPendingInBackground = false;
@@ -354,6 +361,9 @@ export class SessionConnection extends PersistentConnection {
354
361
  });
355
362
  }
356
363
  waitForUnencryptedMessage(timeout = 5000) {
364
+ if (this._destroyed) {
365
+ return Promise.reject(new MtcuteError('Connection destroyed'));
366
+ }
357
367
  const promise = createControllablePromise();
358
368
  const timeoutId = setTimeout(() => {
359
369
  promise.reject(new MtTimeoutError(timeout));