'use strict';

var BSON = require('bson');
var require_optional = require('require_optional');

try {
  // Attempt to grab the native BSON parser
  var BSONNative = require_optional('bson-ext');
  // If we got the native parser, use it instead of the
  // Javascript one
  if (BSONNative) {
    BSON = BSONNative;
  }
} catch (err) {} // eslint-disable-line

module.exports = {
  MongoError: require('./lib/error').MongoError,
  MongoNetworkError: require('./lib/error').MongoNetworkError,
  Connection: require('./lib/connection/connection'),
  Server: require('./lib/topologies/server'),
  ReplSet: require('./lib/topologies/replset'),
  Mongos: require('./lib/topologies/mongos'),
  Logger: require('./lib/connection/logger'),
  Cursor: require('./lib/cursor'),
  ReadPreference: require('./lib/topologies/read_preference'),
  Sessions: require('./lib/sessions'),
  BSON: BSON,
  // Raw operations
  Query: require('./lib/connection/commands').Query,
  // Auth mechanisms
  MongoCR: require('./lib/auth/mongocr'),
  X509: require('./lib/auth/x509'),
  Plain: require('./lib/auth/plain'),
  GSSAPI: require('./lib/auth/gssapi'),
  ScramSHA1: require('./lib/auth/scram'),
  // Utilities
  parseConnectionString: require('./lib/uri_parser')
};
