From 0f5aab6f69ff1faa8ae43fa41405e78912f88079 Mon Sep 17 00:00:00 2001 From: dab246 Date: Sun, 4 Jun 2023 12:18:25 +0700 Subject: [PATCH] TF-1900 Add IsolateManager to for data communication the isolate (cherry picked from commit 11ea14e188c43ae526d75c92bdfab75c8a944d13) --- .../base/isolate/isolate_manager.dart | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 lib/features/base/isolate/isolate_manager.dart 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