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);