@mtcute/core 0.1.2 → 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/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/transports/intermediate.test.js +1 -3
- package/cjs/network/transports/intermediate.test.js.map +1 -1
- package/cjs/network/transports/tcp.test.js +96 -90
- package/cjs/network/transports/tcp.test.js.map +1 -1
- 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.js +4 -5
- package/cjs/storage/json.test.js.map +1 -1
- 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/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.js +2 -1
- package/cjs/storage/memory.test.js.map +1 -1
- 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/crypto/mtproto.test.js +26 -23
- package/cjs/utils/crypto/mtproto.test.js.map +1 -1
- package/cjs/utils/crypto/node.test.js +9 -8
- package/cjs/utils/crypto/node.test.js.map +1 -1
- package/cjs/utils/crypto/utils.test.js +4 -4
- package/cjs/utils/crypto/utils.test.js.map +1 -1
- package/cjs/utils/logger.test.js +10 -8
- package/cjs/utils/logger.test.js.map +1 -1
- package/cjs/utils/peer-utils.js +3 -1
- package/cjs/utils/peer-utils.js.map +1 -1
- 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/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/transports/intermediate.test.js +1 -3
- package/esm/network/transports/intermediate.test.js.map +1 -1
- package/esm/network/transports/tcp.test.js +96 -90
- package/esm/network/transports/tcp.test.js.map +1 -1
- 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.js +4 -5
- package/esm/storage/json.test.js.map +1 -1
- 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/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.js +2 -1
- package/esm/storage/memory.test.js.map +1 -1
- 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/crypto/mtproto.test.js +27 -24
- package/esm/utils/crypto/mtproto.test.js.map +1 -1
- package/esm/utils/crypto/node.test.js +9 -8
- package/esm/utils/crypto/node.test.js.map +1 -1
- package/esm/utils/crypto/utils.test.js +4 -4
- package/esm/utils/crypto/utils.test.js.map +1 -1
- package/esm/utils/logger.test.js +10 -8
- package/esm/utils/logger.test.js.map +1 -1
- package/esm/utils/peer-utils.js +3 -1
- package/esm/utils/peer-utils.js.map +1 -1
- 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"]}
|
|
@@ -2,7 +2,6 @@ import { describe, expect, it } from 'vitest';
|
|
|
2
2
|
import { defaultTestCryptoProvider, useFakeMathRandom } from '@mtcute/test';
|
|
3
3
|
import { hexDecodeToBuffer, hexEncode } from '@mtcute/tl-runtime';
|
|
4
4
|
import { IntermediatePacketCodec, PaddedIntermediatePacketCodec, TransportError } from '../../index.js';
|
|
5
|
-
import { concatBuffers } from '../../utils/index.js';
|
|
6
5
|
describe('IntermediatePacketCodec', () => {
|
|
7
6
|
it('should return correct tag', () => {
|
|
8
7
|
expect(hexEncode(new IntermediatePacketCodec().tag())).eq('eeeeeeee');
|
|
@@ -62,8 +61,7 @@ describe('IntermediatePacketCodec', () => {
|
|
|
62
61
|
}));
|
|
63
62
|
it('should correctly frame packets', () => {
|
|
64
63
|
const data = hexDecodeToBuffer('6cfeffff');
|
|
65
|
-
|
|
66
|
-
expect(Buffer.from(new IntermediatePacketCodec().encode(data))).toEqual(concatBuffers([new Uint8Array([0x04, 0x00, 0x00, 0x00]), data]));
|
|
64
|
+
expect(hexEncode(new IntermediatePacketCodec().encode(data))).toEqual('040000006cfeffff');
|
|
67
65
|
});
|
|
68
66
|
});
|
|
69
67
|
describe('PaddedIntermediatePacketCodec', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intermediate.test.js","sourceRoot":"","sources":["../../../../src/network/transports/intermediate.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAC3E,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAEjE,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"intermediate.test.js","sourceRoot":"","sources":["../../../../src/network/transports/intermediate.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { defaultTestCryptoProvider, useFakeMathRandom } from '@mtcute/test'\nimport { hexDecodeToBuffer, hexEncode } from '@mtcute/tl-runtime'\n\nimport { IntermediatePacketCodec, PaddedIntermediatePacketCodec, TransportError } from '../../index.js'\n\ndescribe('IntermediatePacketCodec', () => {\n it('should return correct tag', () => {\n expect(hexEncode(new IntermediatePacketCodec().tag())).eq('eeeeeeee')\n })\n\n it('should correctly parse immediate framing', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n codec.on('packet', (data: Uint8Array) => {\n expect([...data]).eql([5, 1, 2, 3, 4])\n done()\n })\n codec.feed(hexDecodeToBuffer('050000000501020304'))\n }))\n\n it('should correctly parse incomplete framing', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n codec.on('packet', (data: Uint8Array) => {\n expect([...data]).eql([5, 1, 2, 3, 4])\n done()\n })\n codec.feed(hexDecodeToBuffer('050000000501'))\n codec.feed(hexDecodeToBuffer('020304'))\n }))\n\n it('should correctly parse multiple streamed packets', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n\n let number = 0\n\n codec.on('packet', (data: Uint8Array) => {\n if (number === 0) {\n expect([...data]).eql([5, 1, 2, 3, 4])\n number = 1\n } else {\n expect([...data]).eql([3, 1, 2, 3, 1])\n done()\n }\n })\n codec.feed(hexDecodeToBuffer('050000000501'))\n codec.feed(hexDecodeToBuffer('020304050000'))\n codec.feed(hexDecodeToBuffer('000301020301'))\n }))\n\n it('should correctly parse transport errors', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n\n codec.on('error', (err: TransportError) => {\n expect(err).to.have.instanceOf(TransportError)\n expect(err.code).eq(404)\n done()\n })\n\n codec.feed(hexDecodeToBuffer('040000006cfeffff'))\n }))\n\n it('should reset when called reset()', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n\n codec.on('packet', (data: Uint8Array) => {\n expect([...data]).eql([1, 2, 3, 4, 5])\n done()\n })\n\n codec.feed(hexDecodeToBuffer('ff0000001234567812345678'))\n codec.reset()\n codec.feed(hexDecodeToBuffer('050000000102030405'))\n }))\n\n it('should correctly frame packets', () => {\n const data = hexDecodeToBuffer('6cfeffff')\n\n expect(hexEncode(new IntermediatePacketCodec().encode(data))).toEqual('040000006cfeffff')\n })\n})\n\ndescribe('PaddedIntermediatePacketCodec', () => {\n useFakeMathRandom()\n\n const create = async () => {\n const codec = new PaddedIntermediatePacketCodec()\n codec.setup!(await defaultTestCryptoProvider())\n\n return codec\n }\n\n it('should return correct tag', async () => {\n expect(hexEncode((await create()).tag())).eq('dddddddd')\n })\n\n it('should correctly frame packets', async () => {\n const data = hexDecodeToBuffer('6cfeffff')\n\n expect(hexEncode((await create()).encode(data))).toEqual('0a0000006cfeffff29afd26df40f')\n })\n})\n"]}
|
|
@@ -1,95 +1,101 @@
|
|
|
1
1
|
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
};
|
|
18
|
-
}),
|
|
19
|
-
}));
|
|
20
|
-
describe('TcpTransport', async () => {
|
|
2
|
+
if (import.meta.env.TEST_ENV === 'node') {
|
|
3
|
+
vi.doMock('net', () => ({
|
|
4
|
+
connect: vi.fn().mockImplementation((port, ip, cb) => {
|
|
5
|
+
cb();
|
|
6
|
+
return {
|
|
7
|
+
on: vi.fn(),
|
|
8
|
+
write: vi.fn().mockImplementation((data, cb) => {
|
|
9
|
+
cb();
|
|
10
|
+
}),
|
|
11
|
+
end: vi.fn(),
|
|
12
|
+
removeAllListeners: vi.fn(),
|
|
13
|
+
destroy: vi.fn(),
|
|
14
|
+
};
|
|
15
|
+
}),
|
|
16
|
+
}));
|
|
21
17
|
const net = await import('net');
|
|
22
18
|
const connect = vi.mocked(net.connect);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
};
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
19
|
+
// we need to do these imports here because basically all of them import `net`
|
|
20
|
+
const { defaultTestCryptoProvider, u8HexDecode } = await import('@mtcute/test');
|
|
21
|
+
const { TcpTransport } = await import('./tcp.js');
|
|
22
|
+
const { defaultProductionDc, hexDecodeToBuffer, LogManager } = await import('../../utils/index.js');
|
|
23
|
+
const { TransportState } = await import('./abstract.js');
|
|
24
|
+
describe('TcpTransport', () => {
|
|
25
|
+
const getLastSocket = () => {
|
|
26
|
+
return connect.mock.results[connect.mock.results.length - 1].value;
|
|
27
|
+
};
|
|
28
|
+
const create = async () => {
|
|
29
|
+
const transport = new TcpTransport();
|
|
30
|
+
const logger = new LogManager();
|
|
31
|
+
logger.level = 0;
|
|
32
|
+
transport.setup(await defaultTestCryptoProvider(), logger);
|
|
33
|
+
return transport;
|
|
34
|
+
};
|
|
35
|
+
it('should initiate a tcp connection to the given dc', async () => {
|
|
36
|
+
const t = await create();
|
|
37
|
+
t.connect(defaultProductionDc.main, false);
|
|
38
|
+
expect(connect).toHaveBeenCalledOnce();
|
|
39
|
+
expect(connect).toHaveBeenCalledWith(defaultProductionDc.main.port, defaultProductionDc.main.ipAddress, expect.any(Function));
|
|
40
|
+
await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
|
|
41
|
+
});
|
|
42
|
+
it('should set up event handlers', async () => {
|
|
43
|
+
const t = await create();
|
|
44
|
+
t.connect(defaultProductionDc.main, false);
|
|
45
|
+
const socket = getLastSocket();
|
|
46
|
+
expect(socket.on).toHaveBeenCalledTimes(3);
|
|
47
|
+
expect(socket.on).toHaveBeenCalledWith('data', expect.any(Function));
|
|
48
|
+
expect(socket.on).toHaveBeenCalledWith('error', expect.any(Function));
|
|
49
|
+
expect(socket.on).toHaveBeenCalledWith('close', expect.any(Function));
|
|
50
|
+
});
|
|
51
|
+
it('should write packet codec tag once connected', async () => {
|
|
52
|
+
const t = await create();
|
|
53
|
+
t.connect(defaultProductionDc.main, false);
|
|
54
|
+
const socket = getLastSocket();
|
|
55
|
+
await vi.waitFor(() => expect(socket.write).toHaveBeenCalledWith(u8HexDecode('eeeeeeee'), // intermediate
|
|
56
|
+
expect.any(Function)));
|
|
57
|
+
});
|
|
58
|
+
it('should write to the underlying socket', async () => {
|
|
59
|
+
const t = await create();
|
|
60
|
+
t.connect(defaultProductionDc.main, false);
|
|
61
|
+
await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
|
|
62
|
+
await t.send(hexDecodeToBuffer('00010203040506070809'));
|
|
63
|
+
const socket = getLastSocket();
|
|
64
|
+
expect(socket.write).toHaveBeenCalledWith(u8HexDecode('0a00000000010203040506070809'), expect.any(Function));
|
|
65
|
+
});
|
|
66
|
+
it('should correctly close', async () => {
|
|
67
|
+
const t = await create();
|
|
68
|
+
t.connect(defaultProductionDc.main, false);
|
|
69
|
+
await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
|
|
70
|
+
t.close();
|
|
71
|
+
const socket = getLastSocket();
|
|
72
|
+
expect(socket.removeAllListeners).toHaveBeenCalledOnce();
|
|
73
|
+
expect(socket.destroy).toHaveBeenCalledOnce();
|
|
74
|
+
});
|
|
75
|
+
it('should feed data to the packet codec', async () => {
|
|
76
|
+
const t = await create();
|
|
77
|
+
const codec = t._packetCodec;
|
|
78
|
+
const spyFeed = vi.spyOn(codec, 'feed');
|
|
79
|
+
t.connect(defaultProductionDc.main, false);
|
|
80
|
+
await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
|
|
81
|
+
const socket = getLastSocket();
|
|
82
|
+
const onDataCall = socket.on.mock.calls.find((c) => c[0] === 'data');
|
|
83
|
+
onDataCall[1](u8HexDecode('00010203040506070809'));
|
|
84
|
+
expect(spyFeed).toHaveBeenCalledWith(u8HexDecode('00010203040506070809'));
|
|
85
|
+
});
|
|
86
|
+
it('should propagate errors', async () => {
|
|
87
|
+
const t = await create();
|
|
88
|
+
const spyEmit = vi.spyOn(t, 'emit').mockImplementation(() => true);
|
|
89
|
+
t.connect(defaultProductionDc.main, false);
|
|
90
|
+
await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
|
|
91
|
+
const socket = getLastSocket();
|
|
92
|
+
const onErrorCall = socket.on.mock.calls.find((c) => c[0] === 'error');
|
|
93
|
+
onErrorCall[1](new Error('test error'));
|
|
94
|
+
expect(spyEmit).toHaveBeenCalledWith('error', new Error('test error'));
|
|
95
|
+
});
|
|
93
96
|
});
|
|
94
|
-
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
describe.skip('TcpTransport', () => { });
|
|
100
|
+
}
|
|
95
101
|
//# sourceMappingURL=tcp.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tcp.test.js","sourceRoot":"","sources":["../../../../src/network/transports/tcp.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Socket } from 'net'\nimport { describe, expect, it, MockedObject, vi } from 'vitest'\n\nimport { defaultTestCryptoProvider, u8HexDecode } from '@mtcute/test'\n\nimport { defaultProductionDc, hexDecodeToBuffer, LogManager } from '../../utils/index.js'\nimport { TransportState } from './abstract.js'\nimport { TcpTransport } from './tcp.js'\n\nvi.mock('net', () => ({\n connect: vi.fn().mockImplementation((port: number, ip: string, cb: () => void) => {\n cb()\n\n return {\n on: vi.fn(),\n write: vi.fn().mockImplementation((data: Uint8Array, cb: () => void) => {\n cb()\n }),\n end: vi.fn(),\n removeAllListeners: vi.fn(),\n destroy: vi.fn(),\n }\n }),\n}))\n\ndescribe('TcpTransport', async () => {\n const net = await import('net')\n const connect = vi.mocked(net.connect)\n\n const getLastSocket = () => {\n return connect.mock.results[connect.mock.results.length - 1].value as MockedObject<Socket>\n }\n\n const create = async () => {\n const transport = new TcpTransport()\n const logger = new LogManager()\n logger.level = 0\n transport.setup(await defaultTestCryptoProvider(), logger)\n\n return transport\n }\n\n it('should initiate a tcp connection to the given dc', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n\n expect(connect).toHaveBeenCalledOnce()\n expect(connect).toHaveBeenCalledWith(\n defaultProductionDc.main.port,\n defaultProductionDc.main.ipAddress,\n expect.any(Function),\n )\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n })\n\n it('should set up event handlers', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n\n const socket = getLastSocket()\n\n expect(socket.on).toHaveBeenCalledTimes(3)\n expect(socket.on).toHaveBeenCalledWith('data', expect.any(Function))\n expect(socket.on).toHaveBeenCalledWith('error', expect.any(Function))\n expect(socket.on).toHaveBeenCalledWith('close', expect.any(Function))\n })\n\n it('should write packet codec tag once connected', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n\n const socket = getLastSocket()\n\n await vi.waitFor(() =>\n expect(socket.write).toHaveBeenCalledWith(\n u8HexDecode('eeeeeeee'), // intermediate\n expect.any(Function),\n ),\n )\n })\n\n it('should write to the underlying socket', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n await t.send(hexDecodeToBuffer('00010203040506070809'))\n\n const socket = getLastSocket()\n\n expect(socket.write).toHaveBeenCalledWith(u8HexDecode('0a00000000010203040506070809'), expect.any(Function))\n })\n\n it('should correctly close', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n t.close()\n\n const socket = getLastSocket()\n\n expect(socket.removeAllListeners).toHaveBeenCalledOnce()\n expect(socket.destroy).toHaveBeenCalledOnce()\n })\n\n it('should feed data to the packet codec', async () => {\n const t = await create()\n const codec = t._packetCodec\n\n const spyFeed = vi.spyOn(codec, 'feed')\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n const socket = getLastSocket()\n\n const onDataCall = socket.on.mock.calls.find((c) => (c as string[])[0] === 'data') as unknown as [\n string,\n (data: Uint8Array) => void,\n ]\n onDataCall[1](u8HexDecode('00010203040506070809'))\n\n expect(spyFeed).toHaveBeenCalledWith(u8HexDecode('00010203040506070809'))\n })\n\n it('should propagate errors', async () => {\n const t = await create()\n\n const spyEmit = vi.spyOn(t, 'emit').mockImplementation(() => true)\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n const socket = getLastSocket()\n\n const onErrorCall = socket.on.mock.calls.find((c) => (c as string[])[0] === 'error') as unknown as [\n string,\n (error: Error) => void,\n ]\n onErrorCall[1](new Error('test error'))\n\n expect(spyEmit).toHaveBeenCalledWith('error', new Error('test error'))\n })\n})\n"]}
|
|
1
|
+
{"version":3,"file":"tcp.test.js","sourceRoot":"","sources":["../../../../src/network/transports/tcp.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Socket } from 'net'\nimport { describe, expect, it, MockedObject, vi } from 'vitest'\n\nif (import.meta.env.TEST_ENV === 'node') {\n vi.doMock('net', () => ({\n connect: vi.fn().mockImplementation((port: number, ip: string, cb: () => void) => {\n cb()\n\n return {\n on: vi.fn(),\n write: vi.fn().mockImplementation((data: Uint8Array, cb: () => void) => {\n cb()\n }),\n end: vi.fn(),\n removeAllListeners: vi.fn(),\n destroy: vi.fn(),\n }\n }),\n }))\n\n const net = await import('net')\n const connect = vi.mocked(net.connect)\n\n // we need to do these imports here because basically all of them import `net`\n const { defaultTestCryptoProvider, u8HexDecode } = await import('@mtcute/test')\n\n const { TcpTransport } = await import('./tcp.js')\n const { defaultProductionDc, hexDecodeToBuffer, LogManager } = await import('../../utils/index.js')\n const { TransportState } = await import('./abstract.js')\n\n describe('TcpTransport', () => {\n const getLastSocket = () => {\n return connect.mock.results[connect.mock.results.length - 1].value as MockedObject<Socket>\n }\n\n const create = async () => {\n const transport = new TcpTransport()\n const logger = new LogManager()\n logger.level = 0\n transport.setup(await defaultTestCryptoProvider(), logger)\n\n return transport\n }\n\n it('should initiate a tcp connection to the given dc', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n\n expect(connect).toHaveBeenCalledOnce()\n expect(connect).toHaveBeenCalledWith(\n defaultProductionDc.main.port,\n defaultProductionDc.main.ipAddress,\n expect.any(Function),\n )\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n })\n\n it('should set up event handlers', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n\n const socket = getLastSocket()\n\n expect(socket.on).toHaveBeenCalledTimes(3)\n expect(socket.on).toHaveBeenCalledWith('data', expect.any(Function))\n expect(socket.on).toHaveBeenCalledWith('error', expect.any(Function))\n expect(socket.on).toHaveBeenCalledWith('close', expect.any(Function))\n })\n\n it('should write packet codec tag once connected', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n\n const socket = getLastSocket()\n\n await vi.waitFor(() =>\n expect(socket.write).toHaveBeenCalledWith(\n u8HexDecode('eeeeeeee'), // intermediate\n expect.any(Function),\n ),\n )\n })\n\n it('should write to the underlying socket', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n await t.send(hexDecodeToBuffer('00010203040506070809'))\n\n const socket = getLastSocket()\n\n expect(socket.write).toHaveBeenCalledWith(u8HexDecode('0a00000000010203040506070809'), expect.any(Function))\n })\n\n it('should correctly close', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n t.close()\n\n const socket = getLastSocket()\n\n expect(socket.removeAllListeners).toHaveBeenCalledOnce()\n expect(socket.destroy).toHaveBeenCalledOnce()\n })\n\n it('should feed data to the packet codec', async () => {\n const t = await create()\n const codec = t._packetCodec\n\n const spyFeed = vi.spyOn(codec, 'feed')\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n const socket = getLastSocket()\n\n const onDataCall = socket.on.mock.calls.find((c) => (c as string[])[0] === 'data') as unknown as [\n string,\n (data: Uint8Array) => void,\n ]\n onDataCall[1](u8HexDecode('00010203040506070809'))\n\n expect(spyFeed).toHaveBeenCalledWith(u8HexDecode('00010203040506070809'))\n })\n\n it('should propagate errors', async () => {\n const t = await create()\n\n const spyEmit = vi.spyOn(t, 'emit').mockImplementation(() => true)\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n const socket = getLastSocket()\n\n const onErrorCall = socket.on.mock.calls.find((c) => (c as string[])[0] === 'error') as unknown as [\n string,\n (error: Error) => void,\n ]\n onErrorCall[1](new Error('test error'))\n\n expect(spyEmit).toHaveBeenCalledWith('error', new Error('test error'))\n })\n })\n} else {\n describe.skip('TcpTransport', () => {})\n}\n"]}
|
|
@@ -124,6 +124,10 @@ export interface ITelegramStorage {
|
|
|
124
124
|
updatePeers(peers: ITelegramStorage.PeerInfo[]): MaybeAsync<void>;
|
|
125
125
|
/**
|
|
126
126
|
* Find a peer in local database by its marked ID
|
|
127
|
+
*
|
|
128
|
+
* If no peer was found, the storage should try searching its
|
|
129
|
+
* reference messages database. If a reference message is found,
|
|
130
|
+
* a `inputPeer*FromMessage` constructor should be returned
|
|
127
131
|
*/
|
|
128
132
|
getPeerById(peerId: number): MaybeAsync<tl.TypeInputPeer | null>;
|
|
129
133
|
/**
|
|
@@ -134,6 +138,20 @@ export interface ITelegramStorage {
|
|
|
134
138
|
* Find a peer in local database by its phone number
|
|
135
139
|
*/
|
|
136
140
|
getPeerByPhone(phone: string): MaybeAsync<tl.TypeInputPeer | null>;
|
|
141
|
+
/**
|
|
142
|
+
* For `*FromMessage` constructors: store a reference to a `peerId` -
|
|
143
|
+
* it was seen in message `messageId` in chat `chatId`.
|
|
144
|
+
*
|
|
145
|
+
* `peerId` and `chatId` are marked peer IDs.
|
|
146
|
+
*
|
|
147
|
+
* Learn more: https://core.telegram.org/api/min
|
|
148
|
+
*/
|
|
149
|
+
saveReferenceMessage(peerId: number, chatId: number, messageId: number): MaybeAsync<void>;
|
|
150
|
+
/**
|
|
151
|
+
* For `*FromMessage` constructors: messages `messageIds` in chat `chatId` were deleted,
|
|
152
|
+
* so remove any stored peer references to them.
|
|
153
|
+
*/
|
|
154
|
+
deleteReferenceMessages(chatId: number, messageIds: number[]): MaybeAsync<void>;
|
|
137
155
|
/**
|
|
138
156
|
* Get updates state (if available), represented as a tuple
|
|
139
157
|
* containing: `pts, qts, date, seq`
|