setupIsolateHandshake function

Future<SendPort> setupIsolateHandshake({
  1. required ReceivePort receivePort,
  2. required void onResponse(
    1. dynamic
    ),
  3. required Duration timeout,
  4. required String timeoutMessage,
})

Performs the initial SendPort handshake with a newly spawned isolate.

Implementation

Future<SendPort> setupIsolateHandshake({
  required ReceivePort receivePort,
  required void Function(dynamic) onResponse,
  required Duration timeout,
  required String timeoutMessage,
}) async {
  final Completer<SendPort> initCompleter = Completer<SendPort>();
  late final StreamSubscription<dynamic> subscription;

  subscription = receivePort.listen((message) {
    if (!initCompleter.isCompleted) {
      if (message is SendPort) {
        initCompleter.complete(message);
      } else if (message is Map && message['error'] != null) {
        initCompleter.completeError(StateError(message['error'] as String));
      } else {
        initCompleter.completeError(
          StateError('Expected SendPort, got ${message.runtimeType}'),
        );
      }
      return;
    }
    onResponse(message);
  });

  return initCompleter.future.timeout(
    timeout,
    onTimeout: () {
      subscription.cancel();
      throw TimeoutException(timeoutMessage);
    },
  );
}