fix(core): multi-connection key change handling
This commit is contained in:
parent
4f213b9652
commit
ae09b1f124
2 changed files with 13 additions and 9 deletions
|
@ -316,7 +316,7 @@ export class MultiSessionConnection {
|
||||||
if (this._sessions[0].queuedRpc.length) {
|
if (this._sessions[0].queuedRpc.length) {
|
||||||
// there are pending requests, we need to reconnect.
|
// there are pending requests, we need to reconnect.
|
||||||
this._log.debug('notifying key change on the connection due to queued rpc')
|
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
|
// connection is idle, we don't need to notify it
|
||||||
|
|
|
@ -11,7 +11,7 @@ import type { SessionConnectionParams } from './session-connection.js'
|
||||||
import type { TelegramTransport } from './transports/abstract.js'
|
import type { TelegramTransport } from './transports/abstract.js'
|
||||||
import { defaultReconnectionStrategy, type ReconnectionStrategy } from '@fuman/net'
|
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 { MtArgumentError, MtcuteError, MtUnsupportedError } from '../types/index.js'
|
||||||
import { assertTypeIs, isTlRpcError } from '../utils/type-assertions.js'
|
import { assertTypeIs, isTlRpcError } from '../utils/type-assertions.js'
|
||||||
import { basic as defaultMiddlewares } from './middlewares/default.js'
|
import { basic as defaultMiddlewares } from './middlewares/default.js'
|
||||||
|
@ -580,10 +580,11 @@ export class NetworkManager {
|
||||||
async _getOtherDc(dcId: number): Promise<DcConnectionManager> {
|
async _getOtherDc(dcId: number): Promise<DcConnectionManager> {
|
||||||
if (!this._dcConnections.has(dcId)) {
|
if (!this._dcConnections.has(dcId)) {
|
||||||
if (this._dcCreationPromise.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)
|
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<void>()
|
const promise = new Deferred<void>()
|
||||||
|
@ -602,8 +603,11 @@ export class NetworkManager {
|
||||||
|
|
||||||
this._dcConnections.set(dcId, dc)
|
this._dcConnections.set(dcId, dc)
|
||||||
promise.resolve()
|
promise.resolve()
|
||||||
|
this._dcCreationPromise.delete(dcId)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
promise.reject(e)
|
promise.reject(e)
|
||||||
|
this._dcCreationPromise.delete(dcId)
|
||||||
|
return this._getOtherDc(dcId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -632,17 +636,17 @@ export class NetworkManager {
|
||||||
await this._switchPrimaryDc(dc)
|
await this._switchPrimaryDc(dc)
|
||||||
}
|
}
|
||||||
|
|
||||||
private _pendingExports: Record<number, Promise<void>> = {}
|
private _pendingExports = new Map<number, Promise<void>>()
|
||||||
private async _exportAuthTo(manager: DcConnectionManager): Promise<void> {
|
private async _exportAuthTo(manager: DcConnectionManager): Promise<void> {
|
||||||
if (manager.dcId in this._pendingExports) {
|
if (this._pendingExports.has(manager.dcId)) {
|
||||||
this._log.debug('waiting for auth export to dc %d', 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)
|
this._log.debug('exporting auth to dc %d', manager.dcId)
|
||||||
const promise = new Deferred<void>()
|
const promise = new Deferred<void>()
|
||||||
this._pendingExports[manager.dcId] = promise.promise
|
this._pendingExports.set(manager.dcId, promise.promise)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const auth = await this.call({
|
const auth = await this.call({
|
||||||
|
@ -670,7 +674,7 @@ export class NetworkManager {
|
||||||
assertTypeIs('auth.importAuthorization', res, 'auth.authorization')
|
assertTypeIs('auth.importAuthorization', res, 'auth.authorization')
|
||||||
|
|
||||||
promise.resolve()
|
promise.resolve()
|
||||||
delete this._pendingExports[manager.dcId]
|
this._pendingExports.delete(manager.dcId)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this._log.warn('failed to export auth to dc %d: %s', manager.dcId, e)
|
this._log.warn('failed to export auth to dc %d: %s', manager.dcId, e)
|
||||||
promise.reject(e)
|
promise.reject(e)
|
||||||
|
|
Loading…
Reference in a new issue