333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
'use strict';
 
const MongoNetworkError = require('./core').MongoNetworkError;
const mongoErrorContextSymbol = require('./core').mongoErrorContextSymbol;
 
const GET_MORE_NON_RESUMABLE_CODES = new Set([
  136, // CappedPositionLost
  237, // CursorKilled
  11601 // Interrupted
]);
 
// From spec@https://github.com/mongodb/specifications/blob/7a2e93d85935ee4b1046a8d2ad3514c657dc74fa/source/change-streams/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 error label
//   NonRetryableChangeStreamError and those containing the following error codes:
//   - Interrupted: 11601
//   - CappedPositionLost: 136
//   - CursorKilled: 237
//
// 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;
  }
 
  if (error instanceof MongoNetworkError) {
    return true;
  }
 
  return !(
    GET_MORE_NON_RESUMABLE_CODES.has(error.code) ||
    error.hasErrorLabel('NonRetryableChangeStreamError')
  );
}
 
module.exports = { GET_MORE_NON_RESUMABLE_CODES, isResumableError };