@@ -31,6 +31,7 @@ import { executeOperation, ExecutionResult } from './operations/execute_operatio
3131
3232const kResumeQueue = Symbol ( 'resumeQueue' ) ;
3333const kCursorStream = Symbol ( 'cursorStream' ) ;
34+ const kClosed = Symbol ( 'closed' ) ;
3435
3536const CHANGE_STREAM_OPTIONS = [ 'resumeAfter' , 'startAfter' , 'startAtOperationTime' , 'fullDocument' ] ;
3637const CURSOR_OPTIONS = [ 'batchSize' , 'maxAwaitTimeMS' , 'collation' , 'readPreference' ] . concat (
@@ -180,10 +181,10 @@ export class ChangeStream extends EventEmitter {
180181 namespace : MongoDBNamespace ;
181182 type : symbol ;
182183 cursor ?: ChangeStreamCursor ;
183- closed : boolean ;
184184 streamOptions ?: CursorStreamOptions ;
185185 [ kResumeQueue ] : Denque ;
186186 [ kCursorStream ] ?: Readable ;
187+ [ kClosed ] : boolean ;
187188
188189 /** @event */
189190 static readonly CLOSE = 'close' as const ;
@@ -241,7 +242,7 @@ export class ChangeStream extends EventEmitter {
241242 // Create contained Change Stream cursor
242243 this . cursor = createChangeStreamCursor ( this , options ) ;
243244
244- this . closed = false ;
245+ this [ kClosed ] = false ;
245246
246247 // Listen for any `change` listeners being added to ChangeStream
247248 this . on ( 'newListener' , eventName => {
@@ -296,23 +297,20 @@ export class ChangeStream extends EventEmitter {
296297 }
297298
298299 /** Is the cursor closed */
299- isClosed ( ) : boolean {
300- return this . closed || ( this . cursor ?. isClosed ( ) ?? false ) ;
300+ get closed ( ) : boolean {
301+ return this [ kClosed ] || ( this . cursor ?. closed ?? false ) ;
301302 }
302303
303304 /** Close the Change Stream */
304305 close ( callback ?: Callback ) : Promise < void > | void {
305- return maybePromise ( callback , cb => {
306- if ( this . closed ) return cb ( ) ;
307-
308- // flag the change stream as explicitly closed
309- this . closed = true ;
306+ this [ kClosed ] = true ;
310307
311- if ( ! this . cursor ) return cb ( ) ;
308+ return maybePromise ( callback , cb => {
309+ if ( ! this . cursor ) {
310+ return cb ( ) ;
311+ }
312312
313- // Tidy up the existing cursor
314313 const cursor = this . cursor ;
315-
316314 return cursor . close ( err => {
317315 endStream ( this ) ;
318316 this . cursor = undefined ;
@@ -584,7 +582,7 @@ function processNewChange(
584582 change : ChangeStreamDocument ,
585583 callback ?: Callback
586584) {
587- if ( changeStream . closed ) {
585+ if ( changeStream [ kClosed ] ) {
588586 if ( callback ) callback ( CHANGESTREAM_CLOSED_ERROR ) ;
589587 return ;
590588 }
@@ -615,8 +613,8 @@ function processError(changeStream: ChangeStream, error: AnyError, callback?: Ca
615613 const cursor = changeStream . cursor ;
616614
617615 // If the change stream has been closed explicitly, do not process error.
618- if ( changeStream . closed ) {
619- if ( callback ) callback ( new MongoError ( 'ChangeStream is closed' ) ) ;
616+ if ( changeStream [ kClosed ] ) {
617+ if ( callback ) callback ( CHANGESTREAM_CLOSED_ERROR ) ;
620618 return ;
621619 }
622620
@@ -674,8 +672,8 @@ function processError(changeStream: ChangeStream, error: AnyError, callback?: Ca
674672 * @param changeStream - the parent ChangeStream
675673 */
676674function getCursor ( changeStream : ChangeStream , callback : Callback < ChangeStreamCursor > ) {
677- if ( changeStream . isClosed ( ) ) {
678- callback ( new MongoError ( 'ChangeStream is closed.' ) ) ;
675+ if ( changeStream [ kClosed ] ) {
676+ callback ( CHANGESTREAM_CLOSED_ERROR ) ;
679677 return ;
680678 }
681679
@@ -698,8 +696,8 @@ function getCursor(changeStream: ChangeStream, callback: Callback<ChangeStreamCu
698696function processResumeQueue ( changeStream : ChangeStream , err ?: Error ) {
699697 while ( changeStream [ kResumeQueue ] . length ) {
700698 const request = changeStream [ kResumeQueue ] . pop ( ) ;
701- if ( changeStream . isClosed ( ) && ! err ) {
702- request ( new MongoError ( 'Change Stream is not open.' ) ) ;
699+ if ( changeStream [ kClosed ] && ! err ) {
700+ request ( CHANGESTREAM_CLOSED_ERROR ) ;
703701 return ;
704702 }
705703
0 commit comments