diff --git a/packages/core/src/network/multi-session-connection.ts b/packages/core/src/network/multi-session-connection.ts index 5b14084b..d8cfeaa8 100644 --- a/packages/core/src/network/multi-session-connection.ts +++ b/packages/core/src/network/multi-session-connection.ts @@ -316,7 +316,7 @@ export class MultiSessionConnection { if (this._sessions[0].queuedRpc.length) { // there are pending requests, we need to reconnect. this._log.debug('notifying key change on the connection due to queued rpc') - this._connections[0].onConnected() + this._connections.forEach(conn => conn.onConnected()) } // connection is idle, we don't need to notify it diff --git a/packages/core/src/network/network-manager.ts b/packages/core/src/network/network-manager.ts index 20213aed..b191d784 100644 --- a/packages/core/src/network/network-manager.ts +++ b/packages/core/src/network/network-manager.ts @@ -11,7 +11,7 @@ import type { SessionConnectionParams } from './session-connection.js' import type { TelegramTransport } from './transports/abstract.js' import { defaultReconnectionStrategy, type ReconnectionStrategy } from '@fuman/net' -import { composeMiddlewares, Deferred } from '@fuman/utils' +import { asNonNull, composeMiddlewares, Deferred } from '@fuman/utils' import { MtArgumentError, MtcuteError, MtUnsupportedError } from '../types/index.js' import { assertTypeIs, isTlRpcError } from '../utils/type-assertions.js' import { basic as defaultMiddlewares } from './middlewares/default.js' @@ -580,10 +580,11 @@ export class NetworkManager { async _getOtherDc(dcId: number): Promise { if (!this._dcConnections.has(dcId)) { if (this._dcCreationPromise.has(dcId)) { - this._log.debug('waiting for DC %d to be created', dcId) + this._log.debug('waiting for dc %d to be created', dcId) await this._dcCreationPromise.get(dcId) + this._log.debug('dc %d was created', dcId) - return this._dcConnections.get(dcId)! + return asNonNull(this._dcConnections.get(dcId)) } const promise = new Deferred() @@ -602,8 +603,11 @@ export class NetworkManager { this._dcConnections.set(dcId, dc) promise.resolve() + this._dcCreationPromise.delete(dcId) } catch (e) { promise.reject(e) + this._dcCreationPromise.delete(dcId) + return this._getOtherDc(dcId) } } @@ -632,17 +636,17 @@ export class NetworkManager { await this._switchPrimaryDc(dc) } - private _pendingExports: Record> = {} + private _pendingExports = new Map>() private async _exportAuthTo(manager: DcConnectionManager): Promise { - if (manager.dcId in this._pendingExports) { + if (this._pendingExports.has(manager.dcId)) { this._log.debug('waiting for auth export to dc %d', manager.dcId) - return this._pendingExports[manager.dcId] + return this._pendingExports.get(manager.dcId) } this._log.debug('exporting auth to dc %d', manager.dcId) const promise = new Deferred() - this._pendingExports[manager.dcId] = promise.promise + this._pendingExports.set(manager.dcId, promise.promise) try { const auth = await this.call({ @@ -670,7 +674,7 @@ export class NetworkManager { assertTypeIs('auth.importAuthorization', res, 'auth.authorization') promise.resolve() - delete this._pendingExports[manager.dcId] + this._pendingExports.delete(manager.dcId) } catch (e) { this._log.warn('failed to export auth to dc %d: %s', manager.dcId, e) promise.reject(e)