|
|
@ -18,7 +18,7 @@ import networkerFactory from './networkerFactory'; |
|
|
|
import authorizer from './authorizer'; |
|
|
|
import authorizer from './authorizer'; |
|
|
|
import dcConfigurator, { ConnectionType, TransportType } from './dcConfigurator'; |
|
|
|
import dcConfigurator, { ConnectionType, TransportType } from './dcConfigurator'; |
|
|
|
import { logger } from '../logger'; |
|
|
|
import { logger } from '../logger'; |
|
|
|
import type { InvokeApiOptions } from '../../types'; |
|
|
|
import type { DcId, InvokeApiOptions, TrueDcId } from '../../types'; |
|
|
|
import type { MethodDeclMap } from '../../layer'; |
|
|
|
import type { MethodDeclMap } from '../../layer'; |
|
|
|
import { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise'; |
|
|
|
import { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise'; |
|
|
|
import { bytesFromHex, bytesToHex } from '../../helpers/bytes'; |
|
|
|
import { bytesFromHex, bytesToHex } from '../../helpers/bytes'; |
|
|
@ -78,7 +78,7 @@ export class ApiManager { |
|
|
|
|
|
|
|
|
|
|
|
private cachedExportPromise: {[x: number]: Promise<unknown>} = {}; |
|
|
|
private cachedExportPromise: {[x: number]: Promise<unknown>} = {}; |
|
|
|
private gettingNetworkers: {[dcIdAndType: string]: Promise<MTPNetworker>} = {}; |
|
|
|
private gettingNetworkers: {[dcIdAndType: string]: Promise<MTPNetworker>} = {}; |
|
|
|
private baseDcId = 0; |
|
|
|
private baseDcId: DcId = 0 as DcId; |
|
|
|
|
|
|
|
|
|
|
|
//public telegramMeNotified = false;
|
|
|
|
//public telegramMeNotified = false;
|
|
|
|
|
|
|
|
|
|
|
@ -140,7 +140,7 @@ export class ApiManager { |
|
|
|
/// #endif
|
|
|
|
/// #endif
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public setBaseDcId(dcId: number) { |
|
|
|
public setBaseDcId(dcId: DcId) { |
|
|
|
this.baseDcId = dcId; |
|
|
|
this.baseDcId = dcId; |
|
|
|
|
|
|
|
|
|
|
|
sessionStorage.set({ |
|
|
|
sessionStorage.set({ |
|
|
@ -163,14 +163,14 @@ export class ApiManager { |
|
|
|
const logoutPromises: Promise<any>[] = []; |
|
|
|
const logoutPromises: Promise<any>[] = []; |
|
|
|
for(let i = 0; i < storageResult.length; i++) { |
|
|
|
for(let i = 0; i < storageResult.length; i++) { |
|
|
|
if(storageResult[i]) { |
|
|
|
if(storageResult[i]) { |
|
|
|
logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: i + 1, ignoreErrors: true})); |
|
|
|
logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true})); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const clear = () => { |
|
|
|
const clear = () => { |
|
|
|
//console.error('apiManager: logOut clear');
|
|
|
|
//console.error('apiManager: logOut clear');
|
|
|
|
|
|
|
|
|
|
|
|
this.baseDcId = 0; |
|
|
|
this.baseDcId = undefined; |
|
|
|
//this.telegramMeNotify(false);
|
|
|
|
//this.telegramMeNotify(false);
|
|
|
|
IDBStorage.closeDatabases(); |
|
|
|
IDBStorage.closeDatabases(); |
|
|
|
self.postMessage({type: 'clear'}); |
|
|
|
self.postMessage({type: 'clear'}); |
|
|
@ -189,7 +189,7 @@ export class ApiManager { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// mtpGetNetworker
|
|
|
|
// mtpGetNetworker
|
|
|
|
public getNetworker(dcId: number, options: InvokeApiOptions = {}): Promise<MTPNetworker> { |
|
|
|
public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise<MTPNetworker> { |
|
|
|
const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client'); |
|
|
|
const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client'); |
|
|
|
//const connectionType: ConnectionType = 'client';
|
|
|
|
//const connectionType: ConnectionType = 'client';
|
|
|
|
|
|
|
|
|
|
|
@ -237,10 +237,10 @@ export class ApiManager { |
|
|
|
return this.gettingNetworkers[getKey]; |
|
|
|
return this.gettingNetworkers[getKey]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const ak = 'dc' + dcId + '_auth_key'; |
|
|
|
const ak: `dc${TrueDcId}_auth_key` = `dc${dcId}_auth_key` as any; |
|
|
|
const ss = 'dc' + dcId + '_server_salt'; |
|
|
|
const ss: `dc${TrueDcId}_server_salt` = `dc${dcId}_server_salt` as any; |
|
|
|
|
|
|
|
|
|
|
|
return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map(key => sessionStorage.get(key as any))) |
|
|
|
return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map(key => sessionStorage.get(key))) |
|
|
|
.then(async([authKeyHex, serverSaltHex]) => { |
|
|
|
.then(async([authKeyHex, serverSaltHex]) => { |
|
|
|
const transport = dcConfigurator.chooseServer(dcId, connectionType, transportType, false); |
|
|
|
const transport = dcConfigurator.chooseServer(dcId, connectionType, transportType, false); |
|
|
|
let networker: MTPNetworker; |
|
|
|
let networker: MTPNetworker; |
|
|
@ -273,6 +273,16 @@ export class ApiManager { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(networker.isFileNetworker) { |
|
|
|
|
|
|
|
networker.onDrain = () => { |
|
|
|
|
|
|
|
this.log('networker drain', networker); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
networker.onDrain = undefined; |
|
|
|
|
|
|
|
const idx = networkers.indexOf(networker); |
|
|
|
|
|
|
|
networkers.splice(idx, 1); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* networker.onConnectionStatusChange = (online) => { |
|
|
|
/* networker.onConnectionStatusChange = (online) => { |
|
|
|
console.log('status:', online); |
|
|
|
console.log('status:', online); |
|
|
|
}; */ |
|
|
|
}; */ |
|
|
@ -354,7 +364,7 @@ export class ApiManager { |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
let dcId: number; |
|
|
|
let dcId: DcId; |
|
|
|
|
|
|
|
|
|
|
|
let cachedNetworker: MTPNetworker; |
|
|
|
let cachedNetworker: MTPNetworker; |
|
|
|
let stack = (new Error()).stack || 'empty stack'; |
|
|
|
let stack = (new Error()).stack || 'empty stack'; |
|
|
@ -400,7 +410,7 @@ export class ApiManager { |
|
|
|
this.invokeApi(method, params, options).then(deferred.resolve, rejectPromise); |
|
|
|
this.invokeApi(method, params, options).then(deferred.resolve, rejectPromise); |
|
|
|
}, rejectPromise); |
|
|
|
}, rejectPromise); |
|
|
|
} else if(error.code === 303) { |
|
|
|
} else if(error.code === 303) { |
|
|
|
const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_|FILE_MIGRATE_)(\d+)/)[2]; |
|
|
|
const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_|FILE_MIGRATE_)(\d+)/)[2] as DcId; |
|
|
|
if(newDcId !== dcId) { |
|
|
|
if(newDcId !== dcId) { |
|
|
|
if(options.dcId) { |
|
|
|
if(options.dcId) { |
|
|
|
options.dcId = newDcId; |
|
|
|
options.dcId = newDcId; |
|
|
|