@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.
- package/client.cjs +85 -0
- package/client.js +85 -0
- package/highlevel/client.d.cts +411 -116
- package/highlevel/client.d.ts +411 -116
- package/highlevel/methods/auth/sign-in-qr.cjs +2 -0
- package/highlevel/methods/auth/sign-in-qr.js +2 -0
- package/highlevel/methods/auth/sign-in-qr.test.d.cts +1 -0
- package/highlevel/methods/auth/sign-in-qr.test.d.ts +1 -0
- package/highlevel/methods/chats/build-peers-index.cjs +45 -0
- package/highlevel/methods/chats/build-peers-index.d.cts +13 -0
- package/highlevel/methods/chats/build-peers-index.d.ts +13 -0
- package/highlevel/methods/chats/build-peers-index.js +40 -0
- package/highlevel/methods/chats/join-chat.cjs +1 -1
- package/highlevel/methods/chats/join-chat.d.cts +2 -1
- package/highlevel/methods/chats/join-chat.d.ts +2 -1
- package/highlevel/methods/chats/join-chat.js +1 -1
- package/highlevel/methods/chats/transfer-chat-ownership.cjs +6 -17
- package/highlevel/methods/chats/transfer-chat-ownership.js +6 -17
- package/highlevel/methods/communities/ban-community-participant.cjs +30 -0
- package/highlevel/methods/communities/ban-community-participant.d.cts +20 -0
- package/highlevel/methods/communities/ban-community-participant.d.ts +20 -0
- package/highlevel/methods/communities/ban-community-participant.js +25 -0
- package/highlevel/methods/communities/create-community.cjs +29 -0
- package/highlevel/methods/communities/create-community.d.cts +22 -0
- package/highlevel/methods/communities/create-community.d.ts +22 -0
- package/highlevel/methods/communities/create-community.js +24 -0
- package/highlevel/methods/communities/get-community-link-requests.cjs +27 -0
- package/highlevel/methods/communities/get-community-link-requests.d.cts +17 -0
- package/highlevel/methods/communities/get-community-link-requests.d.ts +17 -0
- package/highlevel/methods/communities/get-community-link-requests.js +22 -0
- package/highlevel/methods/communities/get-community-participant-chats.cjs +24 -0
- package/highlevel/methods/communities/get-community-participant-chats.d.cts +17 -0
- package/highlevel/methods/communities/get-community-participant-chats.d.ts +17 -0
- package/highlevel/methods/communities/get-community-participant-chats.js +19 -0
- package/highlevel/methods/communities/get-joined-communities.cjs +21 -0
- package/highlevel/methods/communities/get-joined-communities.d.cts +6 -0
- package/highlevel/methods/communities/get-joined-communities.d.ts +6 -0
- package/highlevel/methods/communities/get-joined-communities.js +16 -0
- package/highlevel/methods/communities/hide-community-link-request.cjs +30 -0
- package/highlevel/methods/communities/hide-community-link-request.d.cts +22 -0
- package/highlevel/methods/communities/hide-community-link-request.d.ts +22 -0
- package/highlevel/methods/communities/hide-community-link-request.js +25 -0
- package/highlevel/methods/communities/link-community-peer.cjs +32 -0
- package/highlevel/methods/communities/link-community-peer.d.cts +22 -0
- package/highlevel/methods/communities/link-community-peer.d.ts +22 -0
- package/highlevel/methods/communities/link-community-peer.js +27 -0
- package/highlevel/methods/communities/toggle-community-collapsed.cjs +18 -0
- package/highlevel/methods/communities/toggle-community-collapsed.d.cts +16 -0
- package/highlevel/methods/communities/toggle-community-collapsed.d.ts +16 -0
- package/highlevel/methods/communities/toggle-community-collapsed.js +13 -0
- package/highlevel/methods/ephemeral/delete-all-welcome-messages.cjs +17 -0
- package/highlevel/methods/ephemeral/delete-all-welcome-messages.d.cts +8 -0
- package/highlevel/methods/ephemeral/delete-all-welcome-messages.d.ts +8 -0
- package/highlevel/methods/ephemeral/delete-all-welcome-messages.js +12 -0
- package/highlevel/methods/ephemeral/delete-ephemeral-message.cjs +20 -0
- package/highlevel/methods/ephemeral/delete-ephemeral-message.d.cts +13 -0
- package/highlevel/methods/ephemeral/delete-ephemeral-message.d.ts +13 -0
- package/highlevel/methods/ephemeral/delete-ephemeral-message.js +15 -0
- package/highlevel/methods/ephemeral/delete-welcome-message.cjs +18 -0
- package/highlevel/methods/ephemeral/delete-welcome-message.d.cts +9 -0
- package/highlevel/methods/ephemeral/delete-welcome-message.d.ts +9 -0
- package/highlevel/methods/ephemeral/delete-welcome-message.js +13 -0
- package/highlevel/methods/ephemeral/edit-ephemeral-message.cjs +41 -0
- package/highlevel/methods/ephemeral/edit-ephemeral-message.d.cts +39 -0
- package/highlevel/methods/ephemeral/edit-ephemeral-message.d.ts +39 -0
- package/highlevel/methods/ephemeral/edit-ephemeral-message.js +36 -0
- package/highlevel/methods/ephemeral/find-in-update.cjs +27 -0
- package/highlevel/methods/ephemeral/find-in-update.d.cts +8 -0
- package/highlevel/methods/ephemeral/find-in-update.d.ts +8 -0
- package/highlevel/methods/ephemeral/find-in-update.js +22 -0
- package/highlevel/methods/ephemeral/get-ephemeral-callback-answer.cjs +31 -0
- package/highlevel/methods/ephemeral/get-ephemeral-callback-answer.d.cts +29 -0
- package/highlevel/methods/ephemeral/get-ephemeral-callback-answer.d.ts +29 -0
- package/highlevel/methods/ephemeral/get-ephemeral-callback-answer.js +26 -0
- package/highlevel/methods/ephemeral/get-welcome-messages.cjs +29 -0
- package/highlevel/methods/ephemeral/get-welcome-messages.d.cts +8 -0
- package/highlevel/methods/ephemeral/get-welcome-messages.d.ts +8 -0
- package/highlevel/methods/ephemeral/get-welcome-messages.js +24 -0
- package/highlevel/methods/ephemeral/send-ephemeral-message.cjs +48 -0
- package/highlevel/methods/ephemeral/send-ephemeral-message.d.cts +47 -0
- package/highlevel/methods/ephemeral/send-ephemeral-message.d.ts +47 -0
- package/highlevel/methods/ephemeral/send-ephemeral-message.js +43 -0
- package/highlevel/methods/files/download-iterable.cjs +7 -2
- package/highlevel/methods/files/download-iterable.js +7 -2
- package/highlevel/methods/files/download-iterable.test.d.cts +1 -0
- package/highlevel/methods/files/download-iterable.test.d.ts +1 -0
- package/highlevel/methods/files/download-stream.cjs +5 -6
- package/highlevel/methods/files/download-stream.js +5 -6
- package/highlevel/methods/files/normalize-input-media.cjs +25 -4
- package/highlevel/methods/files/normalize-input-media.js +25 -4
- package/highlevel/methods/forums/create-forum-topic.d.cts +7 -0
- package/highlevel/methods/forums/create-forum-topic.d.ts +7 -0
- package/highlevel/methods/forums/delete-forum-topic-history.d.cts +1 -1
- package/highlevel/methods/forums/delete-forum-topic-history.d.ts +1 -1
- package/highlevel/methods/forums/edit-forum-topic.cjs +2 -2
- package/highlevel/methods/forums/edit-forum-topic.d.cts +2 -2
- package/highlevel/methods/forums/edit-forum-topic.d.ts +2 -2
- package/highlevel/methods/forums/edit-forum-topic.js +2 -2
- package/highlevel/methods/forums/get-forum-topics-by-id.cjs +5 -1
- package/highlevel/methods/forums/get-forum-topics-by-id.d.cts +9 -1
- package/highlevel/methods/forums/get-forum-topics-by-id.d.ts +9 -1
- package/highlevel/methods/forums/get-forum-topics-by-id.js +5 -1
- package/highlevel/methods/forums/get-forum-topics-by-id.test.d.cts +1 -0
- package/highlevel/methods/forums/get-forum-topics-by-id.test.d.ts +1 -0
- package/highlevel/methods/forums/get-forum-topics.cjs +1 -1
- package/highlevel/methods/forums/get-forum-topics.js +1 -1
- package/highlevel/methods/forums/toggle-forum-topic-closed.cjs +1 -1
- package/highlevel/methods/forums/toggle-forum-topic-closed.d.cts +1 -1
- package/highlevel/methods/forums/toggle-forum-topic-closed.d.ts +1 -1
- package/highlevel/methods/forums/toggle-forum-topic-closed.js +1 -1
- package/highlevel/methods/forums/toggle-forum-topic-pinned.d.cts +1 -1
- package/highlevel/methods/forums/toggle-forum-topic-pinned.d.ts +1 -1
- package/highlevel/methods/forums/toggle-general-topic-hidden.cjs +3 -3
- package/highlevel/methods/forums/toggle-general-topic-hidden.js +4 -4
- package/highlevel/methods/gifts/buy-resale-gift.cjs +5 -2
- package/highlevel/methods/gifts/buy-resale-gift.d.cts +11 -1
- package/highlevel/methods/gifts/buy-resale-gift.d.ts +11 -1
- package/highlevel/methods/gifts/buy-resale-gift.js +5 -2
- package/highlevel/methods/messages/forward-messages.cjs +1 -0
- package/highlevel/methods/messages/forward-messages.d.cts +2 -0
- package/highlevel/methods/messages/forward-messages.d.ts +2 -0
- package/highlevel/methods/messages/forward-messages.js +1 -0
- package/highlevel/methods/messages/normalize-rich-message.cjs +3 -0
- package/highlevel/methods/messages/normalize-rich-message.js +3 -0
- package/highlevel/methods/messages/send-common.d.cts +7 -1
- package/highlevel/methods/messages/send-common.d.ts +7 -1
- package/highlevel/methods/messages/send-text.cjs +70 -35
- package/highlevel/methods/messages/send-text.js +70 -35
- package/highlevel/methods/messages/send-typing.d.cts +3 -3
- package/highlevel/methods/messages/send-typing.d.ts +3 -3
- package/highlevel/methods/messages/set-typing.cjs +1 -1
- package/highlevel/methods/messages/set-typing.d.cts +2 -2
- package/highlevel/methods/messages/set-typing.d.ts +2 -2
- package/highlevel/methods/messages/set-typing.js +1 -1
- package/highlevel/methods/users/resolve-peer.cjs +11 -1
- package/highlevel/methods/users/resolve-peer.js +11 -1
- package/highlevel/methods.d.cts +19 -0
- package/highlevel/methods.d.ts +19 -0
- package/highlevel/storage/service/peers.cjs +25 -0
- package/highlevel/storage/service/peers.js +25 -0
- package/highlevel/storage/service/peers.test.d.cts +1 -0
- package/highlevel/storage/service/peers.test.d.ts +1 -0
- package/highlevel/types/bots/keyboards/builder.cjs +5 -5
- package/highlevel/types/bots/keyboards/builder.d.cts +8 -9
- package/highlevel/types/bots/keyboards/builder.d.ts +8 -9
- package/highlevel/types/bots/keyboards/builder.js +5 -5
- package/highlevel/types/bots/keyboards/factories.cjs +51 -103
- package/highlevel/types/bots/keyboards/factories.d.cts +58 -89
- package/highlevel/types/bots/keyboards/factories.d.ts +58 -89
- package/highlevel/types/bots/keyboards/factories.js +51 -103
- package/highlevel/types/bots/keyboards/index.d.cts +3 -3
- package/highlevel/types/bots/keyboards/index.d.ts +3 -3
- package/highlevel/types/bots/keyboards/normalize.cjs +131 -0
- package/highlevel/types/bots/keyboards/normalize.d.cts +10 -0
- package/highlevel/types/bots/keyboards/normalize.d.ts +10 -0
- package/highlevel/types/bots/keyboards/normalize.js +126 -0
- package/highlevel/types/bots/keyboards/types.d.cts +160 -4
- package/highlevel/types/bots/keyboards/types.d.ts +160 -4
- package/highlevel/types/conversation.cjs +8 -0
- package/highlevel/types/conversation.d.cts +1 -0
- package/highlevel/types/conversation.d.ts +1 -0
- package/highlevel/types/conversation.js +10 -2
- package/highlevel/types/conversation.test.d.cts +1 -0
- package/highlevel/types/conversation.test.d.ts +1 -0
- package/highlevel/types/messages/dialog.cjs +8 -1
- package/highlevel/types/messages/dialog.d.cts +3 -0
- package/highlevel/types/messages/dialog.d.ts +3 -0
- package/highlevel/types/messages/dialog.js +8 -1
- package/highlevel/types/messages/dialog.test.d.cts +1 -0
- package/highlevel/types/messages/dialog.test.d.ts +1 -0
- package/highlevel/types/messages/ephemeral-message.cjs +135 -0
- package/highlevel/types/messages/ephemeral-message.d.cts +75 -0
- package/highlevel/types/messages/ephemeral-message.d.ts +75 -0
- package/highlevel/types/messages/ephemeral-message.js +130 -0
- package/highlevel/types/messages/index.d.cts +1 -0
- package/highlevel/types/messages/index.d.ts +1 -0
- package/highlevel/types/messages/message-action.cjs +14 -1
- package/highlevel/types/messages/message-action.d.cts +18 -1
- package/highlevel/types/messages/message-action.d.ts +18 -1
- package/highlevel/types/messages/message-action.js +14 -1
- package/highlevel/types/messages/message.cjs +7 -2
- package/highlevel/types/messages/message.d.cts +2 -2
- package/highlevel/types/messages/message.d.ts +2 -2
- package/highlevel/types/messages/message.js +8 -3
- package/highlevel/types/messages/replied-message.cjs +5 -1
- package/highlevel/types/messages/replied-message.d.cts +5 -1
- package/highlevel/types/messages/replied-message.d.ts +5 -1
- package/highlevel/types/messages/replied-message.js +5 -1
- package/highlevel/types/messages/rich/inner.cjs +37 -0
- package/highlevel/types/messages/rich/inner.d.cts +19 -0
- package/highlevel/types/messages/rich/inner.d.ts +19 -0
- package/highlevel/types/messages/rich/inner.js +37 -0
- package/highlevel/types/peers/chat.cjs +23 -3
- package/highlevel/types/peers/chat.d.cts +8 -3
- package/highlevel/types/peers/chat.d.ts +8 -3
- package/highlevel/types/peers/chat.js +24 -4
- package/highlevel/types/peers/community-peer.cjs +60 -0
- package/highlevel/types/peers/community-peer.d.cts +37 -0
- package/highlevel/types/peers/community-peer.d.ts +37 -0
- package/highlevel/types/peers/community-peer.js +55 -0
- package/highlevel/types/peers/full-chat.cjs +24 -5
- package/highlevel/types/peers/full-chat.d.cts +7 -0
- package/highlevel/types/peers/full-chat.d.ts +7 -0
- package/highlevel/types/peers/full-chat.js +24 -5
- package/highlevel/types/peers/index.d.cts +1 -0
- package/highlevel/types/peers/index.d.ts +1 -0
- package/highlevel/types/peers/peer.cjs +2 -0
- package/highlevel/types/peers/peer.js +2 -0
- package/highlevel/types/peers/typing-status.d.cts +4 -1
- package/highlevel/types/peers/typing-status.d.ts +4 -1
- package/highlevel/types/peers/user.cjs +6 -0
- package/highlevel/types/peers/user.d.cts +2 -0
- package/highlevel/types/peers/user.d.ts +2 -0
- package/highlevel/types/peers/user.js +6 -0
- package/highlevel/types/updates/delete-ephemeral-messages-update.cjs +27 -0
- package/highlevel/types/updates/delete-ephemeral-messages-update.d.cts +15 -0
- package/highlevel/types/updates/delete-ephemeral-messages-update.d.ts +15 -0
- package/highlevel/types/updates/delete-ephemeral-messages-update.js +22 -0
- package/highlevel/types/updates/ephemeral-callback-query.cjs +69 -0
- package/highlevel/types/updates/ephemeral-callback-query.d.cts +44 -0
- package/highlevel/types/updates/ephemeral-callback-query.d.ts +44 -0
- package/highlevel/types/updates/ephemeral-callback-query.js +64 -0
- package/highlevel/types/updates/index.d.cts +16 -2
- package/highlevel/types/updates/index.d.ts +16 -2
- package/highlevel/types/updates/parse-update.cjs +12 -1
- package/highlevel/types/updates/parse-update.js +12 -1
- package/highlevel/types/updates/user-typing-update.cjs +18 -0
- package/highlevel/types/updates/user-typing-update.d.cts +9 -0
- package/highlevel/types/updates/user-typing-update.d.ts +9 -0
- package/highlevel/types/updates/user-typing-update.js +18 -0
- package/highlevel/updates/manager.cjs +71 -41
- package/highlevel/updates/manager.d.cts +1 -0
- package/highlevel/updates/manager.d.ts +1 -0
- package/highlevel/updates/manager.js +71 -41
- package/highlevel/updates/manager.test.d.cts +1 -0
- package/highlevel/updates/manager.test.d.ts +1 -0
- package/highlevel/utils/stream-utils.cjs +8 -4
- package/highlevel/utils/stream-utils.js +8 -4
- package/highlevel/utils/stream-utils.test.d.cts +1 -0
- package/highlevel/utils/stream-utils.test.d.ts +1 -0
- package/highlevel/utils/walk-page-blocks.cjs +9 -0
- package/highlevel/utils/walk-page-blocks.js +9 -0
- package/index.cjs +10 -0
- package/index.js +11 -1
- package/methods.cjs +33 -0
- package/methods.js +33 -0
- package/network/client.cjs +4 -3
- package/network/client.d.cts +1 -0
- package/network/client.d.ts +1 -0
- package/network/client.js +4 -3
- package/network/middlewares/flood-waiter.cjs +2 -2
- package/network/middlewares/flood-waiter.js +2 -2
- package/network/middlewares/internal-errors.cjs +1 -1
- package/network/middlewares/internal-errors.js +1 -1
- package/network/middlewares/media-throttle.cjs +1 -1
- package/network/middlewares/media-throttle.js +1 -1
- package/network/mtproto-session.cjs +9 -2
- package/network/mtproto-session.d.cts +3 -1
- package/network/mtproto-session.d.ts +3 -1
- package/network/mtproto-session.js +9 -2
- package/network/mtproxy/index.cjs +4 -3
- package/network/mtproxy/index.d.cts +2 -2
- package/network/mtproxy/index.d.ts +2 -2
- package/network/mtproxy/index.js +4 -3
- package/network/network-manager.cjs +44 -16
- package/network/network-manager.d.cts +10 -3
- package/network/network-manager.d.ts +10 -3
- package/network/network-manager.js +45 -17
- package/network/network-manager.test.d.cts +1 -0
- package/network/network-manager.test.d.ts +1 -0
- package/network/persistent-connection.cjs +10 -2
- package/network/persistent-connection.js +10 -2
- package/network/session-connection.cjs +15 -6
- package/network/session-connection.js +15 -6
- package/network/session-connection.test.d.cts +1 -0
- package/network/session-connection.test.d.ts +1 -0
- package/network/transports/abstract.cjs +16 -0
- package/network/transports/abstract.d.cts +8 -2
- package/network/transports/abstract.d.ts +8 -2
- package/network/transports/abstract.js +17 -1
- package/network/transports/obfuscated.cjs +3 -1
- package/network/transports/obfuscated.js +3 -1
- package/package.json +6 -6
- package/tl/api-schema.json +1 -1
- package/tl/binary/reader.cjs +221 -103
- package/tl/binary/reader.js +221 -103
- package/tl/binary/writer.cjs +693 -277
- package/tl/binary/writer.js +693 -277
- package/tl/compat/reader.cjs +93 -0
- package/tl/compat/reader.js +93 -0
- package/tl/index.d.cts +12529 -4762
- package/tl/index.d.ts +12529 -4762
- package/tl/inner-tl.cjs +90 -24
- package/tl/inner-tl.js +90 -24
- package/tl/raw-errors.json +1 -1
- package/tl/rpc-error.test.d.cts +1 -0
- package/tl/rpc-error.test.d.ts +1 -0
- package/utils/abort-signal.cjs +1 -12
- package/utils/abort-signal.js +1 -12
- package/utils/abort-signal.test.d.cts +1 -0
- package/utils/abort-signal.test.d.ts +1 -0
- package/utils/binary/compat.cjs +189 -29
- package/utils/binary/compat.js +189 -29
- package/utils/early-timer.cjs +3 -11
- package/utils/early-timer.js +3 -11
- package/utils/early-timer.test.d.cts +1 -0
- package/utils/early-timer.test.d.ts +1 -0
- package/utils/function-utils.cjs +9 -4
- package/utils/function-utils.js +9 -4
- package/utils/links/bots.cjs +10 -2
- package/utils/links/bots.js +10 -2
- package/utils/peer-utils.cjs +8 -0
- package/utils/peer-utils.js +8 -0
package/network/client.d.cts
CHANGED
|
@@ -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.d.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
}
|
package/network/mtproxy/index.js
CHANGED
|
@@ -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.
|
|
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.
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
dc.main.onWait.add(
|
|
294
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
242
|
-
|
|
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
|
-
|
|
242
|
-
|
|
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.
|
|
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.
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
dc.main.onWait.add(
|
|
287
|
-
|
|
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
|
-
|
|
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
|
|
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 {};
|