operation.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.defineAspects = exports.AbstractCallbackOperation = exports.AbstractOperation = exports.Aspect = void 0;
  4. const util_1 = require("util");
  5. const bson_1 = require("../bson");
  6. const read_preference_1 = require("../read_preference");
  7. exports.Aspect = {
  8. READ_OPERATION: Symbol('READ_OPERATION'),
  9. WRITE_OPERATION: Symbol('WRITE_OPERATION'),
  10. RETRYABLE: Symbol('RETRYABLE'),
  11. EXPLAINABLE: Symbol('EXPLAINABLE'),
  12. SKIP_COLLATION: Symbol('SKIP_COLLATION'),
  13. CURSOR_CREATING: Symbol('CURSOR_CREATING'),
  14. MUST_SELECT_SAME_SERVER: Symbol('MUST_SELECT_SAME_SERVER')
  15. };
  16. /** @internal */
  17. const kSession = Symbol('session');
  18. /**
  19. * This class acts as a parent class for any operation and is responsible for setting this.options,
  20. * as well as setting and getting a session.
  21. * Additionally, this class implements `hasAspect`, which determines whether an operation has
  22. * a specific aspect.
  23. * @internal
  24. */
  25. class AbstractOperation {
  26. constructor(options = {}) {
  27. this.readPreference = this.hasAspect(exports.Aspect.WRITE_OPERATION)
  28. ? read_preference_1.ReadPreference.primary
  29. : read_preference_1.ReadPreference.fromOptions(options) ?? read_preference_1.ReadPreference.primary;
  30. // Pull the BSON serialize options from the already-resolved options
  31. this.bsonOptions = (0, bson_1.resolveBSONOptions)(options);
  32. this[kSession] = options.session != null ? options.session : undefined;
  33. this.options = options;
  34. this.bypassPinningCheck = !!options.bypassPinningCheck;
  35. this.trySecondaryWrite = false;
  36. }
  37. hasAspect(aspect) {
  38. const ctor = this.constructor;
  39. if (ctor.aspects == null) {
  40. return false;
  41. }
  42. return ctor.aspects.has(aspect);
  43. }
  44. get session() {
  45. return this[kSession];
  46. }
  47. clearSession() {
  48. this[kSession] = undefined;
  49. }
  50. get canRetryRead() {
  51. return true;
  52. }
  53. get canRetryWrite() {
  54. return true;
  55. }
  56. }
  57. exports.AbstractOperation = AbstractOperation;
  58. /** @internal */
  59. class AbstractCallbackOperation extends AbstractOperation {
  60. constructor(options = {}) {
  61. super(options);
  62. }
  63. execute(server, session) {
  64. return (0, util_1.promisify)((callback) => {
  65. this.executeCallback(server, session, callback);
  66. })();
  67. }
  68. }
  69. exports.AbstractCallbackOperation = AbstractCallbackOperation;
  70. function defineAspects(operation, aspects) {
  71. if (!Array.isArray(aspects) && !(aspects instanceof Set)) {
  72. aspects = [aspects];
  73. }
  74. aspects = new Set(aspects);
  75. Object.defineProperty(operation, 'aspects', {
  76. value: aspects,
  77. writable: false
  78. });
  79. return aspects;
  80. }
  81. exports.defineAspects = defineAspects;
  82. //# sourceMappingURL=operation.js.map