@mtcute/core 0.30.3 → 0.32.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 (313) hide show
  1. package/client.cjs +85 -0
  2. package/client.js +85 -0
  3. package/highlevel/client.d.cts +411 -116
  4. package/highlevel/client.d.ts +411 -116
  5. package/highlevel/methods/auth/sign-in-qr.cjs +2 -0
  6. package/highlevel/methods/auth/sign-in-qr.js +2 -0
  7. package/highlevel/methods/auth/sign-in-qr.test.d.cts +1 -0
  8. package/highlevel/methods/auth/sign-in-qr.test.d.ts +1 -0
  9. package/highlevel/methods/chats/build-peers-index.cjs +45 -0
  10. package/highlevel/methods/chats/build-peers-index.d.cts +13 -0
  11. package/highlevel/methods/chats/build-peers-index.d.ts +13 -0
  12. package/highlevel/methods/chats/build-peers-index.js +40 -0
  13. package/highlevel/methods/chats/join-chat.cjs +1 -1
  14. package/highlevel/methods/chats/join-chat.d.cts +2 -1
  15. package/highlevel/methods/chats/join-chat.d.ts +2 -1
  16. package/highlevel/methods/chats/join-chat.js +1 -1
  17. package/highlevel/methods/chats/transfer-chat-ownership.cjs +6 -17
  18. package/highlevel/methods/chats/transfer-chat-ownership.js +6 -17
  19. package/highlevel/methods/communities/ban-community-participant.cjs +30 -0
  20. package/highlevel/methods/communities/ban-community-participant.d.cts +20 -0
  21. package/highlevel/methods/communities/ban-community-participant.d.ts +20 -0
  22. package/highlevel/methods/communities/ban-community-participant.js +25 -0
  23. package/highlevel/methods/communities/create-community.cjs +29 -0
  24. package/highlevel/methods/communities/create-community.d.cts +22 -0
  25. package/highlevel/methods/communities/create-community.d.ts +22 -0
  26. package/highlevel/methods/communities/create-community.js +24 -0
  27. package/highlevel/methods/communities/get-community-link-requests.cjs +27 -0
  28. package/highlevel/methods/communities/get-community-link-requests.d.cts +17 -0
  29. package/highlevel/methods/communities/get-community-link-requests.d.ts +17 -0
  30. package/highlevel/methods/communities/get-community-link-requests.js +22 -0
  31. package/highlevel/methods/communities/get-community-participant-chats.cjs +24 -0
  32. package/highlevel/methods/communities/get-community-participant-chats.d.cts +17 -0
  33. package/highlevel/methods/communities/get-community-participant-chats.d.ts +17 -0
  34. package/highlevel/methods/communities/get-community-participant-chats.js +19 -0
  35. package/highlevel/methods/communities/get-joined-communities.cjs +21 -0
  36. package/highlevel/methods/communities/get-joined-communities.d.cts +6 -0
  37. package/highlevel/methods/communities/get-joined-communities.d.ts +6 -0
  38. package/highlevel/methods/communities/get-joined-communities.js +16 -0
  39. package/highlevel/methods/communities/hide-community-link-request.cjs +30 -0
  40. package/highlevel/methods/communities/hide-community-link-request.d.cts +22 -0
  41. package/highlevel/methods/communities/hide-community-link-request.d.ts +22 -0
  42. package/highlevel/methods/communities/hide-community-link-request.js +25 -0
  43. package/highlevel/methods/communities/link-community-peer.cjs +32 -0
  44. package/highlevel/methods/communities/link-community-peer.d.cts +22 -0
  45. package/highlevel/methods/communities/link-community-peer.d.ts +22 -0
  46. package/highlevel/methods/communities/link-community-peer.js +27 -0
  47. package/highlevel/methods/communities/toggle-community-collapsed.cjs +18 -0
  48. package/highlevel/methods/communities/toggle-community-collapsed.d.cts +16 -0
  49. package/highlevel/methods/communities/toggle-community-collapsed.d.ts +16 -0
  50. package/highlevel/methods/communities/toggle-community-collapsed.js +13 -0
  51. package/highlevel/methods/ephemeral/delete-all-welcome-messages.cjs +17 -0
  52. package/highlevel/methods/ephemeral/delete-all-welcome-messages.d.cts +8 -0
  53. package/highlevel/methods/ephemeral/delete-all-welcome-messages.d.ts +8 -0
  54. package/highlevel/methods/ephemeral/delete-all-welcome-messages.js +12 -0
  55. package/highlevel/methods/ephemeral/delete-ephemeral-message.cjs +20 -0
  56. package/highlevel/methods/ephemeral/delete-ephemeral-message.d.cts +13 -0
  57. package/highlevel/methods/ephemeral/delete-ephemeral-message.d.ts +13 -0
  58. package/highlevel/methods/ephemeral/delete-ephemeral-message.js +15 -0
  59. package/highlevel/methods/ephemeral/delete-welcome-message.cjs +18 -0
  60. package/highlevel/methods/ephemeral/delete-welcome-message.d.cts +9 -0
  61. package/highlevel/methods/ephemeral/delete-welcome-message.d.ts +9 -0
  62. package/highlevel/methods/ephemeral/delete-welcome-message.js +13 -0
  63. package/highlevel/methods/ephemeral/edit-ephemeral-message.cjs +41 -0
  64. package/highlevel/methods/ephemeral/edit-ephemeral-message.d.cts +39 -0
  65. package/highlevel/methods/ephemeral/edit-ephemeral-message.d.ts +39 -0
  66. package/highlevel/methods/ephemeral/edit-ephemeral-message.js +36 -0
  67. package/highlevel/methods/ephemeral/find-in-update.cjs +27 -0
  68. package/highlevel/methods/ephemeral/find-in-update.d.cts +8 -0
  69. package/highlevel/methods/ephemeral/find-in-update.d.ts +8 -0
  70. package/highlevel/methods/ephemeral/find-in-update.js +22 -0
  71. package/highlevel/methods/ephemeral/get-ephemeral-callback-answer.cjs +31 -0
  72. package/highlevel/methods/ephemeral/get-ephemeral-callback-answer.d.cts +29 -0
  73. package/highlevel/methods/ephemeral/get-ephemeral-callback-answer.d.ts +29 -0
  74. package/highlevel/methods/ephemeral/get-ephemeral-callback-answer.js +26 -0
  75. package/highlevel/methods/ephemeral/get-welcome-messages.cjs +29 -0
  76. package/highlevel/methods/ephemeral/get-welcome-messages.d.cts +8 -0
  77. package/highlevel/methods/ephemeral/get-welcome-messages.d.ts +8 -0
  78. package/highlevel/methods/ephemeral/get-welcome-messages.js +24 -0
  79. package/highlevel/methods/ephemeral/send-ephemeral-message.cjs +48 -0
  80. package/highlevel/methods/ephemeral/send-ephemeral-message.d.cts +47 -0
  81. package/highlevel/methods/ephemeral/send-ephemeral-message.d.ts +47 -0
  82. package/highlevel/methods/ephemeral/send-ephemeral-message.js +43 -0
  83. package/highlevel/methods/files/download-iterable.cjs +7 -2
  84. package/highlevel/methods/files/download-iterable.js +7 -2
  85. package/highlevel/methods/files/download-iterable.test.d.cts +1 -0
  86. package/highlevel/methods/files/download-iterable.test.d.ts +1 -0
  87. package/highlevel/methods/files/download-stream.cjs +5 -6
  88. package/highlevel/methods/files/download-stream.js +5 -6
  89. package/highlevel/methods/files/normalize-input-media.cjs +25 -4
  90. package/highlevel/methods/files/normalize-input-media.js +25 -4
  91. package/highlevel/methods/forums/create-forum-topic.d.cts +7 -0
  92. package/highlevel/methods/forums/create-forum-topic.d.ts +7 -0
  93. package/highlevel/methods/forums/delete-forum-topic-history.d.cts +1 -1
  94. package/highlevel/methods/forums/delete-forum-topic-history.d.ts +1 -1
  95. package/highlevel/methods/forums/edit-forum-topic.cjs +2 -2
  96. package/highlevel/methods/forums/edit-forum-topic.d.cts +2 -2
  97. package/highlevel/methods/forums/edit-forum-topic.d.ts +2 -2
  98. package/highlevel/methods/forums/edit-forum-topic.js +2 -2
  99. package/highlevel/methods/forums/get-forum-topics-by-id.cjs +5 -1
  100. package/highlevel/methods/forums/get-forum-topics-by-id.d.cts +9 -1
  101. package/highlevel/methods/forums/get-forum-topics-by-id.d.ts +9 -1
  102. package/highlevel/methods/forums/get-forum-topics-by-id.js +5 -1
  103. package/highlevel/methods/forums/get-forum-topics-by-id.test.d.cts +1 -0
  104. package/highlevel/methods/forums/get-forum-topics-by-id.test.d.ts +1 -0
  105. package/highlevel/methods/forums/get-forum-topics.cjs +1 -1
  106. package/highlevel/methods/forums/get-forum-topics.js +1 -1
  107. package/highlevel/methods/forums/toggle-forum-topic-closed.cjs +1 -1
  108. package/highlevel/methods/forums/toggle-forum-topic-closed.d.cts +1 -1
  109. package/highlevel/methods/forums/toggle-forum-topic-closed.d.ts +1 -1
  110. package/highlevel/methods/forums/toggle-forum-topic-closed.js +1 -1
  111. package/highlevel/methods/forums/toggle-forum-topic-pinned.d.cts +1 -1
  112. package/highlevel/methods/forums/toggle-forum-topic-pinned.d.ts +1 -1
  113. package/highlevel/methods/forums/toggle-general-topic-hidden.cjs +3 -3
  114. package/highlevel/methods/forums/toggle-general-topic-hidden.js +4 -4
  115. package/highlevel/methods/gifts/buy-resale-gift.cjs +5 -2
  116. package/highlevel/methods/gifts/buy-resale-gift.d.cts +11 -1
  117. package/highlevel/methods/gifts/buy-resale-gift.d.ts +11 -1
  118. package/highlevel/methods/gifts/buy-resale-gift.js +5 -2
  119. package/highlevel/methods/messages/forward-messages.cjs +1 -0
  120. package/highlevel/methods/messages/forward-messages.d.cts +2 -0
  121. package/highlevel/methods/messages/forward-messages.d.ts +2 -0
  122. package/highlevel/methods/messages/forward-messages.js +1 -0
  123. package/highlevel/methods/messages/normalize-rich-message.cjs +3 -0
  124. package/highlevel/methods/messages/normalize-rich-message.js +3 -0
  125. package/highlevel/methods/messages/send-common.d.cts +7 -1
  126. package/highlevel/methods/messages/send-common.d.ts +7 -1
  127. package/highlevel/methods/messages/send-text.cjs +70 -35
  128. package/highlevel/methods/messages/send-text.js +70 -35
  129. package/highlevel/methods/messages/send-typing.d.cts +3 -3
  130. package/highlevel/methods/messages/send-typing.d.ts +3 -3
  131. package/highlevel/methods/messages/set-typing.cjs +1 -1
  132. package/highlevel/methods/messages/set-typing.d.cts +2 -2
  133. package/highlevel/methods/messages/set-typing.d.ts +2 -2
  134. package/highlevel/methods/messages/set-typing.js +1 -1
  135. package/highlevel/methods/users/resolve-peer.cjs +11 -1
  136. package/highlevel/methods/users/resolve-peer.js +11 -1
  137. package/highlevel/methods.d.cts +19 -0
  138. package/highlevel/methods.d.ts +19 -0
  139. package/highlevel/storage/service/peers.cjs +25 -0
  140. package/highlevel/storage/service/peers.js +25 -0
  141. package/highlevel/storage/service/peers.test.d.cts +1 -0
  142. package/highlevel/storage/service/peers.test.d.ts +1 -0
  143. package/highlevel/types/bots/keyboards/builder.cjs +5 -5
  144. package/highlevel/types/bots/keyboards/builder.d.cts +8 -9
  145. package/highlevel/types/bots/keyboards/builder.d.ts +8 -9
  146. package/highlevel/types/bots/keyboards/builder.js +5 -5
  147. package/highlevel/types/bots/keyboards/factories.cjs +51 -103
  148. package/highlevel/types/bots/keyboards/factories.d.cts +58 -89
  149. package/highlevel/types/bots/keyboards/factories.d.ts +58 -89
  150. package/highlevel/types/bots/keyboards/factories.js +51 -103
  151. package/highlevel/types/bots/keyboards/index.d.cts +3 -3
  152. package/highlevel/types/bots/keyboards/index.d.ts +3 -3
  153. package/highlevel/types/bots/keyboards/normalize.cjs +131 -0
  154. package/highlevel/types/bots/keyboards/normalize.d.cts +10 -0
  155. package/highlevel/types/bots/keyboards/normalize.d.ts +10 -0
  156. package/highlevel/types/bots/keyboards/normalize.js +126 -0
  157. package/highlevel/types/bots/keyboards/types.d.cts +160 -4
  158. package/highlevel/types/bots/keyboards/types.d.ts +160 -4
  159. package/highlevel/types/conversation.cjs +8 -0
  160. package/highlevel/types/conversation.d.cts +1 -0
  161. package/highlevel/types/conversation.d.ts +1 -0
  162. package/highlevel/types/conversation.js +10 -2
  163. package/highlevel/types/conversation.test.d.cts +1 -0
  164. package/highlevel/types/conversation.test.d.ts +1 -0
  165. package/highlevel/types/messages/dialog.cjs +8 -1
  166. package/highlevel/types/messages/dialog.d.cts +3 -0
  167. package/highlevel/types/messages/dialog.d.ts +3 -0
  168. package/highlevel/types/messages/dialog.js +8 -1
  169. package/highlevel/types/messages/dialog.test.d.cts +1 -0
  170. package/highlevel/types/messages/dialog.test.d.ts +1 -0
  171. package/highlevel/types/messages/ephemeral-message.cjs +135 -0
  172. package/highlevel/types/messages/ephemeral-message.d.cts +75 -0
  173. package/highlevel/types/messages/ephemeral-message.d.ts +75 -0
  174. package/highlevel/types/messages/ephemeral-message.js +130 -0
  175. package/highlevel/types/messages/index.d.cts +1 -0
  176. package/highlevel/types/messages/index.d.ts +1 -0
  177. package/highlevel/types/messages/message-action.cjs +14 -1
  178. package/highlevel/types/messages/message-action.d.cts +18 -1
  179. package/highlevel/types/messages/message-action.d.ts +18 -1
  180. package/highlevel/types/messages/message-action.js +14 -1
  181. package/highlevel/types/messages/message.cjs +7 -2
  182. package/highlevel/types/messages/message.d.cts +2 -2
  183. package/highlevel/types/messages/message.d.ts +2 -2
  184. package/highlevel/types/messages/message.js +8 -3
  185. package/highlevel/types/messages/replied-message.cjs +5 -1
  186. package/highlevel/types/messages/replied-message.d.cts +5 -1
  187. package/highlevel/types/messages/replied-message.d.ts +5 -1
  188. package/highlevel/types/messages/replied-message.js +5 -1
  189. package/highlevel/types/messages/rich/inner.cjs +37 -0
  190. package/highlevel/types/messages/rich/inner.d.cts +19 -0
  191. package/highlevel/types/messages/rich/inner.d.ts +19 -0
  192. package/highlevel/types/messages/rich/inner.js +37 -0
  193. package/highlevel/types/peers/chat.cjs +23 -3
  194. package/highlevel/types/peers/chat.d.cts +8 -3
  195. package/highlevel/types/peers/chat.d.ts +8 -3
  196. package/highlevel/types/peers/chat.js +24 -4
  197. package/highlevel/types/peers/community-peer.cjs +60 -0
  198. package/highlevel/types/peers/community-peer.d.cts +37 -0
  199. package/highlevel/types/peers/community-peer.d.ts +37 -0
  200. package/highlevel/types/peers/community-peer.js +55 -0
  201. package/highlevel/types/peers/full-chat.cjs +24 -5
  202. package/highlevel/types/peers/full-chat.d.cts +7 -0
  203. package/highlevel/types/peers/full-chat.d.ts +7 -0
  204. package/highlevel/types/peers/full-chat.js +24 -5
  205. package/highlevel/types/peers/index.d.cts +1 -0
  206. package/highlevel/types/peers/index.d.ts +1 -0
  207. package/highlevel/types/peers/peer.cjs +2 -0
  208. package/highlevel/types/peers/peer.js +2 -0
  209. package/highlevel/types/peers/typing-status.d.cts +4 -1
  210. package/highlevel/types/peers/typing-status.d.ts +4 -1
  211. package/highlevel/types/peers/user.cjs +6 -0
  212. package/highlevel/types/peers/user.d.cts +2 -0
  213. package/highlevel/types/peers/user.d.ts +2 -0
  214. package/highlevel/types/peers/user.js +6 -0
  215. package/highlevel/types/updates/delete-ephemeral-messages-update.cjs +27 -0
  216. package/highlevel/types/updates/delete-ephemeral-messages-update.d.cts +15 -0
  217. package/highlevel/types/updates/delete-ephemeral-messages-update.d.ts +15 -0
  218. package/highlevel/types/updates/delete-ephemeral-messages-update.js +22 -0
  219. package/highlevel/types/updates/ephemeral-callback-query.cjs +69 -0
  220. package/highlevel/types/updates/ephemeral-callback-query.d.cts +44 -0
  221. package/highlevel/types/updates/ephemeral-callback-query.d.ts +44 -0
  222. package/highlevel/types/updates/ephemeral-callback-query.js +64 -0
  223. package/highlevel/types/updates/index.d.cts +16 -2
  224. package/highlevel/types/updates/index.d.ts +16 -2
  225. package/highlevel/types/updates/parse-update.cjs +12 -1
  226. package/highlevel/types/updates/parse-update.js +12 -1
  227. package/highlevel/types/updates/user-typing-update.cjs +18 -0
  228. package/highlevel/types/updates/user-typing-update.d.cts +9 -0
  229. package/highlevel/types/updates/user-typing-update.d.ts +9 -0
  230. package/highlevel/types/updates/user-typing-update.js +18 -0
  231. package/highlevel/updates/manager.cjs +71 -41
  232. package/highlevel/updates/manager.d.cts +1 -0
  233. package/highlevel/updates/manager.d.ts +1 -0
  234. package/highlevel/updates/manager.js +71 -41
  235. package/highlevel/updates/manager.test.d.cts +1 -0
  236. package/highlevel/updates/manager.test.d.ts +1 -0
  237. package/highlevel/utils/stream-utils.cjs +8 -4
  238. package/highlevel/utils/stream-utils.js +8 -4
  239. package/highlevel/utils/stream-utils.test.d.cts +1 -0
  240. package/highlevel/utils/stream-utils.test.d.ts +1 -0
  241. package/highlevel/utils/walk-page-blocks.cjs +9 -0
  242. package/highlevel/utils/walk-page-blocks.js +9 -0
  243. package/index.cjs +10 -0
  244. package/index.js +11 -1
  245. package/methods.cjs +33 -0
  246. package/methods.js +33 -0
  247. package/network/client.cjs +4 -3
  248. package/network/client.d.cts +1 -0
  249. package/network/client.d.ts +1 -0
  250. package/network/client.js +4 -3
  251. package/network/middlewares/flood-waiter.cjs +2 -2
  252. package/network/middlewares/flood-waiter.js +2 -2
  253. package/network/middlewares/internal-errors.cjs +1 -1
  254. package/network/middlewares/internal-errors.js +1 -1
  255. package/network/middlewares/media-throttle.cjs +1 -1
  256. package/network/middlewares/media-throttle.js +1 -1
  257. package/network/mtproto-session.cjs +9 -2
  258. package/network/mtproto-session.d.cts +3 -1
  259. package/network/mtproto-session.d.ts +3 -1
  260. package/network/mtproto-session.js +9 -2
  261. package/network/mtproxy/index.cjs +4 -3
  262. package/network/mtproxy/index.d.cts +2 -2
  263. package/network/mtproxy/index.d.ts +2 -2
  264. package/network/mtproxy/index.js +4 -3
  265. package/network/network-manager.cjs +44 -16
  266. package/network/network-manager.d.cts +10 -3
  267. package/network/network-manager.d.ts +10 -3
  268. package/network/network-manager.js +45 -17
  269. package/network/network-manager.test.d.cts +1 -0
  270. package/network/network-manager.test.d.ts +1 -0
  271. package/network/persistent-connection.cjs +10 -2
  272. package/network/persistent-connection.js +10 -2
  273. package/network/session-connection.cjs +15 -6
  274. package/network/session-connection.js +15 -6
  275. package/network/session-connection.test.d.cts +1 -0
  276. package/network/session-connection.test.d.ts +1 -0
  277. package/network/transports/abstract.cjs +16 -0
  278. package/network/transports/abstract.d.cts +8 -2
  279. package/network/transports/abstract.d.ts +8 -2
  280. package/network/transports/abstract.js +17 -1
  281. package/network/transports/obfuscated.cjs +3 -1
  282. package/network/transports/obfuscated.js +3 -1
  283. package/package.json +6 -6
  284. package/tl/api-schema.json +1 -1
  285. package/tl/binary/reader.cjs +221 -103
  286. package/tl/binary/reader.js +221 -103
  287. package/tl/binary/writer.cjs +693 -277
  288. package/tl/binary/writer.js +693 -277
  289. package/tl/compat/reader.cjs +93 -0
  290. package/tl/compat/reader.js +93 -0
  291. package/tl/index.d.cts +12529 -4762
  292. package/tl/index.d.ts +12529 -4762
  293. package/tl/inner-tl.cjs +90 -24
  294. package/tl/inner-tl.js +90 -24
  295. package/tl/raw-errors.json +1 -1
  296. package/tl/rpc-error.test.d.cts +1 -0
  297. package/tl/rpc-error.test.d.ts +1 -0
  298. package/utils/abort-signal.cjs +1 -12
  299. package/utils/abort-signal.js +1 -12
  300. package/utils/abort-signal.test.d.cts +1 -0
  301. package/utils/abort-signal.test.d.ts +1 -0
  302. package/utils/binary/compat.cjs +189 -29
  303. package/utils/binary/compat.js +189 -29
  304. package/utils/early-timer.cjs +3 -11
  305. package/utils/early-timer.js +3 -11
  306. package/utils/early-timer.test.d.cts +1 -0
  307. package/utils/early-timer.test.d.ts +1 -0
  308. package/utils/function-utils.cjs +9 -4
  309. package/utils/function-utils.js +9 -4
  310. package/utils/links/bots.cjs +10 -2
  311. package/utils/links/bots.js +10 -2
  312. package/utils/peer-utils.cjs +8 -0
  313. package/utils/peer-utils.js +8 -0
@@ -156,6 +156,7 @@ export declare class MtClient {
156
156
  readonly log: Logger;
157
157
  readonly network: NetworkManager;
158
158
  private _abortController;
159
+ /** Signal that is aborted when the client is destroyed */
159
160
  readonly stopSignal: AbortSignal;
160
161
  readonly onUsable: Emitter<void>;
161
162
  readonly onConnecting: Emitter<void>;
@@ -156,6 +156,7 @@ export declare class MtClient {
156
156
  readonly log: Logger;
157
157
  readonly network: NetworkManager;
158
158
  private _abortController;
159
+ /** Signal that is aborted when the client is destroyed */
159
160
  readonly stopSignal: AbortSignal;
160
161
  readonly onUsable: Emitter<void>;
161
162
  readonly onConnecting: Emitter<void>;
package/network/client.js CHANGED
@@ -63,7 +63,6 @@ class MtClient {
63
63
  onConnecting: this.onConnecting.emit.bind(this.onConnecting),
64
64
  onNetworkChanged: this.onNetworkChanged.emit.bind(this.onNetworkChanged),
65
65
  onUpdate: this.onUpdate.emit.bind(this.onUpdate),
66
- stopSignal: this.stopSignal,
67
66
  platform: params.platform,
68
67
  ...dropUndefined(params.network)
69
68
  },
@@ -99,6 +98,7 @@ class MtClient {
99
98
  log;
100
99
  network;
101
100
  _abortController;
101
+ /** Signal that is aborted when the client is destroyed */
102
102
  stopSignal;
103
103
  onUsable = new Emitter();
104
104
  onConnecting = new Emitter();
@@ -136,12 +136,11 @@ class MtClient {
136
136
  return this._connect.run();
137
137
  }
138
138
  async disconnect() {
139
- await this.network.destroy();
139
+ await this.network.disconnect();
140
140
  await this.storage.save();
141
141
  this._config.destroy();
142
142
  this._prepare.reset();
143
143
  this._connect.reset();
144
- this._abortController.abort();
145
144
  this.log.debug("client disconnected");
146
145
  }
147
146
  /**
@@ -150,6 +149,8 @@ class MtClient {
150
149
  * **Note**: must be called *after* {@link disconnect}
151
150
  */
152
151
  async destroy() {
152
+ this._abortController.abort();
153
+ await this.network.destroy();
153
154
  await this.storage.destroy();
154
155
  this.log.debug("client destroyed");
155
156
  }
@@ -35,7 +35,7 @@ function floodWaiter(options) {
35
35
  if (delta <= minStoredWait) {
36
36
  storage.delete(method);
37
37
  } else if (delta <= floodSleepThreshold) {
38
- await miscUtils.sleepWithAbort(delta, abortSignal.combineAbortSignals(ctx.manager.params.stopSignal, ctx.params?.abortSignal));
38
+ await miscUtils.sleepWithAbort(delta, abortSignal.combineAbortSignals(ctx.manager.teardownSignal, ctx.params?.abortSignal));
39
39
  storage.delete(method);
40
40
  } else {
41
41
  return {
@@ -74,7 +74,7 @@ function floodWaiter(options) {
74
74
  }
75
75
  await miscUtils.sleepWithAbort(
76
76
  ms,
77
- abortSignal.combineAbortSignals(ctx.manager.params.stopSignal, ctx.params?.abortSignal)
77
+ abortSignal.combineAbortSignals(ctx.manager.teardownSignal, ctx.params?.abortSignal)
78
78
  );
79
79
  continue;
80
80
  }
@@ -28,7 +28,7 @@ function floodWaiter(options) {
28
28
  if (delta <= minStoredWait) {
29
29
  storage.delete(method);
30
30
  } else if (delta <= floodSleepThreshold) {
31
- await sleepWithAbort(delta, combineAbortSignals(ctx.manager.params.stopSignal, ctx.params?.abortSignal));
31
+ await sleepWithAbort(delta, combineAbortSignals(ctx.manager.teardownSignal, ctx.params?.abortSignal));
32
32
  storage.delete(method);
33
33
  } else {
34
34
  return {
@@ -67,7 +67,7 @@ function floodWaiter(options) {
67
67
  }
68
68
  await sleepWithAbort(
69
69
  ms,
70
- combineAbortSignals(ctx.manager.params.stopSignal, ctx.params?.abortSignal)
70
+ combineAbortSignals(ctx.manager.teardownSignal, ctx.params?.abortSignal)
71
71
  );
72
72
  continue;
73
73
  }
@@ -50,7 +50,7 @@ function internalErrorsHandler(params) {
50
50
  if (waitSeconds > 0) {
51
51
  await miscUtils.sleepWithAbort(
52
52
  waitSeconds * 1e3,
53
- abortSignal.combineAbortSignals(ctx.manager.params.stopSignal, ctx.params?.abortSignal)
53
+ abortSignal.combineAbortSignals(ctx.manager.teardownSignal, ctx.params?.abortSignal)
54
54
  );
55
55
  }
56
56
  continue;
@@ -43,7 +43,7 @@ function internalErrorsHandler(params) {
43
43
  if (waitSeconds > 0) {
44
44
  await sleepWithAbort(
45
45
  waitSeconds * 1e3,
46
- combineAbortSignals(ctx.manager.params.stopSignal, ctx.params?.abortSignal)
46
+ combineAbortSignals(ctx.manager.teardownSignal, ctx.params?.abortSignal)
47
47
  );
48
48
  }
49
49
  continue;
@@ -52,7 +52,7 @@ function mediaThrottle(params) {
52
52
  const dcId = ctx.params?.dcId ?? ctx.manager.getPrimaryDcId();
53
53
  const limiter = getLimiter(kind, dcId, ctx.manager.params.isPremium);
54
54
  if (!limiter.tryAcquire(bytes)) {
55
- const abortSignal$1 = abortSignal.combineAbortSignals(ctx.manager.params.stopSignal, ctx.params?.abortSignal);
55
+ const abortSignal$1 = abortSignal.combineAbortSignals(ctx.manager.teardownSignal, ctx.params?.abortSignal);
56
56
  await limiter.acquire(bytes, abortSignal$1);
57
57
  }
58
58
  try {
@@ -45,7 +45,7 @@ function mediaThrottle(params) {
45
45
  const dcId = ctx.params?.dcId ?? ctx.manager.getPrimaryDcId();
46
46
  const limiter = getLimiter(kind, dcId, ctx.manager.params.isPremium);
47
47
  if (!limiter.tryAcquire(bytes)) {
48
- const abortSignal = combineAbortSignals(ctx.manager.params.stopSignal, ctx.params?.abortSignal);
48
+ const abortSignal = combineAbortSignals(ctx.manager.teardownSignal, ctx.params?.abortSignal);
49
49
  await limiter.acquire(bytes, abortSignal);
50
50
  }
51
51
  try {
@@ -201,13 +201,20 @@ class MtprotoSession {
201
201
  else writer.object(content);
202
202
  return messageId;
203
203
  }
204
- resetLastPing(withTime = false) {
204
+ resetLastPing(withTime = false, keepPending = false) {
205
205
  if (withTime) this.lastPingTime = 0;
206
- if (!this.lastPingMsgId.isZero()) {
206
+ if (!keepPending && !this.lastPingMsgId.isZero()) {
207
207
  this.pendingMessages.delete(this.lastPingMsgId);
208
208
  }
209
209
  this.lastPingMsgId = Long.ZERO;
210
210
  }
211
+ forgetPendingPings() {
212
+ for (const [msgId, info] of this.pendingMessages) {
213
+ if (info._ === "ping") this.pendingMessages.delete(msgId);
214
+ }
215
+ this.lastPingTime = 0;
216
+ this.lastPingMsgId = Long.ZERO;
217
+ }
211
218
  addToChain(chainId, msgId) {
212
219
  const prevMsgId = this.chains.get(chainId);
213
220
  this.chains.set(chainId, msgId);
@@ -43,6 +43,7 @@ export type PendingMessage = {
43
43
  } | {
44
44
  _: 'ping';
45
45
  pingId: Long;
46
+ sentAt: number;
46
47
  containerId: Long;
47
48
  } | {
48
49
  _: 'destroy_session';
@@ -120,7 +121,8 @@ export declare class MtprotoSession {
120
121
  /** Decrypt a single MTProto message using session's keys */
121
122
  decryptMessage(data: Uint8Array, callback: Parameters<AuthKey['decryptMessage']>[2]): void;
122
123
  writeMessage(writer: TlBinaryWriter, content: tl.TlObject | mtp.TlObject | Uint8Array, isContentRelated?: boolean): Long;
123
- resetLastPing(withTime?: boolean): void;
124
+ resetLastPing(withTime?: boolean, keepPending?: boolean): void;
125
+ forgetPendingPings(): void;
124
126
  addToChain(chainId: string | number, msgId: Long): Long | undefined;
125
127
  removeFromChain(chainId: string | number, msgId: Long): void;
126
128
  getPendingChainedFails(chainId: string | number): SortedArray<PendingRpc>;
@@ -43,6 +43,7 @@ export type PendingMessage = {
43
43
  } | {
44
44
  _: 'ping';
45
45
  pingId: Long;
46
+ sentAt: number;
46
47
  containerId: Long;
47
48
  } | {
48
49
  _: 'destroy_session';
@@ -120,7 +121,8 @@ export declare class MtprotoSession {
120
121
  /** Decrypt a single MTProto message using session's keys */
121
122
  decryptMessage(data: Uint8Array, callback: Parameters<AuthKey['decryptMessage']>[2]): void;
122
123
  writeMessage(writer: TlBinaryWriter, content: tl.TlObject | mtp.TlObject | Uint8Array, isContentRelated?: boolean): Long;
123
- resetLastPing(withTime?: boolean): void;
124
+ resetLastPing(withTime?: boolean, keepPending?: boolean): void;
125
+ forgetPendingPings(): void;
124
126
  addToChain(chainId: string | number, msgId: Long): Long | undefined;
125
127
  removeFromChain(chainId: string | number, msgId: Long): void;
126
128
  getPendingChainedFails(chainId: string | number): SortedArray<PendingRpc>;
@@ -194,13 +194,20 @@ class MtprotoSession {
194
194
  else writer.object(content);
195
195
  return messageId;
196
196
  }
197
- resetLastPing(withTime = false) {
197
+ resetLastPing(withTime = false, keepPending = false) {
198
198
  if (withTime) this.lastPingTime = 0;
199
- if (!this.lastPingMsgId.isZero()) {
199
+ if (!keepPending && !this.lastPingMsgId.isZero()) {
200
200
  this.pendingMessages.delete(this.lastPingMsgId);
201
201
  }
202
202
  this.lastPingMsgId = Long.ZERO;
203
203
  }
204
+ forgetPendingPings() {
205
+ for (const [msgId, info] of this.pendingMessages) {
206
+ if (info._ === "ping") this.pendingMessages.delete(msgId);
207
+ }
208
+ this.lastPingTime = 0;
209
+ this.lastPingMsgId = Long.ZERO;
210
+ }
204
211
  addToChain(chainId, msgId) {
205
212
  const prevMsgId = this.chains.get(chainId);
206
213
  this.chains.set(chainId, msgId);
@@ -11,6 +11,7 @@ const errors = require("../../types/errors.cjs");
11
11
  const _fakeTls = require("./_fake-tls.cjs");
12
12
  const obfuscated = require("../transports/obfuscated.cjs");
13
13
  const intermediate = require("../transports/intermediate.cjs");
14
+ const abstract = require("../transports/abstract.cjs");
14
15
  const MAX_DOMAIN_LENGTH = 182;
15
16
  const TLS_START_SERVER = [
16
17
  new Uint8Array([22, 3, 3]),
@@ -86,13 +87,13 @@ class BaseMtProxyTransport {
86
87
  new obfuscated.ObfuscatedPacketCodec(new intermediate.PaddedIntermediatePacketCodec(), proxy)
87
88
  );
88
89
  }
89
- async connect() {
90
+ async connect(_dc, abortSignal) {
90
91
  const conn = await this._connectTcp({
91
92
  address: this._proxy.host,
92
93
  port: this._proxy.port
93
- });
94
+ }, abortSignal);
94
95
  if (this._fakeTlsDomain) {
95
- await this._handleConnectFakeTls(conn);
96
+ await abstract.performHandshakeWithAbort(conn, abortSignal, () => this._handleConnectFakeTls(conn));
96
97
  }
97
98
  return conn;
98
99
  }
@@ -23,7 +23,7 @@ export interface MtProxySettings {
23
23
  * Base for a TCP transport that connects via an MTProxy
24
24
  */
25
25
  export declare abstract class BaseMtProxyTransport implements TelegramTransport {
26
- abstract _connectTcp(endpoint: TcpEndpoint): Promise<ITcpConnection>;
26
+ abstract _connectTcp(endpoint: TcpEndpoint, abortSignal: AbortSignal): Promise<ITcpConnection>;
27
27
  readonly _proxy: MtProxySettings;
28
28
  private _rawSecret;
29
29
  private _randomPadding;
@@ -37,6 +37,6 @@ export declare abstract class BaseMtProxyTransport implements TelegramTransport
37
37
  constructor(proxy: MtProxySettings);
38
38
  getMtproxyInfo(): tl.RawInputClientProxy;
39
39
  packetCodec(dc: BasicDcOption): IPacketCodec;
40
- connect(): Promise<ITelegramConnection>;
40
+ connect(_dc: BasicDcOption, abortSignal: AbortSignal): Promise<ITelegramConnection>;
41
41
  private _handleConnectFakeTls;
42
42
  }
@@ -23,7 +23,7 @@ export interface MtProxySettings {
23
23
  * Base for a TCP transport that connects via an MTProxy
24
24
  */
25
25
  export declare abstract class BaseMtProxyTransport implements TelegramTransport {
26
- abstract _connectTcp(endpoint: TcpEndpoint): Promise<ITcpConnection>;
26
+ abstract _connectTcp(endpoint: TcpEndpoint, abortSignal: AbortSignal): Promise<ITcpConnection>;
27
27
  readonly _proxy: MtProxySettings;
28
28
  private _rawSecret;
29
29
  private _randomPadding;
@@ -37,6 +37,6 @@ export declare abstract class BaseMtProxyTransport implements TelegramTransport
37
37
  constructor(proxy: MtProxySettings);
38
38
  getMtproxyInfo(): tl.RawInputClientProxy;
39
39
  packetCodec(dc: BasicDcOption): IPacketCodec;
40
- connect(): Promise<ITelegramConnection>;
40
+ connect(_dc: BasicDcOption, abortSignal: AbortSignal): Promise<ITelegramConnection>;
41
41
  private _handleConnectFakeTls;
42
42
  }
@@ -4,6 +4,7 @@ import { MtSecurityError, MtUnsupportedError } from "../../types/errors.js";
4
4
  import { FakeTlsPacketCodec, generateFakeTlsHeader } from "./_fake-tls.js";
5
5
  import { ObfuscatedPacketCodec } from "../transports/obfuscated.js";
6
6
  import { PaddedIntermediatePacketCodec, IntermediatePacketCodec } from "../transports/intermediate.js";
7
+ import { performHandshakeWithAbort } from "../transports/abstract.js";
7
8
  const MAX_DOMAIN_LENGTH = 182;
8
9
  const TLS_START_SERVER = [
9
10
  new Uint8Array([22, 3, 3]),
@@ -79,13 +80,13 @@ class BaseMtProxyTransport {
79
80
  new ObfuscatedPacketCodec(new PaddedIntermediatePacketCodec(), proxy)
80
81
  );
81
82
  }
82
- async connect() {
83
+ async connect(_dc, abortSignal) {
83
84
  const conn = await this._connectTcp({
84
85
  address: this._proxy.host,
85
86
  port: this._proxy.port
86
- });
87
+ }, abortSignal);
87
88
  if (this._fakeTlsDomain) {
88
- await this._handleConnectFakeTls(conn);
89
+ await performHandshakeWithAbort(conn, abortSignal, () => this._handleConnectFakeTls(conn));
89
90
  }
90
91
  return conn;
91
92
  }
@@ -227,7 +227,7 @@ class NetworkManager {
227
227
  _: "initConnection",
228
228
  deviceModel,
229
229
  systemVersion: "1.0",
230
- appVersion: "0.30.3",
230
+ appVersion: "0.32.0",
231
231
  systemLangCode: "en",
232
232
  langPack: "",
233
233
  // "langPacks are for official apps only"
@@ -279,34 +279,45 @@ class NetworkManager {
279
279
  return { main, media };
280
280
  }
281
281
  _resetOnNetworkChange;
282
+ _destroyed = false;
283
+ _teardownAbort = new AbortController();
284
+ /** Signal that is aborted when the network manager is disconnected or destroyed */
285
+ get teardownSignal() {
286
+ return this._teardownAbort.signal;
287
+ }
288
+ _onPrimaryUsable = () => this.params.onUsable();
289
+ _onPrimaryWait = () => this.params.onConnecting();
290
+ _onPrimaryUpdate = (update) => this._updateHandler(update, false);
282
291
  _switchPrimaryDc(dc) {
283
292
  if (this._primaryDc && this._primaryDc !== dc) {
284
293
  this._primaryDc.setIsPrimary(false);
294
+ this._primaryDc.main.onUsable.remove(this._onPrimaryUsable);
295
+ this._primaryDc.main.onWait.remove(this._onPrimaryWait);
296
+ this._primaryDc.main.onUpdate.remove(this._onPrimaryUpdate);
285
297
  }
286
298
  this._primaryDc = dc;
287
299
  dc.setIsPrimary(true);
288
300
  this.params.onConnecting();
289
- dc.main.onUsable.add(() => {
290
- if (dc !== this._primaryDc) return;
291
- this.params.onUsable();
292
- });
293
- dc.main.onWait.add(() => {
294
- if (dc !== this._primaryDc) return;
295
- this.params.onConnecting();
296
- });
297
- dc.main.onUpdate.add((update) => {
298
- this._updateHandler(update, false);
299
- });
301
+ dc.main.onUsable.remove(this._onPrimaryUsable);
302
+ dc.main.onWait.remove(this._onPrimaryWait);
303
+ dc.main.onUpdate.remove(this._onPrimaryUpdate);
304
+ dc.main.onUsable.add(this._onPrimaryUsable);
305
+ dc.main.onWait.add(this._onPrimaryWait);
306
+ dc.main.onUpdate.add(this._onPrimaryUpdate);
300
307
  return dc.loadKeys().then(() => dc.main.ensureConnected());
301
308
  }
302
309
  _dcCreationPromise = /* @__PURE__ */ new Map();
303
310
  async _getOtherDc(dcId) {
311
+ if (this._destroyed) {
312
+ throw new errors.MtcuteError("Network manager is destroyed");
313
+ }
304
314
  if (!this._dcConnections.has(dcId)) {
305
315
  if (this._dcCreationPromise.has(dcId)) {
306
316
  await this._dcCreationPromise.get(dcId);
307
317
  return utils.asNonNull(this._dcConnections.get(dcId));
308
318
  }
309
319
  const promise = new utils.Deferred();
320
+ promise.promise.catch(utils.noop);
310
321
  this._dcCreationPromise.set(dcId, promise.promise);
311
322
  this._log.debug("creating new DC %d", dcId);
312
323
  try {
@@ -323,7 +334,7 @@ class NetworkManager {
323
334
  this._log.debug("dc %d was not created: %e", dcId, e);
324
335
  promise.reject(e);
325
336
  this._dcCreationPromise.delete(dcId);
326
- return this._getOtherDc(dcId);
337
+ throw e;
327
338
  }
328
339
  }
329
340
  return this._dcConnections.get(dcId);
@@ -334,9 +345,15 @@ class NetworkManager {
334
345
  * @param defaultDcs Default DCs to connect to
335
346
  */
336
347
  async connect(defaultDcs) {
348
+ if (this._destroyed) {
349
+ throw new errors.MtcuteError("Network manager is destroyed");
350
+ }
337
351
  if (defaultDcs.main.id !== defaultDcs.media.id) {
338
352
  throw new errors.MtArgumentError("Default DCs must be the same");
339
353
  }
354
+ if (this._teardownAbort.signal.aborted) {
355
+ this._teardownAbort = new AbortController();
356
+ }
340
357
  if (this._dcConnections.has(defaultDcs.main.id)) {
341
358
  throw new errors.MtArgumentError("DC manager already exists");
342
359
  }
@@ -375,11 +392,12 @@ class NetworkManager {
375
392
  }
376
393
  typeAssertions.assertTypeIs("auth.importAuthorization", res, "auth.authorization");
377
394
  promise.resolve();
378
- this._pendingExports.delete(manager.dcId);
379
395
  } catch (e) {
380
396
  this._log.warn("failed to export auth to dc %d: %s", manager.dcId, e);
381
397
  promise.reject(e);
382
398
  throw e;
399
+ } finally {
400
+ this._pendingExports.delete(manager.dcId);
383
401
  }
384
402
  }
385
403
  setIsPremium(isPremium) {
@@ -449,6 +467,9 @@ class NetworkManager {
449
467
  }
450
468
  }
451
469
  async changePrimaryDc(newDc) {
470
+ if (this._destroyed) {
471
+ throw new errors.MtcuteError("Network manager is destroyed");
472
+ }
452
473
  if (newDc === this._primaryDc?.dcId) return;
453
474
  const options = await this._findDcOptions(newDc);
454
475
  if (!this._dcConnections.has(newDc)) {
@@ -581,13 +602,20 @@ class NetworkManager {
581
602
  if (!this._primaryDc) throw new errors.MtcuteError("Not connected to any DC");
582
603
  return this._primaryDc.dcId;
583
604
  }
584
- async destroy() {
605
+ async disconnect() {
606
+ this._teardownAbort.abort();
607
+ this._primaryDc = void 0;
585
608
  for (const dc of this._dcConnections.values()) {
586
609
  await dc.destroy();
587
610
  }
588
611
  this._dcConnections.clear();
589
- this.config.onUpdated.remove(this._onConfigChanged);
590
612
  this._resetOnNetworkChange?.();
613
+ this._resetOnNetworkChange = void 0;
614
+ }
615
+ async destroy() {
616
+ this._destroyed = true;
617
+ await this.disconnect();
618
+ this.config.onUpdated.remove(this._onConfigChanged);
591
619
  }
592
620
  getMtprotoMessageId() {
593
621
  return this._primaryDc.main._connections[0]._session.getMessageId();
@@ -36,7 +36,6 @@ export interface NetworkManagerParams {
36
36
  onUsable: () => void;
37
37
  onConnecting: () => void;
38
38
  onNetworkChanged: (connected: boolean) => void;
39
- stopSignal: AbortSignal;
40
39
  }
41
40
  export type ConnectionCountDelegate = (kind: ConnectionKind, dcId: number, isPremium: boolean) => number;
42
41
  /**
@@ -238,13 +237,20 @@ export declare class NetworkManager {
238
237
  readonly _transport: TelegramTransport;
239
238
  readonly _reconnectionStrategy: ReconnectionStrategy;
240
239
  readonly _connectionCount: ConnectionCountDelegate;
241
- protected readonly _dcConnections: Map<number, DcConnectionManager>;
242
- protected _primaryDc?: DcConnectionManager;
240
+ readonly _dcConnections: Map<number, DcConnectionManager>;
241
+ _primaryDc?: DcConnectionManager;
243
242
  protected _primaryDcRecreationPromise?: Deferred<void>;
244
243
  private _updateHandler;
245
244
  constructor(params: NetworkManagerParams & NetworkManagerExtraParams, config: ConfigManager);
246
245
  private _findDcOptions;
247
246
  private _resetOnNetworkChange?;
247
+ private _destroyed;
248
+ private _teardownAbort;
249
+ /** Signal that is aborted when the network manager is disconnected or destroyed */
250
+ get teardownSignal(): AbortSignal;
251
+ private _onPrimaryUsable;
252
+ private _onPrimaryWait;
253
+ private _onPrimaryUpdate;
248
254
  private _switchPrimaryDc;
249
255
  private _dcCreationPromise;
250
256
  _getOtherDc(dcId: number): Promise<DcConnectionManager>;
@@ -271,6 +277,7 @@ export declare class NetworkManager {
271
277
  changeTransport(transport: TelegramTransport): Promise<void>;
272
278
  getPoolSize(kind: ConnectionKind, dcId?: number): number;
273
279
  getPrimaryDcId(): number;
280
+ disconnect(): Promise<void>;
274
281
  destroy(): Promise<void>;
275
282
  getMtprotoMessageId(): Long;
276
283
  recreateDc(dcId: number): Promise<void>;
@@ -36,7 +36,6 @@ export interface NetworkManagerParams {
36
36
  onUsable: () => void;
37
37
  onConnecting: () => void;
38
38
  onNetworkChanged: (connected: boolean) => void;
39
- stopSignal: AbortSignal;
40
39
  }
41
40
  export type ConnectionCountDelegate = (kind: ConnectionKind, dcId: number, isPremium: boolean) => number;
42
41
  /**
@@ -238,13 +237,20 @@ export declare class NetworkManager {
238
237
  readonly _transport: TelegramTransport;
239
238
  readonly _reconnectionStrategy: ReconnectionStrategy;
240
239
  readonly _connectionCount: ConnectionCountDelegate;
241
- protected readonly _dcConnections: Map<number, DcConnectionManager>;
242
- protected _primaryDc?: DcConnectionManager;
240
+ readonly _dcConnections: Map<number, DcConnectionManager>;
241
+ _primaryDc?: DcConnectionManager;
243
242
  protected _primaryDcRecreationPromise?: Deferred<void>;
244
243
  private _updateHandler;
245
244
  constructor(params: NetworkManagerParams & NetworkManagerExtraParams, config: ConfigManager);
246
245
  private _findDcOptions;
247
246
  private _resetOnNetworkChange?;
247
+ private _destroyed;
248
+ private _teardownAbort;
249
+ /** Signal that is aborted when the network manager is disconnected or destroyed */
250
+ get teardownSignal(): AbortSignal;
251
+ private _onPrimaryUsable;
252
+ private _onPrimaryWait;
253
+ private _onPrimaryUpdate;
248
254
  private _switchPrimaryDc;
249
255
  private _dcCreationPromise;
250
256
  _getOtherDc(dcId: number): Promise<DcConnectionManager>;
@@ -271,6 +277,7 @@ export declare class NetworkManager {
271
277
  changeTransport(transport: TelegramTransport): Promise<void>;
272
278
  getPoolSize(kind: ConnectionKind, dcId?: number): number;
273
279
  getPrimaryDcId(): number;
280
+ disconnect(): Promise<void>;
274
281
  destroy(): Promise<void>;
275
282
  getMtprotoMessageId(): Long;
276
283
  recreateDc(dcId: number): Promise<void>;
@@ -1,5 +1,5 @@
1
1
  import { defaultReconnectionStrategy } from "@fuman/net";
2
- import { asNonNull, Deferred, LruMap, composeMiddlewares } from "@fuman/utils";
2
+ import { asNonNull, Deferred, noop, LruMap, composeMiddlewares } from "@fuman/utils";
3
3
  import { dropUndefined } from "../utils/misc-utils.js";
4
4
  import { isTlRpcError, assertTypeIs } from "../utils/type-assertions.js";
5
5
  import "@mtcute/tl-runtime";
@@ -220,7 +220,7 @@ class NetworkManager {
220
220
  _: "initConnection",
221
221
  deviceModel,
222
222
  systemVersion: "1.0",
223
- appVersion: "0.30.3",
223
+ appVersion: "0.32.0",
224
224
  systemLangCode: "en",
225
225
  langPack: "",
226
226
  // "langPacks are for official apps only"
@@ -272,34 +272,45 @@ class NetworkManager {
272
272
  return { main, media };
273
273
  }
274
274
  _resetOnNetworkChange;
275
+ _destroyed = false;
276
+ _teardownAbort = new AbortController();
277
+ /** Signal that is aborted when the network manager is disconnected or destroyed */
278
+ get teardownSignal() {
279
+ return this._teardownAbort.signal;
280
+ }
281
+ _onPrimaryUsable = () => this.params.onUsable();
282
+ _onPrimaryWait = () => this.params.onConnecting();
283
+ _onPrimaryUpdate = (update) => this._updateHandler(update, false);
275
284
  _switchPrimaryDc(dc) {
276
285
  if (this._primaryDc && this._primaryDc !== dc) {
277
286
  this._primaryDc.setIsPrimary(false);
287
+ this._primaryDc.main.onUsable.remove(this._onPrimaryUsable);
288
+ this._primaryDc.main.onWait.remove(this._onPrimaryWait);
289
+ this._primaryDc.main.onUpdate.remove(this._onPrimaryUpdate);
278
290
  }
279
291
  this._primaryDc = dc;
280
292
  dc.setIsPrimary(true);
281
293
  this.params.onConnecting();
282
- dc.main.onUsable.add(() => {
283
- if (dc !== this._primaryDc) return;
284
- this.params.onUsable();
285
- });
286
- dc.main.onWait.add(() => {
287
- if (dc !== this._primaryDc) return;
288
- this.params.onConnecting();
289
- });
290
- dc.main.onUpdate.add((update) => {
291
- this._updateHandler(update, false);
292
- });
294
+ dc.main.onUsable.remove(this._onPrimaryUsable);
295
+ dc.main.onWait.remove(this._onPrimaryWait);
296
+ dc.main.onUpdate.remove(this._onPrimaryUpdate);
297
+ dc.main.onUsable.add(this._onPrimaryUsable);
298
+ dc.main.onWait.add(this._onPrimaryWait);
299
+ dc.main.onUpdate.add(this._onPrimaryUpdate);
293
300
  return dc.loadKeys().then(() => dc.main.ensureConnected());
294
301
  }
295
302
  _dcCreationPromise = /* @__PURE__ */ new Map();
296
303
  async _getOtherDc(dcId) {
304
+ if (this._destroyed) {
305
+ throw new MtcuteError("Network manager is destroyed");
306
+ }
297
307
  if (!this._dcConnections.has(dcId)) {
298
308
  if (this._dcCreationPromise.has(dcId)) {
299
309
  await this._dcCreationPromise.get(dcId);
300
310
  return asNonNull(this._dcConnections.get(dcId));
301
311
  }
302
312
  const promise = new Deferred();
313
+ promise.promise.catch(noop);
303
314
  this._dcCreationPromise.set(dcId, promise.promise);
304
315
  this._log.debug("creating new DC %d", dcId);
305
316
  try {
@@ -316,7 +327,7 @@ class NetworkManager {
316
327
  this._log.debug("dc %d was not created: %e", dcId, e);
317
328
  promise.reject(e);
318
329
  this._dcCreationPromise.delete(dcId);
319
- return this._getOtherDc(dcId);
330
+ throw e;
320
331
  }
321
332
  }
322
333
  return this._dcConnections.get(dcId);
@@ -327,9 +338,15 @@ class NetworkManager {
327
338
  * @param defaultDcs Default DCs to connect to
328
339
  */
329
340
  async connect(defaultDcs) {
341
+ if (this._destroyed) {
342
+ throw new MtcuteError("Network manager is destroyed");
343
+ }
330
344
  if (defaultDcs.main.id !== defaultDcs.media.id) {
331
345
  throw new MtArgumentError("Default DCs must be the same");
332
346
  }
347
+ if (this._teardownAbort.signal.aborted) {
348
+ this._teardownAbort = new AbortController();
349
+ }
333
350
  if (this._dcConnections.has(defaultDcs.main.id)) {
334
351
  throw new MtArgumentError("DC manager already exists");
335
352
  }
@@ -368,11 +385,12 @@ class NetworkManager {
368
385
  }
369
386
  assertTypeIs("auth.importAuthorization", res, "auth.authorization");
370
387
  promise.resolve();
371
- this._pendingExports.delete(manager.dcId);
372
388
  } catch (e) {
373
389
  this._log.warn("failed to export auth to dc %d: %s", manager.dcId, e);
374
390
  promise.reject(e);
375
391
  throw e;
392
+ } finally {
393
+ this._pendingExports.delete(manager.dcId);
376
394
  }
377
395
  }
378
396
  setIsPremium(isPremium) {
@@ -442,6 +460,9 @@ class NetworkManager {
442
460
  }
443
461
  }
444
462
  async changePrimaryDc(newDc) {
463
+ if (this._destroyed) {
464
+ throw new MtcuteError("Network manager is destroyed");
465
+ }
445
466
  if (newDc === this._primaryDc?.dcId) return;
446
467
  const options = await this._findDcOptions(newDc);
447
468
  if (!this._dcConnections.has(newDc)) {
@@ -574,13 +595,20 @@ class NetworkManager {
574
595
  if (!this._primaryDc) throw new MtcuteError("Not connected to any DC");
575
596
  return this._primaryDc.dcId;
576
597
  }
577
- async destroy() {
598
+ async disconnect() {
599
+ this._teardownAbort.abort();
600
+ this._primaryDc = void 0;
578
601
  for (const dc of this._dcConnections.values()) {
579
602
  await dc.destroy();
580
603
  }
581
604
  this._dcConnections.clear();
582
- this.config.onUpdated.remove(this._onConfigChanged);
583
605
  this._resetOnNetworkChange?.();
606
+ this._resetOnNetworkChange = void 0;
607
+ }
608
+ async destroy() {
609
+ this._destroyed = true;
610
+ await this.disconnect();
611
+ this.config.onUpdated.remove(this._onConfigChanged);
584
612
  }
585
613
  getMtprotoMessageId() {
586
614
  return this._primaryDc.main._connections[0]._session.getMessageId();
@@ -0,0 +1 @@
1
+ export {};