12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- 'use strict';
-
- const MongoNetworkError = require('mongodb-core').MongoNetworkError;
- const mongoErrorContextSymbol = require('mongodb-core').mongoErrorContextSymbol;
-
- const GET_MORE_NON_RESUMABLE_CODES = new Set([
- 136, // CappedPositionLost
- 237, // CursorKilled
- 11601 // Interrupted
- ]);
-
- // From spec@https://github.com/mongodb/specifications/blob/35e466ddf25059cb30e4113de71cdebd3754657f/source/change-streams.rst#resumable-error:
- //
- // An error is considered resumable if it meets any of the following criteria:
- // - any error encountered which is not a server error (e.g. a timeout error or network error)
- // - any server error response from a getMore command excluding those containing the following error codes
- // - Interrupted: 11601
- // - CappedPositionLost: 136
- // - CursorKilled: 237
- // - a server error response with an error message containing the substring "not master" or "node is recovering"
- //
- // An error on an aggregate command is not a resumable error. Only errors on a getMore command may be considered resumable errors.
-
- function isGetMoreError(error) {
- if (error[mongoErrorContextSymbol]) {
- return error[mongoErrorContextSymbol].isGetMore;
- }
- }
-
- function isResumableError(error) {
- if (!isGetMoreError(error)) {
- return false;
- }
-
- return !!(
- error instanceof MongoNetworkError ||
- !GET_MORE_NON_RESUMABLE_CODES.has(error.code) ||
- error.message.match(/not master/) ||
- error.message.match(/node is recovering/)
- );
- }
-
- module.exports = { GET_MORE_NON_RESUMABLE_CODES, isResumableError };
|