mongodb-driver-startup.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import { Meteor } from 'meteor/meteor';
  2. import { mongodbConnectionManager } from '/models/lib/mongodbConnectionManager';
  3. import { mongodbDriverManager } from '/models/lib/mongodbDriverManager';
  4. import { meteorMongoIntegration } from '/models/lib/meteorMongoIntegration';
  5. /**
  6. * MongoDB Driver Startup
  7. *
  8. * This module initializes the MongoDB driver system on server startup,
  9. * providing automatic version detection and driver selection for
  10. * MongoDB versions 3.0 through 8.0.
  11. */
  12. // Initialize MongoDB driver system on server startup
  13. Meteor.startup(async function() {
  14. console.log('=== MongoDB Driver System Startup ===');
  15. try {
  16. // Check if MONGO_URL is available
  17. const mongoUrl = process.env.MONGO_URL;
  18. if (!mongoUrl) {
  19. console.log('MONGO_URL not found, skipping MongoDB driver initialization');
  20. return;
  21. }
  22. console.log('MONGO_URL found, initializing MongoDB driver system...');
  23. console.log(`Connection string: ${mongoUrl.replace(/\/\/.*@/, '//***:***@')}`); // Hide credentials
  24. // Initialize the Meteor integration
  25. meteorMongoIntegration.initialize(mongoUrl);
  26. // Test the connection
  27. console.log('Testing MongoDB connection...');
  28. const testResult = await meteorMongoIntegration.testConnection();
  29. if (testResult.success) {
  30. console.log('✅ MongoDB connection test successful');
  31. console.log(` Driver: ${testResult.driver}`);
  32. console.log(` Version: ${testResult.version}`);
  33. } else {
  34. console.log('❌ MongoDB connection test failed');
  35. console.log(` Error: ${testResult.error}`);
  36. console.log(` Driver: ${testResult.driver}`);
  37. console.log(` Version: ${testResult.version}`);
  38. }
  39. // Log connection statistics
  40. const stats = meteorMongoIntegration.getStats();
  41. console.log('MongoDB Driver System Statistics:');
  42. console.log(` Initialized: ${stats.isInitialized}`);
  43. console.log(` Custom Connection: ${stats.hasCustomConnection}`);
  44. console.log(` Supported Versions: ${mongodbDriverManager.getSupportedVersions().join(', ')}`);
  45. // Log driver compatibility information
  46. console.log('MongoDB Driver Compatibility:');
  47. const supportedVersions = mongodbDriverManager.getSupportedVersions();
  48. supportedVersions.forEach(version => {
  49. const driverInfo = mongodbDriverManager.getDriverInfo(
  50. mongodbDriverManager.getDriverForVersion(version)
  51. );
  52. if (driverInfo) {
  53. console.log(` MongoDB ${version}: ${driverInfo.driver} v${driverInfo.version}`);
  54. }
  55. });
  56. console.log('=== MongoDB Driver System Ready ===');
  57. } catch (error) {
  58. console.error('Error during MongoDB driver system startup:', error.message);
  59. console.error('Stack trace:', error.stack);
  60. // Don't fail the entire startup, just log the error
  61. console.log('Continuing with default MongoDB connection...');
  62. }
  63. });
  64. // Add server-side methods for debugging and monitoring
  65. if (Meteor.isServer) {
  66. // Method to get MongoDB driver statistics
  67. Meteor.methods({
  68. 'mongodb-driver-stats': function() {
  69. if (!this.userId) {
  70. throw new Meteor.Error('not-authorized', 'Must be logged in');
  71. }
  72. return {
  73. connectionStats: mongodbConnectionManager.getConnectionStats(),
  74. driverStats: mongodbDriverManager.getConnectionStats(),
  75. integrationStats: meteorMongoIntegration.getStats()
  76. };
  77. },
  78. 'mongodb-driver-test-connection': async function() {
  79. if (!this.userId) {
  80. throw new Meteor.Error('not-authorized', 'Must be logged in');
  81. }
  82. return await meteorMongoIntegration.testConnection();
  83. },
  84. 'mongodb-driver-reset': function() {
  85. if (!this.userId) {
  86. throw new Meteor.Error('not-authorized', 'Must be logged in');
  87. }
  88. meteorMongoIntegration.reset();
  89. return { success: true, message: 'MongoDB driver system reset' };
  90. },
  91. 'mongodb-driver-supported-versions': function() {
  92. if (!this.userId) {
  93. throw new Meteor.Error('not-authorized', 'Must be logged in');
  94. }
  95. return {
  96. supportedVersions: mongodbDriverManager.getSupportedVersions(),
  97. compatibility: mongodbDriverManager.getSupportedVersions().map(version => {
  98. const driverInfo = mongodbDriverManager.getDriverInfo(
  99. mongodbDriverManager.getDriverForVersion(version)
  100. );
  101. return {
  102. version,
  103. driver: driverInfo?.driver || 'unknown',
  104. driverVersion: driverInfo?.version || 'unknown',
  105. minServer: driverInfo?.minServer || 'unknown',
  106. maxServer: driverInfo?.maxServer || 'unknown'
  107. };
  108. })
  109. };
  110. }
  111. });
  112. // Add a publication for real-time monitoring
  113. Meteor.publish('mongodb-driver-monitor', function() {
  114. if (!this.userId) {
  115. throw new Meteor.Error('not-authorized', 'Must be logged in');
  116. }
  117. const self = this;
  118. // Send initial data
  119. const stats = meteorMongoIntegration.getStats();
  120. self.added('mongodbDriverMonitor', 'stats', stats);
  121. // Update every 30 seconds
  122. const interval = setInterval(() => {
  123. const updatedStats = meteorMongoIntegration.getStats();
  124. self.changed('mongodbDriverMonitor', 'stats', updatedStats);
  125. }, 30000);
  126. // Clean up on unsubscribe
  127. self.onStop(() => {
  128. clearInterval(interval);
  129. });
  130. self.ready();
  131. });
  132. }
  133. // Export for use in other modules
  134. export { mongodbConnectionManager, mongodbDriverManager, meteorMongoIntegration };