sendMessage<T, R> method

Future<R> sendMessage<T, R>(
  1. WorkerMessage<T, R> message, {
  2. Duration? timeout,
})

Sends a WorkerMessage to the isolate for execution and returns the result.

The message's id is set if not already provided. The result is returned as a Future.

Implementation

Future<R> sendMessage<T, R>(
  WorkerMessage<T, R> message, {
  Duration? timeout,
}) async {
  if (_isPaused) {
    throw StateError('Worker $_tag is paused and cannot accept messages.');
  }
  final completer = Completer<R>();
  final id = message.id ?? generateUniqueId();
  message.id = id;
  _completers[id] = completer;
  final messageMap = {'data': message, 'useLogger': useLogger};

  _eventController.add(IsolateWorkerEvent(IsolateWorkerEventType.coming, {
    'worker': _tag,
    'messageId': message.id,
    'message': message,
  }));
  _sendPort.send(messageMap);

  if (timeout != null) {
    // ignore: body_might_complete_normally_catch_error
    completer.future.timeout(timeout).catchError((_) {
      _completers.remove(id);
    });
    return completer.future.timeout(timeout);
  }

  return completer.future;
}