call method
Future<RpcReply>
call(
- String method, {
- Map<
String, Object?> params = const {}, - Duration timeout = const Duration(seconds: 5),
- 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;
}