From ef48af49f5857cb908c59bd4a59565b59c267bc0 Mon Sep 17 00:00:00 2001 From: GochoMugo Date: Fri, 25 Aug 2017 18:39:13 +0300 Subject: [PATCH] src/telegram: Deprecate auto-enabling Promise cancellation Side-effects: src/telegram: Allow providing custom Promise constructor References: * BR: https://github.com/yagop/node-telegram-bot-api/issues/319 --- doc/api.md | 144 +++++++++++++++++++++++++++-------------------- src/telegram.js | 40 +++++++++++-- test/telegram.js | 9 +++ 3 files changed, 126 insertions(+), 67 deletions(-) diff --git a/doc/api.md b/doc/api.md index 510b455..ad7e7e6 100644 --- a/doc/api.md +++ b/doc/api.md @@ -12,68 +12,71 @@ TelegramBot * [TelegramBot](#TelegramBot) * [new TelegramBot(token, [options])](#new_TelegramBot_new) - * [.startPolling([options])](#TelegramBot+startPolling) ⇒ Promise - * ~~[.initPolling([options])](#TelegramBot+initPolling) ⇒ Promise~~ - * [.stopPolling()](#TelegramBot+stopPolling) ⇒ Promise - * [.isPolling()](#TelegramBot+isPolling) ⇒ Boolean - * [.openWebHook()](#TelegramBot+openWebHook) ⇒ Promise - * [.closeWebHook()](#TelegramBot+closeWebHook) ⇒ Promise - * [.hasOpenWebHook()](#TelegramBot+hasOpenWebHook) ⇒ Boolean - * [.getMe()](#TelegramBot+getMe) ⇒ Promise - * [.setWebHook(url, [options])](#TelegramBot+setWebHook) ⇒ Promise - * [.deleteWebHook()](#TelegramBot+deleteWebHook) ⇒ Promise - * [.getWebHookInfo()](#TelegramBot+getWebHookInfo) ⇒ Promise - * [.getUpdates([options])](#TelegramBot+getUpdates) ⇒ Promise - * [.processUpdate(update)](#TelegramBot+processUpdate) - * [.sendMessage(chatId, text, [options])](#TelegramBot+sendMessage) ⇒ Promise - * [.answerInlineQuery(inlineQueryId, results, [options])](#TelegramBot+answerInlineQuery) ⇒ Promise - * [.forwardMessage(chatId, fromChatId, messageId, [options])](#TelegramBot+forwardMessage) ⇒ Promise - * [.sendPhoto(chatId, photo, [options])](#TelegramBot+sendPhoto) ⇒ Promise - * [.sendAudio(chatId, audio, [options])](#TelegramBot+sendAudio) ⇒ Promise - * [.sendDocument(chatId, doc, [options], [fileOpts])](#TelegramBot+sendDocument) ⇒ Promise - * [.sendSticker(chatId, sticker, [options])](#TelegramBot+sendSticker) ⇒ Promise - * [.sendVideo(chatId, video, [options])](#TelegramBot+sendVideo) ⇒ Promise - * [.sendVideoNote(chatId, videoNote, [options])](#TelegramBot+sendVideoNote) ⇒ Promise - * [.sendVoice(chatId, voice, [options])](#TelegramBot+sendVoice) ⇒ Promise - * [.sendChatAction(chatId, action)](#TelegramBot+sendChatAction) ⇒ Promise - * [.kickChatMember(chatId, userId)](#TelegramBot+kickChatMember) ⇒ Promise - * [.unbanChatMember(chatId, userId)](#TelegramBot+unbanChatMember) ⇒ Promise - * [.restrictChatMember(chatId, userId, [options])](#TelegramBot+restrictChatMember) ⇒ Promise - * [.promoteChatMember(chatId, userId, [options])](#TelegramBot+promoteChatMember) ⇒ Promise - * [.exportChatInviteLink(chatId)](#TelegramBot+exportChatInviteLink) ⇒ Promise - * [.setChatPhoto(chatId, photo)](#TelegramBot+setChatPhoto) ⇒ Promise - * [.deleteChatPhoto(chatId)](#TelegramBot+deleteChatPhoto) ⇒ Promise - * [.setChatTitle(chatId, title)](#TelegramBot+setChatTitle) ⇒ Promise - * [.setChatDescription(chatId, description)](#TelegramBot+setChatDescription) ⇒ Promise - * [.pinChatMessage(chatId, messageId)](#TelegramBot+pinChatMessage) ⇒ Promise - * [.unpinChatMessage(chatId)](#TelegramBot+unpinChatMessage) ⇒ Promise - * [.answerCallbackQuery([options])](#TelegramBot+answerCallbackQuery) ⇒ Promise - * [.editMessageText(text, [options])](#TelegramBot+editMessageText) ⇒ Promise - * [.editMessageCaption(caption, [options])](#TelegramBot+editMessageCaption) ⇒ Promise - * [.editMessageReplyMarkup(replyMarkup, [options])](#TelegramBot+editMessageReplyMarkup) ⇒ Promise - * [.getUserProfilePhotos(userId, [options])](#TelegramBot+getUserProfilePhotos) ⇒ Promise - * [.sendLocation(chatId, latitude, longitude, [options])](#TelegramBot+sendLocation) ⇒ Promise - * [.sendVenue(chatId, latitude, longitude, title, address, [options])](#TelegramBot+sendVenue) ⇒ Promise - * [.sendContact(chatId, phoneNumber, firstName, [options])](#TelegramBot+sendContact) ⇒ Promise - * [.getFile(fileId)](#TelegramBot+getFile) ⇒ Promise - * [.getFileLink(fileId)](#TelegramBot+getFileLink) ⇒ Promise - * [.downloadFile(fileId, downloadDir)](#TelegramBot+downloadFile) ⇒ Promise - * [.onText(regexp, callback)](#TelegramBot+onText) - * [.removeTextListener(regexp)](#TelegramBot+removeTextListener) ⇒ Object - * [.onReplyToMessage(chatId, messageId, callback)](#TelegramBot+onReplyToMessage) ⇒ Number - * [.removeReplyListener(replyListenerId)](#TelegramBot+removeReplyListener) ⇒ Object - * [.getChat(chatId)](#TelegramBot+getChat) ⇒ Promise - * [.getChatAdministrators(chatId)](#TelegramBot+getChatAdministrators) ⇒ Promise - * [.getChatMembersCount(chatId)](#TelegramBot+getChatMembersCount) ⇒ Promise - * [.getChatMember(chatId, userId)](#TelegramBot+getChatMember) ⇒ Promise - * [.leaveChat(chatId)](#TelegramBot+leaveChat) ⇒ Promise - * [.sendGame(chatId, gameShortName, [options])](#TelegramBot+sendGame) ⇒ Promise - * [.setGameScore(userId, score, [options])](#TelegramBot+setGameScore) ⇒ Promise - * [.getGameHighScores(userId, [options])](#TelegramBot+getGameHighScores) ⇒ Promise - * [.deleteMessage(chatId, messageId, [options])](#TelegramBot+deleteMessage) ⇒ Promise - * [.sendInvoice(chatId, title, description, payload, providerToken, startParameter, currency, prices, [options])](#TelegramBot+sendInvoice) ⇒ Promise - * [.answerShippingQuery(shippingQueryId, ok, [options])](#TelegramBot+answerShippingQuery) ⇒ Promise - * [.answerPreCheckoutQuery(preCheckoutQueryId, ok, [options])](#TelegramBot+answerPreCheckoutQuery) ⇒ Promise + * _instance_ + * [.startPolling([options])](#TelegramBot+startPolling) ⇒ Promise + * ~~[.initPolling([options])](#TelegramBot+initPolling) ⇒ Promise~~ + * [.stopPolling()](#TelegramBot+stopPolling) ⇒ Promise + * [.isPolling()](#TelegramBot+isPolling) ⇒ Boolean + * [.openWebHook()](#TelegramBot+openWebHook) ⇒ Promise + * [.closeWebHook()](#TelegramBot+closeWebHook) ⇒ Promise + * [.hasOpenWebHook()](#TelegramBot+hasOpenWebHook) ⇒ Boolean + * [.getMe()](#TelegramBot+getMe) ⇒ Promise + * [.setWebHook(url, [options])](#TelegramBot+setWebHook) ⇒ Promise + * [.deleteWebHook()](#TelegramBot+deleteWebHook) ⇒ Promise + * [.getWebHookInfo()](#TelegramBot+getWebHookInfo) ⇒ Promise + * [.getUpdates([options])](#TelegramBot+getUpdates) ⇒ Promise + * [.processUpdate(update)](#TelegramBot+processUpdate) + * [.sendMessage(chatId, text, [options])](#TelegramBot+sendMessage) ⇒ Promise + * [.answerInlineQuery(inlineQueryId, results, [options])](#TelegramBot+answerInlineQuery) ⇒ Promise + * [.forwardMessage(chatId, fromChatId, messageId, [options])](#TelegramBot+forwardMessage) ⇒ Promise + * [.sendPhoto(chatId, photo, [options])](#TelegramBot+sendPhoto) ⇒ Promise + * [.sendAudio(chatId, audio, [options])](#TelegramBot+sendAudio) ⇒ Promise + * [.sendDocument(chatId, doc, [options], [fileOpts])](#TelegramBot+sendDocument) ⇒ Promise + * [.sendSticker(chatId, sticker, [options])](#TelegramBot+sendSticker) ⇒ Promise + * [.sendVideo(chatId, video, [options])](#TelegramBot+sendVideo) ⇒ Promise + * [.sendVideoNote(chatId, videoNote, [options])](#TelegramBot+sendVideoNote) ⇒ Promise + * [.sendVoice(chatId, voice, [options])](#TelegramBot+sendVoice) ⇒ Promise + * [.sendChatAction(chatId, action)](#TelegramBot+sendChatAction) ⇒ Promise + * [.kickChatMember(chatId, userId)](#TelegramBot+kickChatMember) ⇒ Promise + * [.unbanChatMember(chatId, userId)](#TelegramBot+unbanChatMember) ⇒ Promise + * [.restrictChatMember(chatId, userId, [options])](#TelegramBot+restrictChatMember) ⇒ Promise + * [.promoteChatMember(chatId, userId, [options])](#TelegramBot+promoteChatMember) ⇒ Promise + * [.exportChatInviteLink(chatId)](#TelegramBot+exportChatInviteLink) ⇒ Promise + * [.setChatPhoto(chatId, photo)](#TelegramBot+setChatPhoto) ⇒ Promise + * [.deleteChatPhoto(chatId)](#TelegramBot+deleteChatPhoto) ⇒ Promise + * [.setChatTitle(chatId, title)](#TelegramBot+setChatTitle) ⇒ Promise + * [.setChatDescription(chatId, description)](#TelegramBot+setChatDescription) ⇒ Promise + * [.pinChatMessage(chatId, messageId)](#TelegramBot+pinChatMessage) ⇒ Promise + * [.unpinChatMessage(chatId)](#TelegramBot+unpinChatMessage) ⇒ Promise + * [.answerCallbackQuery([options])](#TelegramBot+answerCallbackQuery) ⇒ Promise + * [.editMessageText(text, [options])](#TelegramBot+editMessageText) ⇒ Promise + * [.editMessageCaption(caption, [options])](#TelegramBot+editMessageCaption) ⇒ Promise + * [.editMessageReplyMarkup(replyMarkup, [options])](#TelegramBot+editMessageReplyMarkup) ⇒ Promise + * [.getUserProfilePhotos(userId, [options])](#TelegramBot+getUserProfilePhotos) ⇒ Promise + * [.sendLocation(chatId, latitude, longitude, [options])](#TelegramBot+sendLocation) ⇒ Promise + * [.sendVenue(chatId, latitude, longitude, title, address, [options])](#TelegramBot+sendVenue) ⇒ Promise + * [.sendContact(chatId, phoneNumber, firstName, [options])](#TelegramBot+sendContact) ⇒ Promise + * [.getFile(fileId)](#TelegramBot+getFile) ⇒ Promise + * [.getFileLink(fileId)](#TelegramBot+getFileLink) ⇒ Promise + * [.downloadFile(fileId, downloadDir)](#TelegramBot+downloadFile) ⇒ Promise + * [.onText(regexp, callback)](#TelegramBot+onText) + * [.removeTextListener(regexp)](#TelegramBot+removeTextListener) ⇒ Object + * [.onReplyToMessage(chatId, messageId, callback)](#TelegramBot+onReplyToMessage) ⇒ Number + * [.removeReplyListener(replyListenerId)](#TelegramBot+removeReplyListener) ⇒ Object + * [.getChat(chatId)](#TelegramBot+getChat) ⇒ Promise + * [.getChatAdministrators(chatId)](#TelegramBot+getChatAdministrators) ⇒ Promise + * [.getChatMembersCount(chatId)](#TelegramBot+getChatMembersCount) ⇒ Promise + * [.getChatMember(chatId, userId)](#TelegramBot+getChatMember) ⇒ Promise + * [.leaveChat(chatId)](#TelegramBot+leaveChat) ⇒ Promise + * [.sendGame(chatId, gameShortName, [options])](#TelegramBot+sendGame) ⇒ Promise + * [.setGameScore(userId, score, [options])](#TelegramBot+setGameScore) ⇒ Promise + * [.getGameHighScores(userId, [options])](#TelegramBot+getGameHighScores) ⇒ Promise + * [.deleteMessage(chatId, messageId, [options])](#TelegramBot+deleteMessage) ⇒ Promise + * [.sendInvoice(chatId, title, description, payload, providerToken, startParameter, currency, prices, [options])](#TelegramBot+sendInvoice) ⇒ Promise + * [.answerShippingQuery(shippingQueryId, ok, [options])](#TelegramBot+answerShippingQuery) ⇒ Promise + * [.answerPreCheckoutQuery(preCheckoutQueryId, ok, [options])](#TelegramBot+answerPreCheckoutQuery) ⇒ Promise + * _static_ + * [.Promise](#TelegramBot.Promise) @@ -974,6 +977,23 @@ Use this method to confirm shipping of a product. | ok | Boolean | Specify if every order details are ok | | [options] | Object | Additional Telegram query options | + + +### TelegramBot.Promise +Change Promise library used internally, for all existing and new +instances. + +**Kind**: static property of [TelegramBot](#TelegramBot) + +| Param | Type | +| --- | --- | +| customPromise | function | + +**Example** +```js +const TelegramBot = require('node-telegram-bot-api'); +TelegramBot.Promise = myPromise; +``` * * * diff --git a/src/telegram.js b/src/telegram.js index c7a5314..70e1fcd 100644 --- a/src/telegram.js +++ b/src/telegram.js @@ -7,7 +7,6 @@ const TelegramBotPolling = require('./telegramPolling'); const debug = require('debug')('node-telegram-bot-api'); const EventEmitter = require('eventemitter3'); const fileType = require('file-type'); -const Promise = require('bluebird'); const request = require('request-promise'); const streamedRequest = require('request'); const qs = require('querystring'); @@ -18,6 +17,7 @@ const URL = require('url'); const fs = require('fs'); const pump = require('pump'); const deprecate = require('depd')('node-telegram-bot-api'); +let Promise = require('bluebird'); const _messageTypes = [ 'audio', @@ -49,10 +49,27 @@ const _deprecatedMessageTypes = [ 'new_chat_participant', 'left_chat_participant' ]; -// enable cancellation -Promise.config({ - cancellation: true, -}); + +// Enable Promise cancellation. +try { + const msg = + 'Automatic enabling of cancellation of promises is deprecated.\n' + + 'In the future, you will have to enable it yourself.\n' + + 'See https://github.com/yagop/node-telegram-bot-api/issues/319.'; + deprecate(msg); + Promise.config({ + cancellation: true, + }); +} catch (ex) { + /* eslint-disable no-console */ + const msg = + 'error: Enabling Promise cancellation failed.\n' + + ' Temporary fix is to load/require this library as early as possible before using any Promises.'; + console.error(msg); + throw ex; + /* eslint-enable no-console */ +} + class TelegramBot extends EventEmitter { @@ -64,6 +81,19 @@ class TelegramBot extends EventEmitter { return _messageTypes; } + /** + * Change Promise library used internally, for all existing and new + * instances. + * @param {Function} customPromise + * + * @example + * const TelegramBot = require('node-telegram-bot-api'); + * TelegramBot.Promise = myPromise; + */ + static set Promise(customPromise) { + Promise = customPromise; + } + on(event, listener) { if (_deprecatedMessageTypes.indexOf(event) !== -1) { const url = 'https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#events'; diff --git a/test/telegram.js b/test/telegram.js index e6cd6bd..05938f3 100644 --- a/test/telegram.js +++ b/test/telegram.js @@ -109,6 +109,15 @@ describe('TelegramBot', function telegramSuite() { }); }); + it('allows providing custom Promise library', function test() { + TelegramBot.Promise = global.Promise; + const promise = bot.stopPolling(); + assert.ok(promise instanceof global.Promise); + assert.ok(!(promise instanceof Promise)); + // revert + TelegramBot.Promise = Promise; + }); + it('automatically starts polling', function test() { assert.equal(botPolling.isPolling(), true); return utils.isPollingMockServer(pollingPort2);