recv method

Future<void> recv(
  1. Unmarshaler resp
)

Decode the next response into resp. EndOfStreamError means the call completed OK; StatusException reports the trailers status.

Implementation

Future<void> recv(Unmarshaler resp) async {
  while (true) {
    final StreamEvent? event;
    if (deadline != null) {
      try {
        event = await _input
            .get()
            .timeout(deadline!.difference(DateTime.now()));
      } on TimeoutException {
        _terminated = true;
        _endpoint.cancelStream(streamId);
        throw StatusException(
            Wire.codeDeadlineExceeded, 'deadline exceeded');
      }
    } else {
      event = await _input.get();
    }
    if (event == null) {
      _terminated = true;
      throw StatusException(Wire.codeUnavailable, 'data channel closed');
    }
    switch (event.kind) {
      case EventKind.headers:
        headers = event.headers;
        break;
      case EventKind.data:
        resp.unmarshalDc(event.payload!);
        return;
      case EventKind.trailers:
        _terminated = true;
        final status = event.status;
        trailers = status?.trailers;
        endTrace(Wire.statusName(status?.code ?? Wire.codeOk));
        if (status != null && status.code != Wire.codeOk) {
          throw status;
        }
        throw EndOfStreamError();
      case EventKind.rst:
        _terminated = true;
        final status =
            event.status ?? StatusException(Wire.codeUnavailable, 'stream reset');
        trailers = status.trailers;
        endTrace(Wire.statusName(status.code));
        throw status;
      default:
        break;
    }
  }
}