Skip to content

Commit

Permalink
src/polling: Fix the Offset Infinite Loop bug
Browse files Browse the repository at this point in the history
References:

  * Issue #36: #36
    * answer/solution: #36 (comment)
  • Loading branch information
GochoMugo committed Dec 5, 2017
1 parent fb1f434 commit 9794c7f
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 5 deletions.
1 change: 1 addition & 0 deletions doc/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ Emits `message` when a message arrives.
| [options.request] | <code>Object</code> | | Options which will be added for all requests to telegram api. See https://github.com/request/request#requestoptions-callback for more information. |
| [options.baseApiUrl] | <code>String</code> | <code>https://api.telegram.org</code> | API Base URl; useful for proxying and testing |
| [options.filepath] | <code>Boolean</code> | <code>true</code> | Allow passing file-paths as arguments when sending files, such as photos using `TelegramBot#sendPhoto()`. See [usage information][usage-sending-files-performance] for more information on this option and its consequences. |
| [options.badRejection] | <code>Boolean</code> | <code>false</code> | Set to `true` **if and only if** the Node.js version you're using terminates the process on unhandled rejections. This option is only for *forward-compatibility purposes*. |

<a name="TelegramBot+on"></a>

Expand Down
5 changes: 5 additions & 0 deletions src/telegram.js
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,10 @@ class TelegramBot extends EventEmitter {
* @param {Boolean} [options.filepath=true] Allow passing file-paths as arguments when sending files,
* such as photos using `TelegramBot#sendPhoto()`. See [usage information][usage-sending-files-performance]
* for more information on this option and its consequences.
* @param {Boolean} [options.badRejection=false] Set to `true`
* **if and only if** the Node.js version you're using terminates the
* process on unhandled rejections. This option is only for
* *forward-compatibility purposes*.
* @see https://core.telegram.org/bots/api
*/
constructor(token, options = {}) {
Expand All @@ -184,6 +188,7 @@ class TelegramBot extends EventEmitter {
this.options.webHook = (typeof options.webHook === 'undefined') ? false : options.webHook;
this.options.baseApiUrl = options.baseApiUrl || 'https://api.telegram.org';
this.options.filepath = (typeof options.filepath === 'undefined') ? true : options.filepath;
this.options.badRejection = (typeof options.badRejection === 'undefined') ? false : options.badRejection;
this._textRegexpCallbacks = [];
this._replyListenerId = 0;
this._replyListeners = [];
Expand Down
35 changes: 30 additions & 5 deletions src/telegramPolling.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,18 @@ class TelegramBotPolling {
return !!this._lastRequest;
}

/**
* Handle error thrown during polling.
* @private
* @param {Error} error
*/
_error(error) {
if (!this.bot.listeners('polling_error').length) {
return console.error('error: [polling_error] %j', err); // eslint-disable-line no-console
}
return this.bot.emit('polling_error', error);
}

/**
* Invokes polling (with recursion!)
* @return {Promise} promise of the current request
Expand All @@ -99,12 +111,25 @@ class TelegramBotPolling {
})
.catch(err => {
debug('polling error: %s', err.message);
if (this.bot.listeners('polling_error').length) {
this.bot.emit('polling_error', err);
} else {
console.error('error: [polling_error] %j', err); // eslint-disable-line no-console
/**
* We need to mark the already-processed items
* to avoid fetching them again once the application
* is restarted, or moves to next polling interval
* (in cases where unhandled rejections do not terminate
* the process).
* See https://github.com/yagop/node-telegram-bot-api/issues/36#issuecomment-268532067
*/
if (!this.bot.options.badRejection) {
return this._error(err);
}
return null;
const opts = {
offset: this.options.params.offset,
limit: 1,
timeout: 0,
};
return this.bot.getUpdates(opts).then(() => {
return this._error(err);
});
})
.finally(() => {
if (this._abort) {
Expand Down

0 comments on commit 9794c7f

Please sign in to comment.