@@ -213,7 +213,7 @@ export abstract class AbstractCursor extends EventEmitter {
213
213
return done ( undefined , true ) ;
214
214
}
215
215
216
- next ( this , ( err , doc ) => {
216
+ next ( this , true , ( err , doc ) => {
217
217
if ( err ) return done ( err ) ;
218
218
219
219
if ( doc ) {
@@ -236,7 +236,23 @@ export abstract class AbstractCursor extends EventEmitter {
236
236
return done ( new MongoError ( 'Cursor is exhausted' ) ) ;
237
237
}
238
238
239
- next ( this , done ) ;
239
+ next ( this , true , done ) ;
240
+ } ) ;
241
+ }
242
+
243
+ /**
244
+ * Try to get the next available document from the cursor or `null` if an empty batch is returned
245
+ * @internal
246
+ */
247
+ tryNext ( ) : Promise < Document | null > ;
248
+ tryNext ( callback : Callback < Document | null > ) : void ;
249
+ tryNext ( callback ?: Callback < Document | null > ) : Promise < Document | null > | void {
250
+ return maybePromise ( callback , done => {
251
+ if ( this [ kId ] === Long . ZERO ) {
252
+ return done ( new MongoError ( 'Cursor is exhausted' ) ) ;
253
+ }
254
+
255
+ next ( this , false , done ) ;
240
256
} ) ;
241
257
}
242
258
@@ -259,7 +275,7 @@ export abstract class AbstractCursor extends EventEmitter {
259
275
return maybePromise ( callback , done => {
260
276
const transform = this [ kTransform ] ;
261
277
const fetchDocs = ( ) => {
262
- next ( this , ( err , doc ) => {
278
+ next ( this , true , ( err , doc ) => {
263
279
if ( err || doc == null ) return done ( err ) ;
264
280
if ( doc == null ) return done ( ) ;
265
281
@@ -350,7 +366,7 @@ export abstract class AbstractCursor extends EventEmitter {
350
366
const transform = this [ kTransform ] ;
351
367
const fetchDocs = ( ) => {
352
368
// NOTE: if we add a `nextBatch` then we should use it here
353
- next ( this , ( err , doc ) => {
369
+ next ( this , true , ( err , doc ) => {
354
370
if ( err ) return done ( err ) ;
355
371
if ( doc == null ) return done ( undefined , docs ) ;
356
372
@@ -518,7 +534,11 @@ function nextDocument(cursor: AbstractCursor): Document | null | undefined {
518
534
return null ;
519
535
}
520
536
521
- function next ( cursor : AbstractCursor , callback : Callback < Document | null > ) : void {
537
+ function next (
538
+ cursor : AbstractCursor ,
539
+ blocking : boolean ,
540
+ callback : Callback < Document | null >
541
+ ) : void {
522
542
const cursorId = cursor [ kId ] ;
523
543
if ( cursor . closed ) {
524
544
return callback ( undefined , null ) ;
@@ -577,7 +597,7 @@ function next(cursor: AbstractCursor, callback: Callback<Document | null>): void
577
597
return cleanupCursor ( cursor , ( ) => callback ( err , nextDocument ( cursor ) ) ) ;
578
598
}
579
599
580
- next ( cursor , callback ) ;
600
+ next ( cursor , blocking , callback ) ;
581
601
} ) ;
582
602
583
603
return ;
@@ -604,7 +624,11 @@ function next(cursor: AbstractCursor, callback: Callback<Document | null>): void
604
624
return cleanupCursor ( cursor , ( ) => callback ( err , nextDocument ( cursor ) ) ) ;
605
625
}
606
626
607
- next ( cursor , callback ) ;
627
+ if ( cursor [ kDocuments ] . length === 0 && blocking === false ) {
628
+ return callback ( undefined , null ) ;
629
+ }
630
+
631
+ next ( cursor , blocking , callback ) ;
608
632
} ) ;
609
633
}
610
634
@@ -666,7 +690,7 @@ function makeCursorStream(cursor: AbstractCursor) {
666
690
667
691
function readNext ( ) {
668
692
needToClose = false ;
669
- next ( cursor , ( err , result ) => {
693
+ next ( cursor , true , ( err , result ) => {
670
694
needToClose = err ? ! cursor . closed : result !== null ;
671
695
672
696
if ( err ) {
0 commit comments