[Debug] Add test servers (#1513)

This commit is contained in:
Alexander Zinchuk 2021-10-28 15:50:48 +03:00
parent 3b2149ea58
commit 7e8bf8addf
9 changed files with 44 additions and 28 deletions

View File

@ -45,7 +45,7 @@ export async function init(_onUpdate: OnApiUpdate, initialArgs: ApiInitialArgs)
onUpdate = _onUpdate; onUpdate = _onUpdate;
const { const {
userAgent, platform, sessionData, isMovSupported, userAgent, platform, sessionData, isTest, isMovSupported,
} = initialArgs; } = initialArgs;
const session = new sessions.CallbackSession(sessionData, onSessionUpdate); const session = new sessions.CallbackSession(sessionData, onSessionUpdate);
@ -61,6 +61,7 @@ export async function init(_onUpdate: OnApiUpdate, initialArgs: ApiInitialArgs)
appVersion: `${APP_VERSION} ${APP_CODE_NAME}`, appVersion: `${APP_VERSION} ${APP_CODE_NAME}`,
useWSS: true, useWSS: true,
additionalDcsDisabled: IS_TEST, additionalDcsDisabled: IS_TEST,
testServers: isTest,
} as any, } as any,
); );

View File

@ -4,6 +4,7 @@ export interface ApiInitialArgs {
userAgent: string; userAgent: string;
platform?: string; platform?: string;
sessionData?: ApiSessionData; sessionData?: ApiSessionData;
isTest?: boolean;
isMovSupported?: boolean; isMovSupported?: boolean;
} }

View File

@ -5,12 +5,6 @@ import usePrevious from './usePrevious';
import { getDispatch } from '../lib/teact/teactn'; import { getDispatch } from '../lib/teact/teactn';
import { areSortedArraysEqual } from '../util/iteratees'; import { areSortedArraysEqual } from '../util/iteratees';
// Carefully selected by swiping and observing visual changes
// TODO: may be different on other devices such as iPad, maybe take dpi into account?
const SAFARI_EDGE_BACK_GESTURE_LIMIT = 300;
const SAFARI_EDGE_BACK_GESTURE_DURATION = 350;
export const LOCATION_HASH = window.location.hash;
type HistoryState = { type HistoryState = {
currentIndex: number; currentIndex: number;
nextStateIndexToReplace: number; nextStateIndexToReplace: number;
@ -20,6 +14,13 @@ type HistoryState = {
currentIndexes: number[]; currentIndexes: number[];
}; };
// Carefully selected by swiping and observing visual changes
// TODO: may be different on other devices such as iPad, maybe take dpi into account?
const SAFARI_EDGE_BACK_GESTURE_LIMIT = 300;
const SAFARI_EDGE_BACK_GESTURE_DURATION = 350;
export const LOCATION_HASH = window.location.hash;
const PATH_BASE = `${window.location.pathname}${window.location.search}`;
const historyState: HistoryState = { const historyState: HistoryState = {
currentIndex: 0, currentIndex: 0,
nextStateIndexToReplace: -1, nextStateIndexToReplace: -1,
@ -55,7 +56,7 @@ if (IS_IOS) {
window.addEventListener('popstate', handleTouchEnd); window.addEventListener('popstate', handleTouchEnd);
} }
window.history.replaceState({ index: historyState.currentIndex }, '', window.location.pathname); window.history.replaceState({ index: historyState.currentIndex }, '', PATH_BASE);
export default function useHistoryBack( export default function useHistoryBack(
isActive: boolean | undefined, isActive: boolean | undefined,
@ -87,14 +88,16 @@ export default function useHistoryBack(
historyState.currentIndexes.push(index); historyState.currentIndexes.push(index);
window.history[ window.history[(
(historyState.currentIndexes.includes(historyState.nextStateIndexToReplace - 1) (
historyState.currentIndexes.includes(historyState.nextStateIndexToReplace - 1)
&& window.history.state.index !== 0 && window.history.state.index !== 0
&& historyState.nextStateIndexToReplace === index && historyState.nextStateIndexToReplace === index
&& !shouldReplaceNext) && !shouldReplaceNext
)
? 'replaceState' ? 'replaceState'
: 'pushState' : 'pushState'
]({ )]({
index, index,
state: currentState, state: currentState,
}, ''); }, '');
@ -170,7 +173,7 @@ export default function useHistoryBack(
window.history.replaceState({ window.history.replaceState({
index, index,
state: currentState, state: currentState,
}, '', `#${hashes[hashes.length - 1]}`); }, '', `${PATH_BASE}#${hashes[hashes.length - 1]}`);
indexHashRef.current[indexHashRef.current.length - 1] = { indexHashRef.current[indexHashRef.current.length - 1] = {
index, index,

View File

@ -38,7 +38,6 @@ const PING_DISCONNECT_DELAY = 60000; // 1 min
// All types // All types
const sizeTypes = ['w', 'y', 'd', 'x', 'c', 'm', 'b', 'a', 's']; const sizeTypes = ['w', 'y', 'd', 'x', 'c', 'm', 'b', 'a', 's'];
class TelegramClient { class TelegramClient {
static DEFAULT_OPTIONS = { static DEFAULT_OPTIONS = {
connection: ConnectionTCPObfuscated, connection: ConnectionTCPObfuscated,
@ -59,6 +58,7 @@ class TelegramClient {
baseLogger: 'gramjs', baseLogger: 'gramjs',
useWSS: false, useWSS: false,
additionalDcsDisabled: false, additionalDcsDisabled: false,
testServers: false,
}; };
/** /**
@ -148,7 +148,6 @@ class TelegramClient {
this._destroyed = false; this._destroyed = false;
} }
// region Connecting // region Connecting
/** /**
@ -181,7 +180,7 @@ class TelegramClient {
this._sender._disconnected = true; this._sender._disconnected = true;
const connection = new this._connection( const connection = new this._connection(
this.session.serverAddress, this.session.port, this.session.dcId, this._log, this.session.serverAddress, this.session.port, this.session.dcId, this._log, this._args.testServers,
); );
const newConnection = await this._sender.connect(connection); const newConnection = await this._sender.connect(connection);
@ -337,6 +336,7 @@ class TelegramClient {
dc.port, dc.port,
dcId, dcId,
this._log, this._log,
this._args.testServers,
)); ));
if (this.session.dcId !== dcId && !sender._authenticated) { if (this.session.dcId !== dcId && !sender._authenticated) {
@ -551,7 +551,6 @@ class TelegramClient {
return undefined; return undefined;
} }
_downloadCachedPhotoSize(size) { _downloadCachedPhotoSize(size) {
// No need to download anything, simply write the bytes // No need to download anything, simply write the bytes
let data; let data;
@ -688,7 +687,6 @@ class TelegramClient {
// This causes issues for now because not enough utils // This causes issues for now because not enough utils
// await request.resolve(this, utils) // await request.resolve(this, utils)
this._lastRequest = new Date().getTime(); this._lastRequest = new Date().getTime();
let attempt = 0; let attempt = 0;
for (attempt = 0; attempt < this._requestRetries; attempt++) { for (attempt = 0; attempt < this._requestRetries; attempt++) {
@ -800,7 +798,6 @@ class TelegramClient {
this._dispatchUpdate(args); this._dispatchUpdate(args);
} }
// endregion // endregion
// region private methods // region private methods
@ -883,7 +880,6 @@ class TelegramClient {
*/ */
// endregion // endregion
// users region // users region
/** /**
Turns the given entity into its input entity version. Turns the given entity into its input entity version.
@ -1067,6 +1063,7 @@ async function attempts(cb, times, pause) {
for (let i = 0; i < times; i++) { for (let i = 0; i < times; i++) {
try { try {
// We need to `return await` here so it can be caught locally // We need to `return await` here so it can be caught locally
// eslint-disable-next-line no-return-await
return await cb(); return await cb();
} catch (err) { } catch (err) {
if (i === times - 1) { if (i === times - 1) {

View File

@ -20,6 +20,18 @@ const PUBLIC_KEYS = [
), ),
e: 65537, e: 65537,
}, },
{
fingerprint: bigInt('-5595554452916591101'),
n: bigInt(
'2534288944884041556497168959071347320689884775908477905258202659454602246385394058588521595116849196570822' +
'26493991806038180742006204637761354248846321625124031637930839216416315647409595294193595958529411668489405859523' +
'37613333022396096584117954892216031229237302943701877588456738335398602461675225081791820393153757504952636234951' +
'32323782003654358104782690612092797248736680529211579223142368426126233039432475078545094258975175539015664775146' +
'07193514399690599495696153028090507215003302390050778898553239175099482557220816446894421272976054225797071426466' +
'60768825302832201908302295573257427896031830742328565032949',
),
e: 65537,
},
]; ];
export const _serverKeys = new Map<string, { n: bigInt.BigInteger; e: number }>(); export const _serverKeys = new Map<string, { n: bigInt.BigInteger; e: number }>();

View File

@ -65,21 +65,21 @@ class PromisedWebSockets {
return toReturn; return toReturn;
} }
getWebSocketLink(ip, port) { getWebSocketLink(ip, port, testServers) {
if (port === 443) { if (port === 443) {
return `wss://${ip}:${port}/apiws`; return `wss://${ip}:${port}/apiws${testServers ? '_test' : ''}`;
} else { } else {
return `ws://${ip}:${port}/apiws`; return `ws://${ip}:${port}/apiws${testServers ? '_test' : ''}`;
} }
} }
connect(port, ip) { connect(port, ip, testServers = false) {
this.stream = Buffer.alloc(0); this.stream = Buffer.alloc(0);
this.canRead = new Promise((resolve) => { this.canRead = new Promise((resolve) => {
this.resolveRead = resolve; this.resolveRead = resolve;
}); });
this.closed = false; this.closed = false;
this.website = this.getWebSocketLink(ip, port); this.website = this.getWebSocketLink(ip, port, testServers);
this.client = new WebSocketClient(this.website, 'binary'); this.client = new WebSocketClient(this.website, 'binary');
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.client.onopen = () => { this.client.onopen = () => {

View File

@ -844,6 +844,7 @@ class MTProtoSender {
this._connection._port, this._connection._port,
this._connection._dcId, this._connection._dcId,
this._connection._log, this._connection._log,
this._connection._testServers,
); );
await this.connect(newConnection, true); await this.connect(newConnection, true);

View File

@ -15,11 +15,12 @@ const AsyncQueue = require('../../extensions/AsyncQueue');
class Connection { class Connection {
PacketCodecClass = undefined; PacketCodecClass = undefined;
constructor(ip, port, dcId, loggers) { constructor(ip, port, dcId, loggers, testServers) {
this._ip = ip; this._ip = ip;
this._port = port; this._port = port;
this._dcId = dcId; this._dcId = dcId;
this._log = loggers; this._log = loggers;
this._testServers = testServers;
this._connected = false; this._connected = false;
this._sendTask = undefined; this._sendTask = undefined;
this._recvTask = undefined; this._recvTask = undefined;
@ -39,7 +40,7 @@ class Connection {
async _connect() { async _connect() {
this._log.debug('Connecting'); this._log.debug('Connecting');
this._codec = new this.PacketCodecClass(this); this._codec = new this.PacketCodecClass(this);
await this.socket.connect(this._port, this._ip, this); await this.socket.connect(this._port, this._ip, this._testServers);
this._log.debug('Finished connecting'); this._log.debug('Finished connecting');
// await this.socket.connect({host: this._ip, port: this._port}); // await this.socket.connect({host: this._ip, port: this._port});
await this._initConn(); await this._initConn();
@ -152,7 +153,6 @@ class ObfuscatedConnection extends Connection {
this._obfuscation.write(this._codec.encodePacket(data)); this._obfuscation.write(this._codec.encodePacket(data));
} }
_recv() { _recv() {
return this._codec.readPacket(this._obfuscation); return this._codec.readPacket(this._obfuscation);
} }

View File

@ -37,6 +37,7 @@ addReducer('initApi', (global: GlobalState, actions) => {
userAgent: navigator.userAgent, userAgent: navigator.userAgent,
platform: PLATFORM_ENV, platform: PLATFORM_ENV,
sessionData: loadStoredSession(), sessionData: loadStoredSession(),
isTest: window.location.search.includes('test'),
isMovSupported: IS_MOV_SUPPORTED, isMovSupported: IS_MOV_SUPPORTED,
}); });
})(); })();