diff --git a/src/config/index.ts b/src/config/index.ts index ae54e43..affa41f 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -17,14 +17,7 @@ const defaultConfig = { mcpHubVersion: getPackageVersion(), }; -let dataService: DataService | null = null; - -const getDataServiceInstance = (): DataService => { - if (!dataService) { - dataService = getDataService(); - } - return dataService; -}; +const dataService: DataService = getDataService(); // Settings cache let settingsCache: McpSettings | null = null; @@ -61,16 +54,13 @@ export const loadOriginalSettings = (): McpSettings => { }; export const loadSettings = (): McpSettings => { - return getDataServiceInstance().filterSettings!(loadOriginalSettings()); + return dataService.filterSettings!(loadOriginalSettings()); }; export const saveSettings = (settings: McpSettings): boolean => { const settingsPath = getSettingsPath(); try { - const mergedSettings = getDataServiceInstance().mergeSettings!( - loadOriginalSettings(), - settings, - ); + const mergedSettings = dataService.mergeSettings!(loadOriginalSettings(), settings); fs.writeFileSync(settingsPath, JSON.stringify(mergedSettings, null, 2), 'utf8'); // Update cache after successful save @@ -88,7 +78,6 @@ export const saveSettings = (settings: McpSettings): boolean => { */ export const clearSettingsCache = (): void => { settingsCache = null; - dataService = null; // Also clear the data service cache }; /** diff --git a/src/server.ts b/src/server.ts index 297fc67..38fa60d 100644 --- a/src/server.ts +++ b/src/server.ts @@ -13,7 +13,6 @@ import { } from './services/sseService.js'; import { initializeDefaultUser } from './models/User.js'; import { sseUserContextMiddleware } from './middlewares/userContext.js'; -import { initializeServices } from './services/services.js'; // Get the current working directory (will be project root in most cases) const currentFileDir = process.cwd() + '/src'; @@ -32,9 +31,6 @@ export class AppServer { async initialize(): Promise { try { - // Initialize services - await initializeServices(); - // Initialize default admin user if no users exist await initializeDefaultUser(); diff --git a/src/services/registry.ts b/src/services/registry.ts index 0fd20bd..438ab84 100644 --- a/src/services/registry.ts +++ b/src/services/registry.ts @@ -1,3 +1,6 @@ +import { createRequire } from 'module'; +import { join } from 'path'; + type Class = new (...args: any[]) => T; interface Service { @@ -8,17 +11,19 @@ interface Service { const registry = new Map>(); const instances = new Map(); -export async function registerService(key: string, entry: Service) { +export function registerService(key: string, entry: Service) { // Try to load override immediately during registration - const overridePath = './' + key + 'x.js'; - await import(overridePath) - .then((mod) => { - const override = mod[key.charAt(0).toUpperCase() + key.slice(1) + 'x']; - if (typeof override === 'function') { - entry.override = override; - } - }) - .catch(() => {}); // Silently ignore if override doesn't exist + const overridePath = join(process.cwd(), 'src', 'services', key + 'x.ts'); + try { + const require = createRequire(process.cwd()); + const mod = require(overridePath); + const override = mod[key.charAt(0).toUpperCase() + key.slice(1) + 'x']; + if (typeof override === 'function') { + entry.override = override; + } + } catch (error) { + // Silently ignore if override doesn't exist + } registry.set(key, entry); } diff --git a/src/services/services.ts b/src/services/services.ts index 915f1ae..4c1738f 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1,31 +1,10 @@ import { registerService, getService } from './registry.js'; import { DataService, DataServiceImpl } from './dataService.js'; -let initialized = false; -let tempDataService: DataService | null = null; - -async function initializeServices() { - if (initialized) return; - - await registerService('dataService', { - defaultImpl: DataServiceImpl, - }); - - initialized = true; - tempDataService = null; // Clear temp service once real one is ready -} +registerService('dataService', { + defaultImpl: DataServiceImpl, +}); export function getDataService(): DataService { - if (initialized) { - return getService('dataService'); - } - - // Return temporary service for cases where services haven't been initialized yet - // This allows module loading to work even before server initialization - if (!tempDataService) { - tempDataService = new DataServiceImpl(); - } - return tempDataService; + return getService('dataService'); } - -export { initializeServices };