You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							77 lines
						
					
					
						
							1.8 KiB
						
					
					
				
			
		
		
	
	
							77 lines
						
					
					
						
							1.8 KiB
						
					
					
				| 'use strict';
 | |
| 
 | |
| const Explain = require('../explain').Explain;
 | |
| const MongoError = require('../core/error').MongoError;
 | |
| 
 | |
| const Aspect = {
 | |
|   READ_OPERATION: Symbol('READ_OPERATION'),
 | |
|   WRITE_OPERATION: Symbol('WRITE_OPERATION'),
 | |
|   RETRYABLE: Symbol('RETRYABLE'),
 | |
|   EXECUTE_WITH_SELECTION: Symbol('EXECUTE_WITH_SELECTION'),
 | |
|   NO_INHERIT_OPTIONS: Symbol('NO_INHERIT_OPTIONS'),
 | |
|   EXPLAINABLE: Symbol('EXPLAINABLE')
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * This class acts as a parent class for any operation and is responsible for setting this.options,
 | |
|  * as well as setting and getting a session.
 | |
|  * Additionally, this class implements `hasAspect`, which determines whether an operation has
 | |
|  * a specific aspect.
 | |
|  */
 | |
| class OperationBase {
 | |
|   constructor(options) {
 | |
|     this.options = Object.assign({}, options);
 | |
| 
 | |
|     if (this.hasAspect(Aspect.EXPLAINABLE)) {
 | |
|       this.explain = Explain.fromOptions(options);
 | |
|     } else if (this.options.explain !== undefined) {
 | |
|       throw new MongoError(`explain is not supported on this command`);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   hasAspect(aspect) {
 | |
|     if (this.constructor.aspects == null) {
 | |
|       return false;
 | |
|     }
 | |
|     return this.constructor.aspects.has(aspect);
 | |
|   }
 | |
| 
 | |
|   set session(session) {
 | |
|     Object.assign(this.options, { session });
 | |
|   }
 | |
| 
 | |
|   get session() {
 | |
|     return this.options.session;
 | |
|   }
 | |
| 
 | |
|   clearSession() {
 | |
|     delete this.options.session;
 | |
|   }
 | |
| 
 | |
|   get canRetryRead() {
 | |
|     return true;
 | |
|   }
 | |
| 
 | |
|   execute() {
 | |
|     throw new TypeError('`execute` must be implemented for OperationBase subclasses');
 | |
|   }
 | |
| }
 | |
| 
 | |
| function defineAspects(operation, aspects) {
 | |
|   if (!Array.isArray(aspects) && !(aspects instanceof Set)) {
 | |
|     aspects = [aspects];
 | |
|   }
 | |
|   aspects = new Set(aspects);
 | |
|   Object.defineProperty(operation, 'aspects', {
 | |
|     value: aspects,
 | |
|     writable: false
 | |
|   });
 | |
|   return aspects;
 | |
| }
 | |
| 
 | |
| module.exports = {
 | |
|   Aspect,
 | |
|   defineAspects,
 | |
|   OperationBase
 | |
| };
 |