diff --git a/src/lib/gramjs/client/TelegramClient.js b/src/lib/gramjs/client/TelegramClient.js index e8ee9b4f2..d5290b524 100644 --- a/src/lib/gramjs/client/TelegramClient.js +++ b/src/lib/gramjs/client/TelegramClient.js @@ -25,6 +25,7 @@ const DEFAULT_DC_ID = 2; const WEBDOCUMENT_DC_ID = 4; const DEFAULT_IPV4_IP = 'zws2.web.telegram.org'; const DEFAULT_IPV6_IP = '[2001:67c:4e8:f002::a]'; +const EXPORTED_SENDER_RECONNECT_TIMEOUT = 1000; // 1 sec const EXPORTED_SENDER_RELEASE_TIMEOUT = 30000; // 30 sec const WEBDOCUMENT_REQUEST_PART_SIZE = 131072; // 128kb @@ -374,8 +375,14 @@ class TelegramClient { let sender; try { sender = await this._exportedSenderPromises[dcId]; + if (!sender.isConnected()) { - return this._borrowExportedSender(dcId, true, sender); + if (sender.isConnecting) { + await Helpers.sleep(EXPORTED_SENDER_RECONNECT_TIMEOUT); + return this._borrowExportedSender(dcId, false, sender); + } else { + return this._borrowExportedSender(dcId, true, sender); + } } } catch (err) { // eslint-disable-next-line no-console @@ -390,9 +397,6 @@ class TelegramClient { } this._exportedSenderReleaseTimeouts[dcId] = setTimeout(() => { - // eslint-disable-next-line no-console - console.warn(`Disconnecting from file socket #${dcId}...`); - this._exportedSenderReleaseTimeouts[dcId] = undefined; sender.disconnect(); }, EXPORTED_SENDER_RELEASE_TIMEOUT); diff --git a/src/lib/gramjs/client/downloadFile.ts b/src/lib/gramjs/client/downloadFile.ts index f7b9a8e72..a122a895e 100644 --- a/src/lib/gramjs/client/downloadFile.ts +++ b/src/lib/gramjs/client/downloadFile.ts @@ -104,7 +104,7 @@ export async function downloadFile( progressCallback(progress); } - // used to populate the sender + // Preload sender await client.getSender(dcId); // eslint-disable-next-line no-constant-condition @@ -120,7 +120,7 @@ export async function downloadFile( await foreman.requestWorker(); if (hasEnded) { - await foreman.releaseWorker(); + foreman.releaseWorker(); break; } @@ -128,8 +128,9 @@ export async function downloadFile( promises.push((async (offsetMemo: number) => { // eslint-disable-next-line no-constant-condition while (true) { + let sender; try { - const sender = await client.getSender(dcId); + sender = await client.getSender(dcId); const result = await sender.send(new Api.upload.GetFile({ location: inputLocation, offset: offsetMemo, @@ -150,23 +151,22 @@ export async function downloadFile( hasEnded = true; } + foreman.releaseWorker(); + return result.bytes; } catch (err) { - if (err.message === 'Disconnect') { + if (sender && !sender.isConnected()) { await sleep(DISCONNECT_SLEEP); continue; } else if (err instanceof errors.FloodWaitError) { await sleep(err.seconds * 1000); continue; - } else if (err.message !== 'USER_CANCELED') { - // eslint-disable-next-line no-console - console.error(err); } + foreman.releaseWorker(); + hasEnded = true; throw err; - } finally { - foreman.releaseWorker(); } } })(offset)); diff --git a/src/lib/gramjs/client/uploadFile.ts b/src/lib/gramjs/client/uploadFile.ts index b24bc5393..e5023807f 100644 --- a/src/lib/gramjs/client/uploadFile.ts +++ b/src/lib/gramjs/client/uploadFile.ts @@ -66,9 +66,10 @@ export async function uploadFile( // eslint-disable-next-line no-loop-func sendingParts.push((async (jMemo: number, bytesMemo: Buffer) => { while (true) { + let sender; try { // We always upload from the DC we are in - const sender = await client.getSender(client.session.dcId); + sender = await client.getSender(client.session.dcId); await sender.send( isLarge ? new Api.upload.SaveBigFilePart({ @@ -84,7 +85,7 @@ export async function uploadFile( }), ); } catch (err) { - if (err.message === 'Disconnect') { + if (sender && !sender.isConnected()) { await sleep(DISCONNECT_SLEEP); continue; } else if (err instanceof errors.FloodWaitError) { @@ -106,6 +107,7 @@ export async function uploadFile( } })(j, bytes)); } + await Promise.all(sendingParts); } diff --git a/src/lib/gramjs/extensions/PromisedWebSockets.js b/src/lib/gramjs/extensions/PromisedWebSockets.js index 652e8a702..fe880391a 100644 --- a/src/lib/gramjs/extensions/PromisedWebSockets.js +++ b/src/lib/gramjs/extensions/PromisedWebSockets.js @@ -93,8 +93,11 @@ class PromisedWebSockets { }; this.client.onclose = (event) => { const { code, reason, wasClean } = event; - // eslint-disable-next-line no-console - console.error(`Socket ${ip} closed. Code: ${code}, reason: ${reason}, was clean: ${wasClean}`); + if (code !== 1000) { + // eslint-disable-next-line no-console + console.error(`Socket ${ip} closed. Code: ${code}, reason: ${reason}, was clean: ${wasClean}`); + } + this.resolveRead(false); this.closed = true; if (this.disconnectedCallback) {