diff --git a/lib/features/base/isolate/isolate_manager.dart b/lib/features/base/isolate/isolate_manager.dart new file mode 100644 index 000000000..f85c79dc6 --- /dev/null +++ b/lib/features/base/isolate/isolate_manager.dart @@ -0,0 +1,46 @@ + +import 'dart:async'; +import 'dart:isolate'; + +import 'package:core/presentation/utils/shims/dart_ui_real.dart'; +import 'package:core/utils/app_logger.dart'; + +abstract class IsolateManager { + + final _eventReceivePort = ReceivePort(); + StreamSubscription? _streamSubscription; + + String get isolateIdentityName; + + void initial({ + Function(dynamic)? onData, + Function? onError, + Function()? onDone, + }) { + try { + IsolateNameServer.registerPortWithName(_eventReceivePort.sendPort, isolateIdentityName); + _streamSubscription = _eventReceivePort.listen(onData, onError: onError, onDone: onDone); + } catch (e) { + logError('IsolateManager::initial():EXCEPTION: $e'); + } + } + + void addEvent(Object? value) { + log('IsolateManager::addEvent():value: $value'); + try { + final sendPort = IsolateNameServer.lookupPortByName(isolateIdentityName); + if (sendPort != null) { + sendPort.send(value); + } else { + logError('IsolateManager::addEvent(): sendPort is null'); + } + } catch (e) { + logError('IsolateManager::addEvent():EXCEPTION: $e'); + } + } + + void release() { + _eventReceivePort.close(); + _streamSubscription?.cancel(); + } +} \ No newline at end of file