@mtcute/core 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/base-client.d.ts +3 -6
- package/cjs/base-client.js +12 -20
- package/cjs/base-client.js.map +1 -1
- package/cjs/network/auth-key.test.d.ts +1 -0
- package/cjs/network/auth-key.test.js +111 -0
- package/cjs/network/auth-key.test.js.map +1 -0
- package/cjs/network/config-manager.js +2 -1
- package/cjs/network/config-manager.js.map +1 -1
- package/cjs/network/config-manager.test.d.ts +1 -0
- package/cjs/network/config-manager.test.js +170 -0
- package/cjs/network/config-manager.test.js.map +1 -0
- package/cjs/network/index.d.ts +1 -1
- package/cjs/network/index.js.map +1 -1
- package/cjs/network/multi-session-connection.js +17 -4
- package/cjs/network/multi-session-connection.js.map +1 -1
- package/cjs/network/network-manager.d.ts +1 -1
- package/cjs/network/network-manager.js +12 -5
- package/cjs/network/network-manager.js.map +1 -1
- package/cjs/network/persistent-connection.test.d.ts +1 -0
- package/cjs/network/persistent-connection.test.js +157 -0
- package/cjs/network/persistent-connection.test.js.map +1 -0
- package/cjs/network/session-connection.js +3 -2
- package/cjs/network/session-connection.js.map +1 -1
- package/cjs/network/transports/intermediate.test.d.ts +1 -0
- package/cjs/network/transports/intermediate.test.js +84 -0
- package/cjs/network/transports/intermediate.test.js.map +1 -0
- package/cjs/network/transports/obfuscated.js +1 -1
- package/cjs/network/transports/obfuscated.js.map +1 -1
- package/cjs/network/transports/obfuscated.test.d.ts +1 -0
- package/cjs/network/transports/obfuscated.test.js +131 -0
- package/cjs/network/transports/obfuscated.test.js.map +1 -0
- package/cjs/network/transports/tcp.js +1 -1
- package/cjs/network/transports/tcp.js.map +1 -1
- package/cjs/network/transports/tcp.test.d.ts +1 -0
- package/cjs/network/transports/tcp.test.js +103 -0
- package/cjs/network/transports/tcp.test.js.map +1 -0
- package/cjs/network/transports/websocket.test.d.ts +1 -0
- package/cjs/network/transports/websocket.test.js +91 -0
- package/cjs/network/transports/websocket.test.js.map +1 -0
- package/cjs/storage/abstract.d.ts +18 -0
- package/cjs/storage/abstract.js.map +1 -1
- package/cjs/storage/idb.d.ts +101 -0
- package/cjs/storage/idb.js +458 -0
- package/cjs/storage/idb.js.map +1 -0
- package/cjs/storage/idb.test.d.ts +1 -0
- package/cjs/storage/idb.test.js +21 -0
- package/cjs/storage/idb.test.js.map +1 -0
- package/cjs/storage/index.d.ts +0 -4
- package/cjs/storage/index.js +0 -4
- package/cjs/storage/index.js.map +1 -1
- package/cjs/storage/json-file.d.ts +12 -0
- package/cjs/storage/json-file.js +12 -0
- package/cjs/storage/json-file.js.map +1 -1
- package/cjs/storage/json.js +3 -2
- package/cjs/storage/json.js.map +1 -1
- package/cjs/storage/json.test.d.ts +1 -0
- package/cjs/storage/json.test.js +36 -0
- package/cjs/storage/json.test.js.map +1 -0
- package/cjs/storage/localstorage.d.ts +12 -0
- package/cjs/storage/localstorage.js +12 -0
- package/cjs/storage/localstorage.js.map +1 -1
- package/cjs/storage/localstorage.test.d.ts +1 -0
- package/cjs/storage/localstorage.test.js +23 -0
- package/cjs/storage/localstorage.test.js.map +1 -0
- package/cjs/storage/memory.d.ts +12 -1
- package/cjs/storage/memory.js +65 -3
- package/cjs/storage/memory.js.map +1 -1
- package/cjs/storage/memory.test.d.ts +1 -0
- package/cjs/storage/memory.test.js +48 -0
- package/cjs/storage/memory.test.js.map +1 -0
- package/cjs/utils/async-lock.test.d.ts +1 -0
- package/cjs/utils/async-lock.test.js +25 -0
- package/cjs/utils/async-lock.test.js.map +1 -0
- package/cjs/utils/bigint-utils.test.d.ts +1 -0
- package/cjs/utils/bigint-utils.test.js +150 -0
- package/cjs/utils/bigint-utils.test.js.map +1 -0
- package/cjs/utils/buffer-utils.test.d.ts +1 -0
- package/cjs/utils/buffer-utils.test.js +69 -0
- package/cjs/utils/buffer-utils.test.js.map +1 -0
- package/cjs/utils/condition-variable.test.d.ts +1 -0
- package/cjs/utils/condition-variable.test.js +27 -0
- package/cjs/utils/condition-variable.test.js.map +1 -0
- package/cjs/utils/controllable-promise.d.ts +0 -5
- package/cjs/utils/controllable-promise.js +1 -7
- package/cjs/utils/controllable-promise.js.map +1 -1
- package/cjs/utils/controllable-promise.test.d.ts +1 -0
- package/cjs/utils/controllable-promise.test.js +17 -0
- package/cjs/utils/controllable-promise.test.js.map +1 -0
- package/cjs/utils/crypto/keys.test.d.ts +1 -0
- package/cjs/utils/crypto/keys.test.js +40 -0
- package/cjs/utils/crypto/keys.test.js.map +1 -0
- package/cjs/utils/crypto/miller-rabin.test.d.ts +1 -0
- package/cjs/utils/crypto/miller-rabin.test.js +60 -0
- package/cjs/utils/crypto/miller-rabin.test.js.map +1 -0
- package/cjs/utils/crypto/mtproto.test.d.ts +1 -0
- package/cjs/utils/crypto/mtproto.test.js +50 -0
- package/cjs/utils/crypto/mtproto.test.js.map +1 -0
- package/cjs/utils/crypto/node.test.d.ts +1 -0
- package/cjs/utils/crypto/node.test.js +14 -0
- package/cjs/utils/crypto/node.test.js.map +1 -0
- package/cjs/utils/crypto/password.test.d.ts +1 -0
- package/cjs/utils/crypto/password.test.js +95 -0
- package/cjs/utils/crypto/password.test.js.map +1 -0
- package/cjs/utils/crypto/utils.test.d.ts +1 -0
- package/cjs/utils/crypto/utils.test.js +49 -0
- package/cjs/utils/crypto/utils.test.js.map +1 -0
- package/cjs/utils/crypto/web.test.d.ts +1 -0
- package/cjs/utils/crypto/web.test.js +17 -0
- package/cjs/utils/crypto/web.test.js.map +1 -0
- package/cjs/utils/deque.test.d.ts +1 -0
- package/cjs/utils/deque.test.js +128 -0
- package/cjs/utils/deque.test.js.map +1 -0
- package/cjs/utils/function-utils.test.d.ts +1 -0
- package/cjs/utils/function-utils.test.js +23 -0
- package/cjs/utils/function-utils.test.js.map +1 -0
- package/cjs/utils/linked-list.test.d.ts +1 -0
- package/cjs/utils/linked-list.test.js +36 -0
- package/cjs/utils/linked-list.test.js.map +1 -0
- package/cjs/utils/links/bots.test.d.ts +1 -0
- package/cjs/utils/links/bots.test.js +152 -0
- package/cjs/utils/links/bots.test.js.map +1 -0
- package/cjs/utils/links/chat.test.d.ts +1 -0
- package/cjs/utils/links/chat.test.js +84 -0
- package/cjs/utils/links/chat.test.js.map +1 -0
- package/cjs/utils/links/misc.test.d.ts +1 -0
- package/cjs/utils/links/misc.test.js +153 -0
- package/cjs/utils/links/misc.test.js.map +1 -0
- package/cjs/utils/links/proxy.test.d.ts +1 -0
- package/cjs/utils/links/proxy.test.js +74 -0
- package/cjs/utils/links/proxy.test.js.map +1 -0
- package/cjs/utils/links/user.test.d.ts +1 -0
- package/cjs/utils/links/user.test.js +63 -0
- package/cjs/utils/links/user.test.js.map +1 -0
- package/cjs/utils/logger.test.d.ts +1 -0
- package/cjs/utils/logger.test.js +127 -0
- package/cjs/utils/logger.test.js.map +1 -0
- package/cjs/utils/long-utils.test.d.ts +1 -0
- package/cjs/utils/long-utils.test.js +158 -0
- package/cjs/utils/long-utils.test.js.map +1 -0
- package/cjs/utils/lru-map.test.d.ts +1 -0
- package/cjs/utils/lru-map.test.js +96 -0
- package/cjs/utils/lru-map.test.js.map +1 -0
- package/cjs/utils/lru-set.test.d.ts +1 -0
- package/cjs/utils/lru-set.test.js +77 -0
- package/cjs/utils/lru-set.test.js.map +1 -0
- package/cjs/utils/peer-utils.js +3 -1
- package/cjs/utils/peer-utils.js.map +1 -1
- package/cjs/utils/peer-utils.test.d.ts +1 -0
- package/cjs/utils/peer-utils.test.js +122 -0
- package/cjs/utils/peer-utils.test.js.map +1 -0
- package/cjs/utils/sorted-array.test.d.ts +1 -0
- package/cjs/utils/sorted-array.test.js +66 -0
- package/cjs/utils/sorted-array.test.js.map +1 -0
- package/cjs/utils/string-session.test.d.ts +1 -0
- package/cjs/utils/string-session.test.js +106 -0
- package/cjs/utils/string-session.test.js.map +1 -0
- package/cjs/utils/tl-json.test.d.ts +1 -0
- package/cjs/utils/tl-json.test.js +83 -0
- package/cjs/utils/tl-json.test.js.map +1 -0
- package/cjs/utils/type-assertions.test.d.ts +1 -0
- package/cjs/utils/type-assertions.test.js +67 -0
- package/cjs/utils/type-assertions.test.js.map +1 -0
- package/esm/base-client.d.ts +3 -6
- package/esm/base-client.js +2 -10
- package/esm/base-client.js.map +1 -1
- package/esm/network/auth-key.test.d.ts +1 -0
- package/esm/network/auth-key.test.js +106 -0
- package/esm/network/auth-key.test.js.map +1 -0
- package/esm/network/config-manager.js +2 -1
- package/esm/network/config-manager.js.map +1 -1
- package/esm/network/config-manager.test.d.ts +1 -0
- package/esm/network/config-manager.test.js +168 -0
- package/esm/network/config-manager.test.js.map +1 -0
- package/esm/network/index.d.ts +1 -1
- package/esm/network/index.js.map +1 -1
- package/esm/network/multi-session-connection.js +17 -4
- package/esm/network/multi-session-connection.js.map +1 -1
- package/esm/network/network-manager.d.ts +1 -1
- package/esm/network/network-manager.js +12 -5
- package/esm/network/network-manager.js.map +1 -1
- package/esm/network/persistent-connection.test.d.ts +1 -0
- package/esm/network/persistent-connection.test.js +155 -0
- package/esm/network/persistent-connection.test.js.map +1 -0
- package/esm/network/session-connection.js +3 -2
- package/esm/network/session-connection.js.map +1 -1
- package/esm/network/transports/intermediate.test.d.ts +1 -0
- package/esm/network/transports/intermediate.test.js +82 -0
- package/esm/network/transports/intermediate.test.js.map +1 -0
- package/esm/network/transports/obfuscated.js +1 -1
- package/esm/network/transports/obfuscated.js.map +1 -1
- package/esm/network/transports/obfuscated.test.d.ts +1 -0
- package/esm/network/transports/obfuscated.test.js +129 -0
- package/esm/network/transports/obfuscated.test.js.map +1 -0
- package/esm/network/transports/tcp.js +1 -1
- package/esm/network/transports/tcp.js.map +1 -1
- package/esm/network/transports/tcp.test.d.ts +1 -0
- package/esm/network/transports/tcp.test.js +101 -0
- package/esm/network/transports/tcp.test.js.map +1 -0
- package/esm/network/transports/websocket.test.d.ts +1 -0
- package/esm/network/transports/websocket.test.js +89 -0
- package/esm/network/transports/websocket.test.js.map +1 -0
- package/esm/storage/abstract.d.ts +18 -0
- package/esm/storage/abstract.js.map +1 -1
- package/esm/storage/idb.d.ts +101 -0
- package/esm/storage/idb.js +454 -0
- package/esm/storage/idb.js.map +1 -0
- package/esm/storage/idb.test.d.ts +1 -0
- package/esm/storage/idb.test.js +19 -0
- package/esm/storage/idb.test.js.map +1 -0
- package/esm/storage/index.d.ts +0 -4
- package/esm/storage/index.js +0 -4
- package/esm/storage/index.js.map +1 -1
- package/esm/storage/json-file.d.ts +12 -0
- package/esm/storage/json-file.js +12 -0
- package/esm/storage/json-file.js.map +1 -1
- package/esm/storage/json.js +3 -2
- package/esm/storage/json.js.map +1 -1
- package/esm/storage/json.test.d.ts +1 -0
- package/esm/storage/json.test.js +34 -0
- package/esm/storage/json.test.js.map +1 -0
- package/esm/storage/localstorage.d.ts +12 -0
- package/esm/storage/localstorage.js +12 -0
- package/esm/storage/localstorage.js.map +1 -1
- package/esm/storage/localstorage.test.d.ts +1 -0
- package/esm/storage/localstorage.test.js +21 -0
- package/esm/storage/localstorage.test.js.map +1 -0
- package/esm/storage/memory.d.ts +12 -1
- package/esm/storage/memory.js +65 -3
- package/esm/storage/memory.js.map +1 -1
- package/esm/storage/memory.test.d.ts +1 -0
- package/esm/storage/memory.test.js +46 -0
- package/esm/storage/memory.test.js.map +1 -0
- package/esm/utils/async-lock.test.d.ts +1 -0
- package/esm/utils/async-lock.test.js +23 -0
- package/esm/utils/async-lock.test.js.map +1 -0
- package/esm/utils/bigint-utils.test.d.ts +1 -0
- package/esm/utils/bigint-utils.test.js +148 -0
- package/esm/utils/bigint-utils.test.js.map +1 -0
- package/esm/utils/buffer-utils.test.d.ts +1 -0
- package/esm/utils/buffer-utils.test.js +67 -0
- package/esm/utils/buffer-utils.test.js.map +1 -0
- package/esm/utils/condition-variable.test.d.ts +1 -0
- package/esm/utils/condition-variable.test.js +25 -0
- package/esm/utils/condition-variable.test.js.map +1 -0
- package/esm/utils/controllable-promise.d.ts +0 -5
- package/esm/utils/controllable-promise.js +0 -5
- package/esm/utils/controllable-promise.js.map +1 -1
- package/esm/utils/controllable-promise.test.d.ts +1 -0
- package/esm/utils/controllable-promise.test.js +15 -0
- package/esm/utils/controllable-promise.test.js.map +1 -0
- package/esm/utils/crypto/keys.test.d.ts +1 -0
- package/esm/utils/crypto/keys.test.js +38 -0
- package/esm/utils/crypto/keys.test.js.map +1 -0
- package/esm/utils/crypto/miller-rabin.test.d.ts +1 -0
- package/esm/utils/crypto/miller-rabin.test.js +58 -0
- package/esm/utils/crypto/miller-rabin.test.js.map +1 -0
- package/esm/utils/crypto/mtproto.test.d.ts +1 -0
- package/esm/utils/crypto/mtproto.test.js +48 -0
- package/esm/utils/crypto/mtproto.test.js.map +1 -0
- package/esm/utils/crypto/node.test.d.ts +1 -0
- package/esm/utils/crypto/node.test.js +12 -0
- package/esm/utils/crypto/node.test.js.map +1 -0
- package/esm/utils/crypto/password.test.d.ts +1 -0
- package/esm/utils/crypto/password.test.js +90 -0
- package/esm/utils/crypto/password.test.js.map +1 -0
- package/esm/utils/crypto/utils.test.d.ts +1 -0
- package/esm/utils/crypto/utils.test.js +47 -0
- package/esm/utils/crypto/utils.test.js.map +1 -0
- package/esm/utils/crypto/web.test.d.ts +1 -0
- package/esm/utils/crypto/web.test.js +15 -0
- package/esm/utils/crypto/web.test.js.map +1 -0
- package/esm/utils/deque.test.d.ts +1 -0
- package/esm/utils/deque.test.js +126 -0
- package/esm/utils/deque.test.js.map +1 -0
- package/esm/utils/function-utils.test.d.ts +1 -0
- package/esm/utils/function-utils.test.js +21 -0
- package/esm/utils/function-utils.test.js.map +1 -0
- package/esm/utils/linked-list.test.d.ts +1 -0
- package/esm/utils/linked-list.test.js +34 -0
- package/esm/utils/linked-list.test.js.map +1 -0
- package/esm/utils/links/bots.test.d.ts +1 -0
- package/esm/utils/links/bots.test.js +150 -0
- package/esm/utils/links/bots.test.js.map +1 -0
- package/esm/utils/links/chat.test.d.ts +1 -0
- package/esm/utils/links/chat.test.js +82 -0
- package/esm/utils/links/chat.test.js.map +1 -0
- package/esm/utils/links/misc.test.d.ts +1 -0
- package/esm/utils/links/misc.test.js +151 -0
- package/esm/utils/links/misc.test.js.map +1 -0
- package/esm/utils/links/proxy.test.d.ts +1 -0
- package/esm/utils/links/proxy.test.js +72 -0
- package/esm/utils/links/proxy.test.js.map +1 -0
- package/esm/utils/links/user.test.d.ts +1 -0
- package/esm/utils/links/user.test.js +61 -0
- package/esm/utils/links/user.test.js.map +1 -0
- package/esm/utils/logger.test.d.ts +1 -0
- package/esm/utils/logger.test.js +122 -0
- package/esm/utils/logger.test.js.map +1 -0
- package/esm/utils/long-utils.test.d.ts +1 -0
- package/esm/utils/long-utils.test.js +153 -0
- package/esm/utils/long-utils.test.js.map +1 -0
- package/esm/utils/lru-map.test.d.ts +1 -0
- package/esm/utils/lru-map.test.js +94 -0
- package/esm/utils/lru-map.test.js.map +1 -0
- package/esm/utils/lru-set.test.d.ts +1 -0
- package/esm/utils/lru-set.test.js +72 -0
- package/esm/utils/lru-set.test.js.map +1 -0
- package/esm/utils/peer-utils.js +3 -1
- package/esm/utils/peer-utils.js.map +1 -1
- package/esm/utils/peer-utils.test.d.ts +1 -0
- package/esm/utils/peer-utils.test.js +117 -0
- package/esm/utils/peer-utils.test.js.map +1 -0
- package/esm/utils/sorted-array.test.d.ts +1 -0
- package/esm/utils/sorted-array.test.js +64 -0
- package/esm/utils/sorted-array.test.js.map +1 -0
- package/esm/utils/string-session.test.d.ts +1 -0
- package/esm/utils/string-session.test.js +104 -0
- package/esm/utils/string-session.test.js.map +1 -0
- package/esm/utils/tl-json.test.d.ts +1 -0
- package/esm/utils/tl-json.test.js +81 -0
- package/esm/utils/tl-json.test.js.map +1 -0
- package/esm/utils/type-assertions.test.d.ts +1 -0
- package/esm/utils/type-assertions.test.js +65 -0
- package/esm/utils/type-assertions.test.js.map +1 -0
- package/package.json +20 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-manager.js","sourceRoot":"","sources":["../../../src/network/network-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\nimport { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime'\n\nimport { ITelegramStorage } from '../storage/index.js'\nimport { MtArgumentError, MtcuteError } from '../types/index.js'\nimport { createControllablePromise, ICryptoProvider, Logger, sleep } from '../utils/index.js'\nimport { assertTypeIs } from '../utils/type-assertions.js'\nimport { ConfigManager } from './config-manager.js'\nimport { MultiSessionConnection } from './multi-session-connection.js'\nimport { PersistentConnectionParams } from './persistent-connection.js'\nimport { defaultReconnectionStrategy, ReconnectionStrategy } from './reconnection.js'\nimport { SessionConnection, SessionConnectionParams } from './session-connection.js'\nimport { defaultTransportFactory, TransportFactory } from './transports/index.js'\n\nexport type ConnectionKind = 'main' | 'upload' | 'download' | 'downloadSmall'\n\nconst CLIENT_ERRORS = {\n [tl.RpcError.BAD_REQUEST]: 1,\n [tl.RpcError.UNAUTHORIZED]: 1,\n [tl.RpcError.FORBIDDEN]: 1,\n [tl.RpcError.NOT_FOUND]: 1,\n [tl.RpcError.FLOOD]: 1,\n [tl.RpcError.SEE_OTHER]: 1,\n [tl.RpcError.NOT_ACCEPTABLE]: 1,\n}\n\n/**\n * Params passed into {@link NetworkManager} by {@link TelegramClient}.\n * This type is intended for internal usage only.\n */\nexport interface NetworkManagerParams {\n storage: ITelegramStorage\n crypto: ICryptoProvider\n log: Logger\n\n enableErrorReporting: boolean\n apiId: number\n initConnectionOptions?: Partial<Omit<tl.RawInitConnectionRequest, 'apiId' | 'query'>>\n transport?: TransportFactory\n reconnectionStrategy?: ReconnectionStrategy<PersistentConnectionParams>\n floodSleepThreshold: number\n maxRetryCount: number\n disableUpdates?: boolean\n testMode: boolean\n layer: number\n useIpv6: boolean\n readerMap: TlReaderMap\n writerMap: TlWriterMap\n isPremium: boolean\n _emitError: (err: Error, connection?: SessionConnection) => void\n keepAliveAction: () => void\n onUsable: () => void\n}\n\nexport type ConnectionCountDelegate = (kind: ConnectionKind, dcId: number, isPremium: boolean) => number\n\nconst defaultConnectionCountDelegate: ConnectionCountDelegate = (kind, dcId, isPremium) => {\n switch (kind) {\n case 'main':\n return 1\n case 'upload':\n return isPremium || (dcId !== 2 && dcId !== 4) ? 8 : 4\n case 'download':\n return isPremium ? 8 : 2\n case 'downloadSmall':\n return 2\n }\n}\n\n/**\n * Additional params passed into {@link NetworkManager} by the user\n * that customize the behavior of the manager\n */\nexport interface NetworkManagerExtraParams {\n /**\n * Whether to use PFS (Perfect Forward Secrecy) for all connections.\n * This is disabled by default\n */\n usePfs?: boolean\n\n /**\n * Connection count for each connection kind.\n * The function should be pure to avoid unexpected behavior.\n *\n * Defaults to TDLib logic:\n * - main: handled internally, **cannot be changed here**\n * - upload: if premium or dc id is other than 2 or 4, then 8, otherwise 4\n * - download: if premium then 8, otherwise 2\n * - downloadSmall: 2\n */\n connectionCount?: ConnectionCountDelegate\n\n /**\n * Idle timeout for non-main connections, in ms\n *\n * @default 60000 (60 seconds).\n */\n inactivityTimeout?: number\n}\n\n/** Options that can be customized when making an RPC call */\nexport interface RpcCallOptions {\n /**\n * If the call results in a `FLOOD_WAIT_X` error,\n * the maximum amount of time to wait before retrying.\n *\n * If set to `0`, the call will not be retried.\n *\n * @default {@link BaseTelegramClientOptions.floodSleepThreshold}\n */\n floodSleepThreshold?: number\n\n /**\n * If the call results in an internal server error or a flood wait,\n * the maximum amount of times to retry the call.\n *\n * @default {@link BaseTelegramClientOptions.maxRetryCount}\n */\n maxRetryCount?: number\n\n /**\n * Timeout for the call, in milliseconds.\n *\n * @default Infinity\n */\n timeout?: number\n\n /**\n * Kind of connection to use for this call.\n *\n * @default 'main'\n */\n kind?: ConnectionKind\n\n /**\n * ID of the DC to use for this call\n */\n dcId?: number\n\n /**\n * DC connection manager to use for this call.\n * Overrides `dcId` if set.\n */\n manager?: DcConnectionManager\n\n /**\n * Abort signal for the call.\n */\n abortSignal?: AbortSignal\n}\n\n/**\n * Wrapper over all connection pools for a single DC.\n */\nexport class DcConnectionManager {\n private __baseConnectionParams = (): SessionConnectionParams => ({\n crypto: this.manager.params.crypto,\n initConnection: this.manager._initConnectionParams,\n transportFactory: this.manager._transportFactory,\n dc: this._dcs.media,\n testMode: this.manager.params.testMode,\n reconnectionStrategy: this.manager._reconnectionStrategy,\n layer: this.manager.params.layer,\n disableUpdates: this.manager.params.disableUpdates,\n readerMap: this.manager.params.readerMap,\n writerMap: this.manager.params.writerMap,\n usePfs: this.manager.params.usePfs,\n isMainConnection: false,\n isMainDcConnection: this.isPrimary,\n inactivityTimeout: this.manager.params.inactivityTimeout ?? 60_000,\n enableErrorReporting: this.manager.params.enableErrorReporting,\n })\n\n private _log = this.manager._log.create('dc-manager')\n\n /** Main connection pool */\n main: MultiSessionConnection\n\n /** Upload connection pool */\n upload = new MultiSessionConnection(\n this.__baseConnectionParams(),\n this.manager._connectionCount('upload', this.dcId, this.manager.params.isPremium),\n this._log,\n 'UPLOAD',\n )\n\n /** Download connection pool */\n download = new MultiSessionConnection(\n this.__baseConnectionParams(),\n this.manager._connectionCount('download', this.dcId, this.manager.params.isPremium),\n this._log,\n 'DOWNLOAD',\n )\n\n /** Download connection pool (for small files) */\n downloadSmall = new MultiSessionConnection(\n this.__baseConnectionParams(),\n this.manager._connectionCount('downloadSmall', this.dcId, this.manager.params.isPremium),\n this._log,\n 'DOWNLOAD_SMALL',\n )\n\n private get _mainConnectionCount() {\n if (!this.isPrimary) return 1\n\n return this.manager.config.getNow()?.tmpSessions ?? 1\n }\n\n constructor(\n /** Network manager instance */\n readonly manager: NetworkManager,\n /** DC ID */\n readonly dcId: number,\n /** DC options to use */\n readonly _dcs: ITelegramStorage.DcOptions,\n /** Whether this DC is the primary one */\n public isPrimary = false,\n ) {\n this._log.prefix = `[DC ${dcId}] `\n\n const mainParams = this.__baseConnectionParams()\n mainParams.isMainConnection = true\n mainParams.dc = _dcs.main\n\n if (isPrimary) {\n mainParams.inactivityTimeout = undefined\n }\n\n this.main = new MultiSessionConnection(mainParams, this._mainConnectionCount, this._log, 'MAIN')\n\n this._setupMulti('main')\n this._setupMulti('upload')\n this._setupMulti('download')\n this._setupMulti('downloadSmall')\n }\n\n private _setupMulti(kind: ConnectionKind): void {\n const connection = this[kind]\n\n connection.on('key-change', (idx, key: Uint8Array | null) => {\n if (kind !== 'main') {\n // main connection is responsible for authorization,\n // and keys are then sent to other connections\n this.manager._log.warn('got key-change from non-main connection, ignoring')\n\n return\n }\n\n this.manager._log.debug('key change for dc %d from connection %d', this.dcId, idx)\n\n // send key to other connections\n this.upload.setAuthKey(key)\n this.download.setAuthKey(key)\n this.downloadSmall.setAuthKey(key)\n Promise.resolve(this.manager._storage.setAuthKeyFor(this.dcId, key))\n .then(() => {\n this.upload.notifyKeyChange()\n this.download.notifyKeyChange()\n this.downloadSmall.notifyKeyChange()\n })\n .catch((e: Error) => this.manager.params._emitError(e))\n })\n connection.on('tmp-key-change', (idx: number, key: Uint8Array | null, expires: number) => {\n if (kind !== 'main') {\n this.manager._log.warn('got tmp-key-change from non-main connection, ignoring')\n\n return\n }\n\n this.manager._log.debug('temp key change for dc %d from connection %d', this.dcId, idx)\n\n // send key to other connections\n this.upload.setAuthKey(key, true)\n this.download.setAuthKey(key, true)\n this.downloadSmall.setAuthKey(key, true)\n\n Promise.resolve(this.manager._storage.setTempAuthKeyFor(this.dcId, idx, key, expires * 1000))\n .then(() => {\n this.upload.notifyKeyChange()\n this.download.notifyKeyChange()\n this.downloadSmall.notifyKeyChange()\n })\n .catch((e: Error) => this.manager.params._emitError(e))\n })\n\n connection.on('auth-begin', () => {\n // we need to propagate auth-begin to all connections\n // to avoid them sending requests before auth is complete\n if (kind !== 'main') {\n this.manager._log.warn('got auth-begin from non-main connection, ignoring')\n\n return\n }\n\n // reset key on non-main connections\n // this event was already propagated to additional main connections\n this.upload.resetAuthKeys()\n this.download.resetAuthKeys()\n this.downloadSmall.resetAuthKeys()\n })\n\n connection.on('request-auth', () => {\n this.main.requestAuth()\n })\n\n connection.on('error', (err: Error, conn: SessionConnection) => {\n this.manager.params._emitError(err, conn)\n })\n }\n\n setIsPrimary(isPrimary: boolean): void {\n if (this.isPrimary === isPrimary) return\n this.isPrimary = isPrimary\n\n if (isPrimary) {\n this.main.setInactivityTimeout(undefined)\n } else {\n this.main.setInactivityTimeout(this.manager.params.inactivityTimeout ?? 60_000)\n }\n }\n\n setIsPremium(isPremium: boolean): void {\n this.upload.setCount(this.manager._connectionCount('upload', this.dcId, isPremium))\n this.download.setCount(this.manager._connectionCount('download', this.dcId, isPremium))\n this.downloadSmall.setCount(this.manager._connectionCount('downloadSmall', this.dcId, isPremium))\n }\n\n async loadKeys(): Promise<boolean> {\n const permanent = await this.manager._storage.getAuthKeyFor(this.dcId)\n\n this.main.setAuthKey(permanent)\n this.upload.setAuthKey(permanent)\n this.download.setAuthKey(permanent)\n this.downloadSmall.setAuthKey(permanent)\n\n if (!permanent) {\n return false\n }\n\n if (this.manager.params.usePfs) {\n await Promise.all(\n this.main._sessions.map(async (_, i) => {\n const temp = await this.manager._storage.getAuthKeyFor(this.dcId, i)\n this.main.setAuthKey(temp, true, i)\n\n if (i === 0) {\n this.upload.setAuthKey(temp, true)\n this.download.setAuthKey(temp, true)\n this.downloadSmall.setAuthKey(temp, true)\n }\n }),\n )\n }\n\n return true\n }\n}\n\n/**\n * Class that manages all connections to Telegram servers.\n */\nexport class NetworkManager {\n readonly _log = this.params.log.create('network')\n readonly _storage = this.params.storage\n\n readonly _initConnectionParams: tl.RawInitConnectionRequest\n readonly _transportFactory: TransportFactory\n readonly _reconnectionStrategy: ReconnectionStrategy<PersistentConnectionParams>\n readonly _connectionCount: ConnectionCountDelegate\n\n protected readonly _dcConnections = new Map<number, DcConnectionManager>()\n protected _primaryDc?: DcConnectionManager\n\n private _keepAliveInterval?: NodeJS.Timeout\n private _lastUpdateTime = 0\n private _updateHandler: (upd: tl.TypeUpdates, fromClient: boolean) => void = () => {}\n\n constructor(\n readonly params: NetworkManagerParams & NetworkManagerExtraParams,\n readonly config: ConfigManager,\n ) {\n let deviceModel = 'mtcute on '\n /* eslint-disable no-restricted-globals */\n if (typeof process !== 'undefined' && typeof require !== 'undefined') {\n const os = require('os') as typeof import('os')\n deviceModel += `${os.type()} ${os.arch()} ${os.release()}`\n /* eslint-enable no-restricted-globals */\n } else if (typeof navigator !== 'undefined') {\n deviceModel += navigator.userAgent\n } else deviceModel += 'unknown'\n\n this._initConnectionParams = {\n _: 'initConnection',\n deviceModel,\n systemVersion: '1.0',\n appVersion: '%VERSION%',\n systemLangCode: 'en',\n langPack: '', // \"langPacks are for official apps only\"\n langCode: 'en',\n ...(params.initConnectionOptions ?? {}),\n apiId: params.apiId,\n // eslint-disable-next-line\n query: null as any,\n }\n\n this._transportFactory = params.transport ?? defaultTransportFactory\n this._reconnectionStrategy = params.reconnectionStrategy ?? defaultReconnectionStrategy\n this._connectionCount = params.connectionCount ?? defaultConnectionCountDelegate\n\n this._onConfigChanged = this._onConfigChanged.bind(this)\n config.onConfigUpdate(this._onConfigChanged)\n }\n\n private async _findDcOptions(dcId: number): Promise<ITelegramStorage.DcOptions> {\n const main = await this.config.findOption({\n dcId,\n allowIpv6: this.params.useIpv6,\n preferIpv6: this.params.useIpv6,\n allowMedia: false,\n cdn: false,\n })\n\n const media = await this.config.findOption({\n dcId,\n allowIpv6: this.params.useIpv6,\n preferIpv6: this.params.useIpv6,\n allowMedia: true,\n preferMedia: true,\n cdn: false,\n })\n\n if (!main || !media) {\n throw new MtArgumentError(`Could not find DC ${dcId}`)\n }\n\n return { main, media }\n }\n\n private _switchPrimaryDc(dc: DcConnectionManager) {\n if (this._primaryDc && this._primaryDc !== dc) {\n this._primaryDc.setIsPrimary(false)\n }\n\n this._primaryDc = dc\n dc.setIsPrimary(true)\n\n dc.main.on('usable', () => {\n this._lastUpdateTime = Date.now()\n this.params.onUsable()\n\n if (this._keepAliveInterval) clearInterval(this._keepAliveInterval)\n this._keepAliveInterval = setInterval(() => {\n if (Date.now() - this._lastUpdateTime > 900_000) {\n // telegram asks to fetch pending updates if there are no updates for 15 minutes.\n // it is up to the user to decide whether to do it or not\n\n this.params.keepAliveAction()\n this._lastUpdateTime = Date.now()\n }\n }, 60_000)\n\n Promise.resolve(this._storage.getSelf())\n .then((self) => {\n if (self?.isBot) {\n // bots may receive tmpSessions, which we should respect\n return this.config.update(true)\n }\n })\n .catch((e: Error) => this.params._emitError(e))\n })\n dc.main.on('update', (update: tl.TypeUpdates) => {\n this._lastUpdateTime = Date.now()\n this._updateHandler(update, false)\n })\n\n return dc.loadKeys().then(() => dc.main.ensureConnected())\n }\n\n private _dcCreationPromise = new Map<number, Promise<void>>()\n async _getOtherDc(dcId: number): Promise<DcConnectionManager> {\n if (!this._dcConnections.has(dcId)) {\n if (this._dcCreationPromise.has(dcId)) {\n this._log.debug('waiting for DC %d to be created', dcId)\n await this._dcCreationPromise.get(dcId)\n\n return this._dcConnections.get(dcId)!\n }\n\n const promise = createControllablePromise<void>()\n this._dcCreationPromise.set(dcId, promise)\n\n this._log.debug('creating new DC %d', dcId)\n\n try {\n const dcOptions = await this._findDcOptions(dcId)\n\n const dc = new DcConnectionManager(this, dcId, dcOptions)\n\n if (!(await dc.loadKeys())) {\n dc.main.requestAuth()\n }\n\n this._dcConnections.set(dcId, dc)\n promise.resolve()\n } catch (e) {\n promise.reject(e)\n }\n }\n\n return this._dcConnections.get(dcId)!\n }\n\n /**\n * Perform initial connection to the default DC\n *\n * @param defaultDcs Default DCs to connect to\n */\n async connect(defaultDcs: ITelegramStorage.DcOptions): Promise<void> {\n if (defaultDcs.main.id !== defaultDcs.media.id) {\n throw new MtArgumentError('Default DCs must be the same')\n }\n\n if (this._dcConnections.has(defaultDcs.main.id)) {\n // shouldn't happen\n throw new MtArgumentError('DC manager already exists')\n }\n\n const dc = new DcConnectionManager(this, defaultDcs.main.id, defaultDcs)\n this._dcConnections.set(defaultDcs.main.id, dc)\n await this._switchPrimaryDc(dc)\n }\n\n private _pendingExports: Record<number, Promise<void>> = {}\n private async _exportAuthTo(manager: DcConnectionManager): Promise<void> {\n if (manager.dcId in this._pendingExports) {\n this._log.debug('waiting for auth export to dc %d', manager.dcId)\n\n return this._pendingExports[manager.dcId]\n }\n\n this._log.debug('exporting auth to dc %d', manager.dcId)\n const promise = createControllablePromise<void>()\n this._pendingExports[manager.dcId] = promise\n\n try {\n const auth = await this.call({\n _: 'auth.exportAuthorization',\n dcId: manager.dcId,\n })\n\n const res = await this.call(\n {\n _: 'auth.importAuthorization',\n id: auth.id,\n bytes: auth.bytes,\n },\n { manager },\n )\n\n assertTypeIs('auth.importAuthorization', res, 'auth.authorization')\n\n promise.resolve()\n delete this._pendingExports[manager.dcId]\n } catch (e) {\n this._log.warn('failed to export auth to dc %d: %s', manager.dcId, e)\n promise.reject(e)\n throw e\n }\n }\n\n setIsPremium(isPremium: boolean): void {\n this._log.debug('setting isPremium to %s', isPremium)\n this.params.isPremium = isPremium\n\n for (const dc of this._dcConnections.values()) {\n dc.setIsPremium(isPremium)\n }\n }\n\n notifyLoggedIn(auth: tl.auth.TypeAuthorization): void {\n if (auth._ === 'auth.authorizationSignUpRequired' || auth.user._ === 'userEmpty') {\n return\n }\n\n if (auth.tmpSessions) {\n this._primaryDc?.main.setCount(auth.tmpSessions)\n }\n\n this.setIsPremium(auth.user.premium!)\n }\n\n resetSessions(): void {\n const dc = this._primaryDc\n if (!dc) return\n\n dc.main.resetSessions()\n dc.upload.resetSessions()\n dc.download.resetSessions()\n dc.downloadSmall.resetSessions()\n }\n\n private _onConfigChanged(config: tl.RawConfig): void {\n if (config.tmpSessions) {\n this._primaryDc?.main.setCount(config.tmpSessions)\n }\n }\n\n async changePrimaryDc(newDc: number): Promise<void> {\n if (newDc === this._primaryDc?.dcId) return\n\n const options = await this._findDcOptions(newDc)\n\n if (!this._dcConnections.has(newDc)) {\n this._dcConnections.set(newDc, new DcConnectionManager(this, newDc, options))\n }\n\n await this._storage.setDefaultDcs(options)\n\n await this._switchPrimaryDc(this._dcConnections.get(newDc)!)\n }\n\n private _floodWaitedRequests = new Map<string, number>()\n async call<T extends tl.RpcMethod>(\n message: T,\n params?: RpcCallOptions,\n stack?: string,\n ): Promise<tl.RpcCallReturn[T['_']]> {\n if (!this._primaryDc) {\n throw new MtcuteError('Not connected to any DC')\n }\n\n const floodSleepThreshold = params?.floodSleepThreshold ?? this.params.floodSleepThreshold\n const maxRetryCount = params?.maxRetryCount ?? this.params.maxRetryCount\n\n // do not send requests that are in flood wait\n if (this._floodWaitedRequests.has(message._)) {\n const delta = this._floodWaitedRequests.get(message._)! - Date.now()\n\n if (delta <= 3000) {\n // flood waits below 3 seconds are \"ignored\"\n this._floodWaitedRequests.delete(message._)\n } else if (delta <= this.params.floodSleepThreshold) {\n await sleep(delta)\n this._floodWaitedRequests.delete(message._)\n } else {\n const err = tl.RpcError.create(tl.RpcError.FLOOD, 'FLOOD_WAIT_%d')\n err.seconds = Math.ceil(delta / 1000)\n throw err\n }\n }\n\n let lastError: Error | null = null\n\n const kind = params?.kind ?? 'main'\n let manager: DcConnectionManager\n\n if (params?.manager) {\n manager = params.manager\n } else if (params?.dcId && params.dcId !== this._primaryDc.dcId) {\n manager = await this._getOtherDc(params.dcId)\n } else {\n manager = this._primaryDc\n }\n\n let multi = manager[kind]\n\n for (let i = 0; i < maxRetryCount; i++) {\n try {\n const res = await multi.sendRpc(message, stack, params?.timeout, params?.abortSignal)\n\n if (kind === 'main') {\n this._lastUpdateTime = Date.now()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return res\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n lastError = e as Error\n\n if (!tl.RpcError.is(e)) {\n throw e\n }\n\n if (!(e.code in CLIENT_ERRORS)) {\n this._log.warn('Telegram is having internal issues: %d %s, retrying', e.code, e.message)\n\n if (e.text === 'WORKER_BUSY_TOO_LONG_RETRY') {\n // according to tdlib, \"it is dangerous to resend query without timeout, so use 1\"\n await sleep(1000)\n }\n continue\n }\n\n if (e.is('FLOOD_WAIT_%d') || e.is('SLOWMODE_WAIT_%d') || e.is('FLOOD_TEST_PHONE_WAIT_%d')) {\n if (e.text !== 'SLOWMODE_WAIT_%d') {\n // SLOW_MODE_WAIT is chat-specific, not request-specific\n this._floodWaitedRequests.set(message._, Date.now() + e.seconds * 1000)\n }\n\n // In test servers, FLOOD_WAIT_0 has been observed, and sleeping for\n // such a short amount will cause retries very fast leading to issues\n if (e.seconds === 0) {\n e.seconds = 1\n }\n\n if (e.seconds <= floodSleepThreshold) {\n this._log.info('Flood wait for %d seconds', e.seconds)\n await sleep(e.seconds * 1000)\n continue\n }\n }\n\n if (manager === this._primaryDc) {\n if (e.is('PHONE_MIGRATE_%d') || e.is('NETWORK_MIGRATE_%d') || e.is('USER_MIGRATE_%d')) {\n this._log.info('Migrate error, new dc = %d', e.newDc)\n\n await this.changePrimaryDc(e.newDc)\n manager = this._primaryDc!\n multi = manager[kind]\n\n continue\n }\n } else if (e.is('AUTH_KEY_UNREGISTERED')) {\n // we can try re-exporting auth from the primary connection\n this._log.warn('exported auth key error, trying re-exporting..')\n\n await this._exportAuthTo(manager)\n continue\n }\n\n throw e\n }\n }\n\n throw lastError!\n }\n\n setUpdateHandler(handler: (upd: tl.TypeUpdates, fromClient: boolean) => void): void {\n this._updateHandler = handler\n }\n\n handleUpdate(update: tl.TypeUpdates, fromClient = true): void {\n this._updateHandler(update, fromClient)\n }\n\n changeTransport(factory: TransportFactory): void {\n for (const dc of this._dcConnections.values()) {\n dc.main.changeTransport(factory)\n dc.upload.changeTransport(factory)\n dc.download.changeTransport(factory)\n dc.downloadSmall.changeTransport(factory)\n }\n }\n\n getPoolSize(kind: ConnectionKind, dcId?: number) {\n const dc = dcId ? this._dcConnections.get(dcId) : this._primaryDc\n\n if (!dc) {\n if (!this._primaryDc) {\n throw new MtcuteError('Not connected to any DC')\n }\n\n // guess based on the provided delegate. it is most likely correct,\n // but we should give actual values if possible\n return this._connectionCount(kind, dcId ?? this._primaryDc.dcId, this.params.isPremium)\n }\n\n return dc[kind].getPoolSize()\n }\n\n getPrimaryDcId() {\n if (!this._primaryDc) throw new MtcuteError('Not connected to any DC')\n\n return this._primaryDc.dcId\n }\n\n destroy(): void {\n for (const dc of this._dcConnections.values()) {\n dc.main.destroy()\n dc.upload.destroy()\n dc.download.destroy()\n dc.downloadSmall.destroy()\n }\n if (this._keepAliveInterval) clearInterval(this._keepAliveInterval)\n this.config.offConfigUpdate(this._onConfigChanged)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"network-manager.js","sourceRoot":"","sources":["../../../src/network/network-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\nimport { TlReaderMap, TlWriterMap } from '@mtcute/tl-runtime'\n\nimport { ITelegramStorage } from '../storage/index.js'\nimport { MtArgumentError, MtcuteError } from '../types/index.js'\nimport { ControllablePromise, createControllablePromise, ICryptoProvider, Logger, sleep } from '../utils/index.js'\nimport { assertTypeIs } from '../utils/type-assertions.js'\nimport { ConfigManager } from './config-manager.js'\nimport { MultiSessionConnection } from './multi-session-connection.js'\nimport { PersistentConnectionParams } from './persistent-connection.js'\nimport { defaultReconnectionStrategy, ReconnectionStrategy } from './reconnection.js'\nimport { SessionConnection, SessionConnectionParams } from './session-connection.js'\nimport { defaultTransportFactory, TransportFactory } from './transports/index.js'\n\nexport type ConnectionKind = 'main' | 'upload' | 'download' | 'downloadSmall'\n\nconst CLIENT_ERRORS = {\n [tl.RpcError.BAD_REQUEST]: 1,\n [tl.RpcError.UNAUTHORIZED]: 1,\n [tl.RpcError.FORBIDDEN]: 1,\n [tl.RpcError.NOT_FOUND]: 1,\n [tl.RpcError.FLOOD]: 1,\n [tl.RpcError.SEE_OTHER]: 1,\n [tl.RpcError.NOT_ACCEPTABLE]: 1,\n}\n\n/**\n * Params passed into {@link NetworkManager} by {@link TelegramClient}.\n * This type is intended for internal usage only.\n */\nexport interface NetworkManagerParams {\n storage: ITelegramStorage\n crypto: ICryptoProvider\n log: Logger\n\n enableErrorReporting: boolean\n apiId: number\n initConnectionOptions?: Partial<Omit<tl.RawInitConnectionRequest, 'apiId' | 'query'>>\n transport?: TransportFactory\n reconnectionStrategy?: ReconnectionStrategy<PersistentConnectionParams>\n floodSleepThreshold: number\n maxRetryCount: number\n disableUpdates?: boolean\n testMode: boolean\n layer: number\n useIpv6: boolean\n readerMap: TlReaderMap\n writerMap: TlWriterMap\n isPremium: boolean\n _emitError: (err: Error, connection?: SessionConnection) => void\n keepAliveAction: () => void\n onUsable: () => void\n}\n\nexport type ConnectionCountDelegate = (kind: ConnectionKind, dcId: number, isPremium: boolean) => number\n\nconst defaultConnectionCountDelegate: ConnectionCountDelegate = (kind, dcId, isPremium) => {\n switch (kind) {\n case 'main':\n return 1\n case 'upload':\n return isPremium || (dcId !== 2 && dcId !== 4) ? 8 : 4\n case 'download':\n return isPremium ? 8 : 2\n case 'downloadSmall':\n return 2\n }\n}\n\n/**\n * Additional params passed into {@link NetworkManager} by the user\n * that customize the behavior of the manager\n */\nexport interface NetworkManagerExtraParams {\n /**\n * Whether to use PFS (Perfect Forward Secrecy) for all connections.\n * This is disabled by default\n */\n usePfs?: boolean\n\n /**\n * Connection count for each connection kind.\n * The function should be pure to avoid unexpected behavior.\n *\n * Defaults to TDLib logic:\n * - main: handled internally, **cannot be changed here**\n * - upload: if premium or dc id is other than 2 or 4, then 8, otherwise 4\n * - download: if premium then 8, otherwise 2\n * - downloadSmall: 2\n */\n connectionCount?: ConnectionCountDelegate\n\n /**\n * Idle timeout for non-main connections, in ms\n *\n * @default 60000 (60 seconds).\n */\n inactivityTimeout?: number\n}\n\n/** Options that can be customized when making an RPC call */\nexport interface RpcCallOptions {\n /**\n * If the call results in a `FLOOD_WAIT_X` error,\n * the maximum amount of time to wait before retrying.\n *\n * If set to `0`, the call will not be retried.\n *\n * @default {@link BaseTelegramClientOptions.floodSleepThreshold}\n */\n floodSleepThreshold?: number\n\n /**\n * If the call results in an internal server error or a flood wait,\n * the maximum amount of times to retry the call.\n *\n * @default {@link BaseTelegramClientOptions.maxRetryCount}\n */\n maxRetryCount?: number\n\n /**\n * Timeout for the call, in milliseconds.\n *\n * @default Infinity\n */\n timeout?: number\n\n /**\n * Kind of connection to use for this call.\n *\n * @default 'main'\n */\n kind?: ConnectionKind\n\n /**\n * ID of the DC to use for this call\n */\n dcId?: number\n\n /**\n * DC connection manager to use for this call.\n * Overrides `dcId` if set.\n */\n manager?: DcConnectionManager\n\n /**\n * Abort signal for the call.\n */\n abortSignal?: AbortSignal\n}\n\n/**\n * Wrapper over all connection pools for a single DC.\n */\nexport class DcConnectionManager {\n private __baseConnectionParams = (): SessionConnectionParams => ({\n crypto: this.manager.params.crypto,\n initConnection: this.manager._initConnectionParams,\n transportFactory: this.manager._transportFactory,\n dc: this._dcs.media,\n testMode: this.manager.params.testMode,\n reconnectionStrategy: this.manager._reconnectionStrategy,\n layer: this.manager.params.layer,\n disableUpdates: this.manager.params.disableUpdates,\n readerMap: this.manager.params.readerMap,\n writerMap: this.manager.params.writerMap,\n usePfs: this.manager.params.usePfs,\n isMainConnection: false,\n isMainDcConnection: this.isPrimary,\n inactivityTimeout: this.manager.params.inactivityTimeout ?? 60_000,\n enableErrorReporting: this.manager.params.enableErrorReporting,\n })\n\n private _log = this.manager._log.create('dc-manager')\n\n /** Main connection pool */\n main: MultiSessionConnection\n\n /** Upload connection pool */\n upload = new MultiSessionConnection(\n this.__baseConnectionParams(),\n this.manager._connectionCount('upload', this.dcId, this.manager.params.isPremium),\n this._log,\n 'UPLOAD',\n )\n\n /** Download connection pool */\n download = new MultiSessionConnection(\n this.__baseConnectionParams(),\n this.manager._connectionCount('download', this.dcId, this.manager.params.isPremium),\n this._log,\n 'DOWNLOAD',\n )\n\n /** Download connection pool (for small files) */\n downloadSmall = new MultiSessionConnection(\n this.__baseConnectionParams(),\n this.manager._connectionCount('downloadSmall', this.dcId, this.manager.params.isPremium),\n this._log,\n 'DOWNLOAD_SMALL',\n )\n\n private get _mainConnectionCount() {\n if (!this.isPrimary) return 1\n\n return this.manager.config.getNow()?.tmpSessions ?? 1\n }\n\n constructor(\n /** Network manager instance */\n readonly manager: NetworkManager,\n /** DC ID */\n readonly dcId: number,\n /** DC options to use */\n readonly _dcs: ITelegramStorage.DcOptions,\n /** Whether this DC is the primary one */\n public isPrimary = false,\n ) {\n this._log.prefix = `[DC ${dcId}] `\n\n const mainParams = this.__baseConnectionParams()\n mainParams.isMainConnection = true\n mainParams.dc = _dcs.main\n\n if (isPrimary) {\n mainParams.inactivityTimeout = undefined\n }\n\n this.main = new MultiSessionConnection(mainParams, this._mainConnectionCount, this._log, 'MAIN')\n\n this._setupMulti('main')\n this._setupMulti('upload')\n this._setupMulti('download')\n this._setupMulti('downloadSmall')\n }\n\n private _setupMulti(kind: ConnectionKind): void {\n const connection = this[kind]\n\n connection.on('key-change', (idx, key: Uint8Array | null) => {\n if (kind !== 'main') {\n // main connection is responsible for authorization,\n // and keys are then sent to other connections\n this.manager._log.warn('got key-change from non-main connection, ignoring')\n\n return\n }\n\n this.manager._log.debug('key change for dc %d from connection %d', this.dcId, idx)\n\n // send key to other connections\n this.upload.setAuthKey(key)\n this.download.setAuthKey(key)\n this.downloadSmall.setAuthKey(key)\n Promise.resolve(this.manager._storage.setAuthKeyFor(this.dcId, key))\n .then(() => {\n this.upload.notifyKeyChange()\n this.download.notifyKeyChange()\n this.downloadSmall.notifyKeyChange()\n })\n .catch((e: Error) => this.manager.params._emitError(e))\n })\n connection.on('tmp-key-change', (idx: number, key: Uint8Array | null, expires: number) => {\n if (kind !== 'main') {\n this.manager._log.warn('got tmp-key-change from non-main connection, ignoring')\n\n return\n }\n\n this.manager._log.debug('temp key change for dc %d from connection %d', this.dcId, idx)\n\n // send key to other connections\n this.upload.setAuthKey(key, true)\n this.download.setAuthKey(key, true)\n this.downloadSmall.setAuthKey(key, true)\n\n Promise.resolve(this.manager._storage.setTempAuthKeyFor(this.dcId, idx, key, expires * 1000))\n .then(() => {\n this.upload.notifyKeyChange()\n this.download.notifyKeyChange()\n this.downloadSmall.notifyKeyChange()\n })\n .catch((e: Error) => this.manager.params._emitError(e))\n })\n\n connection.on('auth-begin', () => {\n // we need to propagate auth-begin to all connections\n // to avoid them sending requests before auth is complete\n if (kind !== 'main') {\n this.manager._log.warn('got auth-begin from non-main connection, ignoring')\n\n return\n }\n\n // reset key on non-main connections\n // this event was already propagated to additional main connections\n this.upload.resetAuthKeys()\n this.download.resetAuthKeys()\n this.downloadSmall.resetAuthKeys()\n })\n\n connection.on('request-auth', () => {\n this.main.requestAuth()\n })\n\n // fucking awesome architecture, but whatever\n connection.on('request-keys', (promise: ControllablePromise<void>) => {\n this.loadKeys(true)\n .then(() => promise.resolve())\n .catch((e: Error) => promise.reject(e))\n })\n\n connection.on('error', (err: Error, conn: SessionConnection) => {\n this.manager.params._emitError(err, conn)\n })\n }\n\n setIsPrimary(isPrimary: boolean): void {\n if (this.isPrimary === isPrimary) return\n this.isPrimary = isPrimary\n this.main.params.isMainDcConnection = isPrimary\n\n if (isPrimary) {\n this.main.setInactivityTimeout(undefined)\n } else {\n this.main.setInactivityTimeout(this.manager.params.inactivityTimeout ?? 60_000)\n }\n }\n\n setIsPremium(isPremium: boolean): void {\n this.upload.setCount(this.manager._connectionCount('upload', this.dcId, isPremium))\n this.download.setCount(this.manager._connectionCount('download', this.dcId, isPremium))\n this.downloadSmall.setCount(this.manager._connectionCount('downloadSmall', this.dcId, isPremium))\n }\n\n async loadKeys(forcePfs = false): Promise<boolean> {\n const permanent = await this.manager._storage.getAuthKeyFor(this.dcId)\n\n this.main.setAuthKey(permanent)\n this.upload.setAuthKey(permanent)\n this.download.setAuthKey(permanent)\n this.downloadSmall.setAuthKey(permanent)\n\n if (!permanent) {\n return false\n }\n\n if (this.manager.params.usePfs || forcePfs) {\n await Promise.all(\n this.main._sessions.map(async (_, i) => {\n const temp = await this.manager._storage.getAuthKeyFor(this.dcId, i)\n this.main.setAuthKey(temp, true, i)\n\n if (i === 0) {\n this.upload.setAuthKey(temp, true)\n this.download.setAuthKey(temp, true)\n this.downloadSmall.setAuthKey(temp, true)\n }\n }),\n )\n }\n\n return true\n }\n}\n\n/**\n * Class that manages all connections to Telegram servers.\n */\nexport class NetworkManager {\n readonly _log = this.params.log.create('network')\n readonly _storage = this.params.storage\n\n readonly _initConnectionParams: tl.RawInitConnectionRequest\n readonly _transportFactory: TransportFactory\n readonly _reconnectionStrategy: ReconnectionStrategy<PersistentConnectionParams>\n readonly _connectionCount: ConnectionCountDelegate\n\n protected readonly _dcConnections = new Map<number, DcConnectionManager>()\n protected _primaryDc?: DcConnectionManager\n\n private _keepAliveInterval?: NodeJS.Timeout\n private _lastUpdateTime = 0\n private _updateHandler: (upd: tl.TypeUpdates, fromClient: boolean) => void = () => {}\n\n constructor(\n readonly params: NetworkManagerParams & NetworkManagerExtraParams,\n readonly config: ConfigManager,\n ) {\n let deviceModel = 'mtcute on '\n /* eslint-disable no-restricted-globals */\n if (typeof process !== 'undefined' && typeof require !== 'undefined') {\n const os = require('os') as typeof import('os')\n deviceModel += `${os.type()} ${os.arch()} ${os.release()}`\n /* eslint-enable no-restricted-globals */\n } else if (typeof navigator !== 'undefined') {\n deviceModel += navigator.userAgent\n } else deviceModel += 'unknown'\n\n this._initConnectionParams = {\n _: 'initConnection',\n deviceModel,\n systemVersion: '1.0',\n appVersion: '%VERSION%',\n systemLangCode: 'en',\n langPack: '', // \"langPacks are for official apps only\"\n langCode: 'en',\n ...(params.initConnectionOptions ?? {}),\n apiId: params.apiId,\n // eslint-disable-next-line\n query: null as any,\n }\n\n this._transportFactory = params.transport ?? defaultTransportFactory\n this._reconnectionStrategy = params.reconnectionStrategy ?? defaultReconnectionStrategy\n this._connectionCount = params.connectionCount ?? defaultConnectionCountDelegate\n\n this._onConfigChanged = this._onConfigChanged.bind(this)\n config.onConfigUpdate(this._onConfigChanged)\n }\n\n private async _findDcOptions(dcId: number): Promise<ITelegramStorage.DcOptions> {\n const main = await this.config.findOption({\n dcId,\n allowIpv6: this.params.useIpv6,\n preferIpv6: this.params.useIpv6,\n allowMedia: false,\n cdn: false,\n })\n\n const media = await this.config.findOption({\n dcId,\n allowIpv6: this.params.useIpv6,\n preferIpv6: this.params.useIpv6,\n allowMedia: true,\n preferMedia: true,\n cdn: false,\n })\n\n if (!main || !media) {\n throw new MtArgumentError(`Could not find DC ${dcId}`)\n }\n\n return { main, media }\n }\n\n private _switchPrimaryDc(dc: DcConnectionManager) {\n if (this._primaryDc && this._primaryDc !== dc) {\n this._primaryDc.setIsPrimary(false)\n }\n\n this._primaryDc = dc\n dc.setIsPrimary(true)\n\n dc.main.on('usable', () => {\n this._lastUpdateTime = Date.now()\n this.params.onUsable()\n\n if (this._keepAliveInterval) clearInterval(this._keepAliveInterval)\n this._keepAliveInterval = setInterval(() => {\n if (Date.now() - this._lastUpdateTime > 900_000) {\n // telegram asks to fetch pending updates if there are no updates for 15 minutes.\n // it is up to the user to decide whether to do it or not\n\n this.params.keepAliveAction()\n this._lastUpdateTime = Date.now()\n }\n }, 60_000)\n\n Promise.resolve(this._storage.getSelf())\n .then((self) => {\n if (self?.isBot) {\n // bots may receive tmpSessions, which we should respect\n return this.config.update(true)\n }\n })\n .catch((e: Error) => this.params._emitError(e))\n })\n dc.main.on('update', (update: tl.TypeUpdates) => {\n this._lastUpdateTime = Date.now()\n this._updateHandler(update, false)\n })\n\n return dc.loadKeys().then(() => dc.main.ensureConnected())\n }\n\n private _dcCreationPromise = new Map<number, Promise<void>>()\n async _getOtherDc(dcId: number): Promise<DcConnectionManager> {\n if (!this._dcConnections.has(dcId)) {\n if (this._dcCreationPromise.has(dcId)) {\n this._log.debug('waiting for DC %d to be created', dcId)\n await this._dcCreationPromise.get(dcId)\n\n return this._dcConnections.get(dcId)!\n }\n\n const promise = createControllablePromise<void>()\n this._dcCreationPromise.set(dcId, promise)\n\n this._log.debug('creating new DC %d', dcId)\n\n try {\n const dcOptions = await this._findDcOptions(dcId)\n\n const dc = new DcConnectionManager(this, dcId, dcOptions)\n\n if (!(await dc.loadKeys())) {\n dc.main.requestAuth()\n }\n\n this._dcConnections.set(dcId, dc)\n promise.resolve()\n } catch (e) {\n promise.reject(e)\n }\n }\n\n return this._dcConnections.get(dcId)!\n }\n\n /**\n * Perform initial connection to the default DC\n *\n * @param defaultDcs Default DCs to connect to\n */\n async connect(defaultDcs: ITelegramStorage.DcOptions): Promise<void> {\n if (defaultDcs.main.id !== defaultDcs.media.id) {\n throw new MtArgumentError('Default DCs must be the same')\n }\n\n if (this._dcConnections.has(defaultDcs.main.id)) {\n // shouldn't happen\n throw new MtArgumentError('DC manager already exists')\n }\n\n const dc = new DcConnectionManager(this, defaultDcs.main.id, defaultDcs, true)\n this._dcConnections.set(defaultDcs.main.id, dc)\n await this._switchPrimaryDc(dc)\n }\n\n private _pendingExports: Record<number, Promise<void>> = {}\n private async _exportAuthTo(manager: DcConnectionManager): Promise<void> {\n if (manager.dcId in this._pendingExports) {\n this._log.debug('waiting for auth export to dc %d', manager.dcId)\n\n return this._pendingExports[manager.dcId]\n }\n\n this._log.debug('exporting auth to dc %d', manager.dcId)\n const promise = createControllablePromise<void>()\n this._pendingExports[manager.dcId] = promise\n\n try {\n const auth = await this.call({\n _: 'auth.exportAuthorization',\n dcId: manager.dcId,\n })\n\n const res = await this.call(\n {\n _: 'auth.importAuthorization',\n id: auth.id,\n bytes: auth.bytes,\n },\n { manager },\n )\n\n assertTypeIs('auth.importAuthorization', res, 'auth.authorization')\n\n promise.resolve()\n delete this._pendingExports[manager.dcId]\n } catch (e) {\n this._log.warn('failed to export auth to dc %d: %s', manager.dcId, e)\n promise.reject(e)\n throw e\n }\n }\n\n setIsPremium(isPremium: boolean): void {\n this._log.debug('setting isPremium to %s', isPremium)\n this.params.isPremium = isPremium\n\n for (const dc of this._dcConnections.values()) {\n dc.setIsPremium(isPremium)\n }\n }\n\n notifyLoggedIn(auth: tl.auth.TypeAuthorization): void {\n if (auth._ === 'auth.authorizationSignUpRequired' || auth.user._ === 'userEmpty') {\n return\n }\n\n if (auth.tmpSessions) {\n this._primaryDc?.main.setCount(auth.tmpSessions)\n }\n\n this.setIsPremium(auth.user.premium!)\n }\n\n resetSessions(): void {\n const dc = this._primaryDc\n if (!dc) return\n\n dc.main.resetSessions()\n dc.upload.resetSessions()\n dc.download.resetSessions()\n dc.downloadSmall.resetSessions()\n }\n\n private _onConfigChanged(config: tl.RawConfig): void {\n if (config.tmpSessions) {\n this._primaryDc?.main.setCount(config.tmpSessions)\n }\n }\n\n async changePrimaryDc(newDc: number): Promise<void> {\n if (newDc === this._primaryDc?.dcId) return\n\n const options = await this._findDcOptions(newDc)\n\n if (!this._dcConnections.has(newDc)) {\n this._dcConnections.set(newDc, new DcConnectionManager(this, newDc, options, true))\n }\n\n await this._storage.setDefaultDcs(options)\n\n await this._switchPrimaryDc(this._dcConnections.get(newDc)!)\n }\n\n private _floodWaitedRequests = new Map<string, number>()\n async call<T extends tl.RpcMethod>(\n message: T,\n params?: RpcCallOptions,\n stack?: string,\n ): Promise<tl.RpcCallReturn[T['_']]> {\n if (!this._primaryDc) {\n throw new MtcuteError('Not connected to any DC')\n }\n\n const floodSleepThreshold = params?.floodSleepThreshold ?? this.params.floodSleepThreshold\n const maxRetryCount = params?.maxRetryCount ?? this.params.maxRetryCount\n\n // do not send requests that are in flood wait\n if (this._floodWaitedRequests.has(message._)) {\n const delta = this._floodWaitedRequests.get(message._)! - Date.now()\n\n if (delta <= 3000) {\n // flood waits below 3 seconds are \"ignored\"\n this._floodWaitedRequests.delete(message._)\n } else if (delta <= this.params.floodSleepThreshold) {\n await sleep(delta)\n this._floodWaitedRequests.delete(message._)\n } else {\n const err = tl.RpcError.create(tl.RpcError.FLOOD, 'FLOOD_WAIT_%d')\n err.seconds = Math.ceil(delta / 1000)\n throw err\n }\n }\n\n let lastError: Error | null = null\n\n const kind = params?.kind ?? 'main'\n let manager: DcConnectionManager\n\n if (params?.manager) {\n manager = params.manager\n } else if (params?.dcId && params.dcId !== this._primaryDc.dcId) {\n manager = await this._getOtherDc(params.dcId)\n } else {\n manager = this._primaryDc\n }\n\n let multi = manager[kind]\n\n for (let i = 0; i < maxRetryCount; i++) {\n try {\n const res = await multi.sendRpc(message, stack, params?.timeout, params?.abortSignal)\n\n if (kind === 'main') {\n this._lastUpdateTime = Date.now()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return res\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n lastError = e as Error\n\n if (!tl.RpcError.is(e)) {\n throw e\n }\n\n if (!(e.code in CLIENT_ERRORS)) {\n this._log.warn('Telegram is having internal issues: %d %s, retrying', e.code, e.message)\n\n if (e.text === 'WORKER_BUSY_TOO_LONG_RETRY') {\n // according to tdlib, \"it is dangerous to resend query without timeout, so use 1\"\n await sleep(1000)\n }\n continue\n }\n\n if (e.is('FLOOD_WAIT_%d') || e.is('SLOWMODE_WAIT_%d') || e.is('FLOOD_TEST_PHONE_WAIT_%d')) {\n if (e.text !== 'SLOWMODE_WAIT_%d') {\n // SLOW_MODE_WAIT is chat-specific, not request-specific\n this._floodWaitedRequests.set(message._, Date.now() + e.seconds * 1000)\n }\n\n // In test servers, FLOOD_WAIT_0 has been observed, and sleeping for\n // such a short amount will cause retries very fast leading to issues\n if (e.seconds === 0) {\n e.seconds = 1\n }\n\n if (e.seconds <= floodSleepThreshold) {\n this._log.info('Flood wait for %d seconds', e.seconds)\n await sleep(e.seconds * 1000)\n continue\n }\n }\n\n if (manager === this._primaryDc) {\n if (e.is('PHONE_MIGRATE_%d') || e.is('NETWORK_MIGRATE_%d') || e.is('USER_MIGRATE_%d')) {\n this._log.info('Migrate error, new dc = %d', e.newDc)\n\n await this.changePrimaryDc(e.newDc)\n manager = this._primaryDc!\n multi = manager[kind]\n\n continue\n }\n } else if (e.is('AUTH_KEY_UNREGISTERED')) {\n // we can try re-exporting auth from the primary connection\n this._log.warn('exported auth key error, trying re-exporting..')\n\n await this._exportAuthTo(manager)\n continue\n }\n\n throw e\n }\n }\n\n throw lastError!\n }\n\n setUpdateHandler(handler: (upd: tl.TypeUpdates, fromClient: boolean) => void): void {\n this._updateHandler = handler\n }\n\n handleUpdate(update: tl.TypeUpdates, fromClient = true): void {\n this._updateHandler(update, fromClient)\n }\n\n changeTransport(factory: TransportFactory): void {\n for (const dc of this._dcConnections.values()) {\n dc.main.changeTransport(factory)\n dc.upload.changeTransport(factory)\n dc.download.changeTransport(factory)\n dc.downloadSmall.changeTransport(factory)\n }\n }\n\n getPoolSize(kind: ConnectionKind, dcId?: number) {\n const dc = dcId ? this._dcConnections.get(dcId) : this._primaryDc\n\n if (!dc) {\n if (!this._primaryDc) {\n throw new MtcuteError('Not connected to any DC')\n }\n\n // guess based on the provided delegate. it is most likely correct,\n // but we should give actual values if possible\n return this._connectionCount(kind, dcId ?? this._primaryDc.dcId, this.params.isPremium)\n }\n\n return dc[kind].getPoolSize()\n }\n\n getPrimaryDcId() {\n if (!this._primaryDc) throw new MtcuteError('Not connected to any DC')\n\n return this._primaryDc.dcId\n }\n\n destroy(): void {\n for (const dc of this._dcConnections.values()) {\n dc.main.destroy()\n dc.upload.destroy()\n dc.download.destroy()\n dc.downloadSmall.destroy()\n }\n if (this._keepAliveInterval) clearInterval(this._keepAliveInterval)\n this.config.offConfigUpdate(this._onConfigChanged)\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const test_1 = require("@mtcute/test");
|
|
5
|
+
const index_js_1 = require("../utils/index.js");
|
|
6
|
+
const persistent_connection_js_1 = require("./persistent-connection.js");
|
|
7
|
+
const reconnection_js_1 = require("./reconnection.js");
|
|
8
|
+
class FakePersistentConnection extends persistent_connection_js_1.PersistentConnection {
|
|
9
|
+
constructor(params) {
|
|
10
|
+
const log = new index_js_1.LogManager();
|
|
11
|
+
log.level = 0;
|
|
12
|
+
super(params, log);
|
|
13
|
+
}
|
|
14
|
+
onConnected() {
|
|
15
|
+
this.onConnectionUsable();
|
|
16
|
+
}
|
|
17
|
+
onError() { }
|
|
18
|
+
onMessage() { }
|
|
19
|
+
}
|
|
20
|
+
(0, vitest_1.describe)('PersistentConnection', () => {
|
|
21
|
+
(0, vitest_1.beforeEach)(() => void vitest_1.vi.useFakeTimers());
|
|
22
|
+
(0, vitest_1.afterEach)(() => void vitest_1.vi.useRealTimers());
|
|
23
|
+
const create = async (params) => {
|
|
24
|
+
return new FakePersistentConnection({
|
|
25
|
+
crypto: await (0, test_1.defaultTestCryptoProvider)(),
|
|
26
|
+
transportFactory: () => new test_1.StubTelegramTransport({}),
|
|
27
|
+
dc: (0, test_1.createStub)('dcOption'),
|
|
28
|
+
testMode: false,
|
|
29
|
+
reconnectionStrategy: reconnection_js_1.defaultReconnectionStrategy,
|
|
30
|
+
...params,
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
(0, vitest_1.it)('should set up listeners on transport', async () => {
|
|
34
|
+
const transportFactory = vitest_1.vi.fn().mockImplementation(() => {
|
|
35
|
+
const transport = new test_1.StubTelegramTransport({});
|
|
36
|
+
vitest_1.vi.spyOn(transport, 'on');
|
|
37
|
+
return transport;
|
|
38
|
+
});
|
|
39
|
+
await create({ transportFactory });
|
|
40
|
+
const transport = transportFactory.mock.results[0].value;
|
|
41
|
+
(0, vitest_1.expect)(transport.on).toHaveBeenCalledWith('ready', vitest_1.expect.any(Function));
|
|
42
|
+
(0, vitest_1.expect)(transport.on).toHaveBeenCalledWith('message', vitest_1.expect.any(Function));
|
|
43
|
+
(0, vitest_1.expect)(transport.on).toHaveBeenCalledWith('error', vitest_1.expect.any(Function));
|
|
44
|
+
(0, vitest_1.expect)(transport.on).toHaveBeenCalledWith('close', vitest_1.expect.any(Function));
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.it)('should properly reset old transport', async () => {
|
|
47
|
+
const transportFactory = vitest_1.vi.fn().mockImplementation(() => {
|
|
48
|
+
const transport = new test_1.StubTelegramTransport({});
|
|
49
|
+
vitest_1.vi.spyOn(transport, 'close');
|
|
50
|
+
return transport;
|
|
51
|
+
});
|
|
52
|
+
const pc = await create({ transportFactory });
|
|
53
|
+
const transport = transportFactory.mock.results[0].value;
|
|
54
|
+
pc.changeTransport(transportFactory);
|
|
55
|
+
(0, vitest_1.expect)(transport.close).toHaveBeenCalledOnce();
|
|
56
|
+
});
|
|
57
|
+
(0, vitest_1.it)('should buffer unsent packages', async () => {
|
|
58
|
+
const transportFactory = vitest_1.vi.fn().mockImplementation(() => {
|
|
59
|
+
const transport = new test_1.StubTelegramTransport({});
|
|
60
|
+
const transportConnect = transport.connect;
|
|
61
|
+
vitest_1.vi.spyOn(transport, 'connect').mockImplementation((dc, test) => {
|
|
62
|
+
setTimeout(() => {
|
|
63
|
+
transportConnect.call(transport, dc, test);
|
|
64
|
+
}, 100);
|
|
65
|
+
});
|
|
66
|
+
vitest_1.vi.spyOn(transport, 'send');
|
|
67
|
+
return transport;
|
|
68
|
+
});
|
|
69
|
+
const pc = await create({ transportFactory });
|
|
70
|
+
const transport = transportFactory.mock.results[0].value;
|
|
71
|
+
const data1 = new Uint8Array([1, 2, 3]);
|
|
72
|
+
const data2 = new Uint8Array([4, 5, 6]);
|
|
73
|
+
await pc.send(data1);
|
|
74
|
+
await pc.send(data2);
|
|
75
|
+
(0, vitest_1.expect)(transport.send).toHaveBeenCalledTimes(0);
|
|
76
|
+
await vitest_1.vi.advanceTimersByTimeAsync(150);
|
|
77
|
+
(0, vitest_1.expect)(transport.send).toHaveBeenCalledTimes(2);
|
|
78
|
+
(0, vitest_1.expect)(transport.send).toHaveBeenCalledWith(data1);
|
|
79
|
+
(0, vitest_1.expect)(transport.send).toHaveBeenCalledWith(data2);
|
|
80
|
+
});
|
|
81
|
+
(0, vitest_1.it)('should reconnect on close', async () => {
|
|
82
|
+
const reconnectionStrategy = vitest_1.vi.fn().mockImplementation(() => 1000);
|
|
83
|
+
const transportFactory = vitest_1.vi.fn().mockImplementation(() => new test_1.StubTelegramTransport({}));
|
|
84
|
+
const pc = await create({
|
|
85
|
+
reconnectionStrategy,
|
|
86
|
+
transportFactory,
|
|
87
|
+
});
|
|
88
|
+
const transport = transportFactory.mock.results[0].value;
|
|
89
|
+
pc.connect();
|
|
90
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(pc.isConnected).toBe(true));
|
|
91
|
+
transport.close();
|
|
92
|
+
(0, vitest_1.expect)(reconnectionStrategy).toHaveBeenCalledOnce();
|
|
93
|
+
(0, vitest_1.expect)(pc.isConnected).toBe(false);
|
|
94
|
+
await vitest_1.vi.advanceTimersByTimeAsync(1000);
|
|
95
|
+
(0, vitest_1.expect)(pc.isConnected).toBe(true);
|
|
96
|
+
});
|
|
97
|
+
(0, vitest_1.describe)('inactivity timeout', () => {
|
|
98
|
+
(0, vitest_1.it)('should disconnect on inactivity (passed in constructor)', async () => {
|
|
99
|
+
const pc = await create({
|
|
100
|
+
inactivityTimeout: 1000,
|
|
101
|
+
});
|
|
102
|
+
pc.connect();
|
|
103
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(pc.isConnected).toBe(true));
|
|
104
|
+
vitest_1.vi.advanceTimersByTime(1000);
|
|
105
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(pc.isConnected).toBe(false));
|
|
106
|
+
});
|
|
107
|
+
(0, vitest_1.it)('should disconnect on inactivity (set up with setInactivityTimeout)', async () => {
|
|
108
|
+
const pc = await create();
|
|
109
|
+
pc.connect();
|
|
110
|
+
pc.setInactivityTimeout(1000);
|
|
111
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(pc.isConnected).toBe(true));
|
|
112
|
+
vitest_1.vi.advanceTimersByTime(1000);
|
|
113
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(pc.isConnected).toBe(false));
|
|
114
|
+
});
|
|
115
|
+
(0, vitest_1.it)('should not disconnect on inactivity if disabled', async () => {
|
|
116
|
+
const pc = await create({
|
|
117
|
+
inactivityTimeout: 1000,
|
|
118
|
+
});
|
|
119
|
+
pc.connect();
|
|
120
|
+
pc.setInactivityTimeout(undefined);
|
|
121
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(pc.isConnected).toBe(true));
|
|
122
|
+
vitest_1.vi.advanceTimersByTime(1000);
|
|
123
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(pc.isConnected).toBe(true));
|
|
124
|
+
});
|
|
125
|
+
(0, vitest_1.it)('should reconnect after inactivity before sending', async () => {
|
|
126
|
+
const transportFactory = vitest_1.vi.fn().mockImplementation(() => {
|
|
127
|
+
const transport = new test_1.StubTelegramTransport({});
|
|
128
|
+
vitest_1.vi.spyOn(transport, 'connect');
|
|
129
|
+
vitest_1.vi.spyOn(transport, 'send');
|
|
130
|
+
return transport;
|
|
131
|
+
});
|
|
132
|
+
const pc = await create({
|
|
133
|
+
inactivityTimeout: 1000,
|
|
134
|
+
transportFactory,
|
|
135
|
+
});
|
|
136
|
+
const transport = transportFactory.mock.results[0].value;
|
|
137
|
+
pc.connect();
|
|
138
|
+
vitest_1.vi.advanceTimersByTime(1000);
|
|
139
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(pc.isConnected).toBe(false));
|
|
140
|
+
vitest_1.vi.mocked(transport.connect).mockClear();
|
|
141
|
+
await pc.send(new Uint8Array([1, 2, 3]));
|
|
142
|
+
(0, vitest_1.expect)(transport.connect).toHaveBeenCalledOnce();
|
|
143
|
+
(0, vitest_1.expect)(transport.send).toHaveBeenCalledOnce();
|
|
144
|
+
});
|
|
145
|
+
(0, vitest_1.it)('should propagate errors', async () => {
|
|
146
|
+
const transportFactory = vitest_1.vi.fn().mockImplementation(() => new test_1.StubTelegramTransport({}));
|
|
147
|
+
const pc = await create({ transportFactory });
|
|
148
|
+
const transport = transportFactory.mock.results[0].value;
|
|
149
|
+
pc.connect();
|
|
150
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(pc.isConnected).toBe(true));
|
|
151
|
+
const onErrorSpy = vitest_1.vi.spyOn(pc, 'onError');
|
|
152
|
+
transport.emit('error', new Error('test error'));
|
|
153
|
+
(0, vitest_1.expect)(onErrorSpy).toHaveBeenCalledOnce();
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
//# sourceMappingURL=persistent-connection.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistent-connection.test.js","sourceRoot":"","sources":["../../../src/network/persistent-connection.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport { createStub, defaultTestCryptoProvider, StubTelegramTransport } from '@mtcute/test'\n\nimport { LogManager } from '../utils/index.js'\nimport { PersistentConnection, PersistentConnectionParams } from './persistent-connection.js'\nimport { defaultReconnectionStrategy } from './reconnection.js'\n\nclass FakePersistentConnection extends PersistentConnection {\n constructor(params: PersistentConnectionParams) {\n const log = new LogManager()\n log.level = 0\n super(params, log)\n }\n\n onConnected() {\n this.onConnectionUsable()\n }\n onError() {}\n onMessage() {}\n}\n\ndescribe('PersistentConnection', () => {\n beforeEach(() => void vi.useFakeTimers())\n afterEach(() => void vi.useRealTimers())\n\n const create = async (params?: Partial<PersistentConnectionParams>) => {\n return new FakePersistentConnection({\n crypto: await defaultTestCryptoProvider(),\n transportFactory: () => new StubTelegramTransport({}),\n dc: createStub('dcOption'),\n testMode: false,\n reconnectionStrategy: defaultReconnectionStrategy,\n ...params,\n })\n }\n\n it('should set up listeners on transport', async () => {\n const transportFactory = vi.fn().mockImplementation(() => {\n const transport = new StubTelegramTransport({})\n\n vi.spyOn(transport, 'on')\n\n return transport\n })\n await create({ transportFactory })\n\n const transport = transportFactory.mock.results[0].value as StubTelegramTransport\n\n expect(transport.on).toHaveBeenCalledWith('ready', expect.any(Function))\n expect(transport.on).toHaveBeenCalledWith('message', expect.any(Function))\n expect(transport.on).toHaveBeenCalledWith('error', expect.any(Function))\n expect(transport.on).toHaveBeenCalledWith('close', expect.any(Function))\n })\n\n it('should properly reset old transport', async () => {\n const transportFactory = vi.fn().mockImplementation(() => {\n const transport = new StubTelegramTransport({})\n\n vi.spyOn(transport, 'close')\n\n return transport\n })\n const pc = await create({ transportFactory })\n\n const transport = transportFactory.mock.results[0].value as StubTelegramTransport\n\n pc.changeTransport(transportFactory)\n\n expect(transport.close).toHaveBeenCalledOnce()\n })\n\n it('should buffer unsent packages', async () => {\n const transportFactory = vi.fn().mockImplementation(() => {\n const transport = new StubTelegramTransport({})\n\n const transportConnect = transport.connect\n vi.spyOn(transport, 'connect').mockImplementation((dc, test) => {\n setTimeout(() => {\n transportConnect.call(transport, dc, test)\n }, 100)\n })\n vi.spyOn(transport, 'send')\n\n return transport\n })\n const pc = await create({ transportFactory })\n\n const transport = transportFactory.mock.results[0].value as StubTelegramTransport\n\n const data1 = new Uint8Array([1, 2, 3])\n const data2 = new Uint8Array([4, 5, 6])\n\n await pc.send(data1)\n await pc.send(data2)\n\n expect(transport.send).toHaveBeenCalledTimes(0)\n\n await vi.advanceTimersByTimeAsync(150)\n\n expect(transport.send).toHaveBeenCalledTimes(2)\n expect(transport.send).toHaveBeenCalledWith(data1)\n expect(transport.send).toHaveBeenCalledWith(data2)\n })\n\n it('should reconnect on close', async () => {\n const reconnectionStrategy = vi.fn().mockImplementation(() => 1000)\n const transportFactory = vi.fn().mockImplementation(() => new StubTelegramTransport({}))\n\n const pc = await create({\n reconnectionStrategy,\n transportFactory,\n })\n\n const transport = transportFactory.mock.results[0].value as StubTelegramTransport\n\n pc.connect()\n\n await vi.waitFor(() => expect(pc.isConnected).toBe(true))\n\n transport.close()\n\n expect(reconnectionStrategy).toHaveBeenCalledOnce()\n expect(pc.isConnected).toBe(false)\n\n await vi.advanceTimersByTimeAsync(1000)\n\n expect(pc.isConnected).toBe(true)\n })\n\n describe('inactivity timeout', () => {\n it('should disconnect on inactivity (passed in constructor)', async () => {\n const pc = await create({\n inactivityTimeout: 1000,\n })\n\n pc.connect()\n\n await vi.waitFor(() => expect(pc.isConnected).toBe(true))\n\n vi.advanceTimersByTime(1000)\n\n await vi.waitFor(() => expect(pc.isConnected).toBe(false))\n })\n\n it('should disconnect on inactivity (set up with setInactivityTimeout)', async () => {\n const pc = await create()\n\n pc.connect()\n pc.setInactivityTimeout(1000)\n\n await vi.waitFor(() => expect(pc.isConnected).toBe(true))\n\n vi.advanceTimersByTime(1000)\n\n await vi.waitFor(() => expect(pc.isConnected).toBe(false))\n })\n\n it('should not disconnect on inactivity if disabled', async () => {\n const pc = await create({\n inactivityTimeout: 1000,\n })\n\n pc.connect()\n pc.setInactivityTimeout(undefined)\n\n await vi.waitFor(() => expect(pc.isConnected).toBe(true))\n\n vi.advanceTimersByTime(1000)\n\n await vi.waitFor(() => expect(pc.isConnected).toBe(true))\n })\n\n it('should reconnect after inactivity before sending', async () => {\n const transportFactory = vi.fn().mockImplementation(() => {\n const transport = new StubTelegramTransport({})\n\n vi.spyOn(transport, 'connect')\n vi.spyOn(transport, 'send')\n\n return transport\n })\n\n const pc = await create({\n inactivityTimeout: 1000,\n transportFactory,\n })\n const transport = transportFactory.mock.results[0].value as StubTelegramTransport\n\n pc.connect()\n\n vi.advanceTimersByTime(1000)\n\n await vi.waitFor(() => expect(pc.isConnected).toBe(false))\n\n vi.mocked(transport.connect).mockClear()\n\n await pc.send(new Uint8Array([1, 2, 3]))\n\n expect(transport.connect).toHaveBeenCalledOnce()\n expect(transport.send).toHaveBeenCalledOnce()\n })\n\n it('should propagate errors', async () => {\n const transportFactory = vi.fn().mockImplementation(() => new StubTelegramTransport({}))\n\n const pc = await create({ transportFactory })\n const transport = transportFactory.mock.results[0].value as StubTelegramTransport\n\n pc.connect()\n\n await vi.waitFor(() => expect(pc.isConnected).toBe(true))\n\n const onErrorSpy = vi.spyOn(pc, 'onError')\n\n transport.emit('error', new Error('test error'))\n\n expect(onErrorSpy).toHaveBeenCalledOnce()\n })\n })\n})\n"]}
|
|
@@ -1359,7 +1359,6 @@ class SessionConnection extends persistent_connection_js_1.PersistentConnection
|
|
|
1359
1359
|
});
|
|
1360
1360
|
}
|
|
1361
1361
|
const result = writer.result();
|
|
1362
|
-
// probably the easiest way lol
|
|
1363
1362
|
this.log.debug('sending %d messages: size = %db, acks = %d (msg_id = %s), ping = %s (msg_id = %s), state_req = %s (msg_id = %s), resend = %s (msg_id = %s), cancels = %s (msg_id = %s), rpc = %s, container = %s, root msg_id = %l', messageCount, packetSize, ackMsgIds?.length || 'false', ackMsgIds?.map((it) => it.toString()), Boolean(pingRequest), pingMsgId, getStateMsgIds?.map((it) => it.toString()) || 'false', getStateMsgId, resendMsgIds?.map((it) => it.toString()) || 'false', cancelRpcs, cancelRpcs?.map((it) => it.toString()) || 'false', resendMsgId, rpcToSend.map((it) => it.method), useContainer, rootMsgId);
|
|
1364
1363
|
const enc = this._session.encryptMessage(result);
|
|
1365
1364
|
this.send(enc).catch((err) => {
|
|
@@ -1368,7 +1367,9 @@ class SessionConnection extends persistent_connection_js_1.PersistentConnection
|
|
|
1368
1367
|
if (ackMsgIds) {
|
|
1369
1368
|
this._session.queuedAcks.splice(0, 0, ...ackMsgIds);
|
|
1370
1369
|
}
|
|
1371
|
-
|
|
1370
|
+
if (rootMsgId) {
|
|
1371
|
+
this._onMessageFailed(rootMsgId, 'unknown error');
|
|
1372
|
+
}
|
|
1372
1373
|
});
|
|
1373
1374
|
}
|
|
1374
1375
|
}
|