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 matrix
- const 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 detection
- const 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 incompatibility
- const 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 instance
- const mongodbDriverManager = new MongoDBDriverManager();
- // Export for use in other modules
- export { mongodbDriverManager, MongoDBDriverManager };
- // MongoDB Driver Manager initialized (status available in Admin Panel)
|