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 97155x 155x 155x     155x                                 155x                                   993375x     993375x 993375x 993375x 993375x 993375x 993375x 993375x 993375x 993375x 993375x       993375x       991829x     991829x 991829x 991829x 941138x   50691x   991829x 5950974x 5937444x       5950974x 9852x       991829x 108x               941138x            
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);
  }
}