| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 | import { Meteor } from 'meteor/meteor';/** * MongoDB Driver Manager *  * This module provides automatic MongoDB version detection and driver selection * to support MongoDB versions 3.0 through 8.0 with compatible Node.js drivers. *  * Features: * - Automatic MongoDB version detection from wire protocol errors * - Dynamic driver selection based on detected version * - Fallback mechanism for unsupported versions * - Connection retry with different drivers */// MongoDB driver compatibility matrixconst DRIVER_COMPATIBILITY = {  '3.0': { driver: 'mongodb3legacy', version: '3.7.4', minServer: '3.0', maxServer: '3.6' },  '3.2': { driver: 'mongodb3legacy', version: '3.7.4', minServer: '3.0', maxServer: '3.6' },  '3.4': { driver: 'mongodb3legacy', version: '3.7.4', minServer: '3.0', maxServer: '3.6' },  '3.6': { driver: 'mongodb3legacy', version: '3.7.4', minServer: '3.0', maxServer: '3.6' },  '4.0': { driver: 'mongodb4legacy', version: '4.17.2', minServer: '4.0', maxServer: '4.4' },  '4.2': { driver: 'mongodb4legacy', version: '4.17.2', minServer: '4.0', maxServer: '4.4' },  '4.4': { driver: 'mongodb4legacy', version: '4.17.2', minServer: '4.0', maxServer: '4.4' },  '5.0': { driver: 'mongodb5legacy', version: '5.9.2', minServer: '5.0', maxServer: '5.0' },  '6.0': { driver: 'mongodb6legacy', version: '6.3.0', minServer: '6.0', maxServer: '6.0' },  '7.0': { driver: 'mongodb7legacy', version: '7.0.1', minServer: '7.0', maxServer: '7.0' },  '8.0': { driver: 'mongodb8legacy', version: '6.9.0', minServer: '8.0', maxServer: '8.0' }};// Wire protocol error patterns for version detectionconst VERSION_ERROR_PATTERNS = {  // MongoDB 3.x wire protocol errors  '3.0': [    /unsupported wire protocol version/i,    /wire protocol version 0/i,    /protocol version 0/i  ],  '3.2': [    /wire protocol version 1/i,    /protocol version 1/i  ],  '3.4': [    /wire protocol version 2/i,    /protocol version 2/i  ],  '3.6': [    /wire protocol version 3/i,    /protocol version 3/i  ],  // MongoDB 4.x wire protocol errors  '4.0': [    /wire protocol version 4/i,    /protocol version 4/i  ],  '4.2': [    /wire protocol version 5/i,    /protocol version 5/i  ],  '4.4': [    /wire protocol version 6/i,    /protocol version 6/i  ],  // MongoDB 5.x wire protocol errors  '5.0': [    /wire protocol version 7/i,    /protocol version 7/i  ],  // MongoDB 6.x wire protocol errors  '6.0': [    /wire protocol version 8/i,    /protocol version 8/i  ],  // MongoDB 7.x wire protocol errors  '7.0': [    /wire protocol version 9/i,    /protocol version 9/i  ],  // MongoDB 8.x wire protocol errors  '8.0': [    /wire protocol version 10/i,    /protocol version 10/i  ]};// Generic error patterns that might indicate version incompatibilityconst GENERIC_VERSION_ERRORS = [  /unsupported wire protocol/i,  /wire protocol version/i,  /protocol version/i,  /unsupported server version/i,  /server version/i,  /incompatible wire protocol/i,  /wire protocol mismatch/i];class MongoDBDriverManager {  constructor() {    this.detectedVersion = null;    this.selectedDriver = null;    this.connectionAttempts = [];    this.fallbackDrivers = ['mongodb6legacy', 'mongodb4legacy', 'mongodb3legacy'];  }  /**   * Detect MongoDB version from wire protocol errors   * @param {Error} error - The connection error   * @returns {string|null} - Detected MongoDB version or null   */  detectVersionFromError(error) {    if (!error || !error.message) {      return null;    }    const errorMessage = error.message.toLowerCase();        // Check specific version patterns    for (const [version, patterns] of Object.entries(VERSION_ERROR_PATTERNS)) {      for (const pattern of patterns) {        if (pattern.test(errorMessage)) {          console.log(`MongoDB version detected from error: ${version}`);          return version;        }      }    }    // Check for generic version errors    for (const pattern of GENERIC_VERSION_ERRORS) {      if (pattern.test(errorMessage)) {        console.log('Generic MongoDB version error detected, will try fallback drivers');        return 'unknown';      }    }    return null;  }  /**   * Get the appropriate driver for a MongoDB version   * @param {string} version - MongoDB version   * @returns {string} - Driver package name   */  getDriverForVersion(version) {    if (DRIVER_COMPATIBILITY[version]) {      return DRIVER_COMPATIBILITY[version].driver;    }    // Fallback logic for unknown versions    if (version === 'unknown') {      return this.fallbackDrivers[0]; // Start with most recent fallback    }    // Try to determine from version string    const majorVersion = version.split('.')[0];    if (majorVersion === '3') {      return 'mongodb3legacy';    } else if (majorVersion === '4') {      return 'mongodb4legacy';    } else if (majorVersion === '5') {      return 'mongodb5legacy';    } else if (majorVersion === '6') {      return 'mongodb6legacy';    } else if (majorVersion === '7') {      return 'mongodb7legacy';    } else if (majorVersion === '8') {      return 'mongodb8legacy';    }    return this.fallbackDrivers[0];  }  /**   * Get the next fallback driver   * @returns {string|null} - Next fallback driver or null if none left   */  getNextFallbackDriver() {    const currentIndex = this.fallbackDrivers.indexOf(this.selectedDriver);    if (currentIndex >= 0 && currentIndex < this.fallbackDrivers.length - 1) {      return this.fallbackDrivers[currentIndex + 1];    }    return null;  }  /**   * Record a connection attempt   * @param {string} driver - Driver used   * @param {string} version - MongoDB version attempted   * @param {boolean} success - Whether connection was successful   * @param {Error} error - Error if connection failed   */  recordConnectionAttempt(driver, version, success, error = null) {    this.connectionAttempts.push({      driver,      version,      success,      error: error ? error.message : null,      timestamp: new Date()    });    if (success) {      this.selectedDriver = driver;      this.detectedVersion = version;      console.log(`Successfully connected using ${driver} for MongoDB ${version}`);    }  }  /**   * Get connection statistics   * @returns {Object} - Connection statistics   */  getConnectionStats() {    const total = this.connectionAttempts.length;    const successful = this.connectionAttempts.filter(attempt => attempt.success).length;    const failed = total - successful;    return {      total,      successful,      failed,      currentDriver: this.selectedDriver,      detectedVersion: this.detectedVersion,      attempts: this.connectionAttempts    };  }  /**   * Reset connection state   */  reset() {    this.detectedVersion = null;    this.selectedDriver = null;    this.connectionAttempts = [];  }  /**   * Get driver information   * @param {string} driver - Driver package name   * @returns {Object} - Driver information   */  getDriverInfo(driver) {    for (const [version, info] of Object.entries(DRIVER_COMPATIBILITY)) {      if (info.driver === driver) {        return { version, ...info };      }    }    return null;  }  /**   * Get all supported MongoDB versions   * @returns {Array} - Array of supported versions   */  getSupportedVersions() {    return Object.keys(DRIVER_COMPATIBILITY);  }  /**   * Check if a MongoDB version is supported   * @param {string} version - MongoDB version to check   * @returns {boolean} - Whether version is supported   */  isVersionSupported(version) {    return version in DRIVER_COMPATIBILITY;  }}// Create singleton instanceconst mongodbDriverManager = new MongoDBDriverManager();// Export for use in other modulesexport { mongodbDriverManager, MongoDBDriverManager };// MongoDB Driver Manager initialized (status available in Admin Panel)
 |