77 lines
2.1 KiB
TypeScript
77 lines
2.1 KiB
TypeScript
import type { Document } 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: string;
|
|
minWireVersion?: number;
|
|
maxWireVersion?: number;
|
|
maxBsonObjectSize: number;
|
|
maxMessageSizeBytes: number;
|
|
maxWriteBatchSize: number;
|
|
compressors: CompressorName[];
|
|
compressor?: CompressorName;
|
|
logicalSessionTimeoutMinutes?: number;
|
|
loadBalanced: boolean;
|
|
|
|
__nodejs_mock_server__?: boolean;
|
|
|
|
zlibCompressionLevel?: number;
|
|
|
|
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
|
|
: [];
|
|
}
|
|
|
|
receiveResponse(response: Document | null): void {
|
|
if (response == null) {
|
|
return;
|
|
}
|
|
this.type = parseServerType(response);
|
|
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];
|
|
}
|
|
}
|
|
}
|