isolate<Id, Value, T> static method
Future<_Communicator<Id, Value> >
isolate<Id, Value, T>(
- ValueSetter<
BackendArgument< create,T> > - String isolateId, {
- required IsolatorData<
T> isolatorData, - 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;
}