/// import Denque = require('denque'); import type { BSONSerializeOptions, Document } from '../bson'; import { deserialize, serialize } from '../bson'; import type { MongoCredentials } from '../cmap/auth/mongo_credentials'; import type { ConnectionEvents } from '../cmap/connection'; import type { CloseOptions, ConnectionPoolEvents } from '../cmap/connection_pool'; import type { MongoClient, ServerApi } from '../mongo_client'; import { TypedEventEmitter } from '../mongo_types'; import { ReadPreference, ReadPreferenceLike } from '../read_preference'; import type { ClientSession } from '../sessions'; import type { Transaction } from '../transactions'; import { Callback, ClientMetadata, EventEmitterWithState, HostAddress } from '../utils'; import { ClusterTime, TimerQueue } from './common'; import { ServerClosedEvent, ServerDescriptionChangedEvent, ServerOpeningEvent, TopologyClosedEvent, TopologyDescriptionChangedEvent, TopologyOpeningEvent } from './events'; import { Server, ServerEvents, ServerOptions } from './server'; import { ServerDescription } from './server_description'; import { ServerSelector } from './server_selection'; import { SrvPoller, SrvPollingEvent } from './srv_polling'; import { TopologyDescription } from './topology_description'; /** @internal */ declare const kCancelled: unique symbol; /** @internal */ declare const kWaitQueue: unique symbol; /** @internal */ export declare type ServerSelectionCallback = Callback; /** @internal */ export interface ServerSelectionRequest { serverSelector: ServerSelector; transaction?: Transaction; callback: ServerSelectionCallback; timer?: NodeJS.Timeout; [kCancelled]?: boolean; } /** @internal */ export interface TopologyPrivate { /** the id of this topology */ id: number; /** passed in options */ options: TopologyOptions; /** initial seedlist of servers to connect to */ seedlist: HostAddress[]; /** initial state */ state: string; /** the topology description */ description: TopologyDescription; serverSelectionTimeoutMS: number; heartbeatFrequencyMS: number; minHeartbeatFrequencyMS: number; /** A map of server instances to normalized addresses */ servers: Map; credentials?: MongoCredentials; clusterTime?: ClusterTime; /** timers created for the initial connect to a server */ connectionTimers: TimerQueue; /** related to srv polling */ srvPoller?: SrvPoller; detectShardedTopology: (event: TopologyDescriptionChangedEvent) => void; detectSrvRecords: (event: SrvPollingEvent) => void; } /** @public */ export interface TopologyOptions extends BSONSerializeOptions, ServerOptions { srvMaxHosts: number; srvServiceName: string; hosts: HostAddress[]; retryWrites: boolean; retryReads: boolean; /** How long to block for server selection before throwing an error */ serverSelectionTimeoutMS: number; /** The name of the replica set to connect to */ replicaSet?: string; srvHost?: string; /** @internal */ srvPoller?: SrvPoller; /** Indicates that a client should directly connect to a node without attempting to discover its topology type */ directConnection: boolean; loadBalanced: boolean; metadata: ClientMetadata; /** MongoDB server API version */ serverApi?: ServerApi; /** @internal */ [featureFlag: symbol]: any; } /** @public */ export interface ConnectOptions { readPreference?: ReadPreference; } /** @public */ export interface SelectServerOptions { readPreference?: ReadPreferenceLike; /** How long to block for server selection before throwing an error */ serverSelectionTimeoutMS?: number; session?: ClientSession; } /** @public */ export declare type TopologyEvents = { /** Top level MongoClient doesn't emit this so it is marked: @internal */ connect(topology: Topology): void; serverOpening(event: ServerOpeningEvent): void; serverClosed(event: ServerClosedEvent): void; serverDescriptionChanged(event: ServerDescriptionChangedEvent): void; topologyClosed(event: TopologyClosedEvent): void; topologyOpening(event: TopologyOpeningEvent): void; topologyDescriptionChanged(event: TopologyDescriptionChangedEvent): void; error(error: Error): void; /** @internal */ open(topology: Topology): void; close(): void; timeout(): void; } & Omit & ConnectionPoolEvents & ConnectionEvents & EventEmitterWithState; /** * A container of server instances representing a connection to a MongoDB topology. * @internal */ export declare class Topology extends TypedEventEmitter { /** @internal */ s: TopologyPrivate; /** @internal */ [kWaitQueue]: Denque; /** @internal */ hello?: Document; /** @internal */ _type?: string; client: MongoClient; /** @event */ static readonly SERVER_OPENING: "serverOpening"; /** @event */ static readonly SERVER_CLOSED: "serverClosed"; /** @event */ static readonly SERVER_DESCRIPTION_CHANGED: "serverDescriptionChanged"; /** @event */ static readonly TOPOLOGY_OPENING: "topologyOpening"; /** @event */ static readonly TOPOLOGY_CLOSED: "topologyClosed"; /** @event */ static readonly TOPOLOGY_DESCRIPTION_CHANGED: "topologyDescriptionChanged"; /** @event */ static readonly ERROR: "error"; /** @event */ static readonly OPEN: "open"; /** @event */ static readonly CONNECT: "connect"; /** @event */ static readonly CLOSE: "close"; /** @event */ static readonly TIMEOUT: "timeout"; /** * @internal * * @privateRemarks * mongodb-client-encryption's class ClientEncryption falls back to finding the bson lib * defined on client.topology.bson, in order to maintain compatibility with any version * of mongodb-client-encryption we keep a reference to serialize and deserialize here. */ bson: { serialize: typeof serialize; deserialize: typeof deserialize; }; /** * @param seedlist - a list of HostAddress instances to connect to */ constructor(seeds: string | string[] | HostAddress | HostAddress[], options: TopologyOptions); private detectShardedTopology; private detectSrvRecords; /** * @returns A `TopologyDescription` for this topology */ get description(): TopologyDescription; get loadBalanced(): boolean; get capabilities(): ServerCapabilities; /** Initiate server connect */ connect(options?: ConnectOptions, callback?: Callback): void; /** Close this topology */ close(options?: CloseOptions, callback?: Callback): void; /** * Selects a server according to the selection predicate provided * * @param selector - An optional selector to select servers by, defaults to a random selection within a latency window * @param options - Optional settings related to server selection * @param callback - The callback used to indicate success or failure * @returns An instance of a `Server` meeting the criteria of the predicate provided */ selectServer(selector: string | ReadPreference | ServerSelector, options: SelectServerOptions, callback: Callback): void; /** * @returns Whether the topology should initiate selection to determine session support */ shouldCheckForSessionSupport(): boolean; /** * @returns Whether sessions are supported on the current topology */ hasSessionSupport(): boolean; /** * Update the internal TopologyDescription with a ServerDescription * * @param serverDescription - The server to update in the internal list of server descriptions */ serverUpdateHandler(serverDescription: ServerDescription): void; auth(credentials?: MongoCredentials, callback?: Callback): void; get clientMetadata(): ClientMetadata; isConnected(): boolean; isDestroyed(): boolean; /** * @deprecated This function is deprecated and will be removed in the next major version. */ unref(): void; lastHello(): Document; get commonWireVersion(): number | undefined; get logicalSessionTimeoutMinutes(): number | undefined; get clusterTime(): ClusterTime | undefined; set clusterTime(clusterTime: ClusterTime | undefined); } /** @public */ export declare class ServerCapabilities { maxWireVersion: number; minWireVersion: number; constructor(hello: Document); get hasAggregationCursor(): boolean; get hasWriteCommands(): boolean; get hasTextSearch(): boolean; get hasAuthCommands(): boolean; get hasListCollectionsCommand(): boolean; get hasListIndexesCommand(): boolean; get supportsSnapshotReads(): boolean; get commandsTakeWriteConcern(): boolean; get commandsTakeCollation(): boolean; } export {}; //# sourceMappingURL=topology.d.ts.map