sendMessage<T, R> method
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;
}