callAsync method

Future<Uint8List> callAsync(
  1. String name,
  2. Uint8List payload
)

Implementation

Future<Uint8List> callAsync(String name, Uint8List payload) async {
  final port = ReceivePort();
  final completer = Completer<Uint8List>();

  try {
    final isolate = await Isolate.spawn(
      _callBridge,
      IsolateArguments(name, payload, port.sendPort),
      errorsAreFatal: false,
      debugName: '${_libraryName}_isolate',
      onError: port.sendPort,
    );

    port.listen((message) {
      try {
        if (message is Uint8List) {
          completer.complete(message);
        } else if (message is List && message.isNotEmpty) {
          completer.completeError(message.first ?? "internal error");
        } else {
          completer.completeError("spawn error");
        }
      } finally {
        port.close();
        isolate.kill(priority: Isolate.beforeNextEvent);
      }
    });

    return completer.future;
  } catch (e) {
    port.close();
    throw RSAException("Failed to start isolate: $e");
  }
}