All files / src/operations kill_cursors.ts

100% Statements 19/19
100% Branches 4/4
100% Functions 3/3
100% Lines 19/19

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66  279x       279x 279x                       279x       29318x 29318x 29318x 29318x       29302x               29270x 4x     29266x 29266x     4x     29262x       29262x 29262x           510x         279x  
import type { Long } from '../bson';
import { MongoRuntimeError } from '../error';
import type { Server } from '../sdam/server';
import type { ClientSession } from '../sessions';
import { type TimeoutContext } from '../timeout';
import { type MongoDBNamespace, squashError } from '../utils';
import { AbstractOperation, Aspect, defineAspects, type OperationOptions } from './operation';
 
/**
 * https://www.mongodb.com/docs/manual/reference/command/killCursors/
 * @internal
 */
interface KillCursorsCommand {
  killCursors: string;
  cursors: Long[];
  comment?: unknown;
}
 
export class KillCursorsOperation extends AbstractOperation {
  cursorId: Long;
 
  constructor(cursorId: Long, ns: MongoDBNamespace, server: Server, options: OperationOptions) {
    super(options);
    this.ns = ns;
    this.cursorId = cursorId;
    this.server = server;
  }
 
  override get commandName() {
    return 'killCursors' as const;
  }
 
  override async execute(
    server: Server,
    session: ClientSession | undefined,
    timeoutContext: TimeoutContext
  ): Promise<void> {
    if (server !== this.server) {
      throw new MongoRuntimeError('Killcursor must run on the same server operation began on');
    }
 
    const killCursors = this.ns.collection;
    if (killCursors == null) {
      // Cursors should have adopted the namespace returned by MongoDB
      // which should always defined a collection name (even a pseudo one, ex. db.aggregate())
      throw new MongoRuntimeError('A collection name must be determined before killCursors');
    }
 
    const killCursorsCommand: KillCursorsCommand = {
      killCursors,
      cursors: [this.cursorId]
    };
    try {
      await server.command(this.ns, killCursorsCommand, {
        session,
        timeoutContext
      });
    } catch (error) {
      // The driver should never emit errors from killCursors, this is spec-ed behavior
      squashError(error);
    }
  }
}
 
defineAspects(KillCursorsOperation, [Aspect.MUST_SELECT_SAME_SERVER]);