You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
3.0 KiB
Dart
93 lines
3.0 KiB
Dart
import 'package:get_it/get_it.dart';
|
|
import 'package:test_sa/modules/cx_module/chat/services/signalr_service.dart';
|
|
import 'package:test_sa/modules/cx_module/chat/call/services/webrtc_service.dart';
|
|
import 'package:test_sa/modules/cx_module/chat/services/call_manager.dart';
|
|
import 'package:test_sa/modules/cx_module/chat/call/services/call_notification_service.dart';
|
|
import 'dart:developer';
|
|
|
|
/// Global service locator instance
|
|
final getIt = GetIt.instance;
|
|
|
|
/// Setup dependency injection
|
|
/// This is called ONCE during app startup in the MAIN ISOLATE ONLY
|
|
/// NEVER call this from background isolate
|
|
Future<void> setupServiceLocator() async {
|
|
await _registerServices();
|
|
}
|
|
|
|
/// Internal helper to register services with duplicate protection
|
|
Future<void> _registerServices() async {
|
|
// 1. SignalR Service
|
|
if (!getIt.isRegistered<SignalRService>()) {
|
|
getIt.registerLazySingleton<SignalRService>(() => SignalRService());
|
|
} else {
|
|
log(' ⚠️ SignalRService already registered, skipping', name: 'ServiceLocator');
|
|
}
|
|
|
|
// 2. WebRTC Service
|
|
if (!getIt.isRegistered<WebRTCService>()) {
|
|
getIt.registerLazySingleton<WebRTCService>(() => WebRTCService());
|
|
} else {
|
|
log(' ⚠️ WebRTCService already registered, skipping', name: 'ServiceLocator');
|
|
}
|
|
|
|
// 3. CallManager (depends on SignalRService, WebRTCService)
|
|
if (!getIt.isRegistered<CallManager>()) {
|
|
getIt.registerLazySingleton<CallManager>(() => CallManager());
|
|
} else {
|
|
log(' ⚠️ CallManager already registered, skipping', name: 'ServiceLocator');
|
|
}
|
|
|
|
// 4. CallNotificationService (depends on CallManager)
|
|
if (!getIt.isRegistered<CallNotificationService>()) {
|
|
getIt.registerLazySingleton<CallNotificationService>(() => CallNotificationService());
|
|
} else {
|
|
log(' ⚠️ CallNotificationService already registered, skipping', name: 'ServiceLocator');
|
|
}
|
|
|
|
// Verify all critical dependencies are available
|
|
_verifyDependencies();
|
|
}
|
|
|
|
/// Verify that all required dependencies are registered
|
|
void _verifyDependencies() {
|
|
final dependencies = <Type>[
|
|
SignalRService,
|
|
WebRTCService,
|
|
CallManager,
|
|
CallNotificationService,
|
|
];
|
|
|
|
bool allRegistered = true;
|
|
|
|
for (final type in dependencies) {
|
|
if (getIt.isRegistered(type: type)) {
|
|
log(' ✅ $type is registered', name: 'ServiceLocator');
|
|
} else {
|
|
log(' ❌ $type is NOT registered', name: 'ServiceLocator');
|
|
allRegistered = false;
|
|
}
|
|
}
|
|
|
|
if (allRegistered) {
|
|
} else {
|
|
log('❌ [DI] Some dependencies are missing!', name: 'ServiceLocator');
|
|
throw StateError('Required dependencies are not registered in GetIt');
|
|
}
|
|
}
|
|
|
|
/// Reset all communication services
|
|
/// Used for logout or testing
|
|
Future<void> resetServices() async {
|
|
try {
|
|
if (getIt.isRegistered<CallManager>()) {
|
|
await getIt<CallManager>().reset();
|
|
}
|
|
if (getIt.isRegistered<SignalRService>()) {
|
|
await getIt<SignalRService>().reset();
|
|
}
|
|
} catch (e) {
|
|
log('❌ [DI] Error resetting services: $e', name: 'ServiceLocator');
|
|
}
|
|
}
|