isolate<Id, Value, T> static method

Future<_Communicator<Id, Value>> isolate<Id, Value, T>(
  1. ValueSetter<BackendArgument<T>> create,
  2. String isolateId, {
  3. required IsolatorData<T> isolatorData,
  4. ErrorHandler? errorHandler,
})

Implementation

static Future<_Communicator<Id, Value>> isolate<Id, Value, T>(
  ValueSetter<BackendArgument<T>> create,
  String isolateId, {
  required IsolatorData<T> isolatorData,
  ErrorHandler? errorHandler,
}) async {
  final Completer<_Communicator<Id, Value>> completer = Completer();
  final ReceivePort receivePort = ReceivePort();
  final Stream<dynamic> receiveBroadcast = receivePort.asBroadcastStream();
  final StreamSubscription<dynamic> subscription = receiveBroadcast.listen((dynamic message) {
    if (message is SendPort) {
      completer.complete(_Communicator<Id, Value>(Stream.castFrom<dynamic, _Message<Id, Value>>(receiveBroadcast), _Sender<Id, Value>(message)));
    }
  });
  _isolates[isolateId]?.kill();
  _isolates[isolateId] = await Isolate.spawn(
    create,
    BackendArgument<T>(receivePort.sendPort, data: isolatorData.data, config: isolatorData.config.toJson()),
    debugName: isolateId,
    errorsAreFatal: false,
  );
  final Isolate isolate = _isolates[isolateId]!;
  final ReceivePort errorReceivePort = ReceivePort();

  /// messageAndStackTrace is a List<String> -> [message, stackStrace]
  errorReceivePort.listen((dynamic messageAndStackTrace) async {
    if (IsolatorConfig._instance.logEvents) {
      print('[ERROR] - [$isolateId] !!! The error was thrown in backend and got in Frontend');
    }
    if (errorHandler != null) {
      /// Use only error
      await errorHandler(messageAndStackTrace[0]);
    }
    throw messageAndStackTrace;
  });
  isolate.addErrorListener(errorReceivePort.sendPort);
  final _Communicator<Id, Value> communicator = await completer.future;
  await subscription.cancel();
  return communicator;
}