call method

  1. @override
Future<RpcReply> call(
  1. String method, {
  2. Map<String, Object?> params = const {},
  3. Duration timeout = const Duration(seconds: 5),
  4. RpcCancellationToken? cancellationToken,
})
override

Implementation

@override
Future<RpcReply> call(
  String method, {
  Map<String, Object?> params = const {},
  Duration timeout = const Duration(seconds: 5),
  RpcCancellationToken? cancellationToken,
}) {
  if (_state == _SidecarState.closing ||
      _state == _SidecarState.closed ||
      _state == _SidecarState.failed) {
    return Future.error(_terminalError ?? const BackendClosedException());
  }
  if (cancellationToken?.isCancelled ?? false) {
    return Future.error(RpcCancelledException(method));
  }

  final id = '${++_nextID}';
  final pending = _PendingSidecarCall();
  _pending[id] = pending;
  pending.timeout = Timer(
    timeout,
    () => _cancelPending(
      id,
      TimeoutException('Sidecar method $method timed out.', timeout),
    ),
  );
  pending.cancellationSubscription = cancellationToken?.onCancel.listen(
    (_) => _cancelPending(id, RpcCancelledException(method)),
  );
  unawaited(
    _sendRequestWhenReady(
      id,
      encodeRpcRequest(id: id, method: method, params: params, token: _token),
    ),
  );
  return pending.completer.future;
}