All files / src/cmap stream_description.ts

96.96% Statements 32/33
94.11% Branches 16/17
100% Functions 4/4
96.87% Lines 31/32

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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97416x 416x 416x     416x                                 416x                                   5108441x     5108441x 5108441x 5108441x 5108441x 5108441x 5108441x 5108441x 5108441x 5108441x 5108441x       5108441x       5102320x     5102320x 5102320x 5102320x 4821377x   280943x   5102320x 30613920x 30597750x       30613920x 40482x       5102320x 748x               4821377x            
import { type Document, type Double, Long } from '../bson';
import { ServerType } from '../sdam/common';
import { parseServerType } from '../sdam/server_description';
import type { CompressorName } from './wire_protocol/compression';
 
const RESPONSE_FIELDS = [
  'minWireVersion',
  'maxWireVersion',
  'maxBsonObjectSize',
  'maxMessageSizeBytes',
  'maxWriteBatchSize',
  'logicalSessionTimeoutMinutes'
] as const;
 
/** @public */
export interface StreamDescriptionOptions {
  compressors?: CompressorName[];
  logicalSessionTimeoutMinutes?: number;
  loadBalanced: boolean;
}
 
/** @public */
export class StreamDescription {
  address: string;
  type: ServerType;
  minWireVersion?: number;
  maxWireVersion?: number;
  maxBsonObjectSize: number;
  maxMessageSizeBytes: number;
  maxWriteBatchSize: number;
  compressors: CompressorName[];
  compressor?: CompressorName;
  logicalSessionTimeoutMinutes?: number;
  loadBalanced: boolean;
 
  __nodejs_mock_server__?: boolean;
 
  zlibCompressionLevel?: number;
  serverConnectionId: bigint | null;
 
  public hello: Document | null = null;
 
  constructor(address: string, options?: StreamDescriptionOptions) {
    this.address = address;
    this.type = ServerType.Unknown;
    this.minWireVersion = undefined;
    this.maxWireVersion = undefined;
    this.maxBsonObjectSize = 16777216;
    this.maxMessageSizeBytes = 48000000;
    this.maxWriteBatchSize = 100000;
    this.logicalSessionTimeoutMinutes = options?.logicalSessionTimeoutMinutes;
    this.loadBalanced = !!options?.loadBalanced;
    this.compressors =
      options && options.compressors && Array.isArray(options.compressors)
        ? options.compressors
        : [];
    this.serverConnectionId = null;
  }
 
  receiveResponse(response: Document | null): void {
    Iif (response == null) {
      return;
    }
    this.hello = response;
    this.type = parseServerType(response);
    if ('connectionId' in response) {
      this.serverConnectionId = this.parseServerConnectionID(response.connectionId);
    } else {
      this.serverConnectionId = null;
    }
    for (const field of RESPONSE_FIELDS) {
      if (response[field] != null) {
        this[field] = response[field];
      }
 
      // testing case
      if ('__nodejs_mock_server__' in response) {
        this.__nodejs_mock_server__ = response['__nodejs_mock_server__'];
      }
    }
 
    if (response.compression) {
      this.compressor = this.compressors.filter(c => response.compression?.includes(c))[0];
    }
  }
 
  /* @internal */
  parseServerConnectionID(serverConnectionId: number | Double | bigint | Long): bigint {
    // Connection ids are always integral, so it's safe to coerce doubles as well as
    // any integral type.
    return Long.isLong(serverConnectionId)
      ? serverConnectionId.toBigInt()
      : // @ts-expect-error: Doubles are coercible to number
        BigInt(serverConnectionId);
  }
}