run<Event, Req extends Object?, Res extends Object?> method

  1. @protected
Future<Maybe<Res>> run<Event, Req extends Object?, Res extends Object?>({
  1. required Event event,
  2. Req? data,
  3. Duration? timeout,
  4. bool trackTime = false,
})

Method for calling the Backend's registered actions from the Frontend

Implementation

@protected
Future<Maybe<Res>> run<Event, Req extends Object?, Res extends Object?>({
  required Event event,
  Req? data,
  Duration? timeout,
  bool trackTime = false,
}) async {
  final code = generateMessageCode(event);
  final completer = Completer<Maybe<dynamic>>();
  final currentTrace = StackTrace.current;
  final runningFunctionName = getNameOfParentRunningFunction(
    currentTrace.toString(),
  );
  _completers[code] = completer;
  _runningFunctions[code] = runningFunctionName;
  if (trackTime) {
    _timeTrackers[code] = DateTime.now();
  }
  _frontendIn.send(
    Message<Event, Req?>(
      event: event,
      data: data,
      code: code,
      timestamp: DateTime.now(),
      serviceData: ServiceData.none,
    ),
  );
  Timer? timer;
  if (timeout != null) {
    timer = Timer(timeout, () {
      _completers.remove(code);
      _runningFunctions.remove(code);
      throw Exception(
          'Timeout ($timeout) of action $event with code $code exceed');
    });
  }
  final result = await completer.future;
  timer?.cancel();
  _completers.remove(code);
  _runningFunctions.remove(code);
  return result.castTo<Res>();
}