From f28416fbaf72b74bcf682e4b5486a3cd0bcef5fb Mon Sep 17 00:00:00 2001 From: GochoMugo Date: Fri, 8 Dec 2017 19:37:12 +0300 Subject: [PATCH] src/telegram: Implement downloadFile() in terms of getFileStream() --- doc/api.md | 4 +++- src/telegram.js | 33 +++++++++++++++++++-------------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/doc/api.md b/doc/api.md index 28a0fd0..a8e7a8f 100644 --- a/doc/api.md +++ b/doc/api.md @@ -867,7 +867,9 @@ which returns the full URI to the file on remote server. ### telegramBot.downloadFile(fileId, downloadDir, [options]) ⇒ Promise Downloads file in the specified folder. -This is just a sugar for (getFile)[#getfilefiled] method + +This method is a sugar extension of the [getFileStream](#TelegramBot+getFileStream) method, +which returns a readable file stream. **Kind**: instance method of [TelegramBot](#TelegramBot) **Returns**: Promise - promise Promise, which will have *filePath* of downloaded file in resolve callback diff --git a/src/telegram.js b/src/telegram.js index a1be259..7c6b2e7 100644 --- a/src/telegram.js +++ b/src/telegram.js @@ -1355,7 +1355,9 @@ class TelegramBot extends EventEmitter { /** * Downloads file in the specified folder. - * This is just a sugar for (getFile)[#getfilefiled] method + * + * This method is a sugar extension of the [getFileStream](#TelegramBot+getFileStream) method, + * which returns a readable file stream. * * @param {String} fileId File identifier to get info about * @param {String} downloadDir Absolute path to the folder in which file will be saved @@ -1363,20 +1365,23 @@ class TelegramBot extends EventEmitter { * @return {Promise} promise Promise, which will have *filePath* of downloaded file in resolve callback */ downloadFile(fileId, downloadDir, form = {}) { - return this - .getFileLink(fileId, form) - .then(fileURI => { - const fileName = fileURI.slice(fileURI.lastIndexOf('/') + 1); - // TODO: Ensure fileName doesn't contains slashes - const filePath = path.join(downloadDir, fileName); - - // properly handles errors and closes all streams - return Promise - .fromCallback(next => { - pump(streamedRequest({ uri: fileURI }), fs.createWriteStream(filePath), next); - }) - .return(filePath); + let resolve; + let reject; + const promise = new Promise((a, b) => { + resolve = a; + reject = b; + }); + const fileStream = this.getFileStream(fileId, form); + fileStream.on('info', (info) => { + const fileName = info.uri.slice(info.uri.lastIndexOf('/') + 1); + // TODO: Ensure fileName doesn't contains slashes + const filePath = path.join(downloadDir, fileName); + pump(fileStream, fs.createWriteStream(filePath), (error) => { + if (error) { return reject(error); } + return resolve(filePath); }); + }); + return promise; } /**